summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2015-12-11 16:00:36 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2015-12-11 16:01:19 +0900
commit02e836feb7a708522369a8fb46a3ade8688db655 (patch)
tree270a401f3fe8607a0831974de5f99ada95877d00
parent63002492d52e8631ccd11f8e455b793a86c4fdc0 (diff)
downloadtar-02e836feb7a708522369a8fb46a3ade8688db655.tar.gz
tar-02e836feb7a708522369a8fb46a3ade8688db655.tar.bz2
tar-02e836feb7a708522369a8fb46a3ade8688db655.zip
Imported Upstream version 1.17upstream/1.17upstream
Change-Id: I961320672e61546737ace306bfc11f4a1308718d Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
-rw-r--r--ABOUT-NLS1101
-rw-r--r--AUTHORS34
-rw-r--r--COPYING340
-rw-r--r--ChangeLog8271
-rw-r--r--ChangeLog.15887
-rw-r--r--INSTALL234
-rw-r--r--Makefile.am31
-rw-r--r--Makefile.in920
-rw-r--r--NEWS915
-rw-r--r--PORTS173
-rw-r--r--README251
-rw-r--r--THANKS526
-rw-r--r--TODO71
-rw-r--r--aclocal.m41100
-rwxr-xr-xbuild-aux/config.guess1516
-rwxr-xr-xbuild-aux/config.rpath614
-rwxr-xr-xbuild-aux/config.sub1626
-rwxr-xr-xbuild-aux/depcomp589
-rwxr-xr-xbuild-aux/install-sh519
-rwxr-xr-xbuild-aux/mdate-sh205
-rwxr-xr-xbuild-aux/missing367
-rwxr-xr-xbuild-aux/mkinstalldirs161
-rw-r--r--build-aux/texinfo.tex8641
-rwxr-xr-xbuild-aux/ylwrap223
-rw-r--r--config.hin1204
-rwxr-xr-xconfigure39558
-rw-r--r--configure.ac248
-rw-r--r--doc/Makefile.am86
-rw-r--r--doc/Makefile.in917
-rw-r--r--doc/dumpdir.texi132
-rw-r--r--doc/fdl.texi452
-rw-r--r--doc/freemanuals.texi89
-rwxr-xr-xdoc/gendocs_template108
-rw-r--r--doc/genfile.texi331
-rw-r--r--doc/getdate.texi553
-rw-r--r--doc/header.texi242
-rw-r--r--doc/intern.texi335
-rw-r--r--doc/mastermenu.el91
-rw-r--r--doc/rendition.texi90
-rw-r--r--doc/snapshot.texi66
-rw-r--r--doc/sparse.texi235
-rw-r--r--doc/stamp-vti4
-rw-r--r--doc/tar.info387
-rw-r--r--doc/tar.info-17594
-rw-r--r--doc/tar.info-24783
-rw-r--r--doc/tar.texi10958
-rw-r--r--doc/texify.sed26
-rw-r--r--doc/texinfo.tex7086
-rw-r--r--doc/value.texi22
-rw-r--r--doc/version.texi4
-rw-r--r--lib/Makefile.am41
-rw-r--r--lib/Makefile.in1459
-rw-r--r--lib/__fpending.c30
-rw-r--r--lib/__fpending.h34
-rw-r--r--lib/alloca.c489
-rw-r--r--lib/alloca_.h54
-rw-r--r--lib/allocsa.c137
-rw-r--r--lib/allocsa.h124
-rw-r--r--lib/allocsa.valgrind7
-rw-r--r--lib/argmatch.c278
-rw-r--r--lib/argmatch.h103
-rw-r--r--lib/argp-ba.c25
-rw-r--r--lib/argp-eexst.c31
-rw-r--r--lib/argp-fmtstream.c435
-rw-r--r--lib/argp-fmtstream.h301
-rw-r--r--lib/argp-fs-xinl.c43
-rw-r--r--lib/argp-help.c1954
-rw-r--r--lib/argp-namefrob.h158
-rw-r--r--lib/argp-parse.c953
-rw-r--r--lib/argp-pin.c28
-rw-r--r--lib/argp-pv.c24
-rw-r--r--lib/argp-pvh.c31
-rw-r--r--lib/argp-xinl.c43
-rw-r--r--lib/argp.h622
-rw-r--r--lib/asnprintf.c35
-rw-r--r--lib/at-func.c86
-rw-r--r--lib/backupfile.c364
-rw-r--r--lib/backupfile.h61
-rw-r--r--lib/basename.c129
-rw-r--r--lib/canonicalize-lgpl.c353
-rw-r--r--lib/canonicalize.h54
-rw-r--r--lib/chdir-long.c265
-rw-r--r--lib/chdir-long.h35
-rw-r--r--lib/chown.c104
-rw-r--r--lib/close-stream.c76
-rw-r--r--lib/close-stream.h2
-rw-r--r--lib/closeout.c86
-rw-r--r--lib/closeout.h33
-rwxr-xr-xlib/config.charset639
-rw-r--r--lib/creat-safer.c32
-rw-r--r--lib/dirent_.h50
-rw-r--r--lib/dirfd.c29
-rw-r--r--lib/dirfd.h29
-rw-r--r--lib/dirname.c85
-rw-r--r--lib/dirname.h70
-rw-r--r--lib/dup-safer.c45
-rw-r--r--lib/dup2.c58
-rw-r--r--lib/error.c338
-rw-r--r--lib/error.h66
-rw-r--r--lib/exclude.c275
-rw-r--r--lib/exclude.h44
-rw-r--r--lib/exitfail.c26
-rw-r--r--lib/exitfail.h20
-rw-r--r--lib/fchdir.c279
-rw-r--r--lib/fchmodat.c50
-rw-r--r--lib/fchown-stub.c16
-rw-r--r--lib/fchownat.c50
-rw-r--r--lib/fcntl--.h28
-rw-r--r--lib/fcntl-safer.h24
-rw-r--r--lib/fcntl_.h125
-rw-r--r--lib/fd-safer.c57
-rw-r--r--lib/fileblocks.c75
-rw-r--r--lib/float+.h148
-rw-r--r--lib/float_.h63
-rw-r--r--lib/fnmatch.c354
-rw-r--r--lib/fnmatch_.h65
-rw-r--r--lib/fnmatch_loop.c1210
-rw-r--r--lib/fstatat.c57
-rw-r--r--lib/ftruncate.c90
-rw-r--r--lib/full-write.c81
-rw-r--r--lib/full-write.h35
-rw-r--r--lib/getcwd.c428
-rw-r--r--lib/getdate.c3289
-rw-r--r--lib/getdate.h23
-rw-r--r--lib/getdate.y1520
-rw-r--r--lib/getdelim.c126
-rw-r--r--lib/getdelim.h28
-rw-r--r--lib/getline.c30
-rw-r--r--lib/getline.h28
-rw-r--r--lib/getopt.c1191
-rw-r--r--lib/getopt1.c171
-rw-r--r--lib/getopt_.h226
-rw-r--r--lib/getopt_int.h131
-rw-r--r--lib/getpagesize.h68
-rw-r--r--lib/gettext.h270
-rw-r--r--lib/gettime.c49
-rw-r--r--lib/gettimeofday.c142
-rw-r--r--lib/gnulib.mk1553
-rw-r--r--lib/hash.c1048
-rw-r--r--lib/hash.h88
-rw-r--r--lib/human.c479
-rw-r--r--lib/human.h83
-rw-r--r--lib/imaxtostr.c3
-rw-r--r--lib/intprops.h78
-rw-r--r--lib/inttostr.c51
-rw-r--r--lib/inttostr.h30
-rw-r--r--lib/inttypes_.h1100
-rw-r--r--lib/lchown.c47
-rw-r--r--lib/lchown.h42
-rw-r--r--lib/localcharset.c460
-rw-r--r--lib/localcharset.h41
-rw-r--r--lib/lstat.c76
-rw-r--r--lib/lstat.h24
-rw-r--r--lib/malloc.c35
-rw-r--r--lib/mbchar.c36
-rw-r--r--lib/mbchar.h353
-rw-r--r--lib/mbscasecmp.c103
-rw-r--r--lib/mbuiter.h222
-rw-r--r--lib/memchr.c201
-rw-r--r--lib/mempcpy.c29
-rw-r--r--lib/memrchr.c190
-rw-r--r--lib/memset.c28
-rw-r--r--lib/mkdirat.c43
-rw-r--r--lib/mkdtemp.c39
-rw-r--r--lib/mktime.c663
-rw-r--r--lib/modechange.c386
-rw-r--r--lib/modechange.h31
-rw-r--r--lib/obstack.c431
-rw-r--r--lib/obstack.h513
-rw-r--r--lib/offtostr.c3
-rw-r--r--lib/open-safer.c50
-rw-r--r--lib/openat-die.c51
-rw-r--r--lib/openat-priv.h55
-rw-r--r--lib/openat-proc.c95
-rw-r--r--lib/openat.c270
-rw-r--r--lib/openat.h127
-rw-r--r--lib/pathmax.h47
-rw-r--r--lib/paxerror.c365
-rw-r--r--lib/paxexit.c28
-rw-r--r--lib/paxlib.h115
-rw-r--r--lib/paxnames.c156
-rw-r--r--lib/pipe-safer.c57
-rw-r--r--lib/prepargs.c95
-rw-r--r--lib/prepargs.h3
-rw-r--r--lib/printf-args.c139
-rw-r--r--lib/printf-args.h132
-rw-r--r--lib/printf-parse.c535
-rw-r--r--lib/printf-parse.h74
-rw-r--r--lib/quote.c41
-rw-r--r--lib/quote.h22
-rw-r--r--lib/quotearg.c697
-rw-r--r--lib/quotearg.h140
-rw-r--r--lib/readlink.c50
-rw-r--r--lib/ref-add.sin30
-rw-r--r--lib/ref-del.sin25
-rw-r--r--lib/regcomp.c3832
-rw-r--r--lib/regex.c71
-rw-r--r--lib/regex.h675
-rw-r--r--lib/regex_internal.c1741
-rw-r--r--lib/regex_internal.h857
-rw-r--r--lib/regexec.c4399
-rw-r--r--lib/rmdir.c74
-rw-r--r--lib/rmt.h99
-rw-r--r--lib/rpmatch.c79
-rw-r--r--lib/rtapelib.c740
-rw-r--r--lib/safe-read.c78
-rw-r--r--lib/safe-read.h35
-rw-r--r--lib/safe-write.c19
-rw-r--r--lib/safe-write.h25
-rw-r--r--lib/same-inode.h26
-rw-r--r--lib/save-cwd.c103
-rw-r--r--lib/save-cwd.h34
-rw-r--r--lib/savedir.c137
-rw-r--r--lib/savedir.h27
-rw-r--r--lib/setenv.c332
-rw-r--r--lib/setenv.h54
-rw-r--r--lib/sleep.c47
-rw-r--r--lib/stat-macros.h3
-rw-r--r--lib/stat-time.h184
-rw-r--r--lib/stdbool_.h118
-rw-r--r--lib/stdint_.h512
-rw-r--r--lib/stdio_.h320
-rw-r--r--lib/stdlib_.h140
-rw-r--r--lib/stdopen.c77
-rw-r--r--lib/stdopen.h16
-rw-r--r--lib/stpcpy.c49
-rw-r--r--lib/strcasecmp.c63
-rw-r--r--lib/strchrnul.c32
-rw-r--r--lib/strdup.c55
-rw-r--r--lib/strerror.c57
-rw-r--r--lib/string_.h546
-rw-r--r--lib/stripslash.c45
-rw-r--r--lib/strncasecmp.c63
-rw-r--r--lib/strndup.c37
-rw-r--r--lib/strnlen.c31
-rw-r--r--lib/strnlen1.c36
-rw-r--r--lib/strnlen1.h40
-rw-r--r--lib/strtoimax.c76
-rw-r--r--lib/strtol.c436
-rw-r--r--lib/strtoll.c33
-rw-r--r--lib/strtoul.c20
-rw-r--r--lib/strtoull.c27
-rw-r--r--lib/strtoumax.c2
-rw-r--r--lib/sys_stat_.h284
-rw-r--r--lib/sys_time_.h52
-rw-r--r--lib/sysexits_.h72
-rw-r--r--lib/system-ioctl.h55
-rw-r--r--lib/system.h475
-rw-r--r--lib/tempname.c315
-rw-r--r--lib/tempname.h40
-rw-r--r--lib/time_.h125
-rw-r--r--lib/time_r.c47
-rw-r--r--lib/timespec.h37
-rw-r--r--lib/uinttostr.c3
-rw-r--r--lib/umaxtostr.c3
-rw-r--r--lib/unistd--.h28
-rw-r--r--lib/unistd-safer.h23
-rw-r--r--lib/unistd_.h242
-rw-r--r--lib/unlinkdir.c68
-rw-r--r--lib/unlinkdir.h27
-rw-r--r--lib/unlocked-io.h137
-rw-r--r--lib/unsetenv.c92
-rw-r--r--lib/utime.c109
-rw-r--r--lib/utimens.c189
-rw-r--r--lib/utimens.h3
-rw-r--r--lib/vasnprintf.c918
-rw-r--r--lib/vasnprintf.h81
-rw-r--r--lib/verify.h141
-rw-r--r--lib/version-etc-fsf.c31
-rw-r--r--lib/version-etc.c173
-rw-r--r--lib/version-etc.h37
-rw-r--r--lib/vsnprintf.c76
-rw-r--r--lib/waitpid.c75
-rw-r--r--lib/wchar_.h50
-rw-r--r--lib/wctype_.h165
-rw-r--r--lib/wcwidth.h57
-rw-r--r--lib/xalloc-die.c42
-rw-r--r--lib/xalloc.h271
-rw-r--r--lib/xgetcwd.c41
-rw-r--r--lib/xgetcwd.h18
-rw-r--r--lib/xmalloc.c123
-rw-r--r--lib/xstrndup.c37
-rw-r--r--lib/xstrndup.h24
-rw-r--r--lib/xstrtol.c263
-rw-r--r--lib/xstrtol.h87
-rw-r--r--lib/xstrtoul.c6
-rw-r--r--lib/xstrtoumax.c6
-rw-r--r--m4/absolute-header.m444
-rw-r--r--m4/alloca.m450
-rw-r--r--m4/allocsa.m414
-rw-r--r--m4/argmatch.m410
-rw-r--r--m4/argp.m465
-rw-r--r--m4/backupfile.m416
-rw-r--r--m4/bison.m424
-rwxr-xr-xm4/canonicalize-lgpl.m435
-rw-r--r--m4/chdir-long.m438
-rw-r--r--m4/chown.m483
-rw-r--r--m4/clock_time.m430
-rw-r--r--m4/close-stream.m413
-rw-r--r--m4/closeout.m413
-rw-r--r--m4/codeset.m421
-rw-r--r--m4/d-ino.m441
-rw-r--r--m4/dirfd.m474
-rw-r--r--m4/dirname.m418
-rw-r--r--m4/dos.m471
-rw-r--r--m4/double-slash-root.m438
-rw-r--r--m4/dup2.m415
-rw-r--r--m4/eealloc.m432
-rw-r--r--m4/eoverflow.m470
-rw-r--r--m4/error.m422
-rw-r--r--m4/exclude.m410
-rw-r--r--m4/exitfail.m413
-rw-r--r--m4/extensions.m458
-rw-r--r--m4/fchdir.m428
-rw-r--r--m4/fcntl-safer.m411
-rw-r--r--m4/fcntl_h.m481
-rw-r--r--m4/fileblocks.m420
-rw-r--r--m4/float_h.m421
-rw-r--r--m4/fnmatch.m4127
-rw-r--r--m4/fpending.m478
-rw-r--r--m4/ftruncate.m446
-rw-r--r--m4/getcwd-abort-bug.m4106
-rw-r--r--m4/getcwd-path-max.m4190
-rw-r--r--m4/getcwd.m464
-rw-r--r--m4/getdate.m433
-rw-r--r--m4/getdelim.m429
-rw-r--r--m4/getline.m479
-rw-r--r--m4/getopt.m483
-rw-r--r--m4/getpagesize.m413
-rw-r--r--m4/gettext.m4420
-rw-r--r--m4/gettime.m415
-rw-r--r--m4/gettimeofday.m4101
-rw-r--r--m4/glibc21.m430
-rw-r--r--m4/gnulib-common.m422
-rw-r--r--m4/gnulib-comp.m4613
-rw-r--r--m4/hash.m413
-rw-r--r--m4/human.m413
-rw-r--r--m4/iconv.m4180
-rw-r--r--m4/inline.m440
-rw-r--r--m4/intmax_t.m461
-rw-r--r--m4/inttostr.m437
-rw-r--r--m4/inttypes-pri.m436
-rw-r--r--m4/inttypes.m4223
-rw-r--r--m4/inttypes_h.m426
-rw-r--r--m4/lchown.m419
-rw-r--r--m4/lib-ld.m4110
-rw-r--r--m4/lib-link.m4709
-rw-r--r--m4/lib-prefix.m4185
-rw-r--r--m4/localcharset.m416
-rw-r--r--m4/longlong.m472
-rw-r--r--m4/lstat.m417
-rw-r--r--m4/mbchar.m413
-rw-r--r--m4/mbiter.m417
-rw-r--r--m4/mbrtowc.m431
-rw-r--r--m4/mbscasecmp.m416
-rw-r--r--m4/mbstate_t.m430
-rw-r--r--m4/memchr.m418
-rw-r--r--m4/mempcpy.m426
-rw-r--r--m4/memrchr.m425
-rw-r--r--m4/memset.m418
-rw-r--r--m4/mkdtemp.m420
-rw-r--r--m4/mktime.m4227
-rw-r--r--m4/modechange.m410
-rw-r--r--m4/nls.m431
-rw-r--r--m4/openat.m490
-rw-r--r--m4/pathmax.m411
-rw-r--r--m4/paxutils.m47
-rw-r--r--m4/po.m4428
-rw-r--r--m4/progtest.m492
-rw-r--r--m4/quote.m413
-rw-r--r--m4/quotearg.m415
-rw-r--r--m4/readlink.m429
-rw-r--r--m4/regex.m4211
-rw-r--r--m4/rmdir.m410
-rw-r--r--m4/rmt.m474
-rw-r--r--m4/rpmatch.m416
-rw-r--r--m4/rtapelib.m43
-rw-r--r--m4/safe-read.m418
-rw-r--r--m4/safe-write.m418
-rw-r--r--m4/save-cwd.m412
-rw-r--r--m4/savedir.m410
-rw-r--r--m4/setenv.m482
-rw-r--r--m4/sleep.m419
-rw-r--r--m4/ssize_t.m421
-rw-r--r--m4/stat-time.m485
-rw-r--r--m4/stdarg.m440
-rw-r--r--m4/stdbool.m4115
-rw-r--r--m4/stdint.m4371
-rw-r--r--m4/stdint_h.m426
-rw-r--r--m4/stdio_h.m479
-rw-r--r--m4/stdlib_h.m431
-rw-r--r--m4/stpcpy.m426
-rw-r--r--m4/strcase.m444
-rw-r--r--m4/strchrnul.m421
-rw-r--r--m4/strdup.m422
-rw-r--r--m4/strerror.m426
-rw-r--r--m4/string_h.m478
-rw-r--r--m4/strndup.m453
-rw-r--r--m4/strnlen.m431
-rw-r--r--m4/strtoimax.m434
-rw-r--r--m4/strtol.m410
-rw-r--r--m4/strtoll.m423
-rw-r--r--m4/strtoul.m410
-rw-r--r--m4/strtoull.m423
-rw-r--r--m4/strtoumax.m434
-rw-r--r--m4/sys_stat_h.m450
-rw-r--r--m4/sys_time_h.m461
-rw-r--r--m4/sysexits.m445
-rw-r--r--m4/system.m429
-rw-r--r--m4/tempname.m422
-rw-r--r--m4/time_h.m476
-rw-r--r--m4/time_r.m441
-rw-r--r--m4/timespec.m416
-rw-r--r--m4/tm_gmtoff.m414
-rw-r--r--m4/unistd-safer.m413
-rw-r--r--m4/unistd_h.m455
-rw-r--r--m4/unlinkdir.m433
-rw-r--r--m4/unlocked-io.m442
-rw-r--r--m4/utimbuf.m439
-rw-r--r--m4/utime.m430
-rw-r--r--m4/utimens.m415
-rw-r--r--m4/utimes-null.m441
-rw-r--r--m4/utimes.m483
-rw-r--r--m4/vasnprintf.m4181
-rw-r--r--m4/vsnprintf.m431
-rw-r--r--m4/wchar.m429
-rw-r--r--m4/wchar_t.m420
-rw-r--r--m4/wctype.m447
-rw-r--r--m4/wcwidth.m430
-rw-r--r--m4/wint_t.m428
-rw-r--r--m4/xalloc.m424
-rw-r--r--m4/xgetcwd.m412
-rw-r--r--m4/xstrndup.m415
-rw-r--r--m4/xstrtol.m411
-rw-r--r--po/LINGUAS36
-rw-r--r--po/Makefile.in.in405
-rw-r--r--po/Makevars59
-rw-r--r--po/POTFILES.in56
-rw-r--r--po/Rules-quot47
-rw-r--r--po/bg.gmobin0 -> 67504 bytes
-rw-r--r--po/bg.po2560
-rw-r--r--po/boldquot.sed10
-rw-r--r--po/cs.gmobin0 -> 12799 bytes
-rw-r--r--po/cs.po2865
-rw-r--r--po/da.gmobin0 -> 13055 bytes
-rw-r--r--po/da.po2879
-rw-r--r--po/de.gmobin0 -> 52998 bytes
-rw-r--r--po/de.po2454
-rw-r--r--po/el.gmobin0 -> 18264 bytes
-rw-r--r--po/el.po2879
-rw-r--r--po/en@boldquot.header25
-rw-r--r--po/en@quot.header22
-rw-r--r--po/es.gmobin0 -> 28353 bytes
-rw-r--r--po/es.po3650
-rw-r--r--po/et.gmobin0 -> 48007 bytes
-rw-r--r--po/et.po2401
-rw-r--r--po/eu.gmobin0 -> 39008 bytes
-rw-r--r--po/eu.po2448
-rw-r--r--po/fi.gmobin0 -> 38707 bytes
-rw-r--r--po/fi.po3086
-rw-r--r--po/fr.gmobin0 -> 28849 bytes
-rw-r--r--po/fr.po3319
-rw-r--r--po/ga.gmobin0 -> 52989 bytes
-rw-r--r--po/ga.po2596
-rw-r--r--po/gl.gmobin0 -> 13498 bytes
-rw-r--r--po/gl.po3097
-rw-r--r--po/hr.gmobin0 -> 13368 bytes
-rw-r--r--po/hr.po2880
-rw-r--r--po/hu.gmobin0 -> 55113 bytes
-rw-r--r--po/hu.po2482
-rw-r--r--po/id.gmobin0 -> 13096 bytes
-rw-r--r--po/id.po2836
-rw-r--r--po/insert-header.sin23
-rw-r--r--po/it.gmobin0 -> 27706 bytes
-rw-r--r--po/it.po3008
-rw-r--r--po/ja.gmobin0 -> 48858 bytes
-rw-r--r--po/ja.po2405
-rw-r--r--po/ko.gmobin0 -> 4874 bytes
-rw-r--r--po/ko.po3015
-rw-r--r--po/ky.gmobin0 -> 61837 bytes
-rw-r--r--po/ky.po2629
-rw-r--r--po/ms.gmobin0 -> 12403 bytes
-rw-r--r--po/ms.po2558
-rw-r--r--po/nb.gmobin0 -> 5418 bytes
-rw-r--r--po/nb.po3006
-rw-r--r--po/nl.gmobin0 -> 52261 bytes
-rw-r--r--po/nl.po2428
-rw-r--r--po/no.gmobin0 -> 5346 bytes
-rw-r--r--po/no.po3008
-rw-r--r--po/pl.gmobin0 -> 42892 bytes
-rw-r--r--po/pl.po2582
-rw-r--r--po/pt.gmobin0 -> 4574 bytes
-rw-r--r--po/pt.po3168
-rw-r--r--po/pt_BR.gmobin0 -> 13496 bytes
-rw-r--r--po/pt_BR.po2844
-rw-r--r--po/quot.sed6
-rw-r--r--po/remove-potcdate.sin19
-rw-r--r--po/ro.gmobin0 -> 27296 bytes
-rw-r--r--po/ro.po2561
-rw-r--r--po/ru.gmobin0 -> 67651 bytes
-rw-r--r--po/ru.po2569
-rw-r--r--po/rw.gmobin0 -> 692 bytes
-rw-r--r--po/rw.po2724
-rw-r--r--po/sk.gmobin0 -> 13154 bytes
-rw-r--r--po/sk.po2859
-rw-r--r--po/sl.gmobin0 -> 31603 bytes
-rw-r--r--po/sl.po3405
-rw-r--r--po/stamp-po1
-rw-r--r--po/sv.gmobin0 -> 50378 bytes
-rw-r--r--po/sv.po2403
-rw-r--r--po/tar.pot2310
-rw-r--r--po/tr.gmobin0 -> 51890 bytes
-rw-r--r--po/tr.po2394
-rw-r--r--po/uk.gmobin0 -> 69655 bytes
-rw-r--r--po/uk.po2583
-rw-r--r--po/vi.gmobin0 -> 29903 bytes
-rw-r--r--po/vi.po2557
-rw-r--r--po/zh_CN.gmobin0 -> 15374 bytes
-rw-r--r--po/zh_CN.po2762
-rw-r--r--rmt/Makefile.am13
-rw-r--r--rmt/Makefile.in733
-rw-r--r--rmt/rmt.c676
-rw-r--r--scripts/Makefile.am49
-rw-r--r--scripts/Makefile.in705
-rw-r--r--scripts/backup-specs100
-rw-r--r--scripts/backup.in253
-rw-r--r--scripts/backup.sh.in347
-rw-r--r--scripts/dump-remind.in103
-rw-r--r--scripts/restore.in229
-rw-r--r--src/Makefile.am46
-rw-r--r--src/Makefile.in776
-rw-r--r--src/arith.h27
-rw-r--r--src/buffer.c1696
-rw-r--r--src/common.h738
-rw-r--r--src/compare.c609
-rw-r--r--src/create.c1785
-rw-r--r--src/delete.c391
-rw-r--r--src/extract.c1379
-rw-r--r--src/incremen.c1473
-rw-r--r--src/list.c1341
-rw-r--r--src/misc.c748
-rw-r--r--src/names.c1022
-rw-r--r--src/sparse.c1175
-rw-r--r--src/system.c844
-rw-r--r--src/tar.c2427
-rw-r--r--src/tar.h331
-rw-r--r--src/transform.c527
-rw-r--r--src/update.c210
-rw-r--r--src/utf8.c97
-rw-r--r--src/xheader.c1516
-rw-r--r--tests/Makefile.am161
-rw-r--r--tests/Makefile.in817
-rw-r--r--tests/T-empty.at52
-rw-r--r--tests/T-null.at46
-rw-r--r--tests/append.at34
-rw-r--r--tests/append01.at48
-rw-r--r--tests/append02.at75
-rw-r--r--tests/argcv.c396
-rw-r--r--tests/argcv.h50
-rw-r--r--tests/atlocal.in33
-rw-r--r--tests/chtype.at73
-rw-r--r--tests/comprec.at41
-rw-r--r--tests/delete01.at36
-rw-r--r--tests/delete02.at44
-rw-r--r--tests/delete03.at48
-rw-r--r--tests/delete04.at53
-rw-r--r--tests/delete05.at48
-rw-r--r--tests/exclude.at161
-rw-r--r--tests/extrac01.at33
-rw-r--r--tests/extrac02.at37
-rw-r--r--tests/extrac03.at37
-rw-r--r--tests/extrac04.at47
-rw-r--r--tests/extrac05.at61
-rw-r--r--tests/extrac06.at72
-rw-r--r--tests/extrac07.at57
-rw-r--r--tests/genfile.c884
-rw-r--r--tests/grow.at40
-rw-r--r--tests/gzip.at42
-rw-r--r--tests/ignfail.at77
-rw-r--r--tests/incr01.at55
-rw-r--r--tests/incr02.at77
-rw-r--r--tests/incr03.at78
-rw-r--r--tests/incr04.at63
-rw-r--r--tests/incremental.at60
-rw-r--r--tests/indexfile.at47
-rw-r--r--tests/link01.at55
-rw-r--r--tests/listed01.at63
-rw-r--r--tests/listed02.at150
-rw-r--r--tests/long01.at49
-rw-r--r--tests/longv7.at48
-rw-r--r--tests/lustar01.at37
-rw-r--r--tests/lustar02.at42
-rw-r--r--tests/lustar03.at43
-rw-r--r--tests/multiv01.at66
-rw-r--r--tests/multiv02.at49
-rw-r--r--tests/multiv03.at71
-rw-r--r--tests/multiv04.at66
-rw-r--r--tests/multiv05.at67
-rw-r--r--tests/old.at37
-rw-r--r--tests/options.at37
-rw-r--r--tests/options02.at39
-rw-r--r--tests/package.m46
-rw-r--r--tests/pipe.at54
-rw-r--r--tests/recurse.at34
-rw-r--r--tests/rename01.at89
-rw-r--r--tests/rename02.at102
-rw-r--r--tests/rename03.at126
-rw-r--r--tests/same-order01.at47
-rw-r--r--tests/same-order02.at49
-rw-r--r--tests/shortrec.at39
-rw-r--r--tests/sparse01.at52
-rw-r--r--tests/sparse02.at41
-rw-r--r--tests/sparse03.at56
-rw-r--r--tests/sparsemv.at65
-rw-r--r--tests/sparsemvp.at60
-rw-r--r--tests/spmvp00.at26
-rw-r--r--tests/spmvp01.at26
-rw-r--r--tests/spmvp10.at26
-rw-r--r--tests/star/README68
-rw-r--r--tests/star/gtarfail.at40
-rw-r--r--tests/star/gtarfail2.at45
-rw-r--r--tests/star/multi-fail.at89
-rw-r--r--tests/star/pax-big-10g.at43
-rwxr-xr-xtests/star/quicktest.sh108
-rw-r--r--tests/star/ustar-big-2g.at42
-rw-r--r--tests/star/ustar-big-8g.at42
-rwxr-xr-xtests/testsuite27410
-rw-r--r--tests/testsuite.at194
-rw-r--r--tests/truncate.at53
-rw-r--r--tests/update.at50
-rw-r--r--tests/verbose.at44
-rw-r--r--tests/version.at35
-rw-r--r--tests/volsize.at60
-rw-r--r--tests/volume.at58
634 files changed, 333221 insertions, 0 deletions
diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644
index 0000000..ec20977
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,1101 @@
+1 Notes on the Free Translation Project
+***************************************
+
+Free software is going international! The Free Translation Project is
+a way to get maintainers of free software, translators, and users all
+together, so that free software will gradually become able to speak many
+languages. A few packages already provide translations for their
+messages.
+
+ If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site. But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work on translations can contact the appropriate team.
+
+ When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used. The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+1.1 Quick configuration advice
+==============================
+
+If you want to exploit the full power of internationalization, you
+should configure it using
+
+ ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed. So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias, message inheritance, automatic
+charset conversion or plural form handling) as the implementation here.
+It is also not possible to offer this additional functionality on top
+of a `catgets' implementation. Future versions of GNU `gettext' will
+very likely convey even more functionality. So it might be a good idea
+to change to GNU `gettext' as soon as possible.
+
+ So you need _not_ provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+1.2 INSTALL Matters
+===================
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language. Most such
+packages use GNU `gettext'. Other packages have their own ways to
+internationalization, predating GNU `gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system already
+provides the GNU `gettext' functions. If not, the included GNU
+`gettext' library will be used. This library is wholly contained
+within this package, usually in the `intl/' subdirectory, so prior
+installation of the GNU `gettext' package is _not_ required.
+Installers may use special options at configuration time for changing
+the default behaviour. The commands:
+
+ ./configure --with-included-gettext
+ ./configure --disable-nls
+
+will, respectively, bypass any pre-existing `gettext' to use the
+internationalizing routines provided within this package, or else,
+_totally_ disable translation of messages.
+
+ When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this. This might not be desirable. You should use
+the more recent version of the GNU `gettext' library. I.e. if the file
+`intl/VERSION' shows that the library which comes with this package is
+more recent, you should use
+
+ ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+ The configuration process will not test for the `catgets' function
+and therefore it will not be used. The reason is that even an
+emulation of `gettext' on top of `catgets' could not provide all the
+extensions of the GNU `gettext' library.
+
+ Internationalized packages usually have many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language. Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+1.3 Using This Package
+======================
+
+As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code,
+and `CC' is an ISO 3166 two-letter country code. For example, let's
+suppose that you speak German and live in Germany. At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+ You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries. For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
+country code serves to distinguish the dialects.
+
+ The locale naming convention of `LL_CC', with `LL' denoting the
+language and `CC' denoting the country, is the one use on systems based
+on GNU libc. On other systems, some variations of this scheme are
+used, such as `LL' or `LL_CC.ENCODING'. You can get the list of
+locales supported by your system for your language by running the
+command `locale -a | grep '^LL''.
+
+ Not all programs have translations for all languages. By default, an
+English message is shown in place of a nonexistent translation. If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries. For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+ Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from `no' to `nb' recently (in 2003). During the
+transition period, while some message catalogs for this language are
+installed under `nb' and some older ones under `no', it's recommended
+for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
+older translations are used.
+
+ In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect. For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+1.4 Translating Teams
+=====================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list. The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National 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 `translation@iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skills are praised more than
+programming skills, here.
+
+1.5 Available Packages
+======================
+
+Languages are not equally supported in all packages. The following
+matrix shows the current state of internationalization, as of October
+2006. The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+ Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo
+ +----------------------------------------------------+
+ GNUnet | [] |
+ a2ps | [] [] [] [] [] |
+ aegis | () |
+ ant-phone | () |
+ anubis | [] |
+ ap-utils | |
+ aspell | [] [] [] [] [] |
+ bash | [] [] [] |
+ batchelor | [] |
+ bfd | |
+ bibshelf | [] |
+ binutils | [] |
+ bison | [] [] |
+ bison-runtime | |
+ bluez-pin | [] [] [] [] [] |
+ cflow | [] |
+ clisp | [] [] |
+ console-tools | [] [] |
+ coreutils | [] [] [] |
+ cpio | |
+ cpplib | [] [] [] |
+ cryptonit | [] |
+ darkstat | [] () [] |
+ dialog | [] [] [] [] [] [] |
+ diffutils | [] [] [] [] [] [] |
+ doodle | [] |
+ e2fsprogs | [] [] |
+ enscript | [] [] [] [] |
+ error | [] [] [] [] |
+ fetchmail | [] [] () [] |
+ fileutils | [] [] |
+ findutils | [] [] [] |
+ flex | [] [] [] |
+ fslint | [] |
+ gas | |
+ gawk | [] [] [] |
+ gbiff | [] |
+ gcal | [] |
+ gcc | [] |
+ gettext-examples | [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] |
+ gettext-tools | [] [] |
+ gimp-print | [] [] [] [] |
+ gip | [] |
+ gliv | [] |
+ glunarclock | [] |
+ gmult | [] [] |
+ gnubiff | () |
+ gnucash | () () [] |
+ gnucash-glossary | [] () |
+ gnuedu | |
+ gnulib | [] [] [] [] [] [] |
+ gnunet-gtk | |
+ gnutls | |
+ gpe-aerial | [] [] |
+ gpe-beam | [] [] |
+ gpe-calendar | |
+ gpe-clock | [] [] |
+ gpe-conf | [] [] |
+ gpe-contacts | |
+ gpe-edit | [] |
+ gpe-filemanager | |
+ gpe-go | [] |
+ gpe-login | [] [] |
+ gpe-ownerinfo | [] [] |
+ gpe-package | |
+ gpe-sketchbook | [] [] |
+ gpe-su | [] [] |
+ gpe-taskmanager | [] [] |
+ gpe-timesheet | [] |
+ gpe-today | [] [] |
+ gpe-todo | |
+ gphoto2 | [] [] [] [] |
+ gprof | [] [] |
+ gpsdrive | () () |
+ gramadoir | [] [] |
+ grep | [] [] [] [] [] [] |
+ gretl | |
+ gsasl | |
+ gss | |
+ gst-plugins | [] [] [] [] |
+ gst-plugins-base | [] [] [] |
+ gst-plugins-good | [] [] [] [] [] [] [] |
+ gstreamer | [] [] [] [] [] [] [] |
+ gtick | () |
+ gtkam | [] [] [] |
+ gtkorphan | [] [] |
+ gtkspell | [] [] [] [] |
+ gutenprint | [] |
+ hello | [] [] [] [] [] |
+ id-utils | [] [] |
+ impost | |
+ indent | [] [] [] |
+ iso_3166 | [] [] |
+ iso_3166_2 | |
+ iso_4217 | [] |
+ iso_639 | [] [] |
+ jpilot | [] |
+ jtag | |
+ jwhois | |
+ kbd | [] [] [] [] |
+ keytouch | |
+ keytouch-editor | |
+ keytouch-keyboa... | |
+ latrine | () |
+ ld | [] |
+ leafpad | [] [] [] [] [] |
+ libc | [] [] [] [] [] |
+ libexif | [] |
+ libextractor | [] |
+ libgpewidget | [] [] [] |
+ libgpg-error | [] |
+ libgphoto2 | [] [] |
+ libgphoto2_port | [] [] |
+ libgsasl | |
+ libiconv | [] [] |
+ libidn | [] [] |
+ lifelines | [] () |
+ lilypond | [] |
+ lingoteach | |
+ lynx | [] [] [] [] |
+ m4 | [] [] [] [] |
+ mailutils | [] |
+ make | [] [] |
+ man-db | [] () [] [] |
+ minicom | [] [] [] |
+ mysecretdiary | [] [] |
+ nano | [] [] [] |
+ nano_1_0 | [] () [] [] |
+ opcodes | [] |
+ parted | |
+ pilot-qof | [] |
+ psmisc | [] |
+ pwdutils | |
+ python | |
+ qof | |
+ radius | [] |
+ recode | [] [] [] [] [] [] |
+ rpm | [] [] |
+ screem | |
+ scrollkeeper | [] [] [] [] [] [] [] [] |
+ sed | [] [] [] |
+ sh-utils | [] [] |
+ shared-mime-info | [] [] [] [] |
+ sharutils | [] [] [] [] [] [] |
+ shishi | |
+ silky | |
+ skencil | [] () |
+ sketch | [] () |
+ solfege | |
+ soundtracker | [] [] |
+ sp | [] |
+ stardict | [] |
+ system-tools-ba... | [] [] [] [] [] [] [] [] [] |
+ tar | [] |
+ texinfo | [] [] [] |
+ textutils | [] [] [] |
+ tin | () () |
+ tp-robot | [] |
+ tuxpaint | [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] [] [] |
+ vorbis-tools | [] [] [] [] |
+ wastesedge | () |
+ wdiff | [] [] [] [] |
+ wget | [] [] |
+ xchat | [] [] [] [] [] [] |
+ xkeyboard-config | |
+ xpad | [] [] |
+ +----------------------------------------------------+
+ af am ar az be bg bs ca cs cy da de el en en_GB eo
+ 10 0 1 2 9 22 1 42 41 2 60 95 16 1 17 16
+
+ es et eu fa fi fr ga gl gu he hi hr hu id is it
+ +--------------------------------------------------+
+ GNUnet | |
+ a2ps | [] [] [] () |
+ aegis | |
+ ant-phone | [] |
+ anubis | [] |
+ ap-utils | [] [] |
+ aspell | [] [] [] |
+ bash | [] [] [] |
+ batchelor | [] [] |
+ bfd | [] |
+ bibshelf | [] [] [] |
+ binutils | [] [] [] |
+ bison | [] [] [] [] [] [] |
+ bison-runtime | [] [] [] [] [] |
+ bluez-pin | [] [] [] [] [] |
+ cflow | [] |
+ clisp | [] [] |
+ console-tools | |
+ coreutils | [] [] [] [] [] [] |
+ cpio | [] [] [] |
+ cpplib | [] [] |
+ cryptonit | [] |
+ darkstat | [] () [] [] [] |
+ dialog | [] [] [] [] [] [] [] [] |
+ diffutils | [] [] [] [] [] [] [] [] [] |
+ doodle | [] [] |
+ e2fsprogs | [] [] [] |
+ enscript | [] [] [] |
+ error | [] [] [] [] [] |
+ fetchmail | [] |
+ fileutils | [] [] [] [] [] [] |
+ findutils | [] [] [] [] |
+ flex | [] [] [] |
+ fslint | [] |
+ gas | [] [] |
+ gawk | [] [] [] [] |
+ gbiff | [] |
+ gcal | [] [] |
+ gcc | [] |
+ gettext-examples | [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] |
+ gettext-tools | [] [] [] |
+ gimp-print | [] [] |
+ gip | [] [] [] |
+ gliv | () |
+ glunarclock | [] [] [] |
+ gmult | [] [] [] |
+ gnubiff | () () |
+ gnucash | () () () |
+ gnucash-glossary | [] [] |
+ gnuedu | [] |
+ gnulib | [] [] [] [] [] [] [] [] |
+ gnunet-gtk | |
+ gnutls | |
+ gpe-aerial | [] [] |
+ gpe-beam | [] [] |
+ gpe-calendar | |
+ gpe-clock | [] [] [] [] |
+ gpe-conf | [] |
+ gpe-contacts | [] [] |
+ gpe-edit | [] [] [] [] |
+ gpe-filemanager | [] |
+ gpe-go | [] [] [] |
+ gpe-login | [] [] [] |
+ gpe-ownerinfo | [] [] [] [] [] |
+ gpe-package | [] |
+ gpe-sketchbook | [] [] |
+ gpe-su | [] [] [] [] |
+ gpe-taskmanager | [] [] [] |
+ gpe-timesheet | [] [] [] [] |
+ gpe-today | [] [] [] [] |
+ gpe-todo | [] |
+ gphoto2 | [] [] [] [] [] |
+ gprof | [] [] [] [] |
+ gpsdrive | () () [] () |
+ gramadoir | [] [] |
+ grep | [] [] [] [] [] [] [] [] [] [] [] [] |
+ gretl | [] [] [] |
+ gsasl | [] [] |
+ gss | [] |
+ gst-plugins | [] [] [] |
+ gst-plugins-base | [] [] |
+ gst-plugins-good | [] [] [] |
+ gstreamer | [] [] [] |
+ gtick | [] |
+ gtkam | [] [] [] [] |
+ gtkorphan | [] [] |
+ gtkspell | [] [] [] [] [] [] |
+ gutenprint | [] |
+ hello | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ id-utils | [] [] [] [] [] |
+ impost | [] [] |
+ indent | [] [] [] [] [] [] [] [] [] [] |
+ iso_3166 | [] [] [] |
+ iso_3166_2 | [] |
+ iso_4217 | [] [] [] [] |
+ iso_639 | [] [] [] [] [] |
+ jpilot | [] [] |
+ jtag | [] |
+ jwhois | [] [] [] [] [] |
+ kbd | [] [] |
+ keytouch | [] |
+ keytouch-editor | [] |
+ keytouch-keyboa... | [] |
+ latrine | [] [] [] |
+ ld | [] [] |
+ leafpad | [] [] [] [] [] [] |
+ libc | [] [] [] [] [] |
+ libexif | [] |
+ libextractor | [] |
+ libgpewidget | [] [] [] [] [] |
+ libgpg-error | |
+ libgphoto2 | [] [] [] |
+ libgphoto2_port | [] [] |
+ libgsasl | [] [] |
+ libiconv | [] [] |
+ libidn | [] [] |
+ lifelines | () |
+ lilypond | [] |
+ lingoteach | [] [] [] |
+ lynx | [] [] [] |
+ m4 | [] [] [] [] |
+ mailutils | [] [] |
+ make | [] [] [] [] [] [] [] [] |
+ man-db | () |
+ minicom | [] [] [] [] |
+ mysecretdiary | [] [] [] |
+ nano | [] [] [] [] [] [] |
+ nano_1_0 | [] [] [] [] [] |
+ opcodes | [] [] [] [] |
+ parted | [] [] [] [] |
+ pilot-qof | |
+ psmisc | [] [] [] |
+ pwdutils | |
+ python | |
+ qof | [] |
+ radius | [] [] |
+ recode | [] [] [] [] [] [] [] [] |
+ rpm | [] [] |
+ screem | |
+ scrollkeeper | [] [] [] |
+ sed | [] [] [] [] [] |
+ sh-utils | [] [] [] [] [] [] [] |
+ shared-mime-info | [] [] [] [] [] [] |
+ sharutils | [] [] [] [] [] [] [] [] |
+ shishi | |
+ silky | [] |
+ skencil | [] [] |
+ sketch | [] [] |
+ solfege | [] |
+ soundtracker | [] [] [] |
+ sp | [] |
+ stardict | [] |
+ system-tools-ba... | [] [] [] [] [] [] [] [] |
+ tar | [] [] [] [] [] [] [] |
+ texinfo | [] [] |
+ textutils | [] [] [] [] [] |
+ tin | [] () |
+ tp-robot | [] [] [] [] |
+ tuxpaint | [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | [] [] |
+ util-linux | [] [] [] [] [] [] [] |
+ vorbis-tools | [] [] |
+ wastesedge | () |
+ wdiff | [] [] [] [] [] [] [] [] |
+ wget | [] [] [] [] [] [] [] [] |
+ xchat | [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] [] |
+ xpad | [] [] [] |
+ +--------------------------------------------------+
+ es et eu fa fi fr ga gl gu he hi hr hu id is it
+ 88 22 14 2 40 115 61 14 1 8 1 6 59 31 0 52
+
+ ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no
+ +-------------------------------------------------+
+ GNUnet | |
+ a2ps | () [] [] () |
+ aegis | () |
+ ant-phone | [] |
+ anubis | [] [] [] |
+ ap-utils | [] |
+ aspell | [] [] |
+ bash | [] |
+ batchelor | [] [] |
+ bfd | |
+ bibshelf | [] |
+ binutils | |
+ bison | [] [] [] |
+ bison-runtime | [] [] [] |
+ bluez-pin | [] [] [] |
+ cflow | |
+ clisp | [] |
+ console-tools | |
+ coreutils | [] |
+ cpio | |
+ cpplib | [] |
+ cryptonit | [] |
+ darkstat | [] [] |
+ dialog | [] [] |
+ diffutils | [] [] [] |
+ doodle | |
+ e2fsprogs | [] |
+ enscript | [] |
+ error | [] |
+ fetchmail | [] [] |
+ fileutils | [] [] |
+ findutils | [] |
+ flex | [] [] |
+ fslint | [] [] |
+ gas | |
+ gawk | [] [] |
+ gbiff | [] |
+ gcal | |
+ gcc | |
+ gettext-examples | [] [] |
+ gettext-runtime | [] [] [] |
+ gettext-tools | [] [] |
+ gimp-print | [] [] |
+ gip | [] [] |
+ gliv | [] |
+ glunarclock | [] [] |
+ gmult | [] [] |
+ gnubiff | |
+ gnucash | () () |
+ gnucash-glossary | [] |
+ gnuedu | |
+ gnulib | [] [] [] [] |
+ gnunet-gtk | |
+ gnutls | |
+ gpe-aerial | [] |
+ gpe-beam | [] |
+ gpe-calendar | [] |
+ gpe-clock | [] [] [] |
+ gpe-conf | [] [] |
+ gpe-contacts | [] |
+ gpe-edit | [] [] [] |
+ gpe-filemanager | [] [] |
+ gpe-go | [] [] [] |
+ gpe-login | [] [] [] |
+ gpe-ownerinfo | [] [] |
+ gpe-package | [] [] |
+ gpe-sketchbook | [] [] |
+ gpe-su | [] [] [] |
+ gpe-taskmanager | [] [] [] [] |
+ gpe-timesheet | [] |
+ gpe-today | [] [] |
+ gpe-todo | [] |
+ gphoto2 | [] [] |
+ gprof | |
+ gpsdrive | () () () |
+ gramadoir | () |
+ grep | [] [] [] [] |
+ gretl | |
+ gsasl | [] |
+ gss | |
+ gst-plugins | [] |
+ gst-plugins-base | |
+ gst-plugins-good | [] |
+ gstreamer | [] |
+ gtick | |
+ gtkam | [] |
+ gtkorphan | [] |
+ gtkspell | [] [] |
+ gutenprint | |
+ hello | [] [] [] [] [] [] |
+ id-utils | [] |
+ impost | |
+ indent | [] [] |
+ iso_3166 | [] |
+ iso_3166_2 | [] |
+ iso_4217 | [] [] [] |
+ iso_639 | [] [] |
+ jpilot | () () () |
+ jtag | |
+ jwhois | [] |
+ kbd | [] |
+ keytouch | [] |
+ keytouch-editor | |
+ keytouch-keyboa... | |
+ latrine | [] |
+ ld | |
+ leafpad | [] [] |
+ libc | [] [] [] [] [] |
+ libexif | |
+ libextractor | |
+ libgpewidget | [] |
+ libgpg-error | |
+ libgphoto2 | [] |
+ libgphoto2_port | [] |
+ libgsasl | [] |
+ libiconv | |
+ libidn | [] [] |
+ lifelines | [] |
+ lilypond | |
+ lingoteach | [] |
+ lynx | [] [] |
+ m4 | [] [] |
+ mailutils | |
+ make | [] [] [] |
+ man-db | () |
+ minicom | [] |
+ mysecretdiary | [] |
+ nano | [] [] [] |
+ nano_1_0 | [] [] [] |
+ opcodes | [] |
+ parted | [] [] |
+ pilot-qof | |
+ psmisc | [] [] [] |
+ pwdutils | |
+ python | |
+ qof | |
+ radius | |
+ recode | [] |
+ rpm | [] [] |
+ screem | [] |
+ scrollkeeper | [] [] [] [] |
+ sed | [] [] |
+ sh-utils | [] [] |
+ shared-mime-info | [] [] [] [] [] |
+ sharutils | [] [] |
+ shishi | |
+ silky | [] |
+ skencil | |
+ sketch | |
+ solfege | |
+ soundtracker | |
+ sp | () |
+ stardict | [] [] |
+ system-tools-ba... | [] [] [] [] |
+ tar | [] [] [] |
+ texinfo | [] [] [] |
+ textutils | [] [] [] |
+ tin | |
+ tp-robot | [] |
+ tuxpaint | [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] |
+ vorbis-tools | [] |
+ wastesedge | [] |
+ wdiff | [] [] |
+ wget | [] [] |
+ xchat | [] [] [] [] |
+ xkeyboard-config | [] |
+ xpad | [] [] [] |
+ +-------------------------------------------------+
+ ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no
+ 52 24 2 2 1 3 0 2 3 21 0 15 1 97 5 1
+
+ nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
+ +------------------------------------------------------+
+ GNUnet | |
+ a2ps | () [] [] [] [] [] [] |
+ aegis | () () |
+ ant-phone | [] [] |
+ anubis | [] [] [] |
+ ap-utils | () |
+ aspell | [] [] |
+ bash | [] [] [] |
+ batchelor | [] [] |
+ bfd | |
+ bibshelf | [] |
+ binutils | [] [] |
+ bison | [] [] [] [] [] |
+ bison-runtime | [] [] [] [] |
+ bluez-pin | [] [] [] [] [] [] [] [] [] |
+ cflow | [] |
+ clisp | [] |
+ console-tools | [] |
+ coreutils | [] [] [] [] |
+ cpio | [] [] [] |
+ cpplib | [] |
+ cryptonit | [] [] |
+ darkstat | [] [] [] [] [] [] |
+ dialog | [] [] [] [] [] [] [] [] [] |
+ diffutils | [] [] [] [] [] [] |
+ doodle | [] [] |
+ e2fsprogs | [] [] |
+ enscript | [] [] [] [] [] |
+ error | [] [] [] [] |
+ fetchmail | [] [] [] |
+ fileutils | [] [] [] [] [] |
+ findutils | [] [] [] [] [] [] |
+ flex | [] [] [] [] [] |
+ fslint | [] [] [] [] |
+ gas | |
+ gawk | [] [] [] [] |
+ gbiff | [] |
+ gcal | [] |
+ gcc | [] |
+ gettext-examples | [] [] [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] [] [] |
+ gettext-tools | [] [] [] [] [] [] [] |
+ gimp-print | [] [] |
+ gip | [] [] [] [] |
+ gliv | [] [] [] [] |
+ glunarclock | [] [] [] [] [] [] |
+ gmult | [] [] [] [] |
+ gnubiff | () |
+ gnucash | () [] |
+ gnucash-glossary | [] [] [] |
+ gnuedu | |
+ gnulib | [] [] [] [] [] |
+ gnunet-gtk | [] |
+ gnutls | [] [] |
+ gpe-aerial | [] [] [] [] [] [] [] |
+ gpe-beam | [] [] [] [] [] [] [] |
+ gpe-calendar | [] |
+ gpe-clock | [] [] [] [] [] [] [] [] |
+ gpe-conf | [] [] [] [] [] [] [] |
+ gpe-contacts | [] [] [] [] [] |
+ gpe-edit | [] [] [] [] [] [] [] [] |
+ gpe-filemanager | [] [] |
+ gpe-go | [] [] [] [] [] [] |
+ gpe-login | [] [] [] [] [] [] [] [] |
+ gpe-ownerinfo | [] [] [] [] [] [] [] [] |
+ gpe-package | [] [] |
+ gpe-sketchbook | [] [] [] [] [] [] [] [] |
+ gpe-su | [] [] [] [] [] [] [] [] |
+ gpe-taskmanager | [] [] [] [] [] [] [] [] |
+ gpe-timesheet | [] [] [] [] [] [] [] [] |
+ gpe-today | [] [] [] [] [] [] [] [] |
+ gpe-todo | [] [] [] [] |
+ gphoto2 | [] [] [] [] [] |
+ gprof | [] [] [] |
+ gpsdrive | [] [] [] |
+ gramadoir | [] [] |
+ grep | [] [] [] [] [] [] [] [] |
+ gretl | [] |
+ gsasl | [] [] [] |
+ gss | [] [] [] |
+ gst-plugins | [] [] [] [] |
+ gst-plugins-base | [] |
+ gst-plugins-good | [] [] [] [] |
+ gstreamer | [] [] [] |
+ gtick | [] |
+ gtkam | [] [] [] [] |
+ gtkorphan | [] |
+ gtkspell | [] [] [] [] [] [] [] [] |
+ gutenprint | [] |
+ hello | [] [] [] [] [] [] [] [] |
+ id-utils | [] [] [] [] |
+ impost | [] |
+ indent | [] [] [] [] [] [] |
+ iso_3166 | [] [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_4217 | [] [] [] [] |
+ iso_639 | [] [] [] [] |
+ jpilot | |
+ jtag | [] |
+ jwhois | [] [] [] [] |
+ kbd | [] [] [] |
+ keytouch | [] |
+ keytouch-editor | [] |
+ keytouch-keyboa... | [] |
+ latrine | [] [] |
+ ld | [] |
+ leafpad | [] [] [] [] [] [] |
+ libc | [] [] [] [] [] |
+ libexif | [] |
+ libextractor | [] [] |
+ libgpewidget | [] [] [] [] [] [] [] |
+ libgpg-error | [] [] |
+ libgphoto2 | [] |
+ libgphoto2_port | [] [] [] |
+ libgsasl | [] [] [] [] |
+ libiconv | [] [] |
+ libidn | [] [] () |
+ lifelines | [] [] |
+ lilypond | |
+ lingoteach | [] |
+ lynx | [] [] [] |
+ m4 | [] [] [] [] [] |
+ mailutils | [] [] [] [] |
+ make | [] [] [] [] |
+ man-db | [] [] |
+ minicom | [] [] [] [] [] |
+ mysecretdiary | [] [] [] [] |
+ nano | [] [] [] |
+ nano_1_0 | [] [] [] [] |
+ opcodes | [] [] |
+ parted | [] |
+ pilot-qof | [] |
+ psmisc | [] [] |
+ pwdutils | [] [] |
+ python | |
+ qof | [] [] |
+ radius | [] [] |
+ recode | [] [] [] [] [] [] [] |
+ rpm | [] [] [] [] |
+ screem | |
+ scrollkeeper | [] [] [] [] [] [] [] |
+ sed | [] [] [] [] [] [] [] [] [] |
+ sh-utils | [] [] [] |
+ shared-mime-info | [] [] [] [] [] |
+ sharutils | [] [] [] [] |
+ shishi | [] |
+ silky | [] |
+ skencil | [] [] [] |
+ sketch | [] [] [] |
+ solfege | [] |
+ soundtracker | [] [] |
+ sp | |
+ stardict | [] [] [] |
+ system-tools-ba... | [] [] [] [] [] [] [] [] [] |
+ tar | [] [] [] [] [] |
+ texinfo | [] [] [] [] |
+ textutils | [] [] [] |
+ tin | () |
+ tp-robot | [] |
+ tuxpaint | [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] [] [] |
+ vorbis-tools | [] [] |
+ wastesedge | |
+ wdiff | [] [] [] [] [] [] |
+ wget | [] [] [] [] |
+ xchat | [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] |
+ xpad | [] [] [] |
+ +------------------------------------------------------+
+ nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
+ 0 2 3 58 30 54 5 73 72 4 40 46 11 50 128 2
+
+ tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
+ +---------------------------------------------------+
+ GNUnet | [] | 2
+ a2ps | [] [] [] | 19
+ aegis | | 0
+ ant-phone | [] [] | 6
+ anubis | [] [] [] | 11
+ ap-utils | () [] | 4
+ aspell | [] [] [] | 15
+ bash | [] | 11
+ batchelor | [] [] | 9
+ bfd | | 1
+ bibshelf | [] | 7
+ binutils | [] [] [] | 9
+ bison | [] [] [] | 19
+ bison-runtime | [] [] [] | 15
+ bluez-pin | [] [] [] [] [] [] | 28
+ cflow | [] [] | 5
+ clisp | | 6
+ console-tools | [] [] | 5
+ coreutils | [] [] | 16
+ cpio | [] [] [] | 9
+ cpplib | [] [] [] [] | 11
+ cryptonit | | 5
+ darkstat | [] () () | 15
+ dialog | [] [] [] [] [] | 30
+ diffutils | [] [] [] [] | 28
+ doodle | [] | 6
+ e2fsprogs | [] [] | 10
+ enscript | [] [] [] | 16
+ error | [] [] [] [] | 18
+ fetchmail | [] [] | 12
+ fileutils | [] [] [] | 18
+ findutils | [] [] [] | 17
+ flex | [] [] | 15
+ fslint | [] | 9
+ gas | [] | 3
+ gawk | [] [] | 15
+ gbiff | [] | 5
+ gcal | [] | 5
+ gcc | [] [] [] | 6
+ gettext-examples | [] [] [] [] [] [] | 27
+ gettext-runtime | [] [] [] [] [] [] | 28
+ gettext-tools | [] [] [] [] [] | 19
+ gimp-print | [] [] | 12
+ gip | [] [] | 12
+ gliv | [] [] | 8
+ glunarclock | [] [] [] | 15
+ gmult | [] [] [] [] | 15
+ gnubiff | [] | 1
+ gnucash | () | 2
+ gnucash-glossary | [] [] | 9
+ gnuedu | [] | 2
+ gnulib | [] [] [] [] [] | 28
+ gnunet-gtk | | 1
+ gnutls | | 2
+ gpe-aerial | [] [] | 14
+ gpe-beam | [] [] | 14
+ gpe-calendar | [] | 3
+ gpe-clock | [] [] [] [] | 21
+ gpe-conf | [] [] | 14
+ gpe-contacts | [] [] | 10
+ gpe-edit | [] [] [] [] | 20
+ gpe-filemanager | [] | 6
+ gpe-go | [] [] | 15
+ gpe-login | [] [] [] [] [] | 21
+ gpe-ownerinfo | [] [] [] [] | 21
+ gpe-package | [] | 6
+ gpe-sketchbook | [] [] | 16
+ gpe-su | [] [] [] | 20
+ gpe-taskmanager | [] [] [] | 20
+ gpe-timesheet | [] [] [] [] | 18
+ gpe-today | [] [] [] [] [] | 21
+ gpe-todo | [] | 7
+ gphoto2 | [] [] [] [] | 20
+ gprof | [] [] | 11
+ gpsdrive | | 4
+ gramadoir | [] | 7
+ grep | [] [] [] [] | 34
+ gretl | | 4
+ gsasl | [] [] | 8
+ gss | [] | 5
+ gst-plugins | [] [] [] | 15
+ gst-plugins-base | [] [] [] | 9
+ gst-plugins-good | [] [] [] [] [] | 20
+ gstreamer | [] [] [] | 17
+ gtick | [] | 3
+ gtkam | [] | 13
+ gtkorphan | [] | 7
+ gtkspell | [] [] [] [] [] [] | 26
+ gutenprint | | 3
+ hello | [] [] [] [] [] | 37
+ id-utils | [] [] | 14
+ impost | [] | 4
+ indent | [] [] [] [] | 25
+ iso_3166 | [] [] [] [] | 16
+ iso_3166_2 | | 2
+ iso_4217 | [] [] | 14
+ iso_639 | [] | 14
+ jpilot | [] [] [] [] | 7
+ jtag | [] | 3
+ jwhois | [] [] [] | 13
+ kbd | [] [] | 12
+ keytouch | [] | 4
+ keytouch-editor | | 2
+ keytouch-keyboa... | [] | 3
+ latrine | [] [] | 8
+ ld | [] [] [] [] | 8
+ leafpad | [] [] [] [] | 23
+ libc | [] [] [] | 23
+ libexif | [] | 4
+ libextractor | [] | 5
+ libgpewidget | [] [] [] | 19
+ libgpg-error | [] | 4
+ libgphoto2 | [] | 8
+ libgphoto2_port | [] [] [] | 11
+ libgsasl | [] | 8
+ libiconv | [] | 7
+ libidn | [] [] | 10
+ lifelines | | 4
+ lilypond | | 2
+ lingoteach | [] | 6
+ lynx | [] [] [] | 15
+ m4 | [] [] [] | 18
+ mailutils | [] | 8
+ make | [] [] [] | 20
+ man-db | [] | 6
+ minicom | [] | 14
+ mysecretdiary | [] [] | 12
+ nano | [] [] | 17
+ nano_1_0 | [] [] [] | 18
+ opcodes | [] [] | 10
+ parted | [] [] [] | 10
+ pilot-qof | [] | 3
+ psmisc | [] | 10
+ pwdutils | [] | 3
+ python | | 0
+ qof | [] | 4
+ radius | [] | 6
+ recode | [] [] [] | 25
+ rpm | [] [] [] [] | 14
+ screem | [] | 2
+ scrollkeeper | [] [] [] [] | 26
+ sed | [] [] [] | 22
+ sh-utils | [] | 15
+ shared-mime-info | [] [] [] [] | 24
+ sharutils | [] [] [] | 23
+ shishi | | 1
+ silky | [] | 4
+ skencil | [] | 7
+ sketch | | 6
+ solfege | | 2
+ soundtracker | [] [] | 9
+ sp | [] | 3
+ stardict | [] [] [] [] | 11
+ system-tools-ba... | [] [] [] [] [] [] [] | 37
+ tar | [] [] [] [] | 20
+ texinfo | [] [] [] | 15
+ textutils | [] [] [] | 17
+ tin | | 1
+ tp-robot | [] [] [] | 10
+ tuxpaint | [] [] [] | 16
+ unicode-han-tra... | | 0
+ unicode-transla... | | 2
+ util-linux | [] [] [] | 20
+ vorbis-tools | [] [] | 11
+ wastesedge | | 1
+ wdiff | [] [] | 22
+ wget | [] [] [] | 19
+ xchat | [] [] [] [] | 29
+ xkeyboard-config | [] [] [] [] | 11
+ xpad | [] [] [] | 14
+ +---------------------------------------------------+
+ 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
+ 170 domains 0 1 1 77 39 0 136 10 1 48 5 54 0 2028
+
+ 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 October 2006 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://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
+
+1.6 Using `gettext' in new packages
+===================================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package. Of course you have to respect the GNU Library General Public
+License which covers the use of the GNU `gettext' library. This means
+in particular that even non-free programs can use `libintl' as a shared
+library, whereas only free software can use `libintl' as a static
+library or use modified versions of `libintl'.
+
+ Once the sources are changed appropriately and the setup can handle
+the use of `gettext' the only thing missing are the translations. The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project. Therefore the information given above
+applies also for every other Free Software Project. Contact
+`translation@iro.umontreal.ca' to make the `.pot' files available to
+the translation teams.
+
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..30c8d56
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,34 @@
+Authors of GNU tar.
+
+The following contributions warranted legal paper exchanges with the
+Free Software Foundation. Also see files ChangeLog and THANKS.
+
+TAR Sergey Poznyakoff 2003-10
+Assigns his past and future changes.
+
+TAR Paul Eggert 2000-10
+Assigns his past and future changes.
+
+TAR Jay Fenlason
+Assigns his changes.
+
+TAR Richard E Salz 1993-03-11
+Disclaims changes to getdate.y.
+
+TAR MANUAL (?) Amy Gorin (US 1963) 1995-01-10
+Assigns the Tar Manual.
+
+TAR Francois Pinard Canada 1949 1996-02-01
+Assigns past and future changes.
+
+TAR Melissa Weisshaus US 1966 1997-04-09
+Assigns changes to the manual and future changes.
+melissa@gnu.ai.mit.edu
+
+TAR Thomas Michael Innis Bushnell US 1967 1997-04-09
+Assigns changes.
+thomas@gnu.ai.mit.edu
+
+TAR Thomas Michael Innis Bushnell US 1967 1997-04-09
+Assigns changes to manual.
+thomas@gnu.ai.mit.edu
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..623b625
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <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 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..068efc4
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,8271 @@
+2007-06-08 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * configure.ac, NEWS: Raise version number to 1.17
+
+ * doc/tar.texi, doc/intern.texi: Replace: s/filename/file name/;
+ s/(ASCII|ID|BSD)/@acronym{&}/;s/"[^"]+"/``&''/
+ Use `path' only when it refers to search paths, use
+ `file name' otherwise.
+ Fix various errors (based on patch by Benno Schulenberg)
+
+ * doc/tar.texi (Operation Summary): Restore alphabetical order of
+ the options.
+
+2007-06-02 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Fix bug, introduced on 2007-03-30.
+
+ * src/common.h (xform_type): New data type
+ (transform_member_name): Last argument is of xform_type type
+ All callers updated
+
+ * src/extract.c: Update calls to transform_member_name
+ * src/list.c (decode_xform): Exempt symbolic links from component
+ stripping and name suffix normalization.
+
+ * tests/extrac07.at: Update
+
+2007-05-30 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/xheader.c (decx): Unknown pax keywords produce a warning,
+ not error.
+
+2007-05-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/misc.c (set_file_atime): Use gl_futimens, not futimens,
+ due to gnulib change.
+
+2007-05-19 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/common.h (buffer_write_global_xheader): New function
+ (struct xheader): Move definition to tar.h
+ (extended_header): Remove global
+ (xheader_init): New function
+ (xheader_decode_global,xheader_store,xheader_read)
+ (xheader_write_global,xheader_write,xheader_string_begin)
+ (xheader_string_add,xheader_string_end): Take xhdr as first
+ argument.
+ * src/tar.h (struct xheader): New definition
+ (struct tar_stat_info): New member xhdr (extended header).
+
+ * src/xheader.c (xheader_init): New function
+ (xheader_decode_global,xheader_store,xheader_read)
+ (xheader_write_global,xheader_write,xheader_string_begin)
+ (xheader_string_add,xheader_string_end): Take xhdr as first
+ argument.
+
+ * src/buffer.c (buffer_write_global_xheader): New function
+ Update to use new xheader calls.
+
+ * src/compare.c, src/create.c, src/delete.c, src/list.c,
+ src/sparse.c, src/tar.c, src/update.c: Global extended_header
+ removed, use new xheader calls instead.
+
+ * tests/T-null.at: Minor fix
+ * tests/atlocal.in (tarball_prereq): Discard eventual md5sum
+ output.
+
+2007-05-18 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/create.c (dump_file0): Original ctime cannot be used as a
+ directory change indicator if --remove-files is given.
+
+2007-04-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ Adjust to latest Gnulib.
+ * lib/.cvsignore: Add dirfd.c, dirfd.h, float+.h, mbscasecmp.c,
+ stdio.h, stdio_.h, stdlib.h, stdlib_.h, time.h, time_.h, unistd.h.
+ Remove exit.h, getcwd.h, mempcpy.h, memrchr.h, mkdtemp.h, stpcpy.h,
+ strcase.h, strchrnul.h, strdup.h, strndup.h, strnlen.h, time_r.h,
+ vsnprintf.h.
+ * m4/.cvsignore: Remove localedir.h. Sort.
+
+2007-04-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/common.h (closeopen): Remove decl.
+ * src/misc.c: Don't include <sys/time.h>, <sys/resource.h>; no longer
+ needed.
+ (get_max_open_files, closeopen): Remove. All callers removed.
+ (chdir_dir): Use a different technique, which doesn't rely on closing
+ all open files.
+ * src/tar.c (main): Don't call closeopen.
+
+2007-04-04 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * NEWS: Update
+ * doc/tar.texi: Update
+ * src/system.c (sys_exec_info_script): Store the
+ inter-communication fd in the environment variable TAR_FD
+
+2007-04-03 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/tar.c (main): Move closeopen after decode_options to
+ allow shell process substitution to work.
+ * tests/extrac07.at: Expect a warning on stderr.
+
+2007-03-30 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/common.h (transform_name_fp): Change signature
+ (transform_member_name): New function
+ * src/extract.c (extract_link, extract_symlink): Use
+ transform_member_name instead of safer_name_suffix so that
+ --transform and --strip-components affect links as well.
+ * src/list.c (transform_member_name): New function
+ (decode_header): Use transform_member_name
+ * src/names.c (all_names_found): Remove check for matching_flags.
+ * NEWS: Update
+
+ * TODO: Update
+ * bootstrap (slurp): Remove any occurrences of $bt from the
+ generated gnulib.mk
+ * src/incremen.c: Do not include mkdtemp.h
+
+2007-01-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ Adjust to recent gnulib changes.
+ * lib/.cvsignore: Add fchownat.c, rmt-command.h, strerror.c, string.h,
+ string_.h, sys, sys_time_.h, unistd_.h, wchar_.h, wctype_.h.
+ Remove localedir.h, size_max.h, xsize.h.
+ * src/xheader.c: Don't include stpcpy.h; no longer needed, now that
+ gnulib string.h defines stpcpy on all platforms.
+
+2007-01-23 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Document --exclude-caches* and --exclude-tag*
+ options.
+ * src/common.h (exclude_caches_option): Remove
+ (enum exclusion_tag_type): New data type
+ (add_exclude_tag): Rename to add_exclusion_tag
+ (cachedir_file_p): New prototype
+ * src/create.c (struct exclude_tag): rename to exclusion_tag
+ (check_exclusion_tags): New function
+ (cachedir_file_p): New function (from check_cache_directory)
+ (dump_dir0,dump_file0): Use check_exclusion_tags
+ * src/tar.c: New options --exclude-caches-all,
+ --exclude-caches-under, --exclude-tag-all, --exclude-tag-under
+ * tests/exclude.at: New file
+ * tests/Makefile.am (TESTSUITE_AT): Add exclude.at
+ * tests/testsuite.at: Add exclude.at
+
+2007-01-19 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * gnulib.modules: Require strerror
+ * doc/gendocs_template: Fix typos
+ * scripts/xsparse.c (expand_sparse): use ftruncate to handle the
+ trailing hole
+ * src/sparse.c (sparse_skip_file,pax_dump_header_1)
+ (pax_decode_header): Keep track of the number of bytes
+ written.
+ * configure.ac: Version 1.16.2
+ * NEWS: Update
+
+2007-01-04 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/compare.c (diff_dumpdir): Compare directory contents using
+ dumpdir_cmp. Do not free dumpdir_buffer, it will leave the
+ incremental directory table in the inconsistent state and trigger
+ full dump.
+ (read_and_process): Process dumpdirs no matter what the archive
+ format.
+ * src/incremen.c (list_dumpdir): Minor fixes.
+
+ * src/compare.c (read_and_process): Fix type of "size"
+
+2006-12-13 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * tests/T-null.at: Skip the test if genfile is not able to create
+ the filename with an embedded newline.
+
+2006-12-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ Port to Forte Developer 7 C 5.4 and C99.
+ * src/common.h (add_exclude_tag): Add decl; C99 requires this
+ and Forte warns about it.
+ * src/incremen.c: Include <mkdtemp.h> for mkdtemp prototype,
+ for same reason.
+ * src/misc.c (get_max_open_files): Rewrite to avoid code that
+ Forte C complains about as being unreachable.
+ * src/xheader.c (mtime_code): Rewrite to avoid Forte error
+ reported by Trond Hasle Amundsen.
+
+ * src/incremen.c (compare_dirnames): Rewrite to avoid casts.
+ * src/utf8.c (string_ascii_p): Likewise.
+ * src/xheader.c (mtime_coder, volume_size_coder, volume_offset_coder):
+ Likewise.
+
+2006-12-08 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * bootstrap: Add paxutils files to dot_ignore.
+
+ * configure.ac: Raise version number to 1.16.1
+ * bootstrap (slurp): Create .(cvs|git)ignore if not present
+ * po/.cvsignore, m4/.cvsignore: Remove automatically generated
+ files.
+
+2006-12-07 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * NEWS: Update
+ * Makefile.am (distclean-local): Fixed
+ * doc/tar.texi: Update documentation of --exclude-tag
+ * src/create.c (dump_dir0): Move checks for exclude tags to
+ dump_file0.
+ (dump_dir): Move calls to ensure_slash to dump_file0
+ * src/extract.c (extract_file): Call skip_member if open fails.
+ Patch proposed by Jan-Benedict Glaw <jbglaw@lug-owl.de>
+ * tests/truncate.at: Use genfile instead of dd, because on some
+ systems /dev/zero is not available.
+
+2006-12-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * NEWS: Fix some race conditions with tar -x --same-owner.
+ * src/extract.c (ARCHIVED_PERMSTATS): Add a comment saying that
+ S_IRWXG | S_IRWXO might be masked out.
+ (set_mode): Set the mode if some bits were masked out originally.
+ (set_stat): Don't chmod before chown, as that might temporarily
+ grant permissions that we don't want to grant. The chmod was
+ there only to work around broken hosts, so add a comment advising
+ users not to use those broken hosts instead.
+ (repair_delayed_set_stat, extract_dir):
+ Remember to mask out current umask before inverting permissions.
+ (extract_dir): If the owner might change, or if the mode has
+ special bits, create the directory 700 at first, but restore it later.
+ (open_output_file): New arg mode; all uses changed.
+ (extract_file, extract_node, extract_fifo): If the owner might
+ change, omit group and other bits at first, but restore them after
+ changing the owner.
+
+2006-12-04 Jim Meyering <jim@meyering.net>
+
+ * doc/tar.texi (Long Options): Remove doubled word.
+
+2006-11-30 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/xheader.c (xheader_read): Remove unused variable
+
+ * po/POTFILES.in: Remove src/mangle.c
+
+ * bootstrap: Implement --update-po and .bootstrap
+
+ * src/create.c (dump_dir0): Implement --exclude-tag option
+ * src/tar.c: Likewise
+ * doc/tar.texi (exclude): Document --exclude-tag
+
+2006-11-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * NEWS: Remove support for mangled names.
+ * doc/tar.texi (verbose tutorial): Likewise.
+ * src/Makefile.am (tar_SOURCES): Remove mangle.c.
+ * src/common.h (extract_mangle): Remove decl.
+ * src/extract.c (extract_mangle_wrapper): Remove.
+ (prepare_to_extract): Remove support for mangled names.
+ * src/list.c (read_and, print_header): Likewise.
+ * src/mangle.c: Remove.
+ * src/tar.h (GNUTYPE_NAMES): Remove.
+
+ Port to latest gnulib. There were a lot of changes, so the
+ simplest way to get this up and running was to switch to coreutils
+ bootstrap procedure. I noticed one feature missing after this
+ merge: the ability to update a single .po file. I can add that
+ later if need be.
+ * README-cvs, bootstrap.conf: New files.
+ * lib/.cvsignore: Remove Makefile.am, printf-parse.c, vasnprintf.c.
+ Add fstatat.c, gnulib.mk, openat-proc.c, same-inode.h, stat_.h,
+ tempname.c, tempname.h, uinttostr.c.
+ * lib/printf-parse.c, lib/vasnprintf.c: New files, from coreutils,
+ to override gnulib, so that we don't need xsize.h.
+ * bootstrap: Replace with coreutils bootstrap, except add support
+ for paxutils.
+ * configure.ac (gl_USE_SYSTEM_EXTENSIONS): Remove, as gl_EARLY now
+ does this.
+ (gl_EARLY, gl_INIT): Add.
+ (tar_GNULIB): Remove.
+ * gnulib.modules: Add configmake.
+ * lib/Makefile.tmpl: Remove, replacing with....
+ * lib/Makefile.am: New file.
+ * src/Makefile.am (tar.o): Remove dependency: Automake does this
+ for us.
+ * src/tar.c: Include <configmake.h> and <rmt-command.h>, not
+ <localedir.h>.
+
+2006-11-13 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/xheader.c (mtime_coder): Treat non-null data as a pointer to
+ struct timespec, overriding st->mtime
+ * src/create.c (start_header): Pass mtime as a call-specific data
+ to xheader_store.
+
+ * tests/truncate.at: Do not use 'k' modifier in dd options.
+ * tests/append02.at: Do not depend on command timing.
+
+2006-11-01 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/tar.c (enum read_file_list_state.file_list_skip): New value
+ (read_name_from_file): Skip zero-length entries
+
+ * tests/T-empty.at: New test case
+ * tests/T-null.at: New test case
+ * tests/extrac07.at: New test case
+ * tests/Makefile.am: Add new test cases.
+ * tests/testsuite.at: Add new test cases.
+ * tests/extrac02.at: Add more keywords
+ * tests/extrac04.at: Likewise
+ * tests/extrac06.at: Likewise
+ * tests/shortrec.at: Do not assume tar's default archive is stdout
+
+2006-10-31 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/extract.c, src/xheader.c: Call last_component instead of
+ base_name. The latter returns a malloced string since 2006-03-11.
+
+2006-10-21 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * NEWS, configure.ac: Version 1.16
+ * Makefile.am (distclean-local): New rule
+
+2006-10-17 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/tar.c: Fix help output formatting. Thanks Benno
+ Schulenberg.
+
+2006-10-16 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * Makefile.am (dist-hook): Create a cpio archive.
+ * NEWS: Update
+
+2006-10-14 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi (Synopsis): Document tar exit codes.
+ * src/create.c (dump_regular_file,dump_file0): Set exit_status to
+ TAREXIT_DIFFERS if the file being dumped was truncated or
+ otherwise changed.
+ * src/tar.c: Do not attempt to close stderr after call to
+ close_stdout.
+ * tests/grow.at: New test case
+ * tests/Makefile.am: New test grow.at
+ * tests/testsuite.at: Likewise
+ * tests/truncate.at (AT_KEYWORDS): Keyword `filechange'
+ Test tar exit status.
+
+ * src/buffer.c (_open_archive): Make sure stdlis is set to stderr
+ when we are writing archive to stdout (unless --index-file is
+ used). Bug introduced on 2006-07-06.
+ * tests/Makefile.am: New test verbose.at
+ * tests/testsuite.at: Likewise
+ * tests/indexfile.at (AT_KEYWORDS): Add stdout keyword
+ * tests/verbose.at: New test case
+
+2006-10-02 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * THANKS: Add Joerg Weilbier
+ * src/buffer.c (new_volume): Initialize current_block
+ * src/xheader.c (xheader_string_end): Fix diagnostic message.
+ * tests/multiv05.at: New testcase.
+ * tests/Makefile.am, tests/testsuite.at: Add multiv05.at
+
+2006-09-27 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * bootstrap: Use ${package} instead of hardcoding package name
+ * doc/tar.texi: Minor fix
+ * src/tar.c (doc0, doc1, initialize_argp_doc): Removed. Rely on
+ the new argp method instead.
+
+2006-09-12 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * README: Fix a typo
+
+2006-09-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ Adjust to latest gnulib.
+ * lib/.cvsignore: Add at-func.c, configmake.h, fchmodat.c,
+ fcntl.h, fcntl_.h, inttypes_.h, lstat.c, lstat.h.
+ * tests/testsuite.at (AT_TAR_MKHIER): Use install-sh -d
+ rather than the no-longer-included mkinstalldirs.
+
+2006-09-08 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/incremen.c (try_purge_directory): Initialize struct st. Fix
+ condition for selecting candidates for removal.
+ * README-alpha: List texinfo among build prerequisites for the CVS
+ version.
+
+ * bootstrap (intl_files_to_remove): Do not remove m4/inttypes-h.m4
+ and m4/inttypes-pri.m4
+
+2006-08-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * bootstrap: Set XGETTEXT_OPTIONS to flag our printf-format functions,
+ so that translators are warned about strings that are formats but
+ don't look like formats. This might help prevent core dumps.
+ * configure.ac (AM_GNU_GETTEXT): Upgrade to need-formatstring-macros.
+ Suggested by Eric Blake to avoid problems like
+ <http://lists.gnu.org/archive/html/bug-coreutils/2006-07/msg00087.html>.
+ (AM_GNU_GETTEXT_VERSION): Upgrade from 0.12.1 to 0.15. The gettext
+ manual says we should use the version number normally expected of
+ maintainers, neither more nor less.
+
+ * bootstrap (get_translations):
+ Don't exclude ky.po; it is working again.
+
+2006-08-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * bootstrap (get_translations):
+ Don't exclude ja.po; it is working again.
+ Don't remove all old .po files if we're merely updating one.
+ * po/.cvsignore: Add Makevars.
+
+2006-08-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/tar.c: Work around limitation imposed by gettext 0.15
+ by concatenating strings with "\v" after translation.
+ (doc): Remove, splitting into:
+ (doc0, doc1): New constants.
+ (argp): Don't use doc; just initialize to NULL.
+ (initialize_argp_doc): New function.
+ (decode_options): Use it.
+
+ * bootstrap: Redo po file retrieval to match Bison's method,
+ since the translation project changed its index format.
+ Don't use --assume-autoconf; it's now replaced
+ by looking in configure.ac.
+ (m4/codeset.m4, m4/intdiv.m4, m4/inttypes-pri.m4, m4/isc-posix.m4):
+ (m4/lcmessage.m4, m4/onceonly_2_57.m4, m4/gettext.m4, m4/glibc21.m4):
+ (m4/inttypes_h.m4, m4/lib-ld.m4, m4/lib-prefix.m4, m4/po.m4):
+ (m4/stdint_h.m4, m4/uintmax_t.m4, m4/ulonglong.m4):
+ Don't rename to ..._gl.m4, as this is no longer needed.
+ (m4/geteext.m4): Patch to remove the need for intl/*.
+ Use autopoint manually, then remove the intl files,
+ then undo changes to gnulib files that autoreconf made,
+ and then run aclocal/autoconf/autoheader/automake.
+ This makes our bootstrap procedure closer to Bison's.
+ (po/Makevars): Generate automatically.
+ * configure.ac (AC_PREREQ): Update from 2.59 to 2.60.
+ (gl_AC_TYPE_INTMAX_T, jm_AC_TYPE_UINTMAX_T): Remove.
+ * gnulib.modules: Add inttypes, stdint.
+ * lib/.cvsignore: Add close-stream.c, close-stream.h,
+ stdint.h, stdint_.h.
+ * po/Makefile: Remove; now automatically generated.
+
+ * src/incremen.c (read_incr_db_01): Check input strings more
+ carefully. Do not pass arbitrary char values to isspace, as
+ this has undefined behavior. Likewise for assigning arbitrary
+ uintmax_t values to other types.
+ (read_negative_num, read_unsigned_num, read_timespec):
+ New functions, to check input values a bit more carefuly.
+ (read_num): Use read_unsigned_num. New arg MAX_VAL;
+ all callers changed.
+ (read_incr_db_2): Use these new functions.
+ Use a consistent diagnostic for unexpected EOF.
+ (read_directory_file): Do not assign arbitrary uintmax_t value
+ to int.
+ (read_timespec, write_directory_file_entry, write_directory_file):
+ Handle negative time_t values correctly. We don't bother to do
+ this with pre-2 formats, since presumably the time stamps were
+ output incorrectly.
+
+ * src/tar.c (doc): Don't use \v in an argument to gettext;
+ gettext 0.15 rejects this.
+
+2006-07-24 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/tar.c (decode_options): Do not require -L with -M -Hpax.
+ It could be needed in future, but currently it is not.
+ * src/create.c (to_chars_subst): Update comment regarding OLDGNU
+ vs. GNU format differences.
+ (mode_to_chars): Treat OLDGNU_FORMAT same as GNU_FORMAT. Fixes bug
+ reported by TAMUKI Shoichi <tamuki@linet.gr.jp>, which caused
+ equivalent `tar cf ...' and `tar rf ...' commands to produce
+ different archives.
+
+ * tests/append02.at: New test case
+ * tests/Makefile.am, tests/testsuite.at: Add append02.at
+
+2006-07-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * bootstrap: Adjust to today's change to gnulib-tool by invoking
+ it with --assume-autoconf='latest-stable'.
+
+2006-07-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ Adjust to recent gnulib changes.
+ * lib/.cvsignore: Remove atexit.c, exit.c, getndelim2.c, getndelim2.h,
+ pathmax.h, paxconvert.c, paxerror.h, xstrdup.c.
+ Add inttypes.h, mktime.c, wcwidth.h, xstrndup.c, xstrndup.h.
+ * src/create.c (start_header): Adjust to API change to mode_adjust.
+
+2006-07-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * THANKS: Add Ralf Wildenhues
+ * NEWS: Update
+
+2006-07-09 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * doc/dumpdir.texi, doc/snapshot.texi, doc/sparse.texi,
+ doc/tar.texi: Fix some typos.
+
+2006-07-06 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ tar --index-file=FILE --file=- sent the archive to FILE, and
+ the listing to stderr. Bug reported by Marcin Gryszkalis
+ <mg@fork.pl>
+
+ * src/buffer.c (_open_archive): Remove stdlis initialization
+ * src/tar.c (decode_options): Initialize stdlis
+ * tests/indexfile.at: New test case
+ * tests/testsuite.at: Include indexfile.at
+ * tests/Makefile.am (TESTSUITE_AT): Add indexfile.at
+
+2006-07-05 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/Makefile.am (manual): Fix TEXINPUTS
+ * doc/rendition.texi (FIXME): Do not use deprecated @quote-args.
+ Do not use @allow-recursion. In its current form the macro is not
+ recursive.
+
+2006-07-03 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * bootstrap (update_po): Fix single translation update
+
+2006-07-03 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * configure.ac (AC_CHECK_FUNCS): Check for getdtablesize
+ * src/common.h (closeopen): New function
+ * src/misc.c (chdir_arg): Use x2nrealloc to reallocate wd.
+ (get_max_open_files,closeopen): New functions
+ (chdir_do): Do not use save_cwd if it was already used more than
+ max_open_files-4 times to avoid running off the file
+ descriptors.
+ * src/tar.c (main): Call closeopen
+ * doc/tar.texi: Update --directory description
+ * NEWS: Update
+
+2006-06-26 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Update. Add cross-references.
+ * doc/sparse.texi: Add cross-references.
+
+2006-06-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * scripts/xsparse.c: A sample utility to expand sparse files
+ extracted by third-party tars. It is not meant to be installed nor
+ to be included in the distribution. It is here, so that it can be
+ obtained either from CVS or from the tar web site.
+ * doc/Makefile.am (tar_TEXINFOS): Sorted
+ * doc/tar.texi (Other Tars): New node describing how to extract
+ GNU-specific member formats using third-party tars.
+ * src/common.h (sparse_file_p): Remove
+ * src/sparse.c: Likewise
+ * src/create.c: Use ST_IS_SPARSE instead of sparse_file_p (update
+ paxutils first)
+ * src/tar.c: --sparse-version turns on --sparse
+
+2006-06-24 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/buffer.c (print_total_stats): Add default case.
+ * src/common.h (name_init): New prototype.
+ (xheader_string_end): Return bool.
+ * src/extract.c (extract_volhdr): Add missing return
+ * src/incremen.c: Remove not used variables
+ * src/sparse.c (pax_dump_header_0): Return false if
+ xheader_string_end fails (for 0.1 formats).
+ (pax_dump_header): Return meaningful value
+ * src/transform.c (segm_count): Change type to size_t
+ * src/xheader.c (xhdr_tab.decoder): pass keyword as a second
+ argument. All callers changed.
+ (decode_record): Check for numeric overflow
+ (xheader_string_end): Return boolean value. Check for possible
+ numeric overflow
+
+2006-06-23 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/sparse.texi: New file
+ * doc/Makefile.am (tar_TEXINFOS): Add sparse.texi
+ * doc/intern.texi (Sparse Formats): New node
+ * doc/tar.texi: Update master menu
+
+ * src/common.h (tar_sparse_major,tar_sparse_minor): New globals.
+ * src/sparse.c: Implement sparse format versioning. Implement new
+ version (1.0) of PAX sparse format.
+ (pax_sparse_member_p): Fix condition
+ (pax_dump_header): A dispatcher function
+ (pax_dump_header_0,pax_dump_header_1): New functions.
+ (pax_optab): Update
+ (oldgnu_dump_header): Minor fix: make sure
+ sparse_header.isextended is set before calling
+ set_next_block_after
+ * src/tar.c: New option --sparse-version
+ * src/tar.h (struct tar_stat_info.sparse_major,sparse_minor): New
+ members.
+ * src/xheader.c: Implement new keywords: GNU.sparse.name,
+ GNU.sparse.major, GNU.sparse.minor, GNU.sparse.realsize
+
+ * tests/spmpv00.at, tests/spmvp01.at, tests/spmvp10.at: New
+ testcases.
+
+ * tests/Makefile.am: Add spmvp00.at, spmpv01.at, spmpv10.at
+ * tests/shortrec.at: Explicitely give `-f -' to the tar invocation
+ * tests/sparsemvp.at: Rewritten as an include file.
+ (TAR_MVP_TEST): New macro
+ * tests/testsuite.at: Include sparsemvp.at, spmvp00.at,
+ spmvp01.at, spmvp10.at
+
+2006-06-21 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi (Overriding File Metadata): New node
+ Document --mtime option.
+ * src/common.h (set_mtime_option,mtime_option): New globals
+ * src/create.c (start_header): Override mtime if requested
+ * src/tar.c: Implement new option, --mtime, allowing to set
+ modification times for all archive members during creation.
+ (struct tar_args): textual_date_option replaced with a linked list
+ textual_date. All references updated.
+ (get_date_or_file,report_textual_dates): New functions.
+ * configure.ac: Raise version number to 1.15.92
+ * NEWS: Update
+
+2006-06-20 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/common.h (struct name.explicit): Remove
+ Use variable names in all declarations
+ (name_scan): Remove second argument
+ * src/delete.c: Remove second argument from calls to name_scan
+ * src/update.c: Likewise
+ * src/incremen.c (procdir): Use is_individual_file to check for
+ files explicitely specified in the command line. Fixes bug
+ reported by Dat Head on 19 Jun 2006 (descending into mountpoints
+ with --one-file-system in use)
+ * src/misc.c (maybe_backup_file): Second argument is bool
+ * src/names.c (name_next_elt): Call register_individual_file
+ (namelist_match): Remove third argument
+ (name_match): Change return type to bool
+ (name_scan): Remove second argument
+ * src/sparse.c (pax_dump_header): Store original sparse file name
+ in GNU.sparse.name variable. The name field in the ustar header
+ now contains generated name (%d/GNUSparseFile.%p/%f), so that
+ non-pax-aware tars won't extract the file under the original
+ filename.
+ * src/xheader.c (GNU.sparse.name): New variable for storing sparse
+ file name.
+
+2006-06-13 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/Makefile.am (check-options): Expand macros before grepping
+ in $(info_TEXINFOS)
+ * doc/rendition.texi (FIXME) [!PROOF_FOOTNOTED]: Enclose in a
+ cartouche
+ * doc/tar.texi: Define op as codeindex. Use special macros to
+ populate it
+ Consequently prefer @dfn{long options} over @dfn{mnemonic
+ options}.
+ Document --unquote, --no-unquote
+ (Short Option Summary): Build a table of cross-references to the
+ corresponding long options.
+ (Using Multiple Tapes,Multi-Volume Archives): Rewritten
+
+ * doc/value.texi (xopindex,opsummary): New macros
+
+ * doc/Makefile.am (check-options): New goal
+ * doc/tar.texi: Update
+ * src/tar.c: Implement --overwrite-dir option (long ago
+ documented).
+
+2006-06-12 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Document better the --totals option
+ * NEWS: Update
+ * src/buffer.c (total_blocks_deleted): New variable
+ (set_start_time): Set volume_start_time and last_stat_time as well
+ (set_volume_start_time): New function
+ (compute_duration): Do not call set_start_time, update
+ last_stat_time instead. Use it in calculation instead of
+ start_time, which is now set only once, upon startup.
+ (print_total_written): Removed.
+ (print_total_stats): New function for printing byte/speed statistics.
+ (_open_archive): Detect attempts to update compressed archives.
+ (_gnu_flush_write): Always update prev_written.
+ (open_archive): Call set_volume_start_time.
+ * src/common.h (volume_start_time,last_stat_time): New globals
+ (print_total_written): Replaced with:
+ (print_total_stats): New function
+ * src/delete.c (records_skipped): Remove static qualifier, the
+ variable is used by print_total_stats in buffer.c
+ * src/extract.c (check_time): Use volume_start_time when checking
+ for timestamp plausability.
+ * src/tar.c: (options, parse_opt): Allow for optional argument to
+ the --totals option, which specifies a signal upon delivery of which
+ the statistics must be output.
+ (main): Call print_total_stats if total_option is set.
+
+2006-06-11 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/xheader.c (xheader_set_single_keyword): Fix typo.
+ (decode_time): Avoid using gotos.
+
+ * doc/mastermenu.el: New file
+ * doc/Makefile.am (master-menu): New goal
+ * doc/tar.texi: Update master menu
+
+2006-06-10 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Remove leftover include
+
+2006-06-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/Makefile.am (tar_TEXINFOS): Add intern.texi
+ (EXTRA_DIST): Remove convtexi.pl, add texify.sed
+ * doc/intern.texi: New file
+ * doc/convtexi.pl: Remove
+ * doc/texify.sed: Auxiliary script to convert ../src/tar.h to
+ header.texi
+ * doc/rendition.texi: Fix typo
+ * doc/tar.texi: Update
+ * src/tar.h: Fix indentation, introduce end-of-format marker for
+ texify.sed
+
+ * THANKS: Add Jason Armistead
+ * doc/tar.texi: Update
+ * NEWS: Update
+ * src/buffer.c: Implement more flexible checkpoint style
+ * src/common.h (checkpoint_option): Change type to unsigned
+ (checkpoint_style): New variable.
+ * src/tar.c: --checkpoint takes an optional argument specifying
+ number of records between two successive checkpoints (proposed
+ by Jason Armistead on 2004-06-22). Optional dot starting the
+ argument means "print dots instead of textual checkpoints".
+ (tar_help): New function
+ * src/transform.c: Minor fixes.
+
+2006-06-08 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * gnulib.modules: Add mkdtemp
+ * doc/dumpdir.texi: New file
+ * doc/Makefile.am (tar_TEXINFOS): Add dumpdir.texi
+ * doc/tar.texi: Document dumpdir format
+ * src/incremen.c (dumpdir_locate,obstack_code_rename):
+ (purge_directory): Re-implement renaming. Introduce
+ 'X' control code.
+ (make_tmp_dir_name): Remove
+
+ * src/transform.c (set_transform_expr,_transform_name_to_obstack):
+ Implement NUMBER flag.
+ (add_char_segment): Fix length assignement
+
+ * doc/tar.texi: Update
+
+2006-06-07 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/transform.c (transform_name_fp): Run fun even if
+ _transform_name_to_obstack returns false.
+ (_transform_name_to_obstack,set_transform_expr): Implement GNU
+ extension case conversion operations.
+
+ * doc/tar.texi (transform): Document the option.
+
+2006-06-02 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * NEWS: Update
+ * src/common.h (set_transform_expr): New function
+ * tests/Makefile.am: Add incr04.at
+ * tests/testsuite.at: Likewise
+ * tests/incr04.at: New test case
+ * tests/long01.at: Fix typo in the comment
+ * tests/multiv04.at: Use genfile --files-from
+
+ (Above changes need new genfile.c from paxutils)
+
+ * TODO: Update
+ * NEWS: Update
+ * doc/tar.texi: Update
+ * src/transform.c: New file
+ * src/Makefile.am (tar_SOURCES): New module transform.c
+ * src/common.h (transform_name, transform_name_fp): New functions
+ (show_stored_names_option): Renamed to
+ show_transformed_names_option. All uses changed
+ * src/create.c (dump_file0): Transform file name
+ * src/extract.c (extract_archive): safer_name_suffix and
+ stripped_prefix_len are now called by decode_header
+ * src/list.c (print_header): Update displayable name selection.
+ * src/tar.c: New option --transform
+ New option --show-transformed-names generalizes
+ --show-stored-names. The latter is retained as an alias.
+
+2006-05-31 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/incremen.c (make_directory): Fix initialization of struct
+ directory.
+
+2006-05-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Document use of globbing patterns.
+ * src/tar.c (parse_opt): Add comment before --preserve case.
+
+2006-05-24 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * NEWS: Update
+ * doc/tar.texi: Update
+ * configure.ac (AM_INIT_AUTOMAKE): Use tar-ustar option. Raise
+ version requirement to 1.9
+ * src/common.h (struct name): Refactured
+ (warn_regex_usage): New variable.
+ (dump_file): First argument is const char*.
+ (name_init,name_add): Removed
+ (name_add_name,name_add_dir): New functions
+ (name_next): Return const char*.
+ * src/create.c: (dump_file,dump_file0): First argument is const
+ char*. All callers updated.
+ * src/names.c: Rewritten handling of member names in the command
+ line. Tar no longer attempts to guess globbing patterns, instead
+ it relies on --wildcard option.
+ (init_names): Removed.
+ (struct name_elt): New structure.
+ (name_array): Change type to struct name_elt. All references updated
+ (name_add_name,name_add_dir): New functions
+ (name_next_elt): New function
+ (name_next): Rewritten using name_next_elt.
+ (namelist_match): Rewritten pattern matching using
+ exclude_fnmatch.
+ (names_notfound): Warn if globbing patterns were used without
+ --wildcards option
+ * src/tar.c (options): Move globbing-related options into a
+ separate group. Set -l as an alias to --check-links, as required
+ by UNIX98
+ (struct tar_args): New fields
+ wildcards,matching_flags,include_anchored
+ (MAKE_EXCL_OPTIONS,MAKE_INCL_OPTIONS): New macros
+ (parse_opt): Use x2nrealloc to grow archive_name_array.
+ Use MAKE_EXCL_OPTIONS,MAKE_INCL_OPTIONS to create appropriate
+ fnmatch options, and name_add_name,name_add_dir to handle member
+ name and -C arguments.
+ (decode_options): Likewise
+ (main): Remove call to init_names.
+
+ * tests/append.at, tests/append01.at, tests/extrac01.at,
+ tests/options.at, tests/options02.at, tests/same-order01.at,
+ tests/same-order02.at: Make AT_SETUP more readable.
+
+2006-05-23 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/buffer.c (change_tape_menu): Fix typo (uninitialized
+ variable) introduced yesterday.
+
+2006-05-22 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Use @var{file_name} instead of @var{file name}
+ * src/buffer.c (change_tape_menu): Break the loop after obtaining
+ new archive name. Check for empty input line.
+
+2006-05-15 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * tests/atlocal.in (XFAILFILE): New variable
+ * tests/version.at: Create $XFAILFILE on failure
+ * tests/testsuite.at (AT_TAR_CHECK): Declare expected failure if
+ $XFAILFILE exists.
+
+2006-05-13 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * THANKS: Update
+ * src/buffer.c (read_header0): Use read_header_primitive to avoid
+ clubbering current_tar_info. All callers updated.
+ * src/common.h (read_header_primitive): New function
+ * src/extract.c (extract_volhdr): New function
+ (prepare_to_extract): Use extract_volhdr as extractor for volume
+ names.
+ * src/list.c (read_header_primitive): New function
+ (read_header): Front end for read_header_primitive
+ * tests/chtype.at: New file
+ * tests/volsize.at: New file
+ * tests/Makefile.am (TESTSUITE_AT): Add chtype.at, volsize.at
+ (check-full): New target.
+ * tests/atlocal.in (TEST_DATA_URL,STAR_DATA_URL)
+ (STAR_TESTSCRIPTS): Provide default values.
+ (tarball_prereq): New function
+ * tests/testsuite.at (AT_TARBALL_PREREQ): New defun
+ (AT_STAR_PREREQ): Rewrite using tarball_prereq
+ Include chtype.at and volsize.at
+ * tests/volume.at: Add keywords.
+
+ * tests/star/gtarfail.at, tests/star/gtarfail2.at,
+ tests/star/multi-fail.at, tests/star/pax-big-10g.at,
+ tests/star/ustar-big-2g.at, tests/star/ustar-big-8g.at
+ (AT_STAR_PREREQ): Provide md5 sum.
+
+ * lib/.cvsignore: Update
+
+2006-05-08 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * tests/testsuite.at (AT_SORT_PREREQ, AT_UNPRIVILEGED_PREREQ): New
+ defines
+
+ * tests/extrac04.at, tests/incr03.at, tests/listed02.at,
+ tests/pipe.at, tests/rename01.at, tests/rename02.at,
+ tests/rename03.at, tests/same-order01.at: Call
+ AT_SORT_PREREQ. Remove fd 2 redirection after calls to sort
+ * ignfail.at: Call AT_UNPRIVILEGED_PREREQ
+
+2006-05-08 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Listed incremental backups: keep more information about
+ directories. Handle renamed directories more effectively
+ (initial implementation, more updates to follow).
+ Source tree before this point is tagged
+ alpha_1_15_90_incremental_1.
+
+ * NEWS: Update
+ * configure.ac: Raise version number to 1.15.91
+ * src/common.h (rename_directory,append_incremental_renames): New
+ functions.
+ * src/extract.c (rename_directory): New function
+ * src/incremen.c (struct directory.contents, flags): New members
+ (nfs,found,new): Remove. Replaced by appropriate bitmask values in
+ `flags' field. All uses updated.
+ (directory_meta_table): New table.
+ (hash_directory): Rename to hash_directory_name
+ (compare_directories): Rename to compare_directory_names
+ (hash_directory_meta,compare_directory_meta,find_directory_meta):
+ New functions
+ (compare_dirents): Removed
+ (note_directory): Get 7th argument: directory contents.
+ All callers updated
+ (dumpdir_locate,makedumpdir): New functions
+ (scan_directory): Rewritten. Use makedumpdir to create a sorted
+ dumpdir array. This makes the obstack argument unnecessary. Besides,
+ ALL_CHILDREN flag is set only for new directories.
+ (procdir): Change return type to struct directory. Return
+ immediately if the directory was already initialized. Discover
+ directory renames using directory_meta_table.
+ (append_incremental_renames): New function.
+ (read_directory_file, write_directory_file): Use new snapshot file
+ format.
+ * src/names.c (collect_and_sort_names): Update dir_contents of the
+ first non-fake name entry when in listed incremental mode.
+
+ * tests/incr03.at: New testcase
+ * tests/rename01.at: New testcase
+ * tests/rename02.at: New testcase
+ * tests/rename03.at: New testcase
+ * tests/Makefile.am: Add
+ incr03.at,rename01.at,rename02.at,rename03.at
+ * tests/testsuite.at: Likewise.
+ * tests/listed02.at: Update for the new behavior
+ * tests/multiv04.at (AT_KEYWORDS): Add missing incremental kw.
+
+2006-05-02 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/buffer.c (try_new_volume): Attempt to continue if the name
+ is apparently truncated in a GNU format volume.
+
+ * tests/comprec.at, tests/delete01.at, tests/delete02.at,
+ tests/delete04.at, tests/delete05.at, tests/extrac05.at,
+ tests/listed01.at, tests/multiv01.at, tests/multiv02.at,
+ tests/pipe.at, tests/same-order01.at, tests/same-order02.at,
+ tests/sparse01.at, tests/sparse03.at: Always use genfile --file,
+ this enables extra error checking.
+
+ * tests/multiv03.at: Attempt to extract a member with truncated
+ file name from the archive.
+
+ * src/buffer.c (_open_archive): Remove unnecessary argument to
+ check_compressed_archive.
+
+2006-04-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * tests/sparse01.at, tests/sparse02.at, tests/sparse03.at,
+ tests/sparsemv.at, tests/sparsemvp.at: Skip the test if the file
+ system does not support sparse files.
+ * doc/tar.texi (@copying): Remove the reference to not existing
+ invariant section.
+
+2006-04-11 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/extract.c (extract_dir): Fix toggling existing directory
+ permissions (Debian bug #361077). Use parts of patch provided by
+ Ian Jackson <iwj@ubuntu.com>.
+ * src/compare.c: Minor changes
+ * src/incremen.c (directory.new): New member
+ (note_directory,find_directory: Use make_directory to create
+ struct directory entries
+ (procdir): Avoid duplicating directories in the incremental
+ backup map.
+ * tests/Makefile.am (TESTSUITE_AT): Add extrac06.at
+ * tests/testsuite.at: Include extrac06.at
+
+2006-03-18 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> (trivial change)
+
+ * tests/atlocal.in (PATH): Add build-aux from the source tree,
+ not the build tree.
+
+2006-03-13 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * THANKS: Add Benno Schulenberg
+
+2006-03-13 Jim Meyering <jim@meyering.net>
+
+ * tests/listed02.at: Sort the two lines of stderr from the
+ first `tar -v --listed-incremental'. They would come out
+ reversed and provoke a test failure on a tmpfs
+ file system.
+
+2006-03-13 Benno Schulenberg <benno@nietvergeten.nl>
+
+ * doc/tar.texi: Minor fixes.
+ * src/tar.c (options): Consistently begin help messages with a
+ lowercase letter.
+
+2006-03-12 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * tests/Makefile.am (AM_CPPFLAGS): Define LOCALEDIR
+
+2006-03-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/buffer.c (record_buffer_aligned): New var.
+ (init_buffer): Use it to ensure that the buffer is aligned.
+ This doesn't result in any measurable performance improvement
+ on my host (Debian GNU/Linux 3.1 stable, with default block size),
+ but I assume it does help on some hosts.
+
+ * lib/.cvsignore: Sort.
+
+2006-03-04 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * tests/shortrec.at: Use -f - to read from stdin.
+
+2006-02-21 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Fix typo: --to-command instead of --to-program
+
+2006-02-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * tests/multiv04.at (split directory members in a MV archive):
+ Don't use %X in an awk printf format; this doesn't work with
+ Solaris 10 /usr/bin/awk. Use %x instead.
+
+2006-02-20 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/create.c (split_long_name): Fix maximum length estimation.
+ Patch by Jim Lowe.
+ * tests/Makefile.am (lustar01.at,lustar02.at,lustar03.at): New
+ tests.
+ * tests/atlocal.in: Add build-aux to the PATH
+ * tests/long01.at: Remove mkhier, use AT_TAR_MKHIER instead
+ * tests/longv7.at: Reword test title
+ * tests/lustar01.at: New test
+ * tests/lustar02.at: New test
+ * tests/lustar03.at: New test
+ * tests/testsuite.at (AT_TAR_MKHIER): New macro
+ (lustar01.at,lustar02.at,lustar03.at): New tests.
+
+2006-02-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * bootstrap: Don't claim lib/Makefile.am is generated automatically
+ from itself.
+
+ Avoid installation glitches on Solaris 8 with Sun C 5.4.
+ * lib/.cvsignore: Add system-ioctl.h.
+ * lib/Makefile.tmpl (noinst_HEADERS): Add system-ioctl.h.
+ * src/buffer.c: Include system-ioctl.h.
+ * src/compare.c: Likewise.
+ * src/delete.c: Likewise.
+ * src/system.c: Include <getline.h>, <setenv.h>.
+ * src/tar.c: Include <getline.h>.
+
+2006-02-19 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/buffer.c (add_chunk_header): Free st.orig_file_name after
+ calling finish_header().
+ (new_volume): Prompt the user for archive name if unable to open
+ next archive.
+
+ * src/create.c (dump_file0): Restore file_count_links,
+ accidentally removed on 2005-11-29.
+ * configure.ac: Raise version number to 1.15.90
+ * NEWS: Likewise.
+
+2006-02-08 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/tar.c (tar_set_quoting_style): Provide second argument to
+ the format spec: program_invocation_short_name. Reported by Jim
+ Meyering.
+
+2006-02-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib.modules: Add closeout, exitfial.
+ * lib/.cvsignore: Add __fpending.c, __fpending.h, closeout.c,
+ closeout.h.
+ * src/buffer.c: Incluse closeout.h.
+ (_open_archive): Use freopen rather than fopen, so
+ that stdlis is always either stdout or stderr. Use
+ close_stdout_set_file_name to report its name.
+ * src/tar.c: Include closeout.h and exitfail.h.
+ (parse_opt, usage): Call close_stdout as appropriate, to check for
+ write errors.
+ (decode_options): Exit with status TAREXIT_FAILURE, not 1.
+ (main): Set exit_failure, to exit with proper status on memory
+ allocation failure and the like.
+ Use close_stdout rather than rolling our own test.
+
+ * NEWS: --version now outputs copyright etc., to conform to the
+ GNU coding standards. Remove --license.
+ * gnulib.modules: Add version-etc-fsf.
+ * doc/tar.texi: Document the change.
+ * lib/.cvsignore: Add version-etc-fsf.c, version-etc.c, version-etc.h.
+ * scripts/Makefile.am (SED_CMD): Update PAKCAGE_NAME, not PACKAGE.
+ * scripts/backup.in: Remove --license. Change --version to conform
+ to GCS.
+ * scripts/restore.in: Likewise.
+ * scripts/backup.sh.in (license): Output briefer license in the
+ style of coreutils, for consistency with other changes.
+ * src/tar.c: Include <version-etc.h>.
+ (LICENSE_OPTION): Remove.
+ (options): Remove --license.
+ (license): Remove.
+ (parse_opt): Use version_etc instead of rolling it ourselves.
+ Remove --license.
+ * tests/version.at (tar --version): Check only the first line of
+ output.
+
+ * ChangeLog, NEWS, src/common.h, src/extract.c, src/incremen.c:
+ * src/list.c, src/names.c, src/tar.h, src/xheader.c:
+ Update copyright year to 2006.
+
+2006-02-07 Jim Meyering <jim@meyering.net>
+
+ * src/xheader.c (sparse_map_decoder): Fix misleading diagnostic.
+
+2006-01-31 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/common.h (get_gnu_dumpdir): Remove prototype
+ (is_dumpdir): New function
+ * src/extract.c (prepare_to_extract): Use is_dumpdir member to
+ check for dumpdirs.
+ * src/incremen.c (get_gnu_dumpdir): Static
+ (is_dumpdir): New function
+ (purge_directory): Use is_dumpdir
+ * src/list.c (list_archive): Use is_dumpdir
+ Do not wrap skip_member in mv_begin/mv_end, the function itself
+ takes care of it.
+ (decode_header): Set stat_info->is_dumpdir
+ (skip_member): Do nothing if skipped is true
+ * src/tar.h (struct tar_stat_info): New members is_dumpdir and skipped.
+
+2006-01-22 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/tar.c (decode_options): Refuse using --delete with
+ compression options.
+
+2006-01-18 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * NEWS: Updated.
+ * configure.ac (DEFAULT_QUOTING_STYLE): New configuration variable
+ * doc/tar.texi: Initial documentation for --quoting-style,
+ --quote-chars and --no-quote-chars option.
+ * src/tar.c: Implement new options --quoting-style, --quote-chars
+ and --no-quote-chars.
+
+2006-01-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * bootstrap: Default to pserver, and switch to cvs.sv.gnu.org,
+ to accommodate recent changes to the GNU CVS server.
+ * lib/.cvsignore: Add argp-pin.c, mkdirat.c, openat-priv.h.
+
+2005-12-14 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/names.c (name_scan): Take an additional argument requesting
+ exact matching.
+ * src/common.h (name_scan): Change prototype.
+ * src/delete.c, src/incremen.c, src/update.c: Update invocations
+ of name_scan.
+
+2005-12-13 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/common.h (struct name): New member `explicit'. Remove unused
+ member `isdir'.
+ * src/incremen.c (procdir): If name_scan() returns something,
+ check if it was explicitely given in the command line
+ * src/names.c (addname,add_hierarchy_to_namelist): Initialize
+ explicit member appropriately.
+
+ * src/incremen.c (procdir): If --one-file-system is given and a
+ directory is found to be on another device, *and* this directory
+ is explicitely given in the command line, then do not omit it.
+
+2005-12-11 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * NEWS: Update
+ * doc/tar.texi: Document --delay-directory-restore option.
+ (Configuring Help Summary): Document usage of ARGP_HELP_FMT
+ variable to customize help output.
+ * src/common.h (delay_directory_restore_option): New global.
+ * src/extract.c (directories_first): Replaced by
+ delay_directory_restore_option. All uses changed.
+ * src/tar.c (options,parse_opt): New options
+ --delay-directory-restore and --no-delay-directory-restore
+
+2005-12-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/buffer.c (open_archive): Add default case to shut up gcc.
+ * src/common.h (set_file_atime): Add prototype.
+ * src/create.c (to_chars_subst): Remove unused variable
+ Make sure useful result code is returned.
+ * src/incremen.c (read_directory_file): Fix format string
+ Thanks Eric Blake for reporting.
+
+2005-12-08 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi (Current status): Renamed to 'Changes' and moved to
+ appendices.
+ (Large or Negative Values): Rewritten
+ * src/common.h (gid_to_chars, major_to_chars, minor_to_chars)
+ (mode_to_chars, off_to_chars, size_to_chars, time_to_chars)
+ (uid_to_chars, uintmax_to_chars): Return bool
+ * src/create.c (gid_to_chars, major_to_chars, minor_to_chars)
+ (mode_to_chars, off_to_chars, size_to_chars, time_to_chars)
+ (uid_to_chars, uintmax_to_chars): Return bool
+ (to_chars): Return bool
+ (start_header): Check return values of convertion routines. Fail
+ if unable to store data in the header.
+
+2005-12-07 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Following the discussion with Karl Berry,
+ discontinue using @value{} substitutions for Texinfo commands.
+ Properly index all long options. Print a
+ separate long option index.
+ * doc/value.texi: Remove @set's
+
+ * doc/tar.texi: Update --info-script documentation
+ Resolve some more FIXMEs.
+ * scripts/dump-remind.in: Use TAR_VOLUME instead of reading volno
+ file.
+ * src/buffer.c (new_volume): Update invocation
+ (change_tape_menu): New function. Disable '!' command if given
+ --restrict option.
+ * src/common.h (sys_exec_info_script): Update declaration
+ (restrict_option): New global
+ * src/system.c (sys_exec_info_script): The script can supply new
+ archive name to use by writing it to file descriptor 3.
+ * src/tar.c (options): Add --restrict option. Use macros for
+ option grouping.
+ (license): Print full list of copyright years
+ * NEWS: Update
+
+2005-12-06 Eric Blake <ebb9@byu.net> (trivial changes)
+
+ * configure.ac (DENSITY_LETTER): Fix m4 overquoting.
+ * .cvsignore: Ignore .bootstrap.
+
+2005-12-06 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Document --to-command and --info-script
+ options. Add missing xrefs.
+ * src/buffer.c (new_volume): Use sys_exec_info_script() instead of
+ system().
+ * src/common.h (archive_format_string,subcommand_string)
+ (sys_exec_info_script): New prototypes.
+ * src/system.c (sys_exec_info_script): New function.
+ * src/tar.c (archive_format_string): Remove static qualifier.
+ (subcommand_string): New function.
+
+2005-12-01 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/extract.c: Fix restoring of directory timestamps from
+ incremental archives.
+ (directories_first): New variable.
+ (prepare_to_extract): Set directories_first
+ (extract_archive): Call apply_nonancestor_delayed_set_stat() only
+ if not extracting from an incremental archive
+ (extract_dir): Obtain root_device here, to make sure it works
+ correctly with -C.
+
+ * src/incremen.c (purge_directory): Skip the member and return if
+ the archive is not in incremental format.
+ * tests/incr02.at: New testcase
+ * tests/Makefile.am: Add incr02.at
+ * tests/testsuite.at: Likewise
+
+ * THANKS: Add Guerkan Karaman.
+ * NEWS: Update
+
+2005-11-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/tar.texi (Option Summary): Rewrite the
+ --atime-preserve=system description in response to Ian Turner's
+ proposed patch.
+
+2005-11-30 Ian Turner <ian@zmanda.com>
+
+ * doc/tar.texi (Extracting Specific Files): Remove obsolescent
+ FIXME.
+
+2005-11-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * NEWS: New option --atime-preserve=system, which uses O_NOATIME.
+ * THANKS: Add Ian Turner.
+
+ * configure.ac: Prefer AC_CHECK_HEADERS_ONCE to AC_CHECK_HEADERS.
+ Check for stropts.h and sys/filio.h too, for _FIOSATIME.
+ * doc/tar.texi: Change "modification time" to "data modification
+ time", "change time" to "status change time", and "filesystem" to
+ "file system", so that we use terminology consistent with POSIX.
+ Use American spacing rather than French for sentence ends.
+ "non-dependable" -> "undependable".
+ (Option Summary, Attributes): Explain better the pitfalls of the
+ --atime-preserve option, and suggest read-only mounts,loopback
+ mounts, and noatime mounts for older systems.
+ * doc/value.texi (op-atime-preserve-system): Renamed from
+ op-atime-preserver-system to fix a misspelling.
+ * src/common.h (enum atime_preserve): Use lower case for enum values.
+ * src/compare.c: Don't include utimens.h; no longer needed.
+ (diff_file): Use set_file_atime rather than utimens; avoid closing
+ diff_handle until after this, so that we can set the file time stamp
+ via the file descriptor rather than via its name.
+ * src/create.c: Don't include utimens.h; no longer needed.
+ (dump_regular_finish): Remove. All callers now do its work inline.
+ (dump_dir): New arg FD. All callers changed.
+ Use fdsavedir rather than savedir.
+ (unknown_file_error): Arg is a const pointer now.
+ (dump_file0): 2nd arg is a const pointer now.
+ Treat directories more like files, with respect to --atime-preserve.
+ For example, also warn if a directory changes while we are dumping it.
+ Prefer file descriptors to file names when retrieving/setting file
+ attributes; this saves path-resolution time and allows us to avoid
+ changing mtime/ctime on Solaris when restoring atime as root.
+ Use O_DIRECTORY when opening directories, to avoid some race conditions.
+ Do not reset atime if mtime has changed. Report an error if
+ we cannot reset atime.
+
+ * lib/.cvsignore: Add malloc.h, regcomp.c, regex.c, regex.h,
+ regex_internal.c, regex_internal.h, regexc.c; used by rpmatch.
+
+2005-11-29 Ian Turner <ian@zmanda.com>
+
+ First cut at adding support for --atime-preserve=system.
+ * doc/tar.texi (Option Summary): First cut at documenting it.
+ All other uses of --atime-preserve changed to --atime-preserve=replace.
+ * doc/value.texi (op-atime-preserve-replace, op-atime-preserver-system):
+ New.
+ (op-atime-preserve): Mention METHOD.
+ * src/common.h (atime_preserve): New enum.
+ (atime_preserve_option): Now of the enum type rather than bool.
+ All uses changed.
+ * src/compare.c (diff_file): Read with O_NOATIME if asked for.
+ * src/create.c (dump_file0): Read regular and CTG files with O_NOATIME
+ if asked for.
+ * src/tar.c (usage): Mention new usage.
+ (parse_opt): Parse new usage.
+
+2005-11-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * THANKS: Convert back to UTF-8, sort (using LC_ALL=C on Debian
+ stable), and consistently use tabs rather than spaces.
+
+2005-11-27 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/xheader.c: Remove parts of code prematurely introduced
+ yesterday. Thanks Eric Blake.
+
+2005-11-26 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/xheader.c (xheader_format_name): Fix memory leak.
+
+2005-11-11 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * gnulib.modules: Add rpmatch
+ * lib/stdopen.h, lib/stdopen.c: New file. Imported from coreutils.
+ * lib/Makefile.tmpl: Add stdopen.h, stdopen.c
+ * po/POTFILES.in: Add rpmatch.c
+ * src/tar.c (confirm): Rewritten using rpmatch.
+ (decode_options): Minor optimizations
+ (main): Call stdopen() to ensure the first three descriptors are
+ open.
+
+ * tests/multiv01.at, tests/multiv02.at, tests/multiv03.at,
+ tests/multiv04.at, tests/sparsemv.at, tests/sparsemvp.at,
+ tests/star/multi-fail.at: Close stdin so that if something fails
+ causing tar to ask for the next volume, it won't hang the
+ testsuite.
+
+ * src/buffer.c (flush_write,flush_read): Change data type.
+ (flush_archive): Compute actual buffer fill level before calling
+ low level function.
+ (close_archive): Call flush_archive again if the first call
+ resulted in partially filled buffer.
+ (try_new_volume): Rewritten handling of initial headers.
+ (add_chunk_header): New function. Write an additional header
+ before the continuation chunk. The purpose of the header is to
+ allow third-party tars to extract the member.
+ (simple_flush_write): Take an argument.
+ (_gnu_flush_write): Correctly handle partially filled buffers.
+ * src/common.h (flush_read,flush_write): Functions, again.
+ (write_extended): Changed declaration
+ (xheader_format_name): New declaration
+ * src/create.c (write_extended): Change type and meaning of
+ the first argument. All callers updated
+ * src/xheader.c (xheader_format_name): Remove static
+ qualifier. Change last argument.
+ Correct buffer size calculation (allocated too much space).
+ (xheader_write): Increase global_header_count here ...
+ (xheader_write_global): ... instead of here
+
+ * tests/testsuite.at (AT_TAR_CHECK): Define TEST_TAR_FORMAT
+ * tests/multiv01.at: Update
+ * tests/multiv02.at: Update
+ * tests/multiv03.at: Update
+ * tests/sparsemvp.at: Update
+ * tests/star/multi-fail.at: Update
+
+ * scripts/tarcat: Handle archives in pax format. Improve handling
+ of traditional archives.
+ * doc/tar.texi (Tarcat): New node
+
+2005-11-10 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Fix splitting of sparse files between the volumes.
+
+ * src/buffer.c (try_new_volume): Bugfix. Always check
+ continued_file_name. If it is absent, the volume is out
+ of sync.
+ (add_multi_volume_header): Create GNU.volume.filename keyword in
+ the extended header.
+ * src/sparse.c (sparse_dump_region): Call mv_size_left.
+ (sparse_dump_file): Enclose the loop in mv_begin/mv_end.
+ * src/system.c: Do not pad compressed output if it goes to
+ stdout.
+ * src/xheader.c (xhdr_tab): New keyword GNU.volume.filename.
+
+ * tests/sparsemv.at: New testcase
+ * tests/sparsemvp.at: New testcase
+ * tests/Makefile.am: Add sparsemv.at and sparsemvp.at.
+ * tests/testsuite.at: Likewise.
+
+2005-11-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/buffer.c: Rewritten in a more modular fashion to provide
+ GNU extensions (multi-volume archives and archive labels) in
+ pax format.
+ NOTICE, that some of the aspects (e.g. splitting the archive
+ on the extended header boundary) are still not solved, others
+ (splitting a sparse file between the volume) require additional
+ testing. Wait for the next commit.
+
+ (volume_label,continued_file_name,continued_file_size)
+ (continued_file_offset): New globals.
+ (save_name,save_totsize,save_sizeleft): Make static
+ (mv_begin,mv_end,mv_total_size,mv_size_left): New functions
+ (open_archive,flush_write,flush_read): Rewritten
+
+ * src/common.h (save_name,save_sizeleft,save_totsize): Remove
+ globals.
+ (volume_label,continued_file_name,continued_file_size): New
+ variables.
+ (flush_read,flush_write): Pointers to functions
+ (mv_begin,mv_end,mv_total_size,mv_size_left): New functions
+ (write_extended): New function.
+
+ * src/compare.c, src/create.c, src/extract.c, src/incremen.c,
+ src/list.c: Use mv_.* functions uniformly instead of fiddling
+ with the global variables.
+ * src/sparse.c: Use mv_.* functions where necessary.
+ * src/tar.c (decode_options): Allow to use --multi-volume and
+ --label with pax archives.
+ * src/xheader.c (xhdr_tab): Support for new GNU keywords.
+
+ * tests/delete01.at, tests/delete02.at, tests/delete03.at,
+ tests/delete04.at, tests/delete05.at, tests/extrac01.at,
+ tests/extrac02.at, tests/extrac03.at, tests/extrac04.at,
+ tests/extrac05.at, tests/incr01.at, tests/incremental.at,
+ tests/listed01.at, tests/listed02.at, tests/long01.at,
+ tests/longv7.at, tests/multiv01.at, tests/multiv02.at,
+ tests/multiv03.at, tests/multiv04.at, tests/options.at,
+ tests/options02.at, tests/same-order01.at, tests/same-order02.at,
+ tests/sparse01.at, tests/sparse02.at, tests/sparse03.at,
+ tests/star/multi-fail.at (AT_KEYWORDS): Improve to allow execution
+ of related tests in groups.
+
+ * doc/tar.texi: Update
+
+2005-11-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/xheader.c (struct xhdr_tab.coder): Last arg is void const *,
+ not void *, to avoid create.c warning from GCC "passing argument 3
+ of 'xheader_store' discards qualifiers from pointer target type".
+ (dummy_coder, atime_coder, gid_coder, gname_coder, linkpath_coder):
+ (ctime_coder, mtime_coder, path_coder, size_coder, uid_coder):
+ (uname_coder, sparse_size_coder, sparse_numblocks_coder):
+ (sparse_offset_coder, sparse_numbytes_coder, dumpdir_coder):
+ (xheader_store): Likewise.
+ * src/common.h (xheader_store): Likewise.
+
+2005-11-07 Sergey Poznyakoff <gray@gnu.org.ua>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/tar.c (NS_PRECISION_FORMAT_MASK): New macro.
+ (tar_timespec_cmp): New function. Wrapper over
+ timespec_cmp using the timespec precision provided by the
+ current archive format.
+ * src/common.h (tar_timespec_cmp): New declaration.
+ * src/compare.c (diff_file): Use tar_timespec_cmp.
+ * src/extract.c (file_newer_p): Likewise.
+ * src/update.c (update_archive): Likewise.
+ * tests/truncate.at: Reverted changes
+ * tests/update.at: Reverted changes
+
+2005-11-07 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Support for incremental formats in pax archives.
+ Fixed POSIX compatibility of `sparse' extended header keywords.
+
+ * src/common.h (dumpdir_size,get_gnu_dumpdir)
+ (xheader_string_begin,xheader_string_add)
+ (xheader_string_end): New functions.
+ * src/create.c (dump_dir0): Handle incremental backups in pax
+ archives.
+ * src/incremen.c (dumpdir_size, get_gnu_dumpdir): New functions.
+ (purge_directory): Use stat_info.dumpdir instead of getting its
+ value explicitely.
+ * src/list.c (list_archive): Handle incremental backups in pax
+ format.
+ (decode_header): Initialize stat_info.dumpdir
+ * src/sparse.c (sparse_diff_file): Bugfix: set seekable.
+ (pax_dump_header): Store sparse map in GNU.sparse.map. If this
+ variable has been explicitely deleted, use GNU.sparse.offset/
+ GNU.sparse.numbytes variables.
+ * src/tar.c (decode_options): Incremental options are allowed with
+ --format=pax
+ (tar_stat_destroy): Free dumpdir
+ * src/tar.h (struct tar_stat_info.dumpdir): New member.
+ * src/xheader.c (xheader_keyword_deleted_p): Remove static
+ qualifier.
+ (struct xhdr_tab.decoder): Change prototype. POSIX allows string
+ values to contain embedded nulls, so take an extra argument
+ specifying the length of the string.
+ (decx,decg,dummy_decoder,atime_decoder,gid_decoder)
+ (gname_decoder,linkpath_decoder,ctime_decoder,mtime_decoder)
+ (path_decoder,size_decoder,uid_decoder,uname_decoder)
+ (sparse_size_decoder,sparse_numblocks_decoder)
+ (sparse_offset_decoder,sparse_numbytes_decoder): Likewise.
+ (decode_record): Pass value length to the handler
+ (run_override_list): Pass value length to the decoder
+ (xheader_print_n): New function
+ (xheader_print): Rewritten using xheader_print_n
+ (xheader_finish): Do not rely om strlen to compute the length of
+ the collected string: it can contain embedded nulls
+ (xheader_string_begin,xheader_string_add,xheader_string_end): New
+ functions.
+ (sparse_map_decoder,dumpdir_coder,dumpdir_decoder): New
+ functions. Handle GNU.sparse.map and GNU.dumpdir variables.
+ (xhdr_tab): Add new variables.
+
+ * tests/incr01.at: Test gnu, oldgnu, and posix formats
+ * tests/incremental.at: Likewise
+
+2005-11-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * NEWS: Minor language and white space fixes.
+
+ * tests/truncate.at: Create files whose time stamps must fall on
+ 1-second boundaries. This prevents tests from failing on hosts
+ like Solaris 8 that have nanosecond-resolution file time stamps.
+ * tests/update.at: Likewise.
+
+ * src/xheader.c (strtoimax, strtoumax): Remove decls; now done
+ in system.h.
+
+2005-11-06 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Properly document incremental dumps
+ * doc/value.texi: Likewise.
+ * doc/snapshot.texi: Likewise.
+
+2005-11-05 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Improve listed incremental format:
+
+ * src/common.h (update_parent_directory): New prototype.
+ * src/create.c (dump_file): Call update_parent_directory.
+ * src/incremen.c (struct directory.mtime): New member.
+ (note_directory): Take additional arguments. All callers updated.
+ (scan_directory): Updated to use more metadata. In particular,
+ this allows to correctly detect renamed files.
+ (read_directory_file,write_directory_file)
+ (write_directory_file_entry): Support new directory file format.
+ * tests/listed01.at: Sleep 1 sec before creating second file.
+ * tests/listed02.at: Never skip the test. It should work on any
+ filesystem.
+
+ * doc/snapshot.texi: New file
+ * doc/tar.texi: Update.
+ * doc/Makefile.am: Update.
+
+2005-11-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/extract.c (set_stat): Rewrite to avoid bug in Forte
+ Developer 7 C 5.4 Patch 111708-09 (2004-02-19).
+
+2005-11-04 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * bootstrap: Fix quoting in help output.
+ (update_po): Use backward-compatible wget option --cache instead
+ of deprecated -C to accomodate for wget 1.10.
+ Changes proposed by Eric Blake
+ * THANKS: Add Eric Blake
+
+2005-11-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/tar.texi: Consistently put two spaces after sentences,
+ and put commas after "i.e." and "e.g.". This is the usual GNU
+ style in manuals.
+
+ * lib/.cvsignore: Add creat-safer.c, fcntl--.h, fcntl-safer.h,
+ open-safer.c, openat-die.c, verify.h, to accommodate recent gnulib
+ changes.
+
+2005-10-27 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/compare.c (diff_dumpdir): Pass a valid device number to
+ get_directory_contents.
+
+ * THANKS: Add John Thomas McDole
+
+ * bootstrap: If file `.bootstrap' exists in the cwd and is
+ readable, prepend its contents to the command line
+
+2005-10-21 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * tests/link01.at: Skip test if ln fails (suppose the OS does
+ not support hard links).
+
+2005-10-04 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/tar.c (decode_options): Report error if -A or -r is used
+ together with compression option.
+
+2005-09-29 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * doc/tar.texi: Use @option and @kbd consistently.
+ Document new options.
+
+2005-09-28 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * NEWS: Updated
+ * src/common.h (show_stored_names_option): New variable
+ * src/list.c (print_header): If show_stored_names_option is given,
+ list member names as stored in the archive. Patch proposed by Erik
+ Cumps <erik.cumps@icos.be>
+ * src/tar.c: Implement --show-stored-names option
+
+ * src/common.h (test_label_option): New variable;
+ * src/list.c (print_header): Special handling if test_label_option
+ is set.
+ * src/names.c (all_names_found): If test_label_option is set
+ return true.
+ * src/tar.c: New option --test-label tests the archive volume
+ label. The option proposed by Wouter Verhelst <wouter@nixsys.be>
+
+2005-09-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * tests/Makefile.am (clean-local): Don't attempt to run
+ $(TESTSUITE) if it doesn't exist. Problem reported by
+ Eric Blake.
+
+2005-09-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ Don't filter time stamps through the resolution supported
+ by struct stat; keep them to full nanosecond resolution.
+ This affects behavior only on older hosts or file systems
+ that have lower-resolution time stamps.
+ * src/common.h (OLDER_STAT_TIME): Parenthesize arg.
+ (OLDER_TAR_STAT_TIME): New macro.
+ (code_timespec): New function.
+ (BILLION, LOG10_BILLION, TIMESPEC_STRSIZE_BOUND): New constants.
+ * src/compare.c (diff_file): Use full time stamp resolution.
+ * src/create.c (start_header, dump_file0): Likewise.
+ (start_header, dump_file0): Adjust to new structure layout.
+ (dump_regular_finish): Simplify by using timespec_cmp.
+ * src/extract.c (struct delayed_set_stat): Don't store stat info
+ that we don't need, to save space. All uses changed.
+ (struct delayed_set_stat, struct delayed_link, file_newer_p):
+ (create_placeholder_file, extract_link, apply_delayed_links):
+ Use full time stamp resolution.
+ (check_time): Use code_timespec rather than rolling our own code.
+ (set_stat, delay_set_stat): Arg now points to tar_stat_info to
+ avoid losing time information. All callers changed.
+ * src/list.c (read_and, decode_header, print_heaeder):
+ Use full time stamp resolution.
+ * src/misc.c (code_timespec): New function.
+ * src/tar.h (struct tar_stat_info): Record atime, mtime, ctime
+ separately, for benefit of hosts with lower resolution.
+ * src/update.c (update_archive): Use full time stamp resolution.
+ * src/xheader.c (code_time): Use new code_timespec function
+ to simplify code.
+ (atime_coder, atime_decoder, ctime_coder, ctime_decoder):
+ (mtime_coder, mtime_decoder): Use full time stamp resolution.
+
+ Report time stamps to full resolution in environment.
+ Report memory allocation failures rather than ignoring them.
+ * src/system.c (time_to_env): New function.
+ (oct_to_env, str_to_env, chr_to_env): Report memory allocation failures.
+ (stat_to_env): Report full resolution in time stamps.
+
+2005-09-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge changes from gnulib for file system sub-second time stamps.
+ * configure.ac: Remove checks for struct stat.st_spare1, struct
+ stat.st_atim.tv_nsec, struct stat.st_atimespec.tv_nsec, struct
+ stat.st_atimensec, as gnulib now does this for us.
+ Similarly for LIB_CLOCK_GETTIME.
+ * gnulib.modules: Add stat-time.
+ * lib/.cvsignore: Add stat-time.h.
+ * src/common.h: Include stat-time.h.
+ (timespec_lt): Remove. All callers changed to use timespec_cmp.
+ (get_stat_atime, get_stat_ctime, get_stat_mtime):
+ (set_stat_atime, set_stat_ctime, set_stat_mtime):
+ Remove; now defined by stat-time.h.
+
+2005-09-14 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/incremen.c (list_dumpdir): New function. Used to dump
+ contents of GNUTYPE_DUMPDIR blocks.
+ * src/common.h (list_dumpdir): Likewise.
+ * src/list.c (list_archive): Use list_dumpdir() to display
+ GNUTYPE_DUMPDIR blocks. Do that only if two or more -v options are
+ given.
+
+2005-09-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/.cvsignore: Adjust to current gnulib and modules used.
+ Add getdelim.c, getdelim.h, mbchar.c, mbchar.h, mbuiter.h, memchr.c,
+ pipe-safer.c, size_max.h, strdup.c, strdup.h, strnlen.h, strnlen1.c,
+ strnlen1.h, unistd--.h.
+ Remove getndelim2.c, getndelim2.h, pathmax.h, sysexits.h, xstrdup.c.
+
+ Treat fishy-looking hard links like fishy-looking symlinks.
+ * src/extract.c (struct delayed_set_stat): Rename after_symlinks
+ member to after_links. All uses changed.
+ (struct delayed_link): Renamed from struct delayed_symlink.
+ All uses changed. New member is_symlink.
+ (delayed_link_head): Renamed from delayed_symlink_head. All uses
+ changed.
+ (create_placeholder_file): New function, taken from extract_symlink.
+ (extract_link): Create placeholders for fishy-looking hard links.
+ (extract_symlink): Move code into create_placeholder_file.
+ (apply_delayed_links): Renamed from apply_delayed_symlinks.
+ All uses changed. Create both hard links and symlinks.
+
+2005-09-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * README-alpha: Modernize description of software required for
+ developers.
+
+2005-09-03 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * gnulib.modules: Add strdup
+ * src/incremen.c (purge_directory): Do not dereference symbolic
+ links. Bug reported by Ralph Corderoy <ralph@inputplus.co.uk> and
+ David Brown <davidb@davidb.org>
+ * tests/incr01.at: New test.
+ * tests/Makefile.am: Add incr01.at
+ * tests/testsuite.at: Likewise
+ * THANKS: Updated
+
+2005-08-17 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/incremen.c (read_directory_file): Use strtoumax to read
+ snapshot file contents.
+ (write_directory_file_entry): Use umaxtostr().
+
+2005-07-31 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/create.c (file_dumpable_p,dump_file0): Fix handling of
+ sparse files to /dev/null with --totals option.
+ * tests/update.at: Remove dependency on file order.
+
+2005-07-08 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * doc/tar.texi: Fix typo.
+
+2005-07-07 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * tests/pipe.at: Pipe the output from `tar xfv' through sort.
+
+2005-06-25 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/sparse.c (tar_sparse_init): Fill structure with zeros. Call
+ sparse_select_optab(). All callers updated.
+ (sparse_member_p, sparse_fixup_header): Use tar_sparse_init().
+
+2005-06-23 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/sparse.c (pax_sparse_member_p): Checking member size
+ vs. file size is not reliable enough. Use sparse_map_avail.
+
+ * tests/star/gtarfail.at: Adapt to the new output format
+ * tests/star/gtarfail2.at: Likewise
+ * tests/star/multi-fail.at: Likewise
+ * tests/star/pax-big-10g.at: Likewise
+ * tests/star/ustar-big-2g.at: Likewise
+ * tests/star/ustar-big-8g.at: Likewise
+
+ * tests/sparse03.at: New test.
+ * tests/Makefile.am: Add sparse03.at
+ * tests/testsuite.at: Likewise
+
+ * src/xheader.c (size_decoder): Do not set archive_file_size.
+
+ Fix bugs introduced yesterday:
+
+ * src/sparse.c (tar_sparse_init): Initialize
+ dimped_size to 0.
+ (sparse_scan_file): Initialize archive_file_size to 0. The
+ variable keeps size of the file *as stored in the archive*, not
+ the size reported by stat.
+
+2005-06-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ A sweep of the sparse code prompted by a bug report by Jim Meyering.
+ * src/sparse.c: Include <inttostr.h>.
+ (struct tar_sparse_file): offset and dumped_size are off_t, not
+ size_t. optab is now const *.
+ (dump_zeros): Return bool success flag, not off_t.
+ All callers changed.
+ Use a constant-zero buffer rather than clearing a buffer each time.
+ Don't mess up if write fails.
+ (dump_zeros, check_sparse_region):
+ Don't assume off_t is no wider than size_t.
+ (tar_sparse_init): Don't bother clearing a field that is already clear.
+ (zero_block_p): First arg is const *, not *.
+ (clear_block, SPARSES_INIT_COUNT): Remove.
+ (sparse_add_map): First arg is now struct start_stat_info *, not
+ struct tar_sparse_file *. All callers changed.
+ Use x2nrealloc to check for size_t overflow.
+ (parse_scan_file): Cache commonly-used parts of file.
+ Use an auto buffer, not a static one.
+ Don't bother clearing the buffer; not needed.
+ Don't bother clearing items that are already clear.
+ (oldgnu_optab, star_optab, pax_optab): Now const.
+ (sparse_dump_region): Don't bother clearing the buffer before
+ reading into it; just clear the parts that aren't read into.
+ (sparse_dump_file): Clear the whole local variable 'file'.
+ (diff_buffer): Remove; now a local var.
+ (check_sparse_region): Don't bother clearing buffer before
+ reading into it. Don't assume off_t is promoted to long.
+ (oldgnu_get_sparse_info, star_get_sparse_info):
+ Use an auto status, not static.
+ * src/tar.h (struct tar_stat_info): had_trailing_slash is
+ now bool, not int.
+ * src/xheader.c (sparse_offset_coder, sparse_numbytes_coder):
+ Rewrite to avoid cast.
+ (sparse_offset_decoder, sparse_numbytes_decoder):
+ Diagnose excess entries rather than crashing.
+
+2005-06-22 Jim Meyering <jim@meyering.net>
+
+ * src/common.h (timespec_lt): Add a return type: bool.
+
+2005-06-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ Further improvements inspired by Jim Meyering's fixes.
+
+ * NEWS: Better support for full-resolution time stamps.
+ The -v option now prints time stamps only to 1-minute resolution.
+ * gnulib.modules: Add utimens.
+ * lib/.cvsignore: Add imaxtostr.c, inttostr.c, inttostr.h,
+ offtostr.c, umaxtostr.c, utimens.c, utimens.h. Remove paxconvert.c.
+ * lib/Makefile.tmpl (libtar_a_SOURCES): Remove paxconvert.c.
+ * lib/paxconvert.c: Remove; superseded by umaxtostr.c.
+ * po/POTFILES.in: Remove lib/paxconvert.c. Add lib/xalloc-die.c,
+ lib/obstack.c.
+ * src/buffer.c (set_start_time, compute_duration, start_time):
+ Use gettime rather than rolling our own code.
+ * src/common.h (OLDGNU_NAME_FIELD_SIZE, MAXOCTAL11, MAXOCTAL7): Remove.
+ (newer_ctime_option): Remove.
+ (timespec_lt): New function.
+ (OLDER_STAT_TIME): Use it.
+ (string_to_chars): First arg is char const *, not char *.
+ (tartime): Time arg is now struct timespec. New bool arg.
+ All callers changed.
+ (code_ns_fraction): New decl.
+ (sys_stat_nanoseconds): Remove decl.
+ (get_stat_atime, get_stat_ctime, get_stat_mtime): New functions.
+ (set_stat_atime, set_stat_ctime, set_stat_mtime): New functions.
+ * src/compare.c: Include utimens.h rather than rolling our own.
+ (diff_dir, diff_file, diff_link, diff_symlink, diff_special):
+ Prototype.
+ (diff_dumpdir, diff_multivol): Prototype.
+ (diff_file): Support higher-resolution time stamps.
+ * src/create.c: Include utimens.h rather than rolling our own.
+ (MAX_OCTAL_VAL): New macro.
+ (tar_copy_str, string_to_chars): Don't bother to zero-fill;
+ the destination is already zeroed.
+ (string_to_chars): First arg is char const *.
+ (start_private_header): Use MINOR_TO_CHARS, not MAJOR_TO_CHARS,
+ for minor device number.
+ (write_header_name, dump_hard_link, dump_file0):
+ Simplify test for old GNU format.
+ (start_header): Put in placeholders for uid, etc., even when
+ using extended headers, for benefit of older "tar" implementations.
+ Don't assume uintmax_t is wider than 32 bits.
+ Output extended header for mtime if needed.
+ (dump_regular_finish, dump_file0):
+ Support extended time stamp resolution.
+ * src/extract.c: Include utimens.h rather than rolling our own.
+ (check_time): Support extended time stamp resolution.
+ * src/list.c: Include <inttostr.h>.
+ (tartime): Use umaxtostr rather than stringify_uintmax_t_backwards.
+ * src/xheader.c: Include <inttostr.h>.
+ Do not include <xstrtol.h>.
+ (strtoimax) [!HAVE_DECL_STRTOIMAX && !defined strtoimax]: New decl.
+ (strtoumax) [!HAVE_DECL_STRTOUMAX && !defined strtoumax]: New decl.
+ (BILLION, LOG10_BILLION): New constants.
+ (to_decimal): Remove; superseded by inttostr. All callers changed
+ to use umaxtostr.
+ (xheader_format_name): Don't assume pids and uintmax_t values
+ fit in 63 bytes (!) when printed.
+ (decode_record): Don't bother to check for ERANGE; an out of range
+ value must be treater than len_max anyway.
+ If the length is out of range, output it in the diagnostic.
+ (format_uintmax): Remove; all callers changed to use umaxtostr.
+ (xheader_print): Don't assume sizes can be printed in 99 bytes (!).
+ (out_of_range_header): New function.
+ (decode_time): Use it.
+ (code_time): Accept struct timespec, not time_t and unsigned long.
+ All callers changed. Size sbuf properly, and remove unnecessary check.
+ Don't assume time stamps can fit in 199 bytes.
+ Handle negative time stamps. Handle fractional time stamps
+ more consistently. Don't output unnecessary trailing zeros.
+ (decode_time): Yield struct timespec, not time_t and unsigned long.
+ All callers changed.
+ Handle negative time stamps. Truncate towards minus infinity
+ consistently. Improve overflow checks, and output a better
+ diagnostic on overflow.
+ (code_num): Don't assume uintmax_t can be printed in 99 bytes (!).
+ (decode_num): New function, for better diagnostics.
+ (atime_coder, atime_decoder, gid_decoder, ctime_coder):
+ (ctime_decoder, mtime_coder, mtime_decoder, size_decoder):
+ (uid_decoder, sparse_size_decoder, sparse_numblocks_decoder):
+ (sparse_offset_decoder, sparse_numbytes_decoder):
+ Use decode_num, etc., instead of xstrtoumax, etc.
+
+2005-06-21 Jim Meyering <jim@meyering.net>
+
+ Carefully crafted invalid headers can cause buffer overrun.
+ Invalid header fields go undiagnosed.
+ Some valid time strings are ignored.
+
+ * src/xheader.c (sparse_numblocks_decoder): Remove unchecked use
+ of `calloc'. Use xcalloc instead.
+ (decode_time, gid_decoder, size_decoder, uid_decoder):
+ (sparse_size_decoder, sparse_offset_decoder, sparse_numblocks_decoder):
+ Ensure that the result of calling xstrtoumax is no larger than
+ the maximum value for the target type. Upon any failure, exit with
+ a diagnostic.
+ (sparse_numblocks_decoder): Avoid buffer overrun/heap corruption:
+ use x2nrealloc, rather than `n *= 2' and xrealloc(p, n,....
+ (decode_time): Rewrite to accept time strings like
+ 1119018481.000000000. Before, such strings were always ignored.
+
+2005-06-13 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/create.c (dump_file0): Check for is_avoided_name()
+ first. Fixes bug reported by Martin Lohmeier
+ <martin@mein-horde.de>
+ * tests/update.at: New file
+ * tests/Makefile.am (TESTSUITE_AT): Add update.at
+ * tests/testsuite.at: Likewise
+
+2005-06-13 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac (AC_STRUCT_ST_BLKSIZE)
+ (AC_STRUCT_ST_BLOCKS): Removed. Handled by system.m4.
+
+2005-06-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/names.c (excluded_name): excluded_filename ->
+ excluded_file_name, because the name was changed in gnulib.
+
+2005-05-30 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/tar.c (read_name_from_file,update_argv): Automatically
+ detect nul-terminated list files.
+ * NEWS: Updated
+
+2005-05-27 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * scripts/backup.sh.in: Bugfixes.
+
+2005-05-26 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * scripts/backup.in: Minor fixes
+ * scripts/backup.sh.in (mt_begin,mt_rewind)
+ (mt_offline,mt_status): Use $MT to invoke mt
+ (init_common): Set --rsh-command option for mt if TAPE_FILE is a
+ remote archive.
+ * doc/tar.texi: Document new backup scripts behavior
+
+2005-05-22 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * lib/.cvsignore: Updated
+ * lib/Makefile.tmpl: Add new paxutils files
+ * po/POTFILES.in: Likewise
+ * src/buffer.c: Update invocations of safer_name_suffix()
+ * src/create.c: Likewise
+ * src/extract.c: Likewise
+ * src/xheader.c: Likewise
+ * src/common.h: Include paxlib.h instead of paxerror.h
+ (safer_name_suffix,removed_prefixes_p): Removed. The functions are
+ imported from paxutils
+ * src/names.c (hash_string_hasher,hash_string_compare)
+ (hash_string_insert,hash_string_lookup,removed_prefixes_p)
+ (safer_name_suffix): Moved to paxutils
+
+2005-05-19 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap (copy_files): Accept optional third argument: a prefix
+ to be appended to destination file names.
+ Import paxutils/paxlib files.
+ * configure.ac: Remove checking for LIB_SETSOCKOPT, it is handled
+ by paxutils.
+ * lib/Makefile.tmpl (libtar_a_SOURCES): Add paxerror.c paxexit.c
+ paxconvert.c
+ * po/POTFILES.in: Likewise.
+ * src/common.h: Remove defines and declarations imported from
+ paxutils
+ * src/misc.c: Likewise
+ * src/list.c (stringify_uintmax_t_backwards): Moved to paxutils
+
+2005-05-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/misc.c (remove_any_file): Fix typo in previous change.
+
+2005-05-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ Port to Solaris 10's treatment of unlinking directories.
+ * gnulib-modules: Add unlinkdir.
+ * lib/.cvsignore: Add unlinkdir.h, unlinkdir.c.
+ * src/common.h (we_are_root): Remove extern decl; it's now static.
+ * src/extract.c (we_are_root): Now static.
+ * src/misc.c: Include <unlinkdir.h>.
+ (remove_any_file): Use cannot_unlink_dir () rather than we_are_root.
+
+ * ChangeLog, ChangeLog.1, Makefile.am, NEWS, PORTS, README,
+ README-alpha, TODO, bootstrap, configure.ac, doc/Makefile.am,
+ doc/convtexi.pl, doc/fdl.texi, doc/gendocs_template,
+ lib/Makefile.tmpl, lib/prepargs.c, lib/waitpid.c, po/POTFILES.in,
+ scripts/Makefile.am, scripts/backup-specs, scripts/backup.in,
+ scripts/backup.sh.in, scripts/restore.in, src/Makefile.am,
+ src/arith.h, src/buffer.c, src/common.h, src/compare.c,
+ src/create.c, src/delete.c, src/extract.c, src/incremen.c,
+ src/list.c, src/mangle.c, src/misc.c, src/names.c, src/sparse.c,
+ src/system.c, src/tar.c, src/tar.h, src/update.c, src/utf8.c,
+ src/xheader.c, tests/Makefile.am, tests/append.at,
+ tests/append01.at, tests/comprec.at, tests/delete01.at,
+ tests/delete02.at, tests/delete03.at, tests/delete04.at,
+ tests/delete05.at, tests/extrac01.at, tests/extrac02.at,
+ tests/extrac03.at, tests/extrac04.at, tests/extrac05.at,
+ tests/gzip.at, tests/ignfail.at, tests/incremental.at,
+ tests/link01.at, tests/listed01.at, tests/listed02.at,
+ tests/long01.at, tests/longv7.at, tests/multiv01.at,
+ tests/multiv02.at, tests/multiv03.at, tests/multiv04.at,
+ tests/old.at, tests/options.at, tests/options02.at, tests/pipe.at,
+ tests/recurse.at, tests/same-order01.at, tests/same-order02.at,
+ tests/shortrec.at, tests/sparse01.at, tests/sparse02.at,
+ tests/testsuite.at, tests/truncate.at, tests/version.at,
+ tests/volume.at, tests/star/gtarfail.at, tests/star/gtarfail2.at,
+ tests/star/multi-fail.at, tests/star/pax-big-10g.at,
+ tests/star/quicktest.sh, tests/star/ustar-big-2g.at,
+ tests/star/ustar-big-8g.at:
+ Update FSF postal mail address.
+
+2005-05-12 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * NEWS: Updated
+ * THANKS: Updated
+ * bootstrap: Install files from paxutils/doc
+ * doc/Makefile.am (tar_TEXINFOS): Add genfile.texi
+ * doc/tar.texi (Genfile): New appendix
+ * src/compare.c (diff_file): diff_handle was not initialized
+ * src/create.c (dump_regular_file): Correctly pad archive members
+ that shrunk during archiving. Repored by Frank Heckenbach.
+ * src/extract.c (file_newer_p): Return false if file does not
+ exist
+ (prepare_to_extract): Correct warning wording.
+ * tests/truncate.at: New test case
+ * tests/Makefile.am: Add truncate.at
+ * tests/testsuite.at: Likewise.
+
+ * doc/.cvsignore: Updated
+ * lib/.cvsignore: Updated
+ * tests/.cvsignore: Updated
+
+2005-05-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * tests/multivol04.at: Tell awk to read from /dev/null.
+
+ Adjust to recent gnulib changes.
+ * lib/.cvsignore: Add dup-safer.c, fd-safer.c, unistd-safer.h.
+ * src/common.h (initial_umask): New var.
+ * src/create.c (start_ueader): Use it, and adjust to new modechange
+ API.
+ (hash_link): unsigned -> size_t parameters and result.
+ * src/incremen.c (hash_directory): Likewise.
+ * src/names.c (hash_string_hasher): Likewise.
+ * src/tar.c (parse_opt): Set it, and adjust to new modechange API.
+
+2005-04-19 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * tests/Makefile.am: Add shortrec.at.
+
+2005-04-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/buffer.c (reading_from_pipe): Remove. All uses removed.
+ (short_read): Don't warn about short reads; they're normal.
+ * tests/shortrec.at: New file.
+ * tests/testsuite.at: Include it.
+
+ * bootstrap (gnulib_modules): Don't create a file modlist.tmp, as
+ it is sometimes left behind as a garbage file (maybe due to the
+ multiple traps?).
+
+2005-04-14 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/list.c: Handle Solaris 'X' type flag
+ * src/tar.h (SOLARIS_XHDTYPE): New define
+
+2005-04-06 Sergey Poznyakoff <gray@mirddin.farlep.net>
+
+ * src/tar.c: Minor fixes to text messages. Proposed by Benno
+ Schulenberg.
+ * src/extract.c: Likewise
+ (extract_file): Assign orig_file_name
+ to save_name uniformly over the program. This fixes matching
+ directory names at the start of an archive volume.
+ * src/buffer.c (flush_write): Warn when the name of the archive
+ straddling volume boundary is longer than 100 characters. Earlier
+ behavior was to issue a fatal error.
+ (struct zip_magic): Reverted part of changes from 2005-04-04.
+ They make the maintenance too costly. Removing `unsigned'
+ qualifier from `magic' member should be enough.
+ * src/compare.c (diff_init): Read directory file if in listed
+ incremental. This prevents spurious 'Contents differ' diagnostics.
+ (diff_archive): Minor fixes to text messages
+ (diff_file,diff_dumpdir,diff_multivol): Assign orig_file_name
+ to save_name uniformly over the program. This fixes matching
+ directory names at the start of an archive volume.
+ * src/create.c: Assign orig_file_name
+ to save_name uniformly over the program. This fixes matching
+ directory names at the start of an archive volume.
+ * src/list.c: Likewise
+
+ * tests/multiv03.at: Modified to match the new behavior
+ * tests/multiv04.at: New file. Test splittind directory members between
+ the archive volumes.
+ * tests/Makefile.am: Add multiv04.at
+ * tests/testsuite.at: Likewise.
+
+2005-04-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * configure.ac (AC_CONFIG_AUX_DIR): Rename from config to build-aux,
+ for reasons discussed in the thread beginning at
+ <http://lists.gnu.org/archive/html/bug-gnulib/2005-03/msg00119.html>.
+ * .cvsignore: Remove config; add build-aux.
+
+ * src/buffer.c (struct zip_magic): Use char arrays, not pointers.
+ The unsigned char * pointer ran afoul of pedantic C compilers, and
+ we didn't need pointers anyway. Put the size field before the
+ data to avoid unnecessary padding. All uses changed.
+ (magic) Make it const, since it doesn't change. All uses changed.
+
+2005-04-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/xheader.c (decode_record): Don't dump core when given
+ a corrupted extended header. Problem reported by Jim Meyering.
+ Also, check for other ways that the header might be invalid,
+ e.g., missing newline at end. Do not allow keys with nulls.
+ Allow blanks before and after length, as POSIX requires.
+ Do not allow leading "-" in length. Check for length overflow.
+ (xheader_decode, xheader_decode_global): Let decode_record
+ check for exhaustion of record.
+ (xheader_read): Null-terminate the extended record;
+ decode_record relies on this.
+
+2005-03-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * bootstrap (TP_URL): Change from
+ <http://www2.iro.umontreal.ca/~gnutra/po/maint/tar/> to
+ <http://www.iro.umontreal.ca/translation/maint/tar/> to avoid
+ some redirection glitches.
+ Use "trap - 0" rather than "trap 0" to fix a POSIX-conformance bug.
+ * doc/.cvsignore: Change "tar.info" to "tar.info*". Sort.
+ * lib/.cvsignore: Add intprops.h (new gnulib file).
+
+2005-03-04 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/list.c (print_header): Print UID/GID in case of
+ empty user/group name. This could occur when dumping
+ files belonging to non-existing users and when listing
+ broken archives.
+ Reported by Igor Lautar.
+
+ * src/create.c: Correctly parse empty uname/gname
+ * src/sparse.c (sparse_scan_file): Bugfix. offset had
+ incorrect type.
+
+ * scripts/backup.in: Use `head -n 1'. Provide missing
+ argument to ${MT_STATUS}. Proposed by Jan Merka.
+ * scripts/backup.sh.in: Likewise. Fixed typo in
+ MT_OFFLINE assignment.
+ * scripts/restore.in (restore_fs): Use root_fs
+
+2005-02-15 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/create.c: Replace strdup with xstrdup
+ * src/names.c: Likewise
+ * src/tar.c: Likewise
+
+ * tests/append01.at: Added reference to bug-tar archive
+ * tests/listed02.at: Use -print with find.
+
+2005-02-11 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * THANKS: Added Tim Adye. Fixed UTF.
+ * src/list.c (read_header): Removed assignment to
+ oldgnu_header.isextended. It was breaking append mode.
+
+ * tests/append01.at: New test.
+ * tests/Makefile.am: Added append01.at
+ * tests/testsuite.at: Likewise
+
+2005-02-06 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * gnulib.modules: New file. List of required gnulib
+ modules.
+ * bootstrap: Merge list of required modules from
+ paxutils with that from tar proper.
+ * src/tar.c: Various fixes in help and diagnostic messages.
+
+2005-02-05 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/common.h (EXTRACT_OVER_PIPE): New macro
+ * src/compare.c: Code clean up.
+ * src/extract.c (extract_archive): Do not check for
+ EXTRACT_OVER_PIPE, decode_options() does this.
+ * src/misc.c (exec_error,fork_error,dup2_error)
+ (pipe_error): Removed unneeded functions.
+ * src/system.c (sys_exec_command): Use xclose, xpipe,
+ xfork, xdup2 and exec_fatal.
+ * src/tar.c (options): Improved sorting. Document --backup=off.
+ (decode_options): Clear backup_option if necessary.
+
+2005-02-05 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Initial implementation of --to-command option proposed
+ by Hansjoerg Lipp.
+
+ * bootstrap: Get setenv module from gnulib
+ * src/buffer.c: Do not use 8-bit chars in comments
+ * src/common.h (to_command_option)
+ (ignore_command_error_option): New globals
+ (sys_exec_command,sys_wait_command): New commands
+ * src/extract.c (extract_file): Handle to_command_option
+ Fix error recovery: decrease `size' by `written', not
+ by `count', otherwise tar misses the next header
+ Do not diagnose write error if to_command_option
+ is set, since the command may have exited prematurely.
+ It would be better to check for sigpipe, though.
+ (prepare_to_extract): Handle to_command_option
+ * src/misc.c (exec_error, fork_error, dup_error)
+ (pipe_error): New functions
+ * src/system.c (sys_exec_command)
+ (sys_wait_command): New functions
+ * src/tar.c: Handle new options --to-command,
+ --ignore-command-error
+ * THANKS: Added Hansjoerg Lipp
+
+2005-02-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/list.c (from_header): New arg OCTAL_ONLY, normally false.
+ All uses changed. Fix typo that sometimes suppressed all "Archive
+ contains obsolescent base-64 headers" warnings, not just the first
+ one.
+ (tar_checksum): Accept only octal checksums, since they aren't
+ supposed to overflow into weird formats.
+
+ Adjust to gnulib changes.
+ * lib/.cvsignore: Add chdir-long.c, chdir-long.h, memrchr.c,
+ memrchr.h, openat.c, openat.h. Remove pathmax.h (added by
+ mistake, perhaps?), sysexit.h (my typo), xstrdup.c (gnulib removed
+ this file). Sort entries.
+
+2005-02-04 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/extract.c: Further rewrite.
+ * src/buffer.c: Removed unused variables.
+ * src/list.c: Likewise
+ * src/tar.c (update_argv): Changed type to void
+
+ * src/common.h (OLDGNU_NAME_FIELD_SIZE): New constant
+ * src/create.c (start_private_header,write_header_name)
+ (dump_hard_link): Restore compatibility with 1.13.25
+ * src/extract.c (extract_archive): Rewritten
+ * src/list.c: Add translators' comments
+ * src/tar.c (options) Minor spelling fix
+ * tests/star/quicktest.sh: Determine path to the tar executable.
+
+2005-02-03 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * po/POTFILES.in: Added tests/genfile.c
+ * src/buffer.c (short_read): Use ngettext()
+ (new_volume): use quote().
+ * src/create.c: Use quote()
+ * src/extract.c: Likewise
+ * src/xheader.c: Likewise
+ * src/misc.c: Add comments to translators
+
+ * tests/same-order01.at: sort ls output
+ * tests/sparse01.at (RE_CHECK): Added missing space
+
+ * tests/sparse02.at: Test extracting sparse files over a pipe.
+ * tests/Makefile.am: Added sparse02.at
+ * tests/testsuite.at: Likewise
+ * tests/listed02.at: Skip the test on filesystems that do not
+ update ctime of a file when renaming it. To be reverted when
+ the new incremental mode is ready.
+ * tests/sparse01.at: Extract and compare sparse file
+
+2005-02-02 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/sparse.c: Extract sparse files even if the output
+ fd is not seekable.
+
+2005-02-01 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap: Add a comment to lib/Makefile.am saying that this
+ is an autogenerated file.
+ Exit with code 1 if any of autotools fails.
+ * lib/Makefile.tmpl: Insert Emacs magic to the first line.
+ * tests/Makefile.am: Add append.at
+
+ * m4/.cvsignore: Ignore all *.m4 files
+
+2005-01-18 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Rewritten handling of -T (--files-from) option. Now it
+ inserts the file names immediately into argv array which allows
+ for:
+ 1) any valid tar options (including another -T) to be used in the file
+ 2) any number of -T options to be given in command line
+
+ * configure.ac: Raised version number to 1.15.2
+ * src/common.h: Include obstack.h
+ (files_from_option): Removed
+ (unquote_option): New variable
+ (stat_fatal): New function
+ (name_close): Removed function.
+ * src/incremen.c: Remove inclusion of obstack.h
+ * src/xheader.c: Likewise.
+ * src/misc.c (stat_fatal): New function
+ * src/names.c (name_file): Removed variable.
+ (read_name_from_file): Removed function. All callers changed.
+ (name_close): Removed function. All callers changed.
+ * src/tar.c: New options --unquote (--no-unquote) and
+ --add-file
+ (add_file_id,read_name_from_file,update_argv): New functions
+ (parse_opt): Rewritten handling of -T option. Handle hidden
+ --HANG option for debugging purposes.
+ (decode_options): Init unquote_option to true. Init argv_stk.
+ Remove unneeded references to files_from_option
+
+ * doc/tar.texi: Document new options.
+ Moved rendition macros and option value definitions into
+ separate files
+ * doc/rendition.texi: New file
+ * doc/value.texi: New file
+ * doc/Makefile.am: Updated
+
+2005-01-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * tests/testsuite.at (RE_CHECK): Use "join - file", not
+ "join file -", to work around a bug in Solaris 8 join.
+ Problem reported by Tomohiro Suzuki.
+
+2005-01-13 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/list.c (read_header): Fixed calculation of the
+ size for GNU long name/link. Tar was reading one block
+ more if name_size was divisible by 512. Thanks Josef
+ Bauer.
+ * tests/long01.at: New file. Test listing of GNU long names
+ divisible by 512.
+ * tests/pipe.at: Sort tar output.
+ * tests/Makefile.am: Added long01.at
+ * tests/testsuite.at: Likewise.
+ * THANKS: Added Josef Bauer
+ * lib/.cvsignore: Updated
+ * m4/.cvsignore: Updated
+ * NEWS: Updated
+
+2005-01-11 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * directory: Updated for 1.15.1
+ * doc/Makefile.am: Use gendocs.sh to generate web documentation
+ * doc/gendocs_template: Template file for gendocs.sh
+ * doc/tar.texi: Updated docs for --[no-]same-permissions
+ * src/tar.c: Reworded docstrings for --[no-]same-permissions
+
+2005-01-06 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap: Create m4/paxutils.m4
+ * configure.ac: Call tar_PAXUTILS
+ * tests/options02.at: Test that tar correctly handles non-option
+ arguments interspersed with options.
+ * tests/Makefile.am: Add options02.at
+ * tests/testsuite.at: Likewise
+ * tests/listed02.at: Do not create useless directory
+
+2005-01-05 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/tar.c (parse_opt): Bugfix: Use ARGP_KEY_ARG. Thanks
+ Mike Frysinger <vapier@gentoo.org> for reporting.
+
+2005-01-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/Makefile.tmpl (localedir.h): Omit needless quotes and a
+ needless sed command. Problem reported by Paul Jarc.
+
+2004-12-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ Accommodate latest gnulib.
+ * doc/.cvsignore: Add getdate.texi.
+ * bootstrap: Do not treat alloca-opt specially; this is no
+ longer needed (and breaks builds) with latest gnulib.
+
+2004-12-22 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/tar.c (main): Reverted recent changes (#ifdef).
+
+2004-12-21 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Raise version number to 1.15.1
+ Check for locale.h
+ * NEWS: Entry for 1.15.1
+ * src/buffer.c: Bugfix. Changes introduced 2004-11-26
+ broke extraction from stdin.
+ * src/list.c (from_header, tar_checksum): Changed declaration.
+ All callers updated.
+ * src/common.h: Likewise
+ * src/tar.c (main): Protect invocation of setlocale by
+ ifdef.
+
+ * tests/comprec.at: New test
+ * tests/pipe.at: New test
+ * tests/Makefile.am (comprec.at,pipe.at): New tests
+ * tests/testsuite.at: Likewise
+ * tests/gzip.at: Use AT_GZIP_PREREQ
+ * tests/star/pax-big-10g.at: Likewise
+ * tests/star/ustar-big-2g.at: Likewise
+ * tests/star/ustar-big-8g.at: Likewise
+
+ * tests/extrac04.at: Discard stderr from sort, on some
+ systems it spits out lots of irrelevant info.
+ * tests/listed02.at: Likewise
+
+ * doc/index.html.in: Rewritten in xhtml to follow recent
+ GNU site standards.
+ * THANKS: Updated
+
+2004-12-20 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Released version 1.15. Sources up to this point are
+ tagged release_1_15.
+
+ * configure.ac: Raised version number to 1.15
+ * NEWS: Likewise
+ * directory: Updated
+ * bootstrap (update_po): Give -r to wget. Always remove index.html
+ Ignore alloca-opt module (it duplicates alloca)
+
+ * tests/Makefile.am: Distribute star/quicktest.sh
+ * tests/star/README: Document quicktest.sh
+ * tests/star/qucktest.sh: Removed.
+ * tests/star/quicktest.sh: New file.
+
+2004-12-18 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * NEWS: Updated
+ * doc/tar.texi: Document auto-detection of compressed archive
+ formats.
+ * src/tar.c (decode_options): Ignore --seek if used with --delete.
+ Delete.c is based on the assumption that the archive is being
+ actually read, not lseeked.
+
+ * tests/delete05.at: New file
+ * tests/extrac02.at: Fixed typo in AT_SETUP
+ * tests/Makefile.am: Added delete05.at
+ * tests/testsuite.at: Likewise.
+
+2004-12-17 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/delete.c (delete_archive_members): Bugfix: when
+ attempting to delete an nonexistent member, the last
+ blocking_factor blocks were zeroed.
+
+2004-12-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * TODO: Mention sub-second resolution, lutimes, lchmod.
+
+2004-11-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ Adjust to recent gnulib changes.
+ * doc/getdate.texi: Remove, since bootstrap gets it from gnulib now.
+ * .cvsignore: Add rmt, rmt/*, rmt/*/*.
+ * lib/.cvsignore: Add allocsa.c, allocsa.h, allocsa.valgrind,
+ charset.alias, config.charset, getcwd.c, getcwd.h, localcharset.c,
+ localcharset.h, ref-add.sed, ref-add.sin, ref-del.sed,
+ ref-del.sin, setenv.c, setenv.h, unsetenv.c. Remove pathmax.h,
+ xstrdup.c.
+ * m4/.cvsignore: Add allocsa.m4, eealloc.m4, getcwd-path-max.m4,
+ localcharset.m4, realloc.m4, setenv.m4. Remove malloc.m4,
+ pathmax.m4, realloc.m4.
+
+2004-11-26 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Raised version number to 1.14.91
+ * scripts/tarcat: New file
+ * scripts/Makefile.am: Added tarcat
+ * src/buffer.c (hit_eof): Changed type to boolean
+ (read_full_records,reading_from_pipe): New variables
+ (check_compressed_archive,open_compressed_archive): New functions
+ (open_archive): Autodetect compressed archives and act accordingly.
+ Set reading_from_pipe. This fixes controversial set of changes
+ introduced 2004-05-11,2004-03-22.
+ * src/list.c (tar_checksum): New function
+ (read_header): Use tar_checksum().
+ * src/common.h (tar_checksum): New function
+
+ * tests/star/README: Updated
+ * NEWS: Updated
+ * PORTS: Updated
+
+2004-11-16 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/tar.c (decode_options): Fixed -o semantics. Thanks
+ Jean Delvare <khali@linux-fr.org>
+
+2004-10-25 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap: Add localcharset
+ * lib/Makefile.tmpl: Initialize SUFFIXES and CLEANFILES since the
+ makefile snippet from localcharset uses '+=' on them.
+ * src/Makefile.am (LDADD): Add LIBICONV
+ * src/list.c (decode_header): Set uname/gname to NULL if their
+ header counterparts are empty
+ * src/tar.c (options): Use OPTION_NO_TRANS
+ * src/utf8.c: Use locale_charset() from gnulib
+
+ * tests/star/README: Updated
+
+ * NEWS: Updated
+ * TODO: Minor fix
+
+2004-10-04 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * THANKS: Added Bryan Ford
+ * doc/Makefile.am (.text): Fixed rule
+ * po/POTFILES.in: Added argp-help.c
+
+2004-10-04 Bryan Ford <baford@mit.edu>
+
+ * src/tar.c: New option --exclude-caches, to exclude
+ cache directories automatically on archive creation.
+ Cache directories are directories containing a
+ standardized tag file, as specified at:
+ http://www.brynosaurus.com/cachedir/spec.html
+ * src/common.h: New variable exclude_caches_option.
+ * src/create.c: New function check_cache_directory(),
+ called from dump_dir0() if exclude_caches_option is set,
+ to check for a cache directory tag and exclude the directory
+ if such a tag is found.
+ * doc/tar.texi: Updated accordingly.
+
+2004-09-16 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * doc/tar.texi: Minor fix
+ * src/tar.c (options): Minor fix
+
+2004-09-12 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * TODO: Updated
+ * lib/Makefile.tmpl: Added 'rtapelib.o: localedir.h' dependency
+ * src/common.h: Comment WANT_DIRECTORY_REMOVE_OPTION.
+ * src/extract.c: Normalized use of remove_any_file().
+ * src/misc.c: Likewise.
+ * src/tar.c (parse_opt): Emit warning if -l option is used.
+ (show_default_settings): REMOTE_SHELL may be undefined
+
+2004-09-07 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Test suite rewritten in autotest.
+
+ * configure.ac: Updated for autotest
+ * src/tar.c (argp_program_version): Modified.
+ * tests/Makefile.am: Rewritten for autotest.
+
+ * tests/.cvsignore: Updated
+ * tests/append.at: New file
+ * tests/atlocal.in: New file
+ * tests/delete01.at: New file
+ * tests/delete02.at: New file
+ * tests/delete03.at: New file
+ * tests/delete04.at: New file
+ * tests/extrac01.at: New file
+ * tests/extrac02.at: New file
+ * tests/extrac03.at: New file
+ * tests/extrac04.at: New file
+ * tests/extrac05.at: New file
+ * tests/gzip.at: New file
+ * tests/ignfail.at: New file
+ * tests/incremental.at: New file
+ * tests/link01.at: New file
+ * tests/listed01.at: New file
+ * tests/listed02.at: New file
+ * tests/longv7.at: New file
+ * tests/multiv01.at: New file
+ * tests/multiv02.at: New file
+ * tests/multiv03.at: New file
+ * tests/old.at: New file
+ * tests/options.at: New file
+ * tests/recurse.at: New file
+ * tests/same-order01.at: New file
+ * tests/same-order02.at: New file
+ * tests/sparse01.at: New file
+ * tests/testsuite.at: New file
+ * tests/version.at: New file
+ * tests/volume.at: New file
+ * tests/star/gtarfail.at: New file
+ * tests/star/gtarfail2.at: New file
+ * tests/star/multi-fail.at: New file
+ * tests/star/pax-big-10g.at: New file
+ * tests/star/ustar-big-2g.at: New file
+ * tests/star/ustar-big-8g.at: New file
+
+ * tests/preset.in: Removed
+ * tests/before: Removed
+ * tests/after: Removed
+ * tests/version.sh: Removed.
+ * tests/append.sh: Removed.
+ * tests/delete01.sh: Removed.
+ * tests/delete02.sh: Removed.
+ * tests/delete03.sh: Removed.
+ * tests/delete04.sh: Removed.
+ * tests/extrac01.sh: Removed.
+ * tests/extrac02.sh: Removed.
+ * tests/extrac03.sh: Removed.
+ * tests/extrac04.sh: Removed.
+ * tests/extrac05.sh: Removed.
+ * tests/gzip.sh: Removed.
+ * tests/incremen.sh: Removed.
+ * tests/ignfail.sh: Removed.
+ * tests/link01.sh: Removed.
+ * tests/listed01.sh: Removed.
+ * tests/listed02.sh: Removed.
+ * tests/longv7.sh: Removed.
+ * tests/multiv01.sh: Removed.
+ * tests/multiv02.sh: Removed.
+ * tests/multiv03.sh: Removed.
+ * tests/old.sh: Removed.
+ * tests/options.sh: Removed.
+ * tests/same-order01.sh: Removed.
+ * tests/same-order02.sh: Removed.
+ * tests/volume.sh: Removed.
+ * tests/recurse.sh: Removed.
+ * tests/sparse01.sh: Removed.
+ * tests/star/gtarfail.sh: Removed.
+ * tests/star/gtarfail2.sh: Removed.
+ * tests/star/multi-fail.sh: Removed.
+ * tests/star/ustar-big-2g.sh: Removed.
+ * tests/star/ustar-big-8g.sh: Removed.
+ * tests/star/pax-big-10g.sh: Removed.
+
+2004-09-07 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap: Install genfile.c from paxutils
+ * tests/genfile.c: Removed. Integrated into
+ paxutils.
+ * tests/mksparse.c: Removed. Integrated into
+ (paxutils) genfile.c
+ * tests/Makefile.am: Removed mksparse
+ * tests/sparse01.sh: Use genfile instead of mksparse
+
+2004-09-06 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Started merging with cpio into paxutils. Sources before
+ this point are tagged alpha-1_14_90
+
+ * Makefile.am: Updated for use with paxutils
+ * README-alpha: Likewise
+ * bootstrap: Likewise
+ * configure.ac: Likewise
+ * lib/Makefile.tmpl: Likewise
+ * po/POTFILES.in: Likewise
+ * src/Makefile.am: Likewise
+ * src/buffer.c: Likewise
+ * src/common.h: Likewise
+ * src/compare.c: Likewise
+ * src/create.c: Likewise
+ * src/delete.c: Likewise
+ * src/extract.c: Likewise
+ * src/incremen.c: Likewise
+ * src/list.c: Likewise
+ * src/mangle.c: Likewise
+ * src/misc.c: Likewise
+ * src/names.c: Likewise
+ * src/sparse.c: Likewise
+ * src/system.c: Likewise
+ * src/tar.c: Likewise
+ * src/update.c: Likewise
+ * src/utf8.c: Likewise
+ * src/xheader.c: Likewise
+
+ * src/system.h: Removed
+ * src/rmt.c: Removed
+ * src/rmt.h: Removed
+ * src/rtapelib.c: Removed
+
+2004-09-03 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * tests/listed02.sh: Do not depend on any particular ordering
+ of output.
+
+2004-09-02 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * doc/tar.texi: Document the use of -C option in
+ file lists. Document --seek option.
+ * configure.ac: New option --with-rmt. New configuration variable
+ DEFAULT_RMT_DIR. Removed DEFAULT_RMT_COMMAND.
+ * src/Makefile.am: Install rmt into rmtdir
+ * src/tar.c (usage): Minor fix.
+ * NEWS: Updated.
+ * README: Updated.
+
+2004-09-01 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Raised version number to 1.14.90
+ * src/common.h (is_individual_file): New prototype
+ * src/create.c (dump_file0): Fix bug introduced
+ 2004-02-21.
+ * src/names.c (register_individual_file)
+ (is_individual_file): New functions.
+ * tests/listed01.sh: Use genfile instead of dd.
+ * tests/listed02.sh: New file.
+ * tests/Makefile.am: Added listed02.sh
+
+ * NEWS: Updated
+
+2004-08-31 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/sparse.c (sparse_add_map): Fixed improper initializations
+ of sparse_map_size. We assume that whatever number it contains
+ describes adequately the current size of sparse_map. The only
+ number we need to reset is sparse_map_avail.
+ * src/compare.c (verify_volume): Call set_next_block_after
+ if read_header returns HEADER_FAILURE
+ Destroy and reinitialize content of current_stat_info and
+ extended_header after each iteration (bug reported by
+ John L. Males <jlmales@yahoo.com>).
+ Issue a warning if the created archive contains some members
+ whose file names were stripped off their leading prefixes.
+ This is a temporary fix of the issue reported by Bdale Garbee
+ <bdale@gag.com> (Refs: Debian bug 230064, Message-Id
+ <87n07kyzhi.fsf@rover.gag.com>, Sun, 15 Feb 2004 11:22:17 -0700)
+
+ * src/names.c (removed_prefixes_p): New function.
+
+ * src/buffer.c: When computing write rate do not take
+ into account the time needed to verify the archive(s).
+ The bug reported by John L. Males <jlmales@yahoo.com>
+ (set_start_time,compute_duration): New functions.
+ (print_total_written): Use the result of compute_duration().
+ (close_archive): Call compute_duration.
+ * src/common.h (set_start_time, removed_prefixes_p): New prototypes.
+ * src/list.c (decode_header): Fixed initialization
+ of stat_info->is_sparse
+ * src/tar.c (main): Call set_start_time().
+
+ * src/misc.c (unquote_string): Unquote '\a' and '\v'.
+ Reported by Helmut Waitzmann <helmut.waitzmann@web.de>.
+
+ * NEWS: Updated
+ * THANKS: Updated
+
+2004-08-30 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/tar.c: Fix copy-n-paste errors in the license
+
+2004-08-19 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * scripts/backup.in: Renamed LIBPATH to LIBDIR.
+ Use ROOT_FS with -C option. Do not send mail
+ if ADMINISTRATOR is set to NONE.
+ * scripts/backup.sh.in (test_root): Append / to
+ ROOT_FS if it does not already end in it.
+ * scripts/restore.in: Renamed LIBPATH to LIBDIR.
+ New option -a (--all). Do not start restore unless
+ -a or patterns are given.
+ (restore_fs,restore_files): Fixed use of --listed option.
+ * doc/tar.texi: Updated
+ * NEWS: Updated
+
+2004-08-17 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/tar.c (find_argp_option): Fixed typo
+
+2004-08-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge argp, getopt, xalloc changes from gnulib.
+ * bootstrap (gnulib_modules): Add xalloc-die.
+ Remove code to test for patches; we don't have patches now.
+ Set LC_ALL=C so that file names sort consistently.
+ Prefer the gnulib copies of gettext.m4, glibc21.m4,
+ lib-ld.m4, lib-prefix.m4, po.m4 too.
+
+ * patches/getopt.diff: Remove; gnulib now works unpatched.
+ * configure.ac (_getopt_long_only_r): Remove check.
+ gl_ARGP now does this for us.
+ * lib/.cvsignore: Add fnmatch.h, getopt_.h, sysexit.h,
+ xalloc-die.c.
+ * src/extract.c: Adjust to changes to gnulib xalloc module.
+ (extr_init): Remove assignment to xalloc_fail_func; no longer needed.
+ (xalloc_die): New function.
+
+2004-08-10 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * NEWS: Updated
+
+ * src/buffer.c (flush_write): Limit filenames
+ of the members that straddle multivolume archive
+ boundary to 100 characters.
+ (flush_read): Use strncmp when comparing multivolume member
+ names.
+ * tests/multiv03.sh: New file
+ * tests/Makefile.am: Added multiv03.sh
+
+2004-08-09 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/list.c (read_and): Call decode_header before
+ calling skip_member()
+ (skip_member): Use is_sparse field to determine if the
+ member is a sparse file.
+
+ * tests/Makefile.am: Added extrac05.sh
+ * tests/extrac05.sh: New file
+ * tests/append.sh: Rearranged leading comments. Added explicit
+ references to report messages wherever available.
+ * tests/delete01.sh: Likewise
+ * tests/delete02.sh: Likewise
+ * tests/delete03.sh: Likewise
+ * tests/delete04.sh: Likewise
+ * tests/extrac01.sh: Likewise
+ * tests/extrac02.sh: Likewise
+ * tests/extrac03.sh: Likewise
+ * tests/extrac04.sh: Likewise
+ * tests/gzip.sh: Likewise
+ * tests/ignfail.sh: Likewise
+ * tests/incremen.sh: Likewise
+ * tests/link01.sh: Likewise
+ * tests/listed01.sh: Likewise
+ * tests/longv7.sh: Likewise
+ * tests/multiv01.sh: Likewise
+ * tests/multiv02.sh: Likewise
+ * tests/old.sh: Likewise
+ * tests/options.sh: Likewise
+ * tests/recurse.sh: Likewise
+ * tests/same-order01.sh: Likewise
+ * tests/same-order02.sh: Likewise
+ * tests/sparse01.sh: Likewise
+ * tests/version.sh: Likewise
+ * tests/volume.sh: Likewise
+
+2004-08-08 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap: Extended --update-po option to take an
+ optional argument specifying the po file to update.
+ * src/create.c: Improved compatibility with 1.13.25
+ * tests/link01.sh: New file.
+ * tests/Makefile.am: Added link01.sh
+
+2004-08-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from gnulib.
+
+ * patches/argp.diff: Remove; no longer needed.
+
+ * lib/.cvsignore: Add stat-macros.h.
+ Remove addext.c, malloc.c, realloc.c.
+
+ * src/extract.c: Include <getcwd.h>.
+ (extract_archive): Rewrite with new macro IS_ABSOLUTE_FILE_NAME.
+ * src/extract.c (make_directories):
+ FILESYSTEM_PREFIX_LEN -> FILE_SYSTEM_PREFIX_LEN.
+ * src/misc.c (must_be_dot_or_slash): Likewise.
+ * src/names.c (excluded_name, safer_name_suffix, stripped_prefix_len):
+ Likewise.
+ * src/tar.c (parse_opt): Likewise.
+ * src/incremen.c (purge_directory): Fix format buffer typos in warning
+ strings.
+ * src/tar.c (options): Add missing initializers to pacify gcc.
+ (decode_options): Remove unused var.
+
+2004-08-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * bootstrap (gnulib_modules): Add getpagesize.
+ * configure.ac (valloc): Remove check; valloc no longer used.
+ * lib/.cvsignore: Add getpagesize.h.
+ * m4/.cvsignore: Add getpagesize.m4.
+ * src/buffer.c (record_buffer): New var.
+ (open_archive): Don't use valloc; on older or buggy hosts, you can't
+ free the result. Use page_aligned_alloc instead.
+ * src/compare.c (diff_init): Likewise.
+ * src/buffer.c (open_archive): Record the pointer to be freed
+ into record_buffer.
+ (close_archive): Free record_buffer.
+ * src/common.h (page_aligned_alloc): New decl.
+ * src/misc.c (quote_n, quote): Remove these redundant functions.
+ (ptr_align): New function, from coreutils/src/system.h.
+ (page_aligned_alloc): New function.
+ * src/system.h (valloc): Remove.
+
+2004-07-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/extract.c (extract_archive): Do not report an error
+ when hard-linking X to X when X exists. Problem reported by
+ Toby Peterson.
+ * lib/.cvsignore: Add fchown-stub.c.
+
+2004-06-29 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * NEWS: Updated
+ * src/common.h (root_device): New global.
+ (gnu_restore): Renamed to purge_directory().
+ * src/extract.c (extr_init): Save the device number
+ of the root device.
+ (extract_archive): Renamed gnu_restore() to purge_directory().
+ * src/incremen.c (gnu_restore): Renamed to purge_directory().
+ Do not attempt to purge the directory if it is on a different
+ device and one_file_system_option is set.
+
+2004-06-25 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * doc/tar.texi: The actual default for exclude patterns
+ is --no-anchored. Fixed.
+ * src/tar.c (options): Likewise.
+ Thanks "Felix Natter" <felix.natter@ldc.de> for noticing.
+
+2004-06-22 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * doc/tar.texi: Fixed several inconsistencies.
+ * src/tar.c: Fixed docstring for --checkpoint option.
+
+2004-05-19 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/buffer.c (seek_archive): New function
+ * src/common.h (seek_archive): New function
+ (seekable_archive): New global.
+ * src/list.c (skip_file): Use seek_archive() if
+ possible.
+ * src/tar.c (struct fmttab): Accept 'pax' as alias
+ for 'posix'
+ (options): New option -n (--seek).
+ * src/update.c: Determine type of the archive before
+ appending to it.
+
+ * TODO: Updated.
+
+2004-05-19 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap: New option --update-po
+ * src/tar.c: New option -H (short alias to --format)
+ * doc/tar.texi: Document -H option
+ * src/names.c (safer_name_suffix): Fixed bug introduced
+ 2004-05-11.
+
+2004-05-16 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap: Apply patches from patch subdirectory
+ * patches: New dir
+ * patches/argp.diff: New file
+ * patches/getopt.diff: New file
+ * configure.ac: Check for _getopt_long_only_r and
+ force using included version of getopt if the function
+ is not available.
+ * src/tar.c: Use argp for command line parsing.
+ * src/system.h: Minor formatting fix
+ * m4/.cvsignore: Updated
+ * lib/.cvsignore: Updated
+ * doc/tar.texi: Minor fix.
+ * src/extract.c: Fix improper use of 'path' term
+ * src/incremen.c: Likewise
+ * src/list.c: Likewise
+ * src/misc.c: Likewise
+ * src/names.c: Likewise
+ * src/rmt.h: Likewise
+ * src/rtapelib.c: Likewise
+ * src/update.c: Likewise
+ * src/xheader.c: Likewise
+ * tests/star/README: Minor fix
+
+2004-05-13 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Raised version number to 1.14.1
+ * src/tar.c: Renamed --strip-path to --strip-components
+ Changed improper use of _() to ngettext().
+ * src/extract.c: Renamed strip_path_option to strip_components_option
+ * src/common.h: Likewise.
+ * NEWS: Updated.
+ * doc/tar.texi: Updated
+
+2004-05-11 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/system.c (sys_child_open_for_uncompress): Do not
+ set read_full_records_option: the compressed archive is
+ likely not to contain integer number of records. Should
+ the user wish to use reblocking, he may always give tar
+ -B option. This is a minor improvement over the change
+ dated 2004-03-22.
+ * src/buffer.c (open_archive): Removed assignment to
+ read_full_records_option.
+
+ * src/names.c (safer_name_suffix): (safer_name_suffix): Use "%s"
+ as the format argument, rather than a possibly-translated variable
+ string. Patch provided by Jim Meyering <jim@meyering.net>
+ * src/tar.c (decode_options): Fixed typo in the comment.
+ * tests/star/README: Minor correction
+
+2004-05-11 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * directory: New file. GNU directory entry for tar.
+ * doc/Makefile.am: Rewritten. Added rules for generating
+ documentation for the project's website.
+ * doc/.cvsignore: Updated
+ * doc/index.html.in: New file.
+
+2004-05-11 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Raised version number to 1.14
+ * NEWS: Updated.
+ * tests/after: Added copyleft statement
+ * tests/before: Added copyleft statement
+ * tests/preset.in: Added copyleft statement
+
+ Tar 1.14 is released. Sources up to this point are tagged
+ release_1_14
+
+2004-05-10 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Fixed prerequisite headers for sys/buf.h
+ (needed on FreeBSD)
+ * src/system.h: Likewise.
+ * tests/after (compare): Fixed argument quoting under eval
+ * tests/before: Quote TAR_ARCHIVE_FORMATS
+
+2004-05-10 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * NEWS: Updated
+ * README: Updated
+ * PORTS: Updated
+ * configure.ac: Call gl_AC_TYPE_INTMAX_T. Document
+ DEFAULT_.* variables. Use DEFAULT_RMT_COMMAND to set
+ the pathname of the rmt utility.
+ New option --enable-backup-scripts.
+ * doc/tar.texi: Updated
+ * scripts/Makefile.am: Install the scripts only if requested
+ by the configure.
+ * scripts/backup.in: Fixed --version output.
+ Fixed initialization of the listing files and printing
+ the time of the last previous level dump.
+ * scripts/restore.in: Fixed --version output.
+ * src/Makefile.am (localedir.h rule): Generate correct
+ DEFAULT_RMT_COMMAND variable.
+ * src/common.h (rmt_command_option): New variable.
+ * src/list.c (read_and): Print block number before
+ issuing 'Skipping to next header' diagnostics, if
+ requested by block_number_option.
+ * src/rtapelib.c: Use rmt_command_option instead of
+ hardcoded "/etc/rmt".
+ * src/tar.c: New option --rmt-command.
+ (decode_options): Handle --rmt-command. Initialize
+ rmt_command_option to DEFAULT_RMT_COMMAND.
+
+2004-05-09 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * doc/tar.texi: Further update.
+
+2004-05-08 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Minor fix
+ * scripts/Makefile.am: Updated
+ * scripts/backup-specs: Updated
+ * scripts/backup.in: Minor fixes
+ * scripts/backup.sh: Removed
+ * scripts/backup.sh.in: New file. Source for backup.sh
+ * scripts/restore.in: New file
+ * scripts/.cvsignore: Updated
+ * scripts/WARNING: Removed
+ * doc/tar.texi: Updated
+ * NEWS: Updated
+
+2004-05-07 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/names.c (name_gather): Bugfix: Honor single -C with
+ --same-order.
+ * tests/same-order01.sh: New file
+ * tests/same-order02.sh: New file
+ * tests/Makefile.am: Updated
+
+ * tests/append.sh: Added copyleft header
+ * tests/delete01.sh: Likewise
+ * tests/delete02.sh: Likewise
+ * tests/delete04.sh: Likewise
+ * tests/extrac01.sh: Likewise
+ * tests/extrac02.sh: Likewise
+ * tests/extrac03.sh: Likewise
+ * tests/extrac04.sh: Likewise
+ * tests/gzip.sh: Likewise
+ * tests/ignfail.sh: Likewise
+ * tests/incremen.sh: Likewise
+ * tests/multiv01.sh: Likewise
+ * tests/old.sh: Likewise
+ * tests/options.sh: Likewise
+ * tests/recurse.sh: Likewise
+ * tests/version.sh: Likewise
+ * tests/volume.sh: Likewise
+ * tests/star/gtarfail.sh: Likewise
+ * tests/star/gtarfail2.sh: Likewise
+ * tests/star/multi-fail.sh: Likewise
+ * tests/star/pax-big-10g.sh: Likewise
+ * tests/star/qucktest.sh: Likewise
+ * tests/star/ustar-big-2g.sh: Likewise
+ * tests/star/ustar-big-8g.sh: Likewise
+
+ * doc/.cvsignore: Updated
+
+2004-05-06 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Check whether date accepts +format argument
+ (for backup scripts).
+ * scripts/level-0: Removed
+ * scripts/level-1: Removed
+ * scripts/weekly.new: Removed
+ * scripts/dump-remind: Removed
+ * scripts/backup.in: New file
+ * scripts/backup.sh: New file
+ * scripts/dump-remind.in: New file
+ * scripts/backup-specs: Updated
+ * scripts/Makefile.am: Updated for new directory contents.
+ * scripts/.cvsignore: Updated
+
+2004-05-05 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * TODO: Updated
+ * doc/tar.texi: Updated
+ * src/tar.c: --utc implies -vv
+
+2004-04-28 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/utf8.c: Make sure ICONV_CONST is defined. AM_ICONV
+ does not define it if it fails to find iconv.h.
+
+2004-04-26 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap: Use gnulib-tool to generate lib/Makefile.am
+ and parts of configure.ac
+ * configure.ac: Invoke tar_GNULIB to configure gnulib stuff.
+ * lib/Makefile.am: Removed
+ * lib/Makefile.tmpl: New file.
+ * lib/.cvsignore: Updated
+ * m4/.cvsignore: Updated
+ * src/xheader.c: Include stpcpy.h
+
+ * src/create.c: Produce an error, not warning, if the
+ filename is too long.
+ * tests/longv7.sh: Synchronized with the recent changes.
+
+2004-04-20 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Fixed test for iconv_t
+ * src/rmt.h: Bugfix by Jürgen Weigert
+ * THANKS: Add Jürgen Weigert
+ * tests/star/README: Fixed typo
+
+2004-04-04 Paul Eggert <eggert@twinsun.com>
+
+ Merge getdate documentation changes from coreutils.
+
+ * doc/getdate.texi: Update from coreutils CVS.
+ * doc/tar.texi: Fix getdate menu to match getdate.texi's.
+
+ Merge recent gnulib changes, and remove some lint.
+
+ Improve support for nanosecond-resolution time stamps.
+ * bootstrap: Add gettime, timespec modules.
+ * configure.ac (gl_GETTIME, gl_TIMESPEC): Add.
+ * lib/.cvsignore (getopt_int.h, gettime.c, gettimeofday.c,
+ timespec.h): Add.
+ * lib/Makefile.am (libtar_a_SOURCES): Add gettime.c, timespec.h.
+ * m4/.cvsignore: Add clock_time.m4, gettime.m4, gettimeofday.m4,
+ st_mtim.m4, timespec.m4. Remove malloc.m4, realloc.m4.
+ * src/common.h (newer_mtime_option): Now a struct timespec, not
+ time_t. All uses changed.
+ (NEWER_OPTION_INITIALIZED, OLDER_STAT_MTIME): New macros.
+ * src/create.c (dump_file0): Use OLDER_STAT_TIME to compare times.
+ * src/incremen.c (scan_path): Likewise.
+ * src/list.c (read_and): Likewise.
+ * src/list.c (read_and): Use NEWER_OPTION_INITIALIZED to decide
+ whether newer_mtime_option is initialized.
+ * src/tar.c (decode_options): Likewise.
+ * src/tar.c (decode_options): Adjust to new signature for get_date.
+
+ * src/buffer.c (short_read, flush_read): Use size_t, not ssize_t, for
+ result of safe_read, full_write, and similar functions.
+ Detect safe_read error by comparing to SAFE_READ_ERROR;
+ detect full_write error by comparing to 0.
+ All uses changed.
+ * src/common.h (write_error_details, sys_write_archive_buffer):
+ Likewise.
+ * src/misc.c (write_error_details): Likewise.
+ * src/rmt.c (main): Likewise.
+ * src/rmt.h (rmt_read__, rmt_write__): Likewise.
+ * src/rtapelib.c (rmt_read__, rmt_write__, rmt_ioctl__): Likewise.
+ * src/sparse.c (sparse_scan_file, sparse_dump_region,
+ check_sparse_region, check_data_region): Likewise.
+ * src/system.c (sys_write_archive_buffer, sys_drain_input_pipe,
+ sys_child_open_for_compress, sys_child_open_for_uncompress): Likewise.
+ * src/update.c (append_file): Likewise.
+
+ * src/buffer.c (clear_read_error_count): Use explicit (void)
+ to indicate a function with no arguments.
+ * src/create.c (check_links): Likewise.
+ * src/system.c (sys_get_archive_stat, sys_save_archive_dev_ino,
+ sys_detect_dev_null_output, sys_drain_input_pipe, sys_spawn_shell,
+ sys_reset_uid_gid, sys_get_archive_stat, sys_save_archive_dev_ino,
+ sys_detect_dev_null_output, sys_drain_input_pipe, sys_spawn_shell):
+ Likewise.
+ * src/utf8.c (get_input_charset): Likewise.
+ * src/xheader.c (xheader_ghdr_name, xheader_write_global,
+ xheader_decode_global, extended_header_init): Likewise.
+ * tests/mksparse.c (usage): Likewise.
+
+ * src/buffer.c (new_volume): Rename local variables to avoid
+ shadowing warnings.
+ * src/common.h (file_dumpable_p, sys_stat_nanoseconds,
+ sparse_file_p, sparse_member_p, sparse_fixup_header,
+ sparse_dump_file, sparce_extract_file, sparse_skip_file,
+ sparse_diff_file): Likewise.
+ * src/compare.c (diff_archive): Likewise.
+ * src/create.c (file_dumpable_p, dump_regular_file, dump_dir0,
+ dump_dir, dump_hard_link, file_count_links, dump_file0, dump_file):
+ Likewise.
+ * src/extract.c (repair_delayed_set_stat): Likewise.
+ * src/misc.c (maybe_backup_file, add_hierarchy_to_namelist):
+ Likewise.
+ * src/sparse.c (struct tar_sparse_optab, tar_sparse_dump_region,
+ tar_sparse_extract_region, sparse_dump_region, sparse_extract_region,
+ sparse_dump_file, sparse_file_p, sparse_member_p,
+ sparse_fixup_header, sparse_extract_file, sparse_skip_file,
+ check_data_region, sparse_diff_file): Likewise.
+ * src/system.c (sys_stat_nanoseconds): Likewise.
+ * src/xheader.c (xheader_format_name): Likewise.
+
+ * src/common.h (enum old_files): Remove comma before }; not portable.
+
+ * src/common.h (read_fatal_details): Add __attribute__ ((noreturn)).
+ * src/rmt.c (usage): Likewise.
+ * src/xheader.c (xheader_set_single_keyword): Likewise.
+ * tests/genfile.c (usage): Likewise.
+ * tests/mksparse.c (die, usage): Likewise. Also add printf attribute
+ to die.
+
+ * src/common.h (gname_to_gid, uname_to_uid): Add const to avoid
+ some gcc warnings.
+ * src/names.c (uname_to_uid, gname_to_gid): Likewise.
+ * src/utf8.c (struct langtab.lang, struct langtab.terr, struct
+ langtab.charset, charset_lookup): Likewise.
+
+ * src/common.h (name_init): Remove unused args. All callers changed.
+ * src/names.c (name_init): Likewise.
+
+ * src/common.h (usage, xheader_write, xheader_write_global,
+ sys_reset_uid_gid): New decls.
+
+ * src/compare.c (report_difference, process_noop): Add
+ __attribute__ ((unused)) for unused attributes.
+ * src/sparse.c (oldgnu_sparse_member_p, star_sparse_member_p):
+ Likewise.
+ * src/xheader.c (dummy_coder, dummy_decoder, atime_coder,
+ gid_coder, gname_coder, linkpath_coder, ctime_coder, mtime_coder,
+ path_coder, size_coder, uid_coder, uname_coder,
+ sparse_numblocks_coder): Likewise.
+
+ * src/create.c (dump_regular_finish, dump_dir0, dump_dir,
+ dump_file0): Now static.
+ * src/utf8.c (charset_lookup): Likewise.
+ * src/xheader.c (xheader_protected_pattern_p,
+ xheader_protected_keyword_p, xheader_set_single_keyword,
+ xheader_keyword_deleted_p, xheader_keyword_override_p,
+ xheader_list_append, xheader_list_destroy, xheader_set_keyword_equal):
+ Likewise.
+ * tests/genfile.c (usage): Likewise.
+ * tests/mksparse.c (die, mkhole, mksparse, usage, xlat_suffix):
+ Likewise.
+
+ * src/create.c (hash_link): Rewrite to avoid cast.
+
+ * src/extract.c (file_newer_p): Use parameter, not global var.
+ * src/misc.c (write_error_details): Likewise.
+
+ * src/extract.c (prepare_to_extract): Remove directory arg; not
+ used. All callers changed.
+
+ * src/misc.c (close_fatal): Remove; not used.
+ * src/system.c (sys_utimes): Likewise.
+
+ * src/rmt.c (get_string): Avoid buffer overrun (off by 1 error).
+
+ * src/rmt.c (main): Update copyright date to 2004.
+ * src/tar.c (decode_options): Likewise.
+
+ * src/rtapelib.c (get_status_string): Don't lose errno when
+ skipping the error messages.
+ (get_status): Report an error if atol returns a negative number.
+
+ * src/utf8.c (struct langtab, langtab, charset_lookup,
+ get_input_charset) [!defined HAVE_LIBCONV]: Omit unused
+ definitions.
+ (iconv_open, iconv, iconv_close) [!defined HAVE_LIBCONV]:
+ Use macros, not definitions, to avoid type clashes with system
+ headers.
+ (charset_lookup): Local var is now auto, not static.
+ (utf8_convert): Use ICONV_CONST instead of const, to avoid
+ type clashes.
+
+ * src/utf8.c (langtab): Initialize all elements of struct, to
+ avoid gcc warning.
+ * src/xheader.c (xhdr_tab): Likewise.
+
+ * src/xheader.c: Include fnmatch.h, since we use fnmatch.
+
+ * tests/mksparse.c (mkhole): Fix typo: bool was assigned to off_t.
+
+2004-04-04 Sergey Poznyakoff <gray@Noldor.runasimi.org>
+
+ * NEWS: Updated
+ * configure.ac: Raised version number to 1.13.94
+ * src/system.h: Protect inclusion of <sys/time.h>
+ by ifdef.
+ Declare time() if HAVE_DECL_TIME is 0
+ * tests/.cvsignore: Added mksparse
+
+ * tests/sparse01.sh: New file
+ * tests/multiv02.sh: New file
+ * tests/Makefile.am: Add sparse01.sh and multiv02.sh
+ * tests/longv7.sh: Added missing call to 'after'
+
+ * src/common.h: Added missing prototypes
+ * src/compare.c (diff_archive): Use is_sparse member
+ instead of GNUTYPE_SPARSE.
+ * src/create.c: Removed unused variables
+ * src/extract.c (extract_archive): Use sparse_member_p instead
+ of GNUTYPE_SPARSE.
+ Removed unused variables
+ * src/list.c (decode_header): Use sparse_fixup_header to correct
+ the st_size value.
+ (print_header): Do not rely on GNUTYPE_SPARSE type.
+ Use st->stat.st_size to print real file size.
+ (skip_member): Assign stat_info.file_name to save_name. This fixes
+ bug reported by Mads Martin Joergensen <mmj@suse.de>
+ Use sparse_skip_file() to skip sparse members.
+ * src/rtapelib.c: include "common.h"
+ * src/sparse.c (struct tar_sparse_optab.sparse_member_p)
+ (struct tar_sparse_optab.fixup_header): New member
+ (tar_sparse_member_p): New function.
+ (tar_sparse_init): Return true if decode_header is not provided
+ (tar_sparse_fixup_header)
+ (sparse_member_p,sparse_fixup_header)
+ (sparse_skip_file)
+ (oldgnu_sparse_member_p,oldgnu_fixup_header,star_sparse_member_p)
+ (star_fixup_header, pax_sparse_member_p): New function
+ (pax_decode_header): Remove
+ * src/system.h: Include <sys/time.h> and <utime.h> when available
+ * src/tar.c (usage): Prototype moved to common.h
+ * src/tar.h (struct tar_stat_info.is_sparse): New member
+ * src/utf8.c (utf8_convert): Changed prototype
+ (get_input_charset): Removed unused variable
+ * src/xheader.c: include <fnmatch.h>
+ (size_decoder): Assign to both st->archive_file_size and
+ st->stat.st_size.
+ (st->stat.st_size): Assign to st->stat.st_size
+ (sparse_numbytes_decoder): Removed unused variable
+ * src/.cvsignore: Added .gdbinit
+ * THANKS: Added Mads Martin Joergensen
+
+2004-03-26 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/create.c (write_long_name): Do not allow more than
+ NAME_FIELD_SIZE-1 characters in a file name for V7 format
+ archives.
+ * tests/longv7.sh: New file.
+ * tests/Makefile.am: Add longv7.sh
+
+2004-03-22 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/buffer.c (open_archive): Clear read_full_records_option
+ if reading from a pipe.
+ (short_read): Display warning about the deduced record size
+ if version > 1
+ * tests/star/pax-big-10g.sh: Updated to match the above changes.
+ * tests/star/ustar-big-2g.sh: Likewise.
+ * tests/star/ustar-big-8g.sh: Likewise.
+
+ * configure.ac: Added gl_FUNC_STRTOULL
+ * src/create.c (start_header): Check for GNU_FORMAT
+ if incremental_option is set.
+ * src/xheader.c (to_decimal): New function.
+ (xheader_format_name): Use to_decimal() instead of snprintf.
+ * tests/listed01.sh: Use genfile instead of dd
+ * tests/multiv01.sh: Likewise.
+
+2004-03-12 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/list.c (read_and): Stop processing the archive after
+ encountering a single zero record. Many old archives contain
+ arbitrary garbage after it.
+ The warning is issued anyway.
+
+2004-03-02 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/rtapelib.c (rmt_lseek__,rmt_ioctl__): Bugfix. The
+ conversion buffer was not null terminated. Fix provided
+ by Leland Lucius <llucius@tiny.net>
+ * THANKS: Added Leland Lucius
+ * src/utf8.c (utf8_convert): Indentation fix.
+
+2004-02-29 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/buffer.c (flush_read): Bugfix: the
+ condition at line 714 included
+
+ || (status > 0 && !read_full_records_option)
+
+ which is grossly wrong, since even if new_volume() below succeeds,
+ the subsequent call to rmtread will overwrite the chunk of data
+ already read in the buffer and thus spoil everything.
+ * src/system.c (sys_child_open_for_uncompress): Minor stylistic
+ fix.
+ * tests/star/multi-fail.sh: New test.
+ * tests/Makefile.am: Added multi-fail.sh
+ * tests/star/README: Updated
+
+2004-02-29 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * NEWS: Updated
+ * configure.ac: Removed spurious AC_CHECK_LIB(iconv)
+ * src/common.h (utc_option): new global
+ (enum old_files.KEEP_NEWER_FILES): New element
+ * src/extract.c: Handle --keep-newer-files option
+ * src/list.c (tartime): Print UTC if --utc was given.
+ * src/tar.c: New options: --utc and keep-newer-files
+
+ * tests/Makefile.am: Added new tests
+ * tests/after: Rewritten
+ * tests/before: Rewritten
+ * tests/preset.in: Rewritten
+ * tests/delete03.sh: Accommodate for the new testsuite logic
+ * tests/gzip.sh: Likewise
+ * tests/incremen.sh: Likewise
+ * tests/listed01.sh: Likewise
+ * tests/multiv01.sh: Likewise
+ * tests/old.sh: Likewise
+ * tests/options.sh: Likewise
+ * tests/version.sh: Likewise
+ * tests/volume.sh: Likewise
+
+ * tests/star: New directory
+ * tests/star/README: New file
+ * tests/star/gtarfail.sh: New file
+ * tests/star/gtarfail2.sh: New file
+ * tests/star/pax-big-10g.sh: New file
+ * tests/star/qucktest.sh: New file
+ * tests/star/ustar-big-2g.sh: New file
+ * tests/star/ustar-big-8g.sh: New file
+
+2004-02-26 Paul Eggert <eggert@twinsun.com>
+
+ * doc/tar.texi (dircategory Individual utilities): Append period,
+ as suggested by Karl Berry.
+
+2004-02-24 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/list.c (decode_header): Call xheader_decode before
+ the assignment to current_stat_info.archive_file_size.
+
+2004-02-23 Paul Eggert <eggert@twinsun.com>
+
+ * configure.ac: Invoke AM_ICONV, to define ICONV_CONST if needed.
+
+2004-02-23 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ 1.13.93 released.
+
+ * NEWS: Updated
+ * tests/before: Move testing of the prerequisite archive formats
+ to the separate function 'prereq'. Do not expect any arguments
+ * tests/delete03.sh: Use prereq() instead of passing arguments
+ to 'before'.
+ * tests/incremen.sh: Likewise.
+ * tests/listed01.sh: Likewise.
+ * tests/multiv01.sh: Likewise.
+
+2004-02-22 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Added UTF-8 support. Finished global extended header
+ support.
+
+ * NEWS: Minor fix
+ * configure.ac: Detect libiconv
+ * src/utf8.c: New file. Conversions to and from utf-8.
+ * src/Makefile.am: Added utf8.c
+ * src/create.c (write_header_name) In pax format, use
+ "path" keyword if the file name is not ASCII
+ (start_header): Likewise for uname and gname.
+ * src/list.c: Decode encountered global headers.
+ * src/xheader.c: Use keywords from the global
+ headers.
+ Correctly handle UTF-8 conversions.
+ (xheader_list_destroy): New function.
+ (xheader_set_single_keyword,xheader_set_keyword_equal): Added
+ missing gettext markers
+ (decode_record): Rewritten using caller-provided handler and
+ data closure.
+ * tests/listed01.sh: Give credit to Andreas Schuldei.
+
+2004-02-21 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/create.c (dump_file0): The conditional at line
+ 1296 prevented incremental backups on individual files
+ from working, as reported by Andreas Schuldei
+ <andreas@schuldei.org>.
+
+ This is due to the condition
+
+ (0 < top_level || !incremental_option)
+
+ Removing it makes incremental backups work for individual
+ files as well as for directories. On the other hand, it does
+ not affect other functionality, as shown by the reasoning below:
+
+ To begin with, the two parts of this condition are mutually
+ superfluous, because
+
+ 1) when top_level < 0, incremental_option == 1
+ so the condition yields false
+ 2) when top_level >= 0, incremental_option == 0
+ so the condition yields true.
+
+ In other words, it is completely equivalent to
+
+ (!incremental_option)
+
+ Now, let's consider the effect of its removal. There are two cases:
+
+ 1) when incremental_option==1
+ This means incremental backup in progress. In this case dump_file
+ is invoked only for directories or for files marked with 'Y' by
+ get_directory_contents. The latter are those that did not meet the
+ condition in incremen.c:242, which is exactly the same condition
+ as this at create.c:1296. So, for these files the check
+ (!incremental_option) is useless, since the rest of the
+ conditional will yield false anyway. On the other hand, if
+ dump_file is invoked on a directory, the conditional will yield
+ false due to !S_ISDIR assertion, so these will be processed as usual.
+
+ Thus, for this case the extra condition (!incremental_option) is
+ irrelevant, and its removal won't alter the behavior of tar,
+ *except* that it will enable incremental backups on individual
+ files, which is the wanted effect.
+
+ 2) when incremental_option==0
+ In this case the condition yields true and its removal does not
+ affect the functionality.
+
+ * THANKS: Updated
+ * configure.ac: Raised patchlevel to 93
+ * src/incremen.c: Minor stylistic fixes.
+ * tests/listed01.sh: New test. Check listed incremental
+ backups on individual files.
+ * tests/Makefile.am: Added listed01.sh
+
+2004-02-20 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/common.h (simple_finish_header,start_private_header): New
+ declarations
+ (xheader_ghdr_name): Changed declaration
+ * src/create.c (start_private_header): Removed static qualifier.
+ (write_extended): Removed superfluous last argument. Use
+ xheader_write()
+ (simple_finish_header): New function.
+ (finish_header): Use simple_finish_header() to break recursive
+ dependency between this function and write_extended().
+ * src/tar.c (assert_format): Do not bail out if several
+ --format arguments are given. This is a common case when
+ TAR_OPTIONS are used.
+ (decode_options): New option --show-defaults displays the
+ compiled-in defaults.
+ Use POSIX format if no --format option was given and
+ --pax-option was specified.
+ Do not allow to use --pax-option unless the archive format is
+ set to POSIX (or reading subcommand is requested).
+
+ * src/update.c (update_archive): Write global extended header if
+ constructed.
+ * src/xheader.c (xheader_format_name): Bugfix.
+ (xheader_xhdr_name): Changed the default extended header name
+ to '%d/PaxHeaders.%p/%f', as POSIX requires.
+ (xheader_ghdr_name): Removed unused argument.
+ (xheader_write,xheader_write_global): New function.
+ (xheader_decode): Modified to honor overrides whatever
+ the current archive format is.
+
+ * src/delete.c (delete_archive_members): Call xheader_decode
+ unconditionally.
+ * src/list.c (decode_header): Likewise.
+ * src/incremen.c (sort_obstack): Fixed typo in the comment
+
+ * doc/tar.texi: Document new default for extended
+ header names.
+
+ * tests/before: Accept an optional list of allowed archive
+ formats. Exit with the status 77 if the current archive
+ format does not match any of them.
+ * tests/delete03.sh: Require gnu, oldgnu or posix format
+ * tests/incremen.sh: Require gnu or oldgnu format
+ * tests/multiv01.sh: Likewise
+
+2004-02-20 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * doc/tar.texi (Option Summary): Documented --pax-option
+ * src/tar.c: Likewise.
+ * NEWS: Likewise.
+ * src/create.c (to_chars): Added a comment.
+ * src/tar.h: Comment to GNU_FORMAT
+
+2004-02-18 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * README: Updated
+ * configure.ac: Added stpcpy
+ * bootstrap: Likewise
+ * lib/Makefile.am: Likewise
+ * src/common.h (xheader_xhdr_name,xheader_ghdr_name): New
+ functions
+ * src/create.c (write_extended): Call xheader_xhdr_name
+ instead of using hardcoded "././@PaxHeader" name.
+ * src/tar.c: New option --pax-option (equivalent to -o option
+ of pax).
+ * src/xheader.c: Implement pax -o option. Fixed misleading
+ heading comment (introduced 2003-09-02).
+ * src/incremen.c: Minor fixes
+ * m4/.cvsignore: Updated
+
+2004-02-17 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/incremen.c: Removed accumulator stuff in favor of obstack.
+ (get_directory_contents): Split into two functions
+ * src/update.c: Minor changes
+ * doc/tar.texi: Fixed typo
+
+2004-02-15 Paul Eggert <eggert@twinsun.com>
+
+ Fix Debian bug 230872, originally reported by Jeff King in
+ <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=230872>.
+
+ * doc/tar.texi (posix compliance): Remove. The whole section
+ was a misunderstanding of what POSIXLY_CORRECT is supposed to
+ mean. The GNU Coding Standards says that POSIXLY_CORRECT
+ is for disabling extensions that are incompatible with POSIX:
+ it is not for disabling compatible extensions. All references
+ to this section removed.
+ (posix): This format is created only if the posix format is
+ specified; it is no longer created if gnu format is specified
+ and POSIXLY_CORRECT is set.
+ * src/tar.c (decode_options): Ignore POSIXLY_CORRECT.
+ POSIX does not specify the behavior of tar, so we should
+ not worry about POSIXLY_CORRECT here.
+
+2004-01-21 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * Makefile.am: Removed m4
+ * configure.ac: Require automake-1.8/autoconf-2.59. Removed
+ m4/Makefile.
+ * README-alpha: Updated
+ * bootstrap: Updated TP URL, improved help output. Default
+ to :ext:anoncvs and set CVS_RSH, unless already set.
+ * m4/Makefile.am: Removed
+
+2004-01-21 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * bootstrap: Bugfix by Marco Gerards <metgerards@student.han.nl>:
+ Use $option instead of $1 so all options will be parsed.
+
+2004-01-04 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Started rewriting buffer.c ...
+
+ * bootstrap: New option --no-po
+ * src/buffer.c (new_volume,check_label_pattern): Changed return type.
+ (time_to_start_writing): Changed data type
+ (file_to_switch_to): Removed. Variable never assigned to.
+ (open_archive) Moved option compatibility checks to tar.c
+ Other minor changes.
+ * src/common.h (maybe_backup_file): Changed return type
+ * src/misc.c: Likewise.
+ * src/create.c: Updated invocations of safer_name_suffix
+ * src/extract.c: Likewise
+ * src/delete.c: Updated assignment to write_archive_to_stdout
+ * src/tar.c (decode_options): More option compatibility checks
+ (moved from buffer.c)
+ * src/update.c (time_to_start_writing): Changed data type.
+ * tests/recurse.sh: New test case.
+ * tests/mksparse.c: New file.
+ * tests/Makefile.am: Added recurse.sh and mksparse.c
+
+2004-01-02 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/sparse.c (sparse_diff_file): Bugfix. Thanks
+ Martin Simmons for the patch.
+ * src/create.c (dump_dir0): Bugfix. Thanks Piotr Czerwinski
+ <pius@pld-linux.org> for the patch.
+
+2003-12-26 Paul Eggert <eggert@twinsun.com>
+
+ Synchronize with Gettext 0.13.1, Automake 1.8, Autoconf 2.59,
+ and translation website.
+
+ * bootstrap: Don't bother skipping codeset.m4, glibc21.m4,
+ intdiv0.m4, inttypes_h.m4, inttypes.m4, inttypes-pri.m4,
+ isc-posix.m4, and lcmessage.m4 from gnulib. This list of files is
+ a bit obsolete anyway, now that gettext 0.13.1 is out. Also, the
+ files are replaced by autoreconf. Also, there seems to be a bug
+ in gettext/autoconf/automake if we try to omit these files after
+ autoreconf has replaced them, even though the gettext manual says
+ they're optional. So give up and just include them for now, even
+ though they make 'configure' longer and slower.
+
+ Change translation URL from
+ <http://www.iro.umontreal.ca/contrib/po/maint/tar/> to
+ <http://www2.iro.umontreal.ca/~gnutra/po/maint/tar/> to
+ accommodate translator website revamp.
+
+ Fail if autoreconf fails.
+
+ * m4/.cvsignore: Add intmax.m4, longdouble.m4, printf-posix.m4,
+ signed.m4, size_max.m4, wchar_t.m4, wint_t.m4, xsize.m4, to
+ ignore files now supplied by gettext 0.13.1.
+
+2003-12-25 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Synchronized with the backup repository on Mirddin
+
+2003-12-19 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Check for varios members of struct stat
+ that may represent file modification times with a subsecond
+ precision.
+ Check for utimes (for future use)
+ * src/buffer.c (short_read): Issue a warning on short reads.
+ * src/common.h (sys_stat_nanoseconds): New function
+ * src/create.c (dump_file0): Use sys_stat_nanoseconds().
+ * src/list.c (read_and): Treat only two successive zero
+ filled blocks as an EOF indicator. Issue a warning if
+ a single one is encountered.
+ * src/system.c (sys_stat_nanoseconds): New function
+ * src/tar.h (tar_stat_info.atime_nsec,mtime_nsec,ctime_nsec): New
+ members.
+ * src/xheader.c (code_time,decode_time): Support for subsecond
+ precision.
+ (atime_coder,atime_decoder,ctime_coder,ctime_decoder)
+ (mtime_coder,mtime_decoder): Update invocations of code_time and
+ decode_time.
+ (gid_decoder,size_decoder,uid_decoder,sparse_size_decoder)
+ (sparse_numblocks_decoder,sparse_offset_decoder)
+ (sparse_numbytes_decoder): Updated
+
+2003-12-18 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/names.c (safer_name_suffix): Reverted change made
+ 2003-11-14. Reason: Discussion with Paul Eggert and
+ Jean-Louis Martineau. See also ChangeLog entry from
+ 1999-08-14.
+ * tests/delete03.sh: Likewise.
+ * tests/extrac04.sh: Likewise.
+ * tests/multiv01.sh: Likewise.
+
+2003-12-12 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/incremen.c (write_directory_file): Use sys_truncate
+ * src/list.c (print_header): Use archive_file_size member
+ when printing real file size.
+ * src/sparse.c (sparse_scan_file): Correctly handle files with
+ a hole at the end.
+ (sparse_dump_region,sparse_extract_region): Allow for zero size
+ trailing blocks
+
+2003-12-12 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Raised version number to 1.13.92
+ * src/list.c (decode_header): Discern between pax and ustar
+ formats
+ Initialize current_stat_info.archive_file_size.
+
+ NOTE: Modifications from this date on are temporarily
+ stored on local CVS on mirddin. This repository will
+ be synchronized with Savannah as soon as the latter
+ becomes operational again.
+
+2003-12-01 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * TODO: Updated
+ * src/sparse.c: Initial implementation of GNU/pax sparse
+ file format.
+ * src/common.h (xheader_store): Changed prototype.
+ * src/create.c: Update calls to xheader_store
+ * src/extract.c (extract_archive): Check reported size vs.
+ archive file size to determine if we have to do with a
+ sparse file.
+ * src/tar.c (usage): Cleaned up the sample argument to --newer
+ option.
+ (decode_options): Allow --sparse for POSIX_FORMAT archives.
+ * src/xheader.c (struct xhdr_tab.coder; all coder function): Added
+ extra argument
+ Implemented GNU.sparse.* keywords.
+
+2003-11-30 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Check for setlocale. Thanks Bruno Haible for
+ reporting.
+
+2003-11-25 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/create.c (write_gnu_long_link): Use oldgnu
+ magic with @LongLink blocks.
+
+2003-11-17 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/tar.h: Support for star sparse format.
+ * src/sparse.c: Likewise.
+
+2003-11-17 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/sparse.c (sparse_diff_file): New function
+ * src/common.h (sys_compare_uid,sys_compare_gid): New functions
+ (sys_compare_uid_gid): Removed.
+ (sys_compare_links,report_difference): Changed prototype
+ (sparse_diff_file): New function
+ * src/system.c (sys_compare_uid,sys_compare_gid): New functions
+ (sys_compare_uid_gid): Removed.
+ (sys_compare_links): Changed declaration
+ * src/compare.c (diff_archive): Use sparse_diff_file.
+
+2003-11-16 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Rewritten sparse file handling.
+
+ * src/sparse.c: New file. Provides a universal framework
+ for various methods for sparse files handling.
+ * src/Makefile.am: Added sparse.c
+ * src/common.h (struct sp_array,sparsearray,sp_array_size)
+ (init_sparsearray,fill_in_sparse_array): Removed
+ (enum dump_status): New data type
+ (pad_archive,close_diag,open_diag,read_diag_details)
+ (readlink_diag,savedir_diag,seek_diag_details,stat_diag): New
+ functions.
+ (sparse_file_p,sparse_dump_file,sparse_extract_file): New
+ functions.
+ (print_header): Changed prototype declaration.
+ * src/tar.h (struct sp_array): Declaration from common.h
+ (struct tar_stat_info): New members archive_file_size,
+ sparse_map_avail,sparse_map.
+ * src/create.c: Major rewrite.
+ * src/extract.c: Use new sparse file interface.
+ * src/compare.c (diff_sparse_files): Temporary placeholder.
+
+ * src/buffer.c: Minor changes
+ * src/tar.c: Likewise.
+ * src/list.c: Likewise.
+ * src/misc.c (close_diag,open_diag,read_diag_details)
+ (readlink_diag,savedir_diag,seek_diag_details,stat_diag): New
+ diagnostics functions.
+ * src/incremen.c: Use new diagnostics functions.
+ * src/names.c: Likewise.
+
+2003-11-14 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Fixed check for setsockopt
+
+ * src/create.c: Do not zero-terminate name field if
+ the name is exactly 100 characters long.
+ (write_ustar_long_name): Fixed cheking for unsplittable
+ names.
+
+2003-11-14 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/create.c (start_header): Removed debugging hook
+ (dump_file): Fixed handling of linkname field.
+ * src/names.c (safer_name_suffix): If the input
+ file name ends with a slash, output one should do so
+ as well.
+ * doc/tar.texi: Documented --format=ustar
+
+2003-11-14 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/tar.h (archive_format): USTAR_FORMAT: New type.
+ * src/create.c: Added POSIX.1-1988 support.
+ * src/names.c (safer_name_suffix): Skip leading ./
+ * src/tar.c: New option --format=ustar forces
+ POSIX.1-1988 archive format.
+ * tests/delete03.sh: Updated.
+ * tests/extrac04.sh: Updated.
+ * tests/multiv01.sh: Updated.
+
+2003-11-13 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/list.c (read_and): Initialize current_stat_info
+ and extended_header at the start of the loop.
+ * src/names.c (all_names_found): Check if the argument
+ contains valid filename. Fixes coredump on `not_a_tar_file'
+ * src/xheader.c (atime_decoder,gid_decoder,ctime_decoder)
+ (mtime_decoder,size_decoder,uid_decoder): Use xstrtoumax.
+ Fixes `pax-big-10g' bug.
+
+2003-11-12 Paul Eggert <eggert@twinsun.com>
+
+ Fix some C compatibility bugs reported by Joerg Schilling.
+
+ * src/common.h (stripped_prefix_len): Fix misspelling
+ "stripped_path_len" in declaration.
+ * src/rmt.c (main): Use "return FOO;" rather than
+ "exit (FOO);"; we no longer have to worry about
+ pre-ANSI hosts that mishandled returned values from "main".
+ * src/tar.c (main): Likewise. This avoids warnings on some
+ compilers.
+ * src/system.c: Include signal.h, for 'kill'.
+ * src/system.h (DEV_BSIZE): Remove.
+ (DEFAULT_ST_BLKSIZE): New macro.
+ (ST_BLKSIZE): Use it, instead of DEV_BSIZE.
+ * src/tar.c (enum): Remove comma just before }.
+
+2003-11-12 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/list.c (decode_header): Initialize st_atime and
+ st_ctime.
+
+2003-11-11 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac (tar_save_LIBS): Bugfix. Thanks Adrian
+ Bunk <bunk@fs.tum.de> for reporting.
+ * doc/tar.texi: Fixed spelling. Thanks Martin Buchholz
+ <martin@xemacs.org> for spotting.
+
+2003-11-04 Paul Eggert <eggert@twinsun.com>
+
+ * src/xheader.c (xhdr_tab): Make it extern, not static, as C89 and
+ C99 require this.
+
+2003-10-26 Paul Eggert <eggert@twinsun.com>
+
+ * src/system.c (sys_spawn_shell): Cast trailing null to (char *).
+ Bug reported by Christian Weisgerber.
+
+2003-10-19 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * AUTHORS: Updated
+ * NEWS: Updated
+ * src/tar.c (decode_options): Removed superfluous archive format
+ check
+ * doc/tar.texi: Documented new features.
+
+2003-10-08 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * NEWS: Updated
+ * THANKS: Added Wojciech Polak
+ * configure.ac: Added checks for missing functions. Raised
+ version number to indicate alpha release.
+ * lib/Makefile.am: Added missing headers
+ * lib/waitpid.c: Added missing includes.
+ * src/extract.c: Likewise.
+ * src/names.c: Removed spurious includes.
+ * src/xheader.c: Likewise.
+ * src/system.h [MSDOS]: Fixed spelling of EACCES. Added
+ macro overriding broken mkdir prototypes.
+
+2003-10-04 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Check for dev_t and ino_t.
+ * m4/Makefile.am: Added missing files.
+ * src/system.c: New file.
+ * src/Makefile.am: Added system.c
+ * src/common.h: Prototypes for functions from system.c
+ * src/system.h (SET_BINARY_MODE, ERRNO_IS_EACCESS): New defines
+ * src/buffer.c: Moved system dependencies to system.c
+ * src/compare.c: Likewise.
+ * src/create.c: Likewise.
+ * src/delete.c: Likewise.
+ * src/extract.c: Likewise.
+ * src/rtapelib.c: Likewise.
+
+2003-10-04 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ Implemented --occurrence option.
+
+ * NEWS: Updated.
+ * src/tar.c: New option --occurrence.
+ * src/common.h (occurrence_option): New global
+ (struct name): Changed `found' member to `uintmax_t
+ found_count'.
+ (names_done): Removed
+ (all_names_found): Changed prototype.
+ (ISFOUND,WASFOUND): New macros
+ * src/delete.c (delete_archive_members): Honor --occurrence
+ option.
+ * src/list.c (read_and): Likewise.
+ * src/names.c: Count number of occurrences of each name in the
+ archive.
+ (name_match): Honor --occurrence option.
+ (names_done): Removed
+ (all_names_found,names_notfound): Rewritten.
+
+2003-10-02 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/tar.c: Removed extra precaution regarding
+ subcommand_option == CAT_SUBCOMMAND
+ * lib/Makefile.am: Updated
+
+2003-10-02 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/common.h (names_done): New function.
+ * src/names.c: Likewise.
+ * src/list.c (read_and): Use all_names_found() as `while'
+ condition.
+ * src/tar.c: New option --first-copy
+ * NEWS: Updated
+
+2003-09-24 Paul Eggert <eggert@twinsun.com>
+
+ * src/rmt.c (main): Don't translate Copyright string; international
+ law says the word "Copyright" should be in English.
+ * src/tar.c (decode_options): Likewise.
+
+2003-09-22 Paul Eggert <eggert@twinsun.com>
+
+ * doc/tar.texi (extracting untrusted archives): New section.
+
+ * src/common.h (stripped_path_len): Renamed from cut_path_elements.
+ Return size_t, not pointer, so that we don't have to worry about
+ violating the C standard by converting char const * to char *.
+ All callers changed.
+ * src/names.c (stripped_path_len): Likewise. Strip file system
+ prefix, too. Count adjacent slashes as if they were one slash;
+ that is the POSIX standard.
+
+2003-09-17 Paul Eggert <eggert@twinsun.com>
+
+ * README-alpha: Document maintainer tool assumptions a bit. GNU
+ 'sed' is no longer required. For GNU m4 1.4, suggest the patch in
+ Debian bug 211447. Fix minor misspellings/whitespace nits.
+
+ * configure.ac (AC_AIX, AC_MINIX): Remove; subsumed by
+ gl_USE_SYSTEM_EXTENSIONS.
+
+ * lib/.cvsignore: Add exit.h, time_r.c, time_r.h.
+ * m4/.cvsignore: Add restrict.m4, time_r.m4.
+
+2003-09-17 Paul Eggert <eggert@twinsun.com>
+
+ * bootstrap: Don't use "for option; do";
+ Solaris 8 /bin/sh doesn't like that.
+
+2003-09-17 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * README-alpha: Updated
+ * bootstrap: Updated
+
+2003-09-17 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * README-alpha: Updated
+ * bootstrap: Updated
+ * po/POTFILES.in: Added src/xheader.c
+ * src/common.h (cut_path_elements): Added proto.
+
+2003-09-05 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/buffer.c: Use ngettext where appropriate.
+ * src/compare.c: Likewise.
+ * src/create.c: Likewise.
+ * src/misc.c: Likewise.
+ * src/tar.c: Likewise.
+ * src/update.c: Likewise.
+
+2003-09-04 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * .cvsignore: Added *.shar.gz
+ * NEWS: Updated
+ * TODO: Updated
+ * src/common.h (strip_path_elements): New variable.
+ * src/extract.c (extract_archive): Implemented --strip-path
+ * src/names.c (cut_path_elements): New function.
+ * src/tar.c: New option --strip-path=NUM.
+ (decode_options) Assign boolean values to bool variables.
+
+2003-09-04 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/delete.c: Fixed deletion from the POSIX archives.
+ * src/list.c (read_header): Minor change.
+ * src/tar.c (main): Do not check for volume_label_option
+ if subcommand_option is not CREATE_SUBCOMMAND.
+ * src/xheader.c (xheader_decode): Store the header as
+ well (for eventual delete).
+
+ * tests/incremen.sh: Explicitly request GNU format. This will
+ disappear when GNU extended header keywords are working.
+ * tests/multiv01.sh: Likewise
+ * tests/volume.sh: Likewise
+
+2003-09-04 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/create.c: Support for "linkpath" extended keyword.
+ * src/xheader.c (decode_record): Reversed the return
+ condition.
+
+2003-09-03 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * configure.ac: Allow to redefine the default output format.
+ * src/tar.c: Use DEFAULT_ARCHIVE_FORMAT macro
+ (archive_format_string): New function.
+ (usage): Updated help output.
+ * README: Updated.
+ * NEWS: Updated.
+ * TODO: Updated.
+
+2003-09-02 Paul Eggert <eggert@twinsun.com>
+
+ * src/common.h (destroy_stat, xheader_decode, xheader_store,
+ xheader_read, xheader_finish, xheader_destroy): Add decls;
+ C99 requires this.
+
+ * src/create.c (write_extended): Remove unused local 'bufsize'.
+
+ * src/delete.c (delete_archive_members): Handle case of
+ HEADER_SUCCESS_EXTENDED followed by HEADER_FAILURE.
+ * src/list.c (read_and): Abort if HEADER_SUCCESS_EXTENDED
+ occurs, as it's not possible.
+ * src/update.c (update_archive): Likewise.
+
+ Use "const" when possible in new code.
+ * src/tar.c (struct fmttab.name): Now char const *. All uses changed.
+ (fmttab): Now const. All uses changed.
+ * src/xheader.c (struct xhdr_tab.keyword): Now pointer to const.
+ (struct xhdr_tab.coder, struct xhdr_tab.decoder, locate_handler,
+ decode_record, xheader_store, xheader_print, code_string, code_time,
+ code_num, dummy_coder, dummy_decoder, atime_coder, atime_decoder,
+ gid_coder, gid_decoder, gname_coder, gname_decoder, linkpath_coder,
+ linkpath_decoder, ctime_coder, ctime_decoder, mtime_coder,
+ mtime_decoder, path_coder, path_decoder, size_coder, size_decoder,
+ uid_coder, uid_decoder, uname_coder, uname_decoder):
+ Use pointers to const when possible.
+ (xhdr_tab): Now const.
+
+ * src/tar.c (fmttab): Avoid GCC warning by not eliding initializers.
+ (set_archive_format): Report an error if no format name matches,
+ instead of returning an undefined value.
+
+ * src/xheader.c (struct xhdr_tab.decoder, dummy_decoder,
+ atime_decoder, gid_decoder, gname_decoder, linkpath_decoder,
+ ctime_decoder, mtime_decoder, path_decoder, size_decoder,
+ uid_decoder, uname_decoder): Remove unused keyword arg.
+ All uses changed.
+
+ * src/tar.c (set_archive_format): Now static.
+ * src/xheader.c (xhdr_tab, format_uintmax): Now static.
+
+ * src/xheader.c (dummy_coder, dummy_decoder, atime_coder,
+ atime_decoder, gid_coder, gid_decoder, gname_coder, gname_decoder,
+ linkpath_coder, linkpath_decoder, mtime_coder, mtime_decoder,
+ ctime_coder, ctime_decoder, path_coder, path_decoder, size_coder,
+ size_decoder, uid_coder, uid_decoder, uname_coder, uname_decoder):
+ Remove forward decls; no longer needed.
+ (xhdr_tab): Move to end, so that the forward decls aren't needed.
+ Add a forward declaration.
+
+ Use 'bool' in new code, when appropriate.
+ * src/xheader.c (decode_record): Return bool, not int.
+ * src/common.h (read_header): Since it accepts bool, change
+ all callers to use false and true rather than 0 and 1.
+
+ * src/xheader.c (decode_record): Fix misspelling in diagnostic
+ "extended headed" -> "extended header".
+
+ GNU coding style fixes.
+ * src/xheader.c (decode_record, xheader_decode):
+ Do not use decls like "char *p, *q;".
+
+ Minor style fixes.
+ (xheader_store): Avoid parentheses around object operand of sizeof.
+
+2003-09-03 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/create.c (start_header): Store long file names
+ in "path" keyword of an extended header if in POSIX
+ mode.
+ (finish_header): print header before calling write_extended().
+ * src/list.c (list_archive): Always decode the header. This
+ is necessary so the extended header is processed and the correct
+ filename is printed no matter what the state of verbose_option.
+ * src/xheader.c (xhdr_tab): Reserved GNU keywords (commented out
+ for the time being).
+
+2003-09-01 Paul Eggert <eggert@twinsun.com>
+
+ Update from gnulib, and correct fnmatch to fnmatch-gnu.
+ * bootstrap (gnulib_modules): Change fnmatch to fnmatch-gnu.
+ Sort.
+ * configure.ac (gl_USE_SYSTEM_EXTENSIONS): Use this instead
+ of AC_GNU_SOURCE.
+ * lib/.cvsignore: Add alloca.h, stdbool.h. Sort. Append newline.
+ * lib/Makefile.am (lib_OBJECTS): New macro, for convenience when
+ copying rules from gnulib module descriptions.
+ (BUILT_SOURCES, EXTRA_DIST, all-local, alloca.h):
+ Update from gnulib modules alloca, fnmatch, getline, stdbool.
+ * m4/.cvsignore: Add utimes-null.m4. Sort.
+
+2003-09-01 Sergey Poznyakoff
+
+ Added initial support for creating POSIX headers.
+
+ * src/common.h (MAXOCTAL11,MAXOCTAL7): New defines
+ (string_to_chars): New functions
+ (struct xheader): Changed structure
+ (gid_to_gname,gname_to_gid,uid_to_uname,uname_to_uid): Changed
+ prototypes.
+ * src/create.c (string_to_chars): New function.
+ (write_extended): New function
+ (start_header): Create extended POSIX headers if necessary.
+ (finish_header): Likewise.
+ * src/list.c (print_header): Take user/group from
+ current_stat_info.
+ * src/names.c (gid_to_gname,gname_to_gid)
+ (uid_to_uname,uname_to_uid): Changed prototypes.
+ * src/tar.c: New option --format.
+ * src/tar.h (OLDGNU_COMPATIBILITY): Removed
+ (struct extra_header): Removed unused structure.
+ (union block.extra_header): Removed unused member.
+ * src/xheader.c: Implemented coder functions.
+ * bootstrap: Added obstack.
+ * lib/.cvsignore: Likewise.
+ * configure.ac: Added 'gl_OBSTACK'
+ * m4/Makefile.am: Added new files.
+ * m4/.cvsignore: Likewise.
+ * TODO: Minor formatting change
+
+2003-08-31 Sergey Poznyakoff
+
+ Added initial support for POSIX extended and STAR headers
+ (only for listing/extracting).
+
+ * src/xheader.c: New file.
+ * src/Makefile.am: Added xheader.c
+ * src/tar.h (struct star_header): New datatype
+ (XHDTYPE,XGLTYPE): New defines
+ (enum archive_format:STAR_FORMAT): New member
+ (struct tar_stat_info): New datatype.
+ (union block.star_header): New member.
+ * src/common.h (orig_file_name,current_file_name)
+ (current_trailing_slash,current_link_name): Removed variables.
+ (current_stat_info): New variable
+ (current_stat): Removed
+ (extended_header): New variable
+ (decode_header): Changed prototype.
+ * src/list.c (decode_header): Added initial support for POSIX extended
+ and STAR headers.
+ (skip_member): Check oldgnu_header only if current_format is set
+ to OLDGNU_FORMAT.
+ * src/buffer.c: Use current_stat_info
+ * src/compare.c: Likewise.
+ * src/create.c: Likewise.
+ * src/delete.c: Likewise.
+ * src/incremen.c: Likewise.
+ * src/mangle.c: Likewise.
+ * src/update.c: Likewise.
+ * src/extract.c: Likewise.
+ (make_directories): Improved check for the existence of the directory
+ * src/tar.c (destroy_stat): New function.
+
+2003-08-29 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, bootstrap: Drop en_GB locale; it was more trouble than it
+ was worth (e.g., different users in en_GB disagree about -ize
+ versus -ise).
+ * po/en_GB.po: Remove.
+
+2003-07-28 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * TODO: Updated
+ * NEWS: Updated
+ * src/tar.c: Removed support for the obsolete command line
+ options.
+ * doc/tar.texi: Removed references to the obsolete command
+ line options.
+
+2003-07-27 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * TODO: Updated
+ * NEWS: Updated
+ * doc/tar.texi: Updated
+ * src/common.h (check_links_option): New variable
+ (orig_file_name): New variable
+ (check_links): New proto.
+ * src/create.c (struct link.nlink): New member
+ (link_table): Static for the module.
+ (dump_file): Update `link' member when adding new links
+ to the link_table.
+ (check_links): New function.
+ * src/list.c (print_header): Use orig_file_name.
+ * src/tar.c: New option --check-links. Changed semantics of
+ -o to comply to UNIX98 when extracting and to its previous
+ semantics otherwise.
+ (main): Call check_links if --check-links. was given.
+
+2003-07-25 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * src/list.c (print_header): Revised
+ * NEWS: Started the entry for 1.13.26
+ * doc/Makefile.am (tar.dvi): Fixed TEXINPUTS value.
+
+2003-07-24 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * .cvsignore: Added to the repository.
+ * doc/.cvsignore: Likewise.
+ * lib/.cvsignore: Likewise.
+ * m4/.cvsignore: Likewise.
+ * po/.cvsignore: Likewise.
+ * scripts/.cvsignore: Likewise.
+ * src/.cvsignore: Likewise.
+ * tests/.cvsignore: Likewise.
+
+ * lib/Makefile.am: Added exitfail.[hc]
+ * src/misc.c (chdir_do): Fixed call to restore_cwd
+ * src/buffer.c (flush_read): Fixed behavior on short
+ reads right after opening the new archive (multiv01.sh test).
+ (new_volume): Special handling for "-".
+ * src/list.c (print_header): Print trailing slash if
+ current_trailing_slash was set (extrac03.sh,extrac04.sh tests).
+ * tests/multiv01.sh: Minor changes.
+ * m4/Makefile.am: Added missing files.
+
+2003-07-05 Paul Eggert <eggert@twinsun.com>
+
+ Finish the checkin begin yesterday.
+
+ * NEWS: Document the user-visible changes installed in the last
+ two days.
+
+ * TODO: New file (actually, resurrected; but with new contents).
+
+ * src/list.c (read_and): Give full type for procedure arg.
+ (read_header): Strip trailing slashes, setting current_trailing_slash.
+ (tartime): Avoid int overflow when printing year (!).
+ (print_header): New arg specifying block ordinal. All uses changed.
+ Print link as 'h' type. Give labels for long links and names.
+
+ * src/misc.c (contains_dot_dot): Moved to names.c
+ (must_be_dot_or_slash): New function.
+ (safer_rmdir): Use it.
+ (remove_any_file): Now takes enum as option, not boolean.
+ Check for (Linux) EISDIR as well as (POSIX) EPERM when attempting
+ to unlink a directory.
+ (deref_stat): Accept bool, not int.
+
+ * src/names.c (namelist_match): Allow partial matches only if
+ recursive.
+ (hash_string_hasher): Renamed from hash_avoided_name.
+ (hash_string_compare): Renamed from compare_avoided_anames.
+ (hash_string_insert, hash_string_lookup): New functions.
+ (add_avoided_name, is_avoided_name): Use them.
+ (safer_name_suffix): New function.
+ (contains_dot_dot): Moved here from misc.c. Now returns bool, not int.
+
+ * src/rmt.c: Don't include print-copyr.h.
+ (prepare_input_buffer): New arg FD.
+ Do not read more than INT_MAX bytes at once,
+ since it breaks on some brain damaged Tru64 hosts.
+ Divide size by two
+ when retrying instead of subtracting 1024; for speed.
+ (main): Use gettext to translate (C), not print_copyright.
+
+ * src/system.h: Include <alloca.h> and <stdbool.h> unconditionally,
+ now that gnulib handles this.
+ Include <stddef.h> and <limits.h> unconditionally, now that we assume
+ C89 or better.
+ Assume that offsetof is defined in stddef.h.
+ Do not include <sys/param.h>.
+ (realloc, lseek): Do not declare.
+ (HAVE_DECL_VALLOC): Renamed from HAVE_VALLOC.
+ (CHAR_BIT, CHAR_MAX, UCHAR_MAX, LONG_MAX): Remove
+ declarations, since we now assume C89 or better.
+ (PARAMS): Remove, as we now assume C89. All uses changed.
+ (bindtextdomain, textdomain): Include <gettext.h> to define.
+ Include <unlocked-io.h>.
+ (valloc): Define if not defined, and if valloc is not declared.
+ (xstrdup): Remove decl.
+
+ * src/tar.c: Do not include <print-copyr.h>.
+ Include <getdate.h>.
+ (get_date): Remove decl.
+ (ATIME_PRESERVE_OPTION, CHECKPOINT_OPTION, FORCE_LOCAL_OPTION,
+ IGNORE_FAILED_READ_OPTION, INDEX_FILE_OPTION, NO_OVERWRITE_DIR_OPTION,
+ NUMERIC_OWNER_OPTION, RECURSIVE_UNLINK_OPTION, REMOVE_FILES_OPTION,
+ SHOW_OMITTED_DIRS_OPTION, TOTALS_OPTION): New constants.
+ (long_options, decode_options): Use them.
+ (OVERWRITE_DIR_OPTION): Remove.
+ (long_options): New options --index-file, --no-overwrite-dir.
+ Remove --overwrite-dir option.
+ (usage): Use PACKAGE_BUGREPORT.
+ (decode_options): Terminate new argv properly.
+ Use PACKAGE_NAME, PACKAGE_VERSION.
+ If verbose, report how we grokked any textual date option.
+ (main): Add support for index-file.
+
+ * tests/Makefile.am: Convert to UTF-8.
+ (AUTOMAKE_OPTIONS): Remove.
+ (TESTS): Add delete04.sh, multiv01.sh, options.sh.
+ (INCLUDES): Remove ../intl.
+ (LDADD): Don't link libtar.a twice.
+
+ * tests/genfile.c: Convert to UTF-8.
+ Don't include <print-copyr.h>.
+ (DEFAULT_PATTERN): Renamed from DEFAULT.
+ (ZEROS_PATTERN): Renamed from ZEROS.
+ (main): Use gettext to translate (C), not print_copyright.
+
+2003-07-04 Paul Eggert <eggert@twinsun.com>
+
+ Revamp to meet current standards of autoconf, automake,
+ gettext, and gnulib, and incorporate new translations.
+
+ * config/config.guess, config/config.sub, config/depcomp,
+ config/install-sh, config/mdate-sh, config/missing,
+ config/mkinstalldirs, config/texinfo.texi:
+ Moved here from parent directory, or from doc.
+ * config.hin: Renamed from config.h.in.
+ * config/config.rpath: New file.
+
+ * intl: Remove this subdirectory.
+
+ * lib/fnmatch_.h: Renamed from lib/fnmatch.hin.
+
+ * lib/getstr.c, lib/getstr.h, lib/msleep.c, lib/print-copyr.c,
+ lib/print-copyr.h, lib/readutmp.c, lib/rename.c, lib/stpcpy.c,
+ lib/strstr.c, lib/strtoimax.c, lib/strtoll.c, lib/strtoull.c,
+ lib/strtoumax.c, lib/unicodeio.c, lib/unicodeio.h,
+ lib/xstrtoimax.c, m4/c-bs-a.m4, m4/ccstdc.m4, m4/check-decl.m4,
+ m4/decl.m4, m4/jm-mktime.m4, m4/prereq.m4, m4/xstrtoimax.m4,
+ stamp-h.in: Remove.
+
+ * lib/alloca_.h, lib/fnmatch_loop.c, lib/gettext.h, lib/pathmax.h,
+ lib/safe-write.c, lib/safe-write.h, lib/stdbool_.h, lib/strcase.h,
+ lib/stripslash.c, lib/unlocked-io.h, lib/xgetcwd.h, m4/alloca.m4,
+ m4/backupfile.m4, m4/bison.m4, m4/chown.m4, m4/dirname.m4,
+ m4/dos.m4, m4/exclude.m4, m4/fileblocks.m4, m4/ftruncate.m4,
+ m4/getdate.m4, m4/getopt.m4, m4/hash.m4, m4/human.m4,
+ m4/intdiv0.m4, m4/intmax_t.m4, m4/inttypes-pri.m4,
+ m4/inttypes_h.m4, m4/isc-posix.m4, m4/lchown.m4, m4/lib-ld.m4,
+ m4/lib-link.m4, m4/lib-prefix.m4, m4/memset.m4, m4/mktime.m4,
+ m4/modechange.m4, m4/nls.m4, m4/onceonly.m4, m4/pathmax.m4,
+ m4/po.m4, m4/quote.m4, m4/quotearg.m4, m4/rmdir.m4,
+ m4/safe-read.m4, m4/safe-write.m4, m4/save-cwd.m4, m4/savedir.m4,
+ m4/ssize_t.m4, m4/stdbool.m4, m4/stdint_h.m4, m4/strcase.m4,
+ m4/strtoimax.m4, m4/strtol.m4, m4/strtoll.m4, m4/strtoul.m4,
+ m4/strtoull.m4, m4/strtoumax.m4, m4/tm_gmtoff.m4, m4/uintmax_t.m4,
+ m4/unlocked-io.m4, m4/xalloc.m4, m4/xgetcwd.m4, m4/xstrtol.m4,
+ po/LINGUAS, po/Makevars, po/Rules-quot, po/boldquot.sed,
+ po/en@boldquot.header, po/en@quot.header, po/en_GB.po,
+ po/insert-header.sin, po/remove-potcdate.sin, po/stamp-po: New files.
+
+ * ABOUT-NLS, INSTALL, lib/addext.c, lib/alloca.c, lib/argmatch.c,
+ lib/argmatch.h, lib/backupfile.c, lib/backupfile.h, lib/dirname.c,
+ lib/dirname.h, lib/error.c, lib/exclude.c, lib/exclude.h,
+ lib/fnmatch.h, lib/full-write.c, lib/full-write.h, lib/getdate.h,
+ lib/getdate.y, lib/getline.c, lib/getline.h, lib/getopt.c,
+ lib/getopt.h, lib/getopt1.c, lib/hash.c, lib/hash.h, lib/human.c,
+ lib/human.h, lib/lchown.c, lib/malloc.c, lib/mktime.c,
+ lib/modechange.c, lib/modechange.h, lib/quote.c, lib/quote.h,
+ lib/quotearg.c, lib/quotearg.h, lib/realloc.c, lib/safe-read.c,
+ lib/safe-read.h, lib/save-cwd.c, lib/save-cwd.h, lib/savedir.c,
+ lib/savedir.h, lib/strcasecmp.c, lib/utime.c, lib/xalloc.h,
+ lib/xgetcwd.c, lib/xmalloc.c, lib/xstrdup.c, lib/xstrtol.c,
+ lib/xstrtol.h, lib/xstrtoumax.c, m4/codeset.m4, m4/d-ino.m4,
+ m4/error.m4, m4/fnmatch.m4, m4/getcwd.m4, m4/getline.m4, m4/gettext.m4,
+ m4/glibc21.m4, m4/iconv.m4, m4/inttypes.m4, m4/lcmessage.m4,
+ m4/longlong.m4, m4/malloc.m4, m4/mbrtowc.m4, m4/mbstate_t.m4,
+ m4/progtest.m4, m4/realloc.m4, m4/strerror_r.m4, m4/ulonglong.m4,
+ m4/utimbuf.m4, m4/utime.m4, m4/utimes.m4, m4/xstrtoumax.m4,
+ po/Makefile.in.in:
+ Upgrade to latest version from external source. The file "bootstrap"
+ now grabs these automatically, so we needn't keep track of them
+ in this change long any longer.
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Remove. Now done by configure.ac.
+ (SUBDIRS): Remove intl.
+ * PORTS: Update for star, Macintosh.
+ * README, README-alpha: Suggest Autoconf 2.57, Automake 1.7.5,
+ Bison 1.875, gettext 0.12.1.
+ * THANKS: Add Bernhard Rosenkraenzer, Solar Designer.
+ * configure.ac (AC_INIT, AM_INIT_AUTOMAKE): Convert to modern form.
+ (AC_CONFIG_AUX_DIR): New.
+ (AC_CONFIG_HEADERS): Rename config.h.in to config.hin, to be more
+ like coreutils.
+ (AC_PREREQ): Bump from 2.52 to 2.57.
+ (AC_GNU_SOURCE): New.
+ (AC_PROG_GCC_TRADITIONAL, AM_C_PROTOTYPES, AC_C_CONST): Remove;
+ we no longer support K&R C.
+ (YACC): Remove.
+ (AC_CHECK_HEADERS): Remove limits.h, poll.h, stdbool.h, stropts.h,
+ sys/ioccom.h, sys/param.h, sys/time.h, sys/timeb.h, wchar.h, wctype.h.
+ (AC_MBSTATE_T): Remove.
+ (HAVE_UTIME_H, HAVE_DECL_FREE, HAVE_DECL_GETGRGID, HAVE_DECL_GETPWUID,
+ HAVE_DECL_GETENV, HAVE_DECL_MALLOC, HAVE_DECL_STRTOUL,
+ HAVE_DECL_STRTOULL, HAVE_MKNOD): Remove our special code.
+ (AM_STDBOOL_H): Add.
+ (AC_HEADER_TIME, AC_STRUCT_TIMEZONE,
+ jm_CHECK_TYPE_STRUCT_DIRENT_D_INO): Remove.
+ (AC_CHECK_TYPE): Remove ssize_t.
+ (gt_TYPE_SSIZE_T): Add.
+ (jm_AC_PREREQ_XSTRTOUMAX, jm_PREREQ_ADDEXT, jm_PREREQ_ERROR,
+ jm_PREREQ_HUMAN, jm_PREREQ_QUOTEARG, jm_PREREQ_XGETCWD,
+ AC_FUNC_ALLOCA, AC_FUNC_CLOSEDIR_VOID, AC_FUNC_STRERROR_R,
+ AC_FUNC_FNMATCH, AC_FUNC_VPRINTF, AM_FUNC_GETLINE, jm_FUNC_MALLOC,
+ jm_FUNC_MKTIME, jm_FUNC_REALLOC):
+ Remove. Switch to gnulib macros like gl_BACKUPFILE instead.
+ (tar_LDADD): Rename to LIB_CLOCK_GETTIME. All uses changed.
+ (rmt_LDADD): Rename to LIB_SETSOCKOPT. All uses changed.
+ (AC_CHECK_FUNCS): Remove fchdir, ftime, getcwd, isascii, nap,
+ napms, poll, select, strstr, usleep.
+ (AC_REPLACE_FUNCS): Remove ftruncate, lchown, memset, rename,
+ rmdir, strcasecmp, strncasecmp, strtol, strtoul.
+ (AM_GNU_GETTEXT): Use external and need-ngettext options.
+ (AM_GNU_GETTEXT_VERSION): New.
+ (AC_OUTPUT): Remove intl/Makefile.
+
+ * doc/Makefile.am (AUTOMAKE_OPTIONS): Remove.
+ ($(srcdir)/tar.info, tar.dvi): Remove obsolete warnings.
+ * doc/fdl.texi: Update to current GNU version.
+ * doc/gettext.texi: Update to current coreutils version,
+ plus a copyright notice.
+ * doc/tar.texi: Switch to new method for doing copyright notices.
+ Use @acronym instead of @sc where appropriate.
+ Remove empty examples. Give a few more examples.
+
+ * lib/Makefile.am (AUTOMAKE_OPTIONS): Remove.
+ (EXTRA_DIST, libtar_a_SOURCES): Switch to gnulib, so that they
+ are built up in pieces with +=.
+ (noinst_HEADERS, INCLUDES): Remove.
+ (BUILT_SOURCES, MAINTAINERCLEANFILES, MOSTLYCLEANFILES): New.
+ (libtar_a_LIBADD): Use $ rather than @.
+ (all-local, alloca.h, fnmatch.h, stdbool.h): New rules, from gnulib.
+
+ * m4/Makefile.am (EXTRA_DIST): Add alloca.m4, backupfile.m4,
+ bison.m4, chown.m4, dirname.m4, dos.m4, exclude.m4, fileblocks.m4,
+ ftruncate.m4, getdate.m4, getopt.m4, hash.m4, human.m4,
+ intdiv0.m4, intmax_t.m4, inttypes_h.m4, inttypes-pri.m4,
+ isc-posix.m4, lcown.m4, lib-ld.m4, lib-link.m4, lib-prefix.m4,
+ memset.m4, mktime.m4, modechange.m4, nls.m4, onceonly.m4,
+ pathmax.m4, po.m4, quotearg.m4, quote.m4, rmdir.m4, safe-read.m4,
+ safe-write.m4, save-cwd.m4, savedir.m4, ssize_t.m4, stdbool.m4,
+ stdint_h.m4, strcase.m4, strtoimax.m4, strtoll.m4, strtol.m4,
+ strtoull.m4, strtoul.m4, strtoumax.m4, tm_gmtoff.m4, uintmax_t.m4,
+ unlocked-io.m4, xalloc.m4, xgetcwd.m4, xstrtol.m4.
+ Remove c-bs-a.m4, ccstdc.m4, check-decl.m4, decl.m4, jm-mktime.m4,
+ prereq.m4, xstrtoimax.m4.
+
+ * po/POTFILES.in: Remove tests/genfile.c; it doesn't need to
+ be translated, since it's not a user-visible tool.
+
+ * scripts/Makefile.am (AUTOMAKE_OPTIONS): Remove.
+
+ * src/Makefile.am (AUTOMAKE_OPTIONS): Remove.
+ (INCLUDES): Remove ../intl. Put top-srcdir before ., for
+ consistency with coreutils.
+ (LDADD): Link LIBINTL after libtar.a, since
+ it's now external and should stand by itself.
+
+ * src/buffer.c (print_total_written): Adjust to new human.h
+ interface.
+ (child_open_for_compress): Do not increase size to BLOCKSIZE.
+ (open_archive): Open index file name.
+ Strip trailing slahes from file names.
+ (flush_write): Set size to 0 if not saving names.
+ (flush_write, flush_read): Use safer_name_suffix rather than
+ inline code.
+
+ * src/common.h: Include <quote.h>.
+ (absolute_names_option, atime_preserve_option, backup_option,
+ block_number_option, checkpoint_option, dereference_option,
+ force_local_option, ignore_failed_read_option, ignore_zeros_option,
+ incremental_option, interactive_option, multi_volume_option,
+ numeric_owner_option, one_file_system_option, recursive_unlink_option,
+ read_full_records_option, remove_files_option, same_order_option,
+ show_omitted_dirs_option, sparse_option, starting_file_option,
+ to_stdout_option, totals_option, touch_option, verify_option,
+ dev_null_output, now_verifying, we_are_root): Now bool, not int.
+ (current_trailing_slash, index_file_name, recent_long_name_blocks,
+ recent_long_link_blocks): New vars.
+ (NO_OVERWRITE_DIR_OLD_FILES): New constant.
+ (OVERWRITE_OLD_DIRS): Remove.
+ (enum remove_option): New enum.
+ (remove_any_file): Use it as option arg, not int.
+ (is_avoided_name, contains_dot_dot): Return bool, not int.
+ (safer_name_suffix): New decl.
+
+ * src/compare.c (now_verifying): Now bool, not int.
+ (fill_in_sparse_array): Move to extract.c. Now returns bool;
+ all callers changed to test for failure.
+ (diff_sparse_files): Take size from current_stat, not from param.
+ (diff_archive): Do not count trailing slashes in archives.
+ (verify_volume): Test for header failure after loop, not before.
+
+ * src/create.c (relativize): Remove; replaced by safer_name_suffix.
+ All callers changed.
+ (start_header): Clear devmajor and devminor fields, too.
+ (finish_header): New arg block_ordinal.
+ (init_sparsearray): Now extern. Set sp_array_size to
+ SPARSES_IN_OLDGNU_HEADER if it is zero.
+ (dump_file): Keep link table as a hash.
+ Do not count "file changed as we read it" as a failure.
+
+ * src/delete.c (recent_long_name_blocks, recent_long_link_blocks):
+ Move extern decl to common.h.
+
+ * src/extract.c (we_are_root): Now bool, not int.
+ (check_time): Warn about implausibly old time stamps.
+ (set_stat): Use utimbuf, not stat_info.
+ (prepare_to_extract): New arg DIRECTORY.
+ (fill_in_sparse_array): Moved here from compare.c.
+ (extract_sparse_file): Now returns off_t, giving size left.
+ Truncate file at end.
+ (extract_archive): Use safer_name_suffix rather than rolling our own.
+ Use fill_in_sparse_array rather than rolling our own.
+ Strip trailing slashes more effectively.
+ Check for unsafe names.
+
+ * src/incremen.c (struct directory): nfs and found are now of type
+ bool, not int.
+ (gnu_restore): Now takes directory name as argument, not offset
+ of directory name in a global. All uses changed.
+ (CURRENT_FILE_NAME): Remove.
+
+ New tests.
+ * tests/delete04.sh, tests/multiv01.sh, tests/options.sh: New
+ files.
+
+2002-09-30 Paul Eggert <eggert@twinsun.com>
+
+ * src/rmt.c (prepare_input_buffer): Renamed form
+ prepare_record_buffer. All uses changed. Do not assume that
+ size_t is the same width as int.
+
+2002-03-29 Paul Eggert <eggert@twinsun.com>
+
+ * src/incremen.c (get_directory_contents):
+ If ignore_failed_read_option, only warn about
+ get_directory_contents failures. Fix suggested by
+ Mark Costlow.
+
+2002-01-31 Mark W. Eichin <eichin@thok.org>
+
+ * src/buffer.c (child_open_for_compress): Don't try to read
+ past the end of the buffer.
+
+2001-10-11 Jim Meyering <meyering@lucent.com>
+
+ * argmatch.c (argmatch_invalid): Use quotearg_n_style (0, ...
+ and quote_n (1, ... to avoid clobbering a buffer.
+
+2001-09-26 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.ac (AM_INIT_AUTOMAKE): Version 1.13.25.
+
+ * src/buffer.c (flush_read): Don't diagnose partial blocks before
+ end of file; just ignore them silently.
+
+ * src/list.c (read_header): Don't keep around extended name
+ and link info indefinitely; keep it only for the next file.
+ This fixes a bug introduced in 1.13.24, and removes the need
+ for some static variables. Set recent_long_name and
+ recent_long_link to zero if there were no long links; this
+ avoids a violation of ANSI C rules for pointers in delete.c.
+ * THANKS: Add Christian Laubscher.
+
+2001-09-26 Jim Meyering <meyering@lucent.com>
+
+ * doc/tar.texi (Remote Tape Server): is know -> is known
+
+2001-09-25 Paul Eggert <eggert@twinsun.com>
+
+ * lib/unicodeio.c (EILSEQ): Include <iconv.h> first, since
+ <iconv.h> may define EILSEQ (e.g. libiconv). Define a
+ replacement EILSEQ to be ENOENT, not EINVAL, since callers may
+ want to distinguish EINVAL and EILSEQ.
+
+2001-09-24 Christophe Kalt <Christophe.Kalt@kbcfp.com>
+
+ * src/extract.c (maybe_recoverable):
+ Treat OVERWRITE_OLD_DIRS like DEFAULT_OLD_FILES.
+
+2001-09-22 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.ac (AM_INIT_AUTOMAKE): Version 1.13.24.
+
+ * ABOUT-NLS, intl/*: Update to gettext-0.10.40, replacing LGPL
+ with GPL.
+
+ * INSTALL, mkinstalldirs: Update to autoconf 2.52 version.
+ * PORTS: Add copyright notice, 'star' reference.
+ * README-alpha: Add copyright notice, autoconf 2.52 patch.
+ * THANKS: Add Christophe Kalt.
+ * config.sub: Upgrade to 2001-09-14 version.
+
+ * configure.ac (ALL_LINGUAS): Add ko.
+ * po/ko.po: Resurrected file.
+
+ * doc/convtexi.pl: Add coding advice for Emacs.
+
+ * doc/getdate.texi: Add copyright notice.
+
+ * doc/mdate-sh: Upgrade to automake 1.5 version.
+
+ * doc/tar.texi (extracting files): Mention --to-stdout.
+ (Option Summary, Dealing with Old Files): New option --overwrite-dir.
+ (Overwrite Old Files): Likewise.
+
+ * lib/Makefile.am (noinst_HEADERS):
+ Remove copysym.h. Add print-copyr.h, unicodeio.h.
+ (libtar_a_SOURCES): Remove copysym.c, Add print-copyr.c, unicodeio.c.
+
+ * lib/copysym.c, lib/copysym.h: Remove.
+ * lib/print-copyr.c, lib/print-copyr.h, lib/unicodeio.c,
+ lib/unicodeio.h: New files.
+
+ * lib/error.c, lib/getopt.c, lib/getopt.h, lib/getopt1.c,
+ lib/mktime.c, lib/strtoll.c: Switch from LGPL to GPL.
+
+ * lib/quotearg.c (HAVE_MBSINIT): Undef if !HAVE_MBRTOWC.
+ (mbsinit): Define to 1 if !defined mbsinit && !HAVE_MBSINIT.
+
+ * m4/Makefile.am (EXTRA_DIST): Remove isc-posix.m4.
+ * m4/isc-posix.m4: Remove.
+
+ * m4/prereq.m4 (jm_PREREQ_QUOTEARG): Check for mbsinit.
+
+ * po/POTFILES.in: Add copyright notice.
+
+ * src/Makefile.am (LDADD): Like libtar.a before @INTLLIBS@ as
+ well as after.
+ * tests/Makefile.am (LDADD): Likewise.
+
+ * src/buffer.c (write_archive_buffer, close_archive):
+ If an archive is a socket, treat it like a FIFO.
+ (records_read, records_written): New vars.
+ (write_archive_to_stdout): Now bool, not int.
+ (open_archive, flush_write, flush_read): Keep records_read and
+ records_written up to date.
+
+ * src/common.h (enum old_files): New value OVERWRITE_OLD_DIRS.
+ (write_archive_to_stdout): Now bool, not int.
+ (enum read_header): New value HEADER_SUCCESS_EXTENDED.
+ (read_header): Now takes bool arg. Existing callers modified
+ to pass 0, unless otherwise specified.
+
+ * src/delete.c (records_read): Remove; now a global.
+ (acting_as_filter): Now bool, not int.
+ (recent_long_name, recent_long_link, recent_long_name_blocks,
+ recent_long_link_blocks, records_read, records_written): New decls.
+ (records_skipped): New var.
+ (move_archive): Don't divide by zero if arg is 0.
+ Use the above vars to compute how far to move.
+ (write_recent_blocks): New function.
+ (delete_archive_member): Pass 1 to read_header, so that it doesn't
+ read more than 1 block. Handle resulting HEADER_SUCCESS_EXTENDED code.
+ Keep track of how many records have been skipped.
+ Let the buffer code count records.
+ When copying a header, copy any extended headers that came before it.
+
+ * src/extract.c (extract_archive): When marking a directory to be
+ updated after symlinks, stat all directories after it in the
+ delayed-set-stat list too, since they will be checked after
+ symlinks. Add support for --overwrite-dir.
+
+ * src/list.c (recent_long_name, recent_long_link,
+ recent_long_name_blocks, recent_long_link_blocks): New vars.
+ (read_and): Pass 0 to read_header.
+ (read_header): New arg RAW_EXTENDED_HEADERS. Store away extended
+ headers into new vars. Null-terminate incoming symbolic links.
+
+ * src/rmt.c: Include print-copyr.h, not copysym.h.
+ (main): Use print_copyright, not copyright_symbol.
+ * src/tar.c (decode_options): Likewise.
+ (OVERWRITE_DIR_OPTION): New constant.
+ (long_options, usage, decode_options): Add --overwrite-dir.
+
+ * src/tar.h: Put copyright notice into documentation.
+
+ * tests/Makefile.am (TESTS): Add delete03.sh.
+ * tests/delete03.sh: New file.
+
+ * tests/genfile.c: Include print-copyr.h, not copysym.h.
+ (main): Use print_copyright, not copyright_symbol.
+ Include <argmatch.h>.
+ (pattern_strings): Remove.
+ (pattern_args, pattern_types): New constants.
+ (main): Use XARGMATCH, not argmatch.
+
+2001-09-20 Jim Meyering <meyering@lucent.com>
+
+ * lib/xstrtol.c (strtoimax): Guard declaration with
+ `#if !HAVE_DECL_STRTOIMAX', rather than just `#ifndef strtoimax'.
+ The latter fails because some systems (at least rs6000-ibm-aix4.3.3.0)
+ have their own, conflicting declaration of strtoimax in sys/inttypes.h.
+ (strtoumax): Likewise, for completeness (it wasn't necessary).
+ * m4/xstrtoimax.m4 (jm_AC_PREREQ_XSTRTOIMAX):
+ Check for declaration of strtoimax.
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX):
+ Check for declaration of strtoumax.
+
+2001-09-16 Paul Eggert <eggert@twinsun.com>
+
+ * fnmatch.m4 (jm_FUNC_FNMATCH): Fix typo in previous patch: yes -> no.
+
+2001-09-14 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.ac (AC_INIT_AUTOMAKE): Version 1.13.23.
+
+ * README-alpha: Describe automake patch.
+
+ * configure.ac (LIBOBJS):
+ Remove automake 1.4 workaround, as we're using 1.5 now.
+ (USE_INCLUDED_LIBINTL): New AC_DEFINE.
+
+ * lib/copysym.c: Include stddef.h, for size_t.
+ Include langinfo.h if needed.
+ Use locale_charset only if USE_INCLUDED_LIBINTL;
+ if not, use nl_langinfo (CODESET) if available.
+
+2001-09-13 Paul Eggert <eggert@twinsun.com>
+
+ * config.guess, config.sub: Sync with canonical versions.
+
+ * configure.ac (jm_PREREQ_XGETCWD): Add.
+
+ * lib/Makefile.am (noinst_HEADERS): Add copysym.h.
+ (libtar_a_SOURCES): Add copysym.c.
+ * copysym.c, copysym.h: New files.
+
+ * lib/error.c: Sync with fileutils version.
+
+ * m4/Makefile.am (EXTRA_DIST): Add getcwd.m4; remove uintmax_t.m4.
+ * m4/getcwd.m4: New file.
+ * m4/uintmax_t.m4: Remove.
+
+ * m4/gettext.m4 (AM_WITH_NLS):
+ Fix bug with calculating version of Bison 1.29.
+ Reported by Karl Berry.
+
+ * src/Makefile.am (datadir): Remove.
+
+ * src/rmt.c: Include copysym.h.
+ (main): Use copyright_symbol to translate copyright notice,
+ instead of gettext.
+ * src/tar.c: Likewise.
+ * tests/genfile.c: Likewise.
+
+ * src/system.h (MB_LEN_MAX): New symbol.
+
+2001-09-11 Paul Eggert <eggert@twinsun.com>
+
+ * src/extract.c (struct delayed_set_stat): New member
+ 'after_symlinks'.
+ (delay_set_stat): Initialize it to 0.
+ (set_mode): New arg current_stat_info. Use it (if nonnull) to avoid
+ taking an extra stat ourselves. All callers changed.
+ (set_stat): Likewise.
+ (apply_nonancestor_delayed_set_stat): New arg 'after_symlinks'.
+ If false, stop when encountering a struct whose 'after_symlinks'
+ member is true. Otherwise, go through all structures but check
+ them more carefully. All callers changed.
+ (extract_archive): When extracting a deferred symlink, if its parent
+ directory's status needs fixing, then mark the directory as needing
+ to be fixed after symlinks.
+ (extract_finish): Fix status of ordinary directories, then apply
+ delayed symlinks, then fix the status of directories that are
+ ancestors of delayed symlinks.
+
+ * src/rtapelib.c (rexec):
+ Remove declaration; it ran afoul of prototypes on Crays.
+ Reported by Wendy Palm of Cray.
+
+2001-09-06 Paul Eggert <eggert@twinsun.com>
+
+ * lib/strtoimax.c (HAVE_LONG_LONG):
+ Redefine to HAVE_UNSIGNED_LONG_LONG if unsigned.
+ (strtoimax): Use sizeof (long), not
+ sizeof strtol (ptr, endptr, base),
+ to work around bug in IBM C compiler.
+
+2001-09-04 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xgetcwd.c: Include "xalloc.h".
+ (xgetcwd): Do not return NULL when memory is exhausted; instead,
+ report an error and exit.
+
+ * m4/prereq.m4 (jm_PREREQ_XREADLINK): New macro.
+ (jm_PREREQ): Use it.
+
+2001-09-03 Paul Eggert <eggert@twinsun.com>
+
+ * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_XGETCWD.
+ (jm_PREREQ_XGETCWD): New macro.
+
+ * lib/exclude.c (fnmatch_no_wildcards):
+ Fix typo that caused us to do case-folding
+ search even when that was not desired. This occurred only in the
+ no-wildcard case.
+
+ * lib/xgetcwd.c: Include pathmax.h if not HAVE_GETCWD.
+ Do not include xalloc.h.
+ (INITIAL_BUFFER_SIZE): New symbol.
+ Do not use xmalloc / xrealloc, since the caller is responsible for
+ handling errors. Preserve errno around `free' during failure.
+ Do not overrun buffer when using getwd.
+
+ * lib/xgetcwd.c (xgetcwd):
+ Use HAVE_GETCWD_NULL, not defined __GLIBC__ && __GLIBC__ >= 2,
+ to decide whether to use getcwd (NULL, 0).
+
+2001-09-02 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xgetcwd.c: Fix typo in local var; from Jim Meyering.
+
+2001-09-01 Jim Meyering <meyering@lucent.com>
+
+ * exclude.c: Use `""', not `<>' to #include non-system header files.
+ (fnmatch_no_wildcards): Rewrite not to use function names, strcasecmp
+ and strncasecmp as r-values. Unixware didn't have declarations.
+
+2001-08-31 Jim Meyering <meyering@lucent.com>
+
+ * lib/xgetcwd.c (xgetcwd): Reorganize to avoid some duplication.
+ Use an initial, malloc'd, buffer of length 128 rather than
+ a statically allocated one of length 1024.
+
+2001-08-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/utime.c: Include full-write.h.
+ * lib/xstrtol.c (strtoimax): New decl.
+
+2001-08-29 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.ac (AC_INIT_AUTOMAKE): Version 1.13.22.
+
+ * src/create.c (dump_file): Relativize link names before dumping.
+ This fixes a bug reported by Jose Pedro Oliveira.
+
+ * src/create.c (dump_file): Use offsetof when computing sizes for
+ struct hack; this avoids wasted space in some cases.
+ * src/incremen.c (note_directory, find_directory): Likewise.
+ * src/names.c (name_gather, addname): Likewise.
+
+ * src/extract.c (extract_archive): Use strcpy, not memcpy,
+ for consistency with other code that does similar things.
+ * src/names.c (name_gather): Likewise.
+
+ * src/names.c (read_name_from_file, name_next, name_gather,
+ add_hierarchy_to_namelist): Avoid quadratic behavior when
+ reallocating buffers. Check for buffer size overflow.
+ (addname): Avoid unnecessary clearing of memory.
+
+2001-08-29 "Jan D." <Jan.Djarv@mbox200.swipnet.se>
+
+ * src/extract.c (delay_set_stat): Fix off-by-one error in file
+ name size allocation that caused core dumps.
+
+2001-08-28 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.ac (AC_INIT_AUTOMAKE): Version 1.13.21.
+
+ * configure.ac (GNU_SOURCE): Define to 1, not /**/.
+ (major_t, minor_t, ssize_t): Use new-style AC_CHECK_TYPE.
+ (daddr_t): Remove; no longer used.
+ (jm_PREREQ_HUMAN): Add.
+
+ * acconfig.h: Remove; no longer needed.
+
+ * config.guess, config.sub:
+ New files, from automake 1.5. Gettext 0.10.39 needs them.
+ * depcomp, missing, mkinstalldirs: Upgrade to automake 1.5.
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Add dist-bzip2.
+ (SUBDIRS): Put intl before lib, as gettext requires.
+
+ * ABOUT-NLS: Upgrade to gettext 0.10.39.
+ * intl: Upgrade entire directory to gettext 0.10.39.
+ * m4/codeset.m4, m4/glibc21.m4, m4/iconv.m4:
+ New files, from gettext 0.10.39.
+ * m4/gettext.m4, m4/isc-posix.m4, m4/lcmessage.m4, m4/progtest.m4,
+ Upgrade to gettext 0.10.39,
+ * po/Makefile.in.in: Likewise, except fix a typo in its copying
+ permissions.
+ * po/cat-id-tbl.c, po/stamp-cat-id:
+ Remove; no longer used by gettext 0.10.39.
+ * po/ChangeLog: New file.
+
+ * doc/Makefile.am (EXTRA_DIST): Add freemanuals.texi.
+ $(srcdir)/tar.texi: Likewise.
+ * doc/freemanuals.texi: New file.
+ * doc/tar.texi (Free Software Needs Free Documentation): New appendix.
+ `fileds' -> `fields'
+ * doc/texinfo.tex: Upgrade to version 2001-07-25.07.
+
+ * lib/Makefile.am (EXTRA_DIST): Add strtoll.c, strtoimax.c.
+ (noinst_HEADERS): Add quote.h.
+ (libtar_a_SOURCES): Add quote.c, xstrtoimax.c.
+
+ * lib/exclude.c: Fix typo in '#include <stdint.h>' directive.
+
+ * lib/full-write.c, lib/savedir.c: Comment fix.
+
+ * lib/pathmax.h: Remove.
+
+ * lib/quote.c, lib/quote.h: New files.
+
+ * lib/xgetcwd.c: Don't include pathmax.h.
+ Include stdlib.h and unistd.h if available.
+ Include xalloc.h.
+ (xmalloc, xstrdup, free): Remove decls.
+ (xgetcwd): Don't assume sizes fit in unsigned.
+ Check for overflow when computing sizes.
+ Simplify reallocation code.
+
+ * lib/xmalloc.c: Quote failure tests.
+
+ * lib/strtoumax.c, lib/xstrtoimax.c: New files.
+
+ * lib/strtoimax.c: Renamed from strtouxmax.c. Make it more
+ similar to strtol.c.
+ (UNSIGNED): Renamed from STRTOUXMAX_UNSIGNED.
+ (verify): New macro.
+ (strtoumax, uintmax_t, strtoull, strtol): Remove.
+ (intmax_t, strtoimax, strtol, strtoll): New macros, if UNSIGNED.
+ (strtoimax): Renamed from strtoumax. All uses of unsigned values
+ changed to signed values. Check sizes at compile-time, not
+ run-time. Prefer strtol to strtoll if both work.
+ (main): Remove.
+
+ * lib/xstrtol.h (xstrtoimax): New decl.
+
+ * m4/Makefile.am (EXTRA_DIST):
+ Add codeset.m4, glibc21.m4, iconv.m4, inttypes.m4,
+ longlong.m4, xstrtoimax.m4.
+
+ * m4/inttypes.m4 (jm_AC_HEADER_INTTYPES_H):
+ Remove; now done by autoconf.
+ (jm_AC_TYPE_INTMAX_T, jm_AC_TYPE_UINTMAX_T): Replace with
+ Use AC_CHECK_TYPE instead of merely looking for the header.
+
+ * m4/uintmax_t.m4: Use shorter comment.
+
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX):
+ Quote first arg of AC_DEFUN.
+ Require jm_AC_TYPE_INTMAX_T and jm_AC_TYPE_LONG_LONG since they
+ is needed to parse the include file.
+ Simplify logic behind the args to AC_REPLACE.
+
+ * src/Makefile.am (OMIT_DEPENDENCIES): Remove.
+
+ * src/ansi2knr.1, src/ansi2knr.c: Remove; wasn't being used.
+
+ * src/rmt.c (main):
+ Use "Copyright %d" to simplify the translator's job in the future.
+ Advise translator about circle-C.
+ * src/tar.c: (decode_options): Likewise.
+ * tests/genfile.c (main): Likewise.
+
+2001-08-28 Jim Meyering <meyering@lucent.com>
+
+ * lib/argmatch.c: Include "quote.h".
+ (argmatch_invalid): Quote the context.
+
+ * lib/dirname.c (dir_name): Fix typo on PC platforms.
+
+ * lib/backupfile.c, lib/basename.c, lib/dirname.c, lib/strtoul.c:
+ Use single-quote for local .h files.
+
+ * lib/error.h (__attribute__): Don't depend on __STRICT_ANSI__.
+
+ * lib/getopt.c, lib/getopt.h, lib/getopt1.c: Upgrade to recent
+ glibc versions.
+
+ * lib/getdate.y (get_date): Initialize tm_isdst to -1 before
+ invoking mktime the last time.
+
+ * lib/pathmax.h: Use #if rather than #ifdef for HAVE_UNISTD_H.
+
+ * lib/rename.c: Major rewrite by Volker Borchert to use system
+ rename function, but to work around problems with trailing
+ slashes.
+
+ * lib/strtoll.c: New file, from glibc.
+ * lib/strtoul.c: Update from glibc.
+
+ * lib/strtouxmax.c: Renamed from lib/strtoumax.c.
+ Add support for signed numbers, too.
+ (strtoul, strtoull): Do not declare if STRTOUXMAX_UNSIGNED
+ is not defined.
+ (strtol, strtoll): Declare as needed, if STRTOUXMAX_UNSIGNED is
+ not defined.
+ (strtoumax, uintmax_t, strtoull, strtoul): New macros.
+ (main): Use generic names in debugging output.
+ * lib/strtoimax.c: Plus add the following changes of my own:
+ (main): Use accurate names in debugging output.
+
+ * lib/xgetcwd.c (xgetcwd): Use getcwd if glibc 2 or later.
+ Don't use PATH_MAX.
+
+ * m4/c-bs-a.m4, m4/check-decl.m4, m4/d-ino.m4, m4/error.m4,
+ m4/getline.m4, m4/jm-mktime.m4, m4/malloc.m4, m4/mbrtowc.m4,
+ m4/mbstate_t.m4, m4/realloc.m4, m4/uintmax_t.m4, m4/utimbuf.m4,
+ m4/utime.m4, m4/utimes.m4:
+ Quote the first argument in each use of AC_DEFUN.
+
+ * m4/getline.m4: Don't use string.h.
+
+ * m4/inttypes.m4, m4/longlong.m4, m4/xstrtoimax.m4: New files.
+
+ * m4/mbrtowc.m4 (jm_FUNC_MBRTOWC): @%:@ -> #.
+
+2001-08-27 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.ac (AC_INIT_AUTOMAKE): Version 1.13.20.
+
+ The biggest change is the new --exclude semantics and options.
+ The basic idea was suggested by Gerhard Poul; thanks!
+
+ * NEWS: Describe new --exclude semantics and options, and bug fixes.
+ * README: ignfail.sh fails on some NFS hosts.
+ * NEWS, README, lib/xstrtol.h: Add copyright notice.
+
+ * Makefile.am (ACLOCAL_AMFLAGS): Add -I m4.
+ (M4DIR, ACINCLUDE_INPUTS, $(srcdir)/acinclude.m4):
+ Remove; the automake bug has been fixed.
+ * acinclude.m4: Remove.
+
+ * configure.ac: Renamed from configure.in.
+ (AC_PREREQ): Bump from 2.13 to 2.52.
+ (ALL_LINGUAS): Add id, tr. Remove ko, as po/ko.po (dated
+ 1997-05-30) has an encoding error.
+ (jm_AC_HEADER_INTTYPES_H): Remove; now done by autoconf.
+ (AC_FUNC_FNMATCH): Use AC_CONFIG_LINKS, not AC_LINK_FILES.
+
+ * doc/fdl.texi: Update to current GNU version.
+
+ * doc/tar.texi: Put leading '*' in direntry.
+ Accommodate new gfdl sectioning.
+ New option --recursion (the default) that is the inverse of
+ --no-recursion.
+
+ New options --anchored, --ignore-case, --wildcards,
+ --wildcards-match-slash, and their negations (e.g., --no-anchored).
+ Along with --recursion and --no-recursion, these control how exclude
+ patterns are interpreted. The default interpretation of exclude
+ patterns is now --no-anchored --no-ignore-case --recursion
+ --wildcards --wildcards-match-slash.
+
+ * lib/Makefile.am (OMIT_DEPENDENCIES): Remove.
+
+ * lib/exclude.c (bool): Declare, perhaps by including stdbool.h.
+ (<sys/types.h>): Include only if HAVE_SYS_TYPES_H.
+ (<stdlib.h>, <string.h>, <strings.h>, <inttypes.h>, <stdint.h>):
+ Include if available.
+ (<xalloc.h>): Include
+ (SIZE_MAX): Define if <stdint.h> or <inttypes.h> doesn't.
+ (verify): New macro. Use it to verify that EXCLUDE macros do not
+ collide with FNM macros.
+ (struct patopts): New struct.
+ (struct exclude): Use it, as exclude patterns now come with options.
+ (new_exclude): Support above changes.
+ (new_exclude, add_exclude_file):
+ Initial size must now be a power of two to simplify overflow checking.
+ (free_exclude, fnmatch_no_wildcards): New function.
+ (excluded_filename): No longer requires options arg, as the options
+ are determined by add_exclude. Now returns bool, not int.
+ (excluded_filename, add_exclude):
+ Add support for the fancy new exclusion options.
+ (add_exclude, add_exclude_file): Now takes int options arg.
+ Check for arithmetic overflow when computing sizes.
+ (add_exclude_file): xrealloc might modify errno, so don't
+ realloc until after errno might be used.
+
+ * lib/exclude.h (EXCLUDE_ANCHORED, EXCLUDE_INCLUDE,EXCLUDE_WILDCARDS):
+ New macros.
+ (free_exclude): New decl.
+ (add_exclude, add_exclude_file): Now takes int options arg.
+ (excluded_filename): No longer requires options arg, as the options
+ are determined by add_exclude. Now returns bool, not int.
+
+ * lib/prepargs.c: Include <string.h>; required for C99 since
+ we use strlen.
+
+ * lib/quotearg.c:
+ BSD/OS 4.1 wchar.h requires FILE and struct tm to be declared.
+
+ * lib/xstrtol.h (_DECLARE_XSTRTOL): Improve quality of
+ diagnostic for LONGINT_INVALID_SUFFIX_CHAR.
+
+ * m4/Makefile.am (EXTRA_DIST): Add check-decl.m4, mbrtowc.m4.
+ Remove inttypes_h.m4, largefile.m4, mktime.m4.
+
+ * m4/inttypes_h.m4, m4/largefile.m4, m4/mktime.m4: Remove;
+ subsumed by Autoconf 2.50.
+
+ * m4/error.m4: Upgrade to serial 2.
+
+ * m4/fnmatch.m4 (jm_FUNC_FNMATCH): Upgrade to serial 4, but
+ remove test for GNU C library. It's not correct, as some
+ older glibcs are buggy.
+
+ * m4/getline.m4, m4/malloc.m4: Upgrade to serial 4.
+
+ * m4/prereq.m4: Upgrade to serial 20, but then:
+ (jm_PREREQ): Add jm_PREREQ_EXCLUDE.
+ (jm_PREREQ_EXCLUDE): New macro.
+ (jm_PREREQ_HUMAN): Remove jm_AC_HEADER_INTTYPES_H, as it is subsumed
+ by autoconf 2.5x.
+
+ * m4/realloc.m4: Upgrade to serial 4.
+
+ * m4/strerror_r.m4: Revert to serial 1002.
+
+ * m4/uintmax_t.m4: Upgrade to autoconf 2.5x.
+
+ * m4/utimes.m4: Upgrade to latest version (still "serial 3").
+
+ * m4/xstrtoumax.m4: Upgrade to serial 3, but then:
+ (jm_AC_PREREQ_XSTRTOUMAX): Remove jm_AC_HEADER_INTTYPES_H, as
+ it is now subsumed by autoconf. Add inttypes.h.
+
+ * po/cs.po, po/da.po, po/de.po, po/es.po, po/et.po, po/fr.po,
+ po/it.po, po/pl.po, po/sl.po, po/sv.po: Sync with translation project.
+
+ * src/buffer.c (new_volume): Stop if the script exits with an error.
+
+ * src/common.h (excluded_with_slash, excluded_without_slash):
+ Remove, replacing by:
+ (excluded): New decl.
+ (link_error): New decl.
+ (excluded_name): Now returns bool.
+
+ * src/extract.c:
+ (struct delayed_symlinks, extract_archive, apply_delayed_symlinks):
+ Support hard links to symbolic links.
+
+ (struct delayed_symlink): Remove 'names' member, replacing it with
+ 'sources' and 'target' member. All uses changed.
+
+ (struct string_list): New type.
+
+ (delayed_set_stat, extract_archive): Use offsetof when computing sizes
+ for struct hack; this avoids wasted space in some cases.
+
+ (extract_archive): Fix test for absolute pathnames and/or "..".
+ Use link_error to report errors for links.
+ Remove redundant trailing '/' at "really_dir", for all uses, not
+ just before invoking mkdir.
+ If overwriting old files, do not worry so much about existing
+ directories.
+ Fix mode computation in the case where the directory exists.
+
+ (apply_delayed_symlinks): If we can't make a hard link to a symbolic
+ link, make a copy of the symbolic link.
+
+ * src/incremen.c (get_directory_contents):
+ If ignore_failed_read_option, only warn about
+ stat failures.
+
+ * src/list.c (from_header): Do not issue a diagnostic if TYPE is zero.
+ However, check for error even for '-' or '+' case.
+
+ (print_header): Try parsing uids and gids as unsigned integers first,
+ and as a uid_t or gid_t only if that fails. This adds support for
+ listing positive uids and gids that are greater than UID_MAX and
+ GID_MAX.
+
+ * src/misc.c (link_error): New function.
+
+ * src/names.c (collect_and_sort_names):
+ If ignore_failed_read_option, only warn about
+ stat errors.
+
+ (excluded_name): Now returns bool. Simplify, as the fancy
+ features are now all in excluded_filename.
+
+ * src/rtapelib.c (base_name): Remove decl, as system.h now
+ declares it.
+
+ * src/system.h: Include stddef.h if available.
+ (offsetof): Declare if stddef.h doesn't.
+
+ Include <dirname.h>.
+ (FILESYSTEM_PREFIX_LEN, ISSLASH): Remove; now defined by dirname.h.
+
+ * src/tar.c (ANCHORED_OPTION, IGNORE_CASE_OPTION,
+ NO_ANCHORED_OPTION, NO_IGNORE_CASE_OPTION, NO_WILDCARDS_OPTION,
+ NO_WILDCARDS_MATCH_SLASH_OPTION, WILDCARDS_OPTION,
+ WILDCARDS_MATCH_SLASH_OPTION):
+ New enum values.
+
+ (long_options, usage, decode_options): Add support for --anchored,
+ --ignore-case, --no-anchored, --no-ignore-case, --no-wildcards,
+ --no-wildcards-match-slash, --recursion, --wildcards,
+ --wildcards-match-slash.
+
+ (decode_options): Implement the new way of interpreting exclude
+ patterns.
+
+ (usage): --newer-mtime takes a DATE operand. DATE may be a file name.
+
+ (OPTION_STRING, decode_options): Add -I, -y. Currently these options
+ just print error messages suggesting alternatives.
+
+ (add_filtered_exclude): Remove.
+
+ * tests/Makefile.am (TESTS): Alphabetize, except put version.sh first.
+
+ * tests/extrac04.sh (out): Remove
+ directory/subdirectory/file1, as the new semantics for
+ --exclude exclude it.
+
+ * tests/genfile.c (main): Don't use non-ASCII char in msgid.
+
+2001-08-12 Paul Eggert <eggert@twinsun.com>
+
+ * lib/addext.c (<errno.h>): Include.
+ (errno): Declare if not defined.
+ (addext): Work correctly on the Hurd, where pathconf returns -1 and
+ leaves errno alone, because there is no limit. Also, work even if
+ size_t is narrower than long.
+
+2001-07-08 Paul Eggert <eggert@twinsun.com>
+
+ * lib/alloca.c (alloca): Arg is of type size_t, not unsigned.
+
+2001-05-10 Paul Eggert <eggert@twinsun.com>
+
+ * lib/addext.c (ISSLASH, base_name): Remove decls; now in dirname.h.
+ Include <backupfile.h> and <dirname.h> after size_t is defined.
+ (addext): Use base_len to trim redundant trailing slashes instead of
+ doing it ourselves.
+
+ * lib/backupfile.c (ISSLASH, base_name):
+ Remove decls; now in dirname.h.
+ Include <argmatch.h>, <backupfile.h>, <dirname.h> after size_t
+ is defined.
+ (find_backup_file_name): Rename locals to avoid new functions.
+ Use base_len instead of rolling it ourselves.
+ Work even if dirlen is 0.
+ Use a dir of '.' if given the empty string.
+
+ * lib/basename.c:
+ Do not include <stdio.h>, <assert.h>; no longer needed.
+ (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
+ Include <string.h>, <dirname.h>.
+ (base_name): Allow file names ending in slashes, other than names
+ that are all slashes. In this case, return the basename followed
+ by the slashes.
+
+ * lib/dirname.c: Include <string.h> instead of <stdlib.h>.
+ (FILESYSTEM_PREFIX_LEN, ISSLASH): Remove; now in dirname.h.
+ (dir_len): Renamed from dirlen.
+ All callers changed.
+
+ * lib/dirname.h (DIRECTORY_SEPARATOR, ISSLASH, FILESYSTEM_PREFIX_LEN):
+ New macros.
+ (base_name, base_len, dir_len, strip_trailing_slashes): New decls.
+
+2001-02-16 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (mbrtowc, mbrtowc, mbsinit):
+ Do not declare or define if HAVE_MBRTOWC,
+ since the test for HAVE_MBRTOWC now requires proper declarations.
+
+ * lib/alloca.c (malloc): Undef before defining.
+
+2001-02-13 Paul Eggert <eggert@twinsun.com>
+
+ * src/compare.c (read_and_process): Use off_t for size.
+ From Maciej W. Rozycki.
+
+2001-01-26 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c: Include stddef.h. From Jim Meyering.
+
+2001-01-12 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AC_INIT_AUTOMAKE): Version 1.13.19.
+
+ * lib/savedir.h (savedir): Remove size arg.
+
+ * doc/tar.texi: Add @setchapternewpage odd.
+ Remove -I as an alias for -T, for now.
+ Add @dircategory.
+ Update copyright. Remove "Published by".
+ Dates beginning with / or . are taken to be file names.
+
+ * src/tar.c (<time.h>): Do not include;
+ (time): Do not declare.
+ (usage): Remove -I as an alias for -T.
+ (OPTION_STRING): Remove -I.
+ (decode_options): Dates that look like an absolute path name,
+ or that start with '.', are presumed to be file names whose
+ dates are taken.
+ Remove 'I' as an aliase for 'T'.
+ Update copyright.
+
+ * src/extract.c (<time.h>): Do not include; system.h now does this.
+ (make_directories): Skip filesystem prefixes.
+ Don't assume '/' is the only separator.
+ (extract_sparse_file): Use new full_write semantics.
+ On write error, return instead of invoking skip_file.
+ Do not free sparsearray; caller does this now.
+ (apply_nonancestor_delayed_set_stat): Do not assume '/' is the only
+ separator.
+ (extract_archive): Don't assume file name lengths fit in int.
+ Report what got stripped from member name; it might be more than '/'.
+ Use new full_write semantics.
+ Do not pass redundant trailing "/" to mkdir, as POSIX does not allow
+ mkdir to ignore it.
+ Do not report mkdir error if old_files_option == KEEP_OLD_FILES.
+
+ * src/buffer.c (<time.h>): Do not include; system.h now does this.
+ (time): Remove decl; likewise.
+ (child_open_for_uncompress): Use new full_write semantics.
+ (flush_write): Use ISSLASH instead of testing for '/'.
+ (flush_read): Likewise.
+
+ * src/rmt.h (_remdev): Look for / anywhere in Path.
+
+ * src/misc.c (contains_dot_dot): Skip filesystem prefix.
+ Don't assume '/' is the only separator.
+ (safer_rmdir): Don't assume '/' is the only separator.
+
+ * src/compare.c (diff_archive): Don't assume '/' is the only separator.
+
+ * lib/dirname.h (dirlen): New decl.
+
+ * src/incremen.c (get_directory_contents):
+ Remove path_size arg; all callers changed.
+ Don't assume '/' is the only directory separator.
+ (gnu_restore): Work even if file name length doesn't fit in int.
+
+ * lib/addext.c (ISSLASH): New macro.
+ (addext): Trim any redundant trailing slashes.
+
+ * src/names.c (name_next):
+ Don't assume '/' is the only directory separator.
+ (namelist_match): Likewise.
+ (add_hierarchy_to_namelist): Remove dirsize arg.
+ Do not assume '/' is the only directory separator.
+ (new_name): Likewise.
+
+ * lib/Makefile.am (noinst_HEADERS): Add dirname.h, full-write.h.
+ (libtar_a_SOURCES): Add dirname.c.
+
+ * src/create.c (relativize):
+ New function, with much of old start_header's guts.
+ Handle filesystem prefixes.
+ (start_header): Use this new function.
+ (init_sparsearray): Don't bother to zero out the new array;
+ it's not needed.
+ (deal_with_sparse): Fix array allocation bug.
+ (create_archive): Don't assume '/' is the only separator.
+ (dump_file): Likewise.
+ Don't worry about leading / in symlink targets.
+
+ * lib/savedir.c (savedir):
+ Remove size arg; it wasn't portable. All callers changed.
+
+ * lib/utime.c (utime_null): Adjust to new full_write convention.
+
+ * configure.in (YACC): Avoid portability problem with Ultrix sh.
+
+ * lib/backupfile.c: Include <dirname.h>.
+ (ISSLASH): New macro.
+ (find_backup_file_name): Use dirlen to calculate directory lengths.
+ (max_backup_version): Strip redundant trailing slashes.
+
+ * src/common.h: Include <full-write.h>.
+ (get_directory_contents): No longer has size arg.
+ (gnu_restore): Arg is size_t, not int.
+
+ * src/system.h: Include <time.h>.
+ (time): Declare if not defined.
+
+ * lib/full-write.c: Include full-write.h, not safe-read.h.
+ full_write returns size_t, with short writes meaning failure.
+ All callers changed.
+
+ * src/rtapelib.c: Include full-write.h.
+
+ * src/rmt.c: Include full-write.h.
+ (main): Update copyright.
+
+ * doc/getdate.texi: Mention that only English is supported.
+ Show how to use "date" so that the output is acceptable to getdate.
+ Mention Z as an abbreviation for UTC.
+
+ * lib/full-write.h: New file.
+
+ * src/list.c: system.h now does time.h stuff.
+
+ * lib/dirname.c:
+ Use HAVE_STDLIB_H, not STDC_HEADERS, to decide whether to include
+ stdlib.h.
+ Do not include string.h, strings.h, or assert.h; no longer needed.
+ (strrchr, memrchr, malloc): Remove decls; no longer needed.
+ Include <xalloc.h>.
+ (base_name): New decl.
+ (BACKSLASH_IS_PATH_SEPARATOR): Remove.
+ (dir_name_r): Remove.
+ (dirlen): New function.
+ (dir_name): Use dirlen instead of dir_name_r.
+ (<string.h>, <strings.h>): Include only if test program.
+ (main): Use "return 0", not "exit (0)".
+
+2000-12-08 Paul Eggert <eggert@twinsun.com>
+
+ * lib/dirname.h: New file.
+
+2000-11-02 Vesselin Atanasov <vesselin@bgnet.bg>
+
+ * lib/fnmatch.c: Do not comment out all the code if we are using
+ the GNU C library, because in some cases we are replacing buggy
+ code in the GNU C library itself.
+
+2000-10-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/fnmatch.c (FOLD): Do not assume that characters are unsigned.
+
+2000-10-29 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AC_INIT_AUTOMAKE): Version 1.13.18.
+
+ * src/tar.c: Include <fnmatch.h>, for FNM_LEADING_DIR.
+
+2000-10-28 Paul Eggert <eggert@twinsun.com>
+
+ * doc/tar.texi: --no-recursion now applies to extraction, too.
+ * src/create.c (dump_file): no_recurse_option -> ! recursion_option
+ * src/names.c (namelist_match, excluded_name):
+ Do not match subfiles of a directory
+ if --no-recursion is specified.
+ * src/tar.c (NO_RECURSE_OPTION): Remove.
+ (long_options): Have getopt set the --no-recursion flag.
+ (decode_options): Initialize recursion_option to FNM_LEADING_DIR.
+ Remove case for NO_RECURSE_OPTION.
+ * src/common.h (recursion_option):
+ Renamed from no_recurse_option, with sense
+ negated, and with FNM_LEADING_DIR being the nonzero value.
+
+ * names.c (namelist_match): New function.
+ (name_match, name_scan): Use it to eliminate duplicate code.
+ (names_notfound): Remove special case for Amiga.
+
+2000-10-27 Paul Eggert <eggert@twinsun.com>
+
+ * src/misc.c (read_error_details, read_warn_details,
+ read_fatal_details): Don't assume size_t is unsigned long.
+
+ * src/buffer.c (flush_read): If read_full_records_option, try to
+ fill the input buffer, as --delete -f - needs this.
+
+2000-10-24 Paul Eggert <eggert@twinsun.com>
+
+ * m4/strerror_r.m4 (AC_FUNC_STRERROR_R): Port to autoconf 2.13.
+
+ * src/buffer.c (check_label_pattern):
+ Make sure header name is a string before
+ passing it to fnmatch.
+ (init_volume_number): Check for global_volno overflow.
+ (new_volume): Check for global_volno overflow.
+
+ * src/tar.c (decode_options):
+ Check that volume label is not too long to overflow
+ name in tar header block.
+
+ * Makefile.am (EXTRA_DIST): Remove rebox.el.
+
+ * configure.in (HAVE_DECL_STRERROR_R): Remove our handwritten code.
+ (AC_FUNC_STRERROR_R): Use this instead.
+
+2000-10-23 Paul Eggert <eggert@twinsun.com>
+
+ * src/extract.c: Include <time.h>, since we invoke "time".
+
+ * lib/prepargs.c (prepend_default_options):
+ Don't use NULL, for portability.
+
+ * m4/fnmatch.m4: Add "working" to message.
+
+ * src/names.c: (_GNU_SOURCE): Remove; autoconf now does this.
+ Include <hash.h>.
+ (getpwuid, getgrgid): Declare only if system headers don't.
+ (gid_to_gname): Don't invoke setgrent.
+ (namelist): Now static, not global.
+ (nametail): New var. All uses of namelast changed to use
+ nametail, with one extra level of indirection.
+ (name_gather): Use memcpy instead of strncpy + assignment of NUL.
+ (name_match): Set nametail too, when setting namelist to null.
+ (add_hierarchy_to_namelist): Change type of dir arg from char * to
+ struct name *, so that we don't have to look up the name again
+ here. Get change_dir from dir rather than as a separate arg. Add
+ dirsize arg, and pass it along to get_directory_contents. Remove
+ unnecessary check of directory type.
+ (new_name): Do not append a slash if PATH already ends in one.
+ (avoided_names, struct avoided_name): Remove.
+ (avoided_name_table): New var, replacing avoided_names.
+ (hash_avoided_name, compare_avoided_names): New function.
+ (add_avoided_name, is_avoided_name): Use hash table rather than
+ linked list.
+
+ * src/buffer.c (_GNU_SOURCE): Remove; autoconf now does this.
+ (child_open_for_compress, child_open_for_uncompress,
+ close_archive): Propagate any failure of the compression process
+ back to "tar".
+ (open_archive, flush_write, flush_read, close_archive): Do not
+ allocate an array of size PATH_MAX, as PATH_MAX might be (size_t)
+ -1. Instead, allocate an array with the size that's needed.
+ (open_archive): Don't bother checking S_ISCHR of /dev/null.
+ (backspace_output): Don't try to backspace past start of archive.
+ (close_archive): Remove special case for DELETE_SUBCOMMAND.
+
+ * acconfig.h (_GNU_SOURCE, DEFAULT_ARCHIVE, DEFAULT_BLOCKING,
+ DENSITY_LETTER, DEVICE_PREFIX, EMUL_OPEN3, HAVE_GETGRGID,
+ HAVE_GETPWUID, HAVE_MKNOD, HAVE_RTAPELIB, HAVE_ST_FSTYPE_STRING,
+ HAVE_UNION_WAIT, HAVE_UTIME_H, HAVE_VALLOC, MTIO_CHECK_FIELD, PACKAGE,
+ PROTOTYPES, REMOTE_SHELL, STD_INC_PATH, VERSION, WITH_CATALOGS,
+ WITH_DMALLOC, WITH_REGEX):
+ Remove; now generated automatically.
+
+ * configure.in (_GNU_SOURCE): Define to empty, not 1, for
+ compatibility for glibc fragments.
+ (_GNU_SOURCE, HAVE_UTIME_H, MTIO_CHECK_FIELD,
+ HAVE_ST_FSTYPE_STRING, HAVE_MKNOD, REMOTE_SHELL, DENSITY_LETTER,
+ DEVICE_PREFIX, DEFAULT_ARCHIVE, DEFAULT_BLOCKING): Add comment so
+ that we needn't put an entry into acconfig.h.
+ (ALL_LINGUAS): Add da.
+ (AC_C_BACKSLASH_A): Remove; jm_PREREQ_QUOTEARG now does this.
+ (AC_CHECK_HEADERS): Add stdbool.h (for hash.h users), wctype.h
+ (for strtol.c).
+ (AC_MBSTATE_T): Add.
+ (RMT): Append $(EXEEXT).
+ (HAVE_GETGRGID, HAVE_GETPWUID, pe_AC_TYPE_SIGNED_CHAR): Remove.
+ (HAVE_DECL_FREE, HAVE_DECL_GETGRGID, HAVE_DECL_GETPWUID,
+ HAVE_DECL_GETENV, HAVE_DECL_MALLOC, HAVE_DECL_STRTOUL,
+ HAVE_DECL_STRTOULL, HAVE_DECL_STRERROR_R): New macros.
+ (jm_PREREQ_ADDEXT, jm_PREREQ_ERROR, jm_PREREQ_QUOTEARG): Add.
+ (AC_REPLACE_FUNCS): Remove execlp; no longer needed.
+ (AC_CHECK_FUNCS): Add clock_gettime; AC_SEARCH_LIBS wasn't enough.
+ Remove mbrtowc; jm_PREREQ_QUOTEARG now does this.
+ (EMUL_OPEN3): Remove; no longer needed.
+ (DENSITY_LETTER, DEVICE_PREFIX): Simplify m4 quoting.
+
+ * m4/fnmatch.m4 (AC_FUNC_FNMATCH): Detect d*/*1 vs d/s/1 bug.
+
+ * src/common.h: Do not include basename.h.
+ * src/rtapelib.c (base_name): Do not include basename.h;
+ declare base_name instead.
+
+ * lib/basename.h, lib/execlp.c, lib/getpagesize.h, lib/mkdir.c:
+ Remove these files.
+ * lib/getstr.c, lib/getstr.h, lib/hash.h, lib/hash.h, lib/prepargs.c,
+ lib/prepargs.h, lib/savedir.c, lib/savedir.h: New files.
+ * lib/Makefile.am (EXTRA_DIST, noinst_HEADERS, libtar_a_SOURCES):
+ Adjust to the above changes.
+
+ * lib/Makefile.am (AUTOMAKE_OPTIONS): Remove ../src/ansi2knr.
+
+ * src/open3.c: Remove.
+
+ * src/Makefile.am (AUTOMAKE_OPTIONS): Remove ansi2knr.
+ (tar_SOURCES): Remove open3.c.
+ (INCLUDES): Remove -I.., as automake does that.
+ (OMIT_DEPENDENCIES): ../lib/fnmatch.h -> fnmatch.h. Add localedir.h.
+
+ The following changes are to put LOCALEDIR into localedir.h instead
+ of passing it on the command line.
+ (DEFS): Remove.
+ (DISTCLEANFILES): New macro.
+ (localedir.h): New rule.
+ (rmt.o tar.o): Now depend on localedir.h.
+
+ * tests/delete02.sh, tests/extrac04.sh: New files.
+
+ * tests/Makefile.am (AUTOMAKE_OPTIONS): Remove ansi2knr.
+ (TESTS): Add extrac04.sh, and restore delete02.sh.
+ (DEFS): Remove; LOCALEDIR is now done via localedir.h.
+ (INCLUDES): Remove -I.. as automake does this now.
+
+ * src/rtapelib.c (rexec): Don't declare unless using it.
+ (do_command): Simplify signal-handling code slightly.
+
+ * src/delete.c (blocks_needed): Remove. All uses changed to use
+ blocking_factor - new_blocks.
+ (acting_as_filter): New var.
+ (write_record, delete_archive_members): Use acting_as_filter
+ rather than archive == STDIN_FILENO to detect whether we're acting
+ as a filter, as open can return STDIN_FILENO in some cases.
+ (delete_archive_members): Ignore zero blocks if
+ ignore_zeros_option is nonzero. Fix bug that messed up last
+ output block: write_eot can't be used here, as it gets confused
+ when the input is at end of file.
+
+ * src/compare.c (diff_archive): Do not impose an arbitrary limit on
+ symbolic link contents length. Pass directory size to
+ get_directory_contents.
+
+ * m4/decl.m4, m4/error.m4, m4/mbstate_t.m4, m4/prereq.m4,
+ m4/strerror_r.m4: New files.
+ * m4/signedchar.m4: Remove this file.
+ * Makefile.am (ACINCLUDE_INPUTS): Adjust to above changes.
+ * m4/Makefile.am (EXTRA_DIST): Likewise.
+
+ * Makefile.am (DISTCLEANFILES): Add intl/libintl.h.
+
+ * po/da.po: New translation file.
+
+ * src/mangle.c (extract_mangle):
+ Fix diagnostic with wrong number of %s'es.
+
+ * lib/fnmatch.c (fnmatch):
+ Fix some FNM_FILE_NAME and FNM_LEADING_DIR bugs,
+ e.g. fnmatch("d*/*1", "d/s/1", FNM_FILE_NAME) incorrectly yielded zero.
+
+ * lib/full-write.c (full_write): Some buggy drivers return 0 when you
+ fall off a device's end. Detect this.
+
+ * src/system.h (IN_CTYPE_DOMAIN): Renamed from CTYPE_DOMAIN. All
+ uses changed.
+ (open): Remove macro; we no longer support EMUL_OPEN3. Do not
+ include <pathmax.h> and directory include files like <dirent.h>;
+ no longer used. Include <savedir.h> instead.
+ (closedir, signed_char): remove macro; no longer used.
+ (bool, false, true): Include <stdbool.h> if you have the include
+ file, otherwise define.
+
+ * src/misc.c:
+ (is_dot_or_dotdot, closedir_error, closedir_warn, opendir_error,
+ opendir_warn, readdir_error): Remove; no longer needed.
+ (safer_rmdir): Strip leading ./ (or .// or ./// or ././ or etc.)
+ before deciding whether we're trying to remove ".".
+ (remove_any_file): Try unlink first if we are not root. Use
+ savedir when recursively removing directories, to avoid exhausting
+ file descriptors.
+ (savedir_error, savedir_warn, symlink_error): New functions.
+
+ * src/list.c: (read_and): Do not invoke
+ apply_nonancestor_delayed_set_stat; DO_SOMETHING is now
+ responsible for that. Do not invoke apply_delayed_set_stat; our
+ caller is now responsible for that.
+ (read_header): Use signed char instead of signed_char. Prevent
+ later references to current_header from mistakenly treating it as
+ an old GNU header.
+ (from_header): Quote invalid base-64 strings in diagnostics.
+ (time_from_header): Do not warn about future timestamps in
+ archive; check_time now does that.
+ (print_header): Quote unknown file types.
+ (skip_member): New function, replacing skip_extended_headers and
+ now skipping the whole member instead of just the extended
+ headers. All callers changed. This makes the code handle
+ extended headers uniformly, and fixes some bugs.
+
+ * src/update.c (update_archive): Use skip_member.
+
+ * src/extract.c (we_are_root): Now global.
+ (struct delayed_symlink): New type.
+ (delayed_symlink_head): New var.
+ (extr_init, fatal_exit): Invoke extract_finish on fatal errors,
+ not apply_delayed_set_stat.
+ (set_mode, set_stat): Pointer args are now const pointers.
+ (check_time): New function.
+ (set_stat): Warn if setting a file's timestamp to be the future.
+ (make_directories): Do not save and restore errno.
+ (maybe_recoverable): Set errno to ENOENT if we cannot make missing
+ intermediate directories.
+ (extract_archive): Invoke apply_nonancestor_delayed_set_stat here,
+ not in caller. Extract potentially dangerous symbolic links more
+ carefully, deferring their creation until the end, and using a
+ regular file placeholder in the meantime. Do not remove trailing
+ / and /. from file names. Do not bother checking for ".." when
+ checking whether a directory loops back on itself, as loopbacks
+ can occur with symlinks too. Also, in that case, do not bother
+ saving and restoring errno; just set it to EEXIST.
+ (apply_nonancestor_delayed_set_stat): A prefix is a potential
+ ancestor if it ends in slash too (as well as ending in a char just
+ before slash).
+ (apply_delayed_set_stat): Remove.
+ (apply_delayed_symlinks, extract_finish): New functions.
+
+ * doc/fdl.texi: New file.
+ * doc/Makefile.am (EXTRA_DIST): Add fdl.texi.
+ ($(srcdir)/tar.info): Add fdl.texi. Invoke makeinfo with --no-split.
+ * doc/tar.texi: Add Free Documentation License. New section
+ "Overwrite Old Files", and revamp that section to make it easier to
+ follow. "tar" -> "GNU tar" where appropriate. Migrate getdate
+ documentation into getdate.texi. Fix several minor typos. Describe
+ TAR_OPTIONS. Describe incompatibility between incremental backups and
+ --atime-preserve. Describe incompatibility between --verify and other
+ options. Mention that tar normally removes symbolic links rather than
+ following them, when extracting a file of the same name.
+
+ * THANKS: Add gpoul. Change skip's address.
+
+ * po/POTFILES.in: Add lib/human.c.
+
+ * src/common.h (namelist, namelast): Remove decls.
+ (we_are_root, extract_finish, skip_member, savedir_error,
+ savedir_warn, symlink_error, gnu_list_name): New decls.
+ (apply_delayed_set_stat, apply_nonancestor_delayed_set_stat,
+ skip_extended_headers, is_dot_or_dotdot, closedir_error,
+ closedir_warn, opendir_error, opendir_warn, readdir_error,
+ readdir_warn): Remove decls.
+ (get_directory_contents): New off_t arg.
+ (addname): Now returns struct name *.
+
+ * src/tar.h, tests/genfile.c: Fix comments.
+
+ * src/create.c: Include hash.h.
+ (gnu_list_name): Remove decl.
+ (struct link): Remove "next" member.
+ (linklist): Remove.
+ (start_header): Say "leading `FOO'" rather than "`FOO' prefix" for
+ consistency with other diagnostics.
+ (deal_with_sparse): Check for I/O error when closing the file.
+ (create_archive): Do not allocate an array of size PATH_MAX, as
+ PATH_MAX might be (size_t) -1. Instead, allocate an array with
+ the size that's needed.
+ (hash_link, compare_links): New functions.
+ (dump_file): Do not exhaust open file descriptors when descending
+ deeply into a directory, by using savedir rather than
+ opendir/readdir. Do not zero-fill the name buffer unnecessarily.
+ Hash the set of links already created, instead of using a linked
+ list. Fix some bugs in outputting sparse files which caused the
+ sparse tables to be incorrect. When a file unexpectedly shrinks,
+ output zeros rather than garbage. Do not allocate an array of
+ size PATH_MAX, as PATH_MAX might be (size_t) -1. Instead,
+ allocate an array with the size that's needed.
+
+ * src/incremen.c: Include hash.h.
+ (struct directory): Remove "next", "dir_text". Change "name" to
+ be char[1] with struct hack, not const char *. Add "found".
+ (directory_list): Remove. Replaced by directory_table.
+ (directory_table): New var.
+ (nfs_string): Renamed from nfs.
+ (hash_directory, compare_directories): New functions.
+ (note_directory): Now returns struct directory *. First arg is
+ now const pointer. struct stat arg is now dev_t, ino_t, nfs.
+ Remove text arg. New "found" arg, basically corresponding to the
+ old text arg not being null. All callers changed.
+ (note_directory, find_directory): Use hash table rather than
+ linked list.
+ (get_directory_contents): New arg "device". Use savedir to do the
+ hard work. Save the nfs-ness of stat_data, since it might change
+ under us. Use note_directory instead of find_directory to save
+ some work. When adding an "A" record, do it with
+ add_to_accumulator instead of cheating with strcat.
+ (read_directory_file): Use "+" flag before device to indicate
+ whether it was NFS. Fix typo in checking for strtoul error.
+ (write_directory_file_entry): New function.
+ (write_directory_file): Use it, and use the hash routines to
+ traverse the directory table.
+ (gnu_restore): Use savedir rather than opendir/readdir.
+
+ * src/tar.c: Include localedir.h, prepargs.h.
+ (long_options): Now static.
+ (long_options, usage, decode_options): -j is now short for
+ --bzip2, and -I is now an alias for -T.
+ (decode_options, main): argv is not const pointer now.
+ (decode_options): Invoke prepend_default_options to support
+ TAR_OPTIONS. In diagnostic, mention the string that was the
+ invalid blocking factor, tape length, group, owner, or record
+ size. --delete is no longer incompatible with -f -, undoing
+ 2000-01-07 change.
+ (main): Invoke extract_finish at end of extraction.
+
+ * src/rmt.c: Include localedir.h.
+ (main): Update copyright date to 2000.
+
+ * doc/getdate.texi: New file, taken from fileutils 4.0.27, with the
+ following changes: Use @sc where appropriate. Document the ranges of
+ supported times more precisely. Add Eggert to getdate authors.
+ Document old Latin 12m/12pm tradition. Remove list of alphabetic time
+ zone names, as it wasn't correct and people shouldn't be relying on it
+ anyway. Relative items also account for non-DST adjustments. Fix
+ some misspellings.
+
+ * lib/prepargs.c, lib/prepargs.h, tests/extrac04.sh: New file.
+
+ * tests/ignfail.sh: opendir -> savedir in diagnostics.
+
+ * tests/preset.in: Set LANGUAGE to the empty string, for some
+ brain damaged host.
+
+2000-10-20 Paul Eggert <eggert@twinsun.com>
+
+ * m4/fnmatch.m4: Mention the GNU C library.
+
+2000-10-19 Paul Eggert <eggert@twinsun.com>
+
+ * m4/fnmatch.m4: Add a couple more test cases to catch bugs in
+ glibc 2.1.95.
+
+2000-10-17 Paul Eggert <eggert@twinsun.com>
+
+ * lib/human.c (<limits.h>): Do not include; human.h does it if needed.
+ (CHAR_BIT): Remove.
+
+ * lib/human.h (<limits.h>): Include if HAVE_LIMITS_H.
+ (CHAR_BIT): Define if not defined.
+
+2000-09-09 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c: From fileutils: rename ISASCII to IN_CTYPE_DOMAIN.
+
+2000-08-07 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xmalloc.c: Memory exhausted -> memory exhausted
+
+ * lib/xalloc.h (xalloc_msg_memory_exhausted):
+ change to array from char *.
+
+2000-08-06 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mbstate_t.m4: Define mbstate_t to be int, not char, for
+ compatibility with glibc 2.1.3 strftime.c.
+
+2000-07-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (quotearg_n_options):
+ Don't make the initial slot vector a constant,
+ since it might get modified.
+
+ * lib/quotearg.c: Add support for more than one preallocated slot.
+
+2000-07-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (quotearg_n_options):
+ Preallocate a slot 0 buffer, so that the caller
+ can always quote one small component of a "memory exhausted" message
+ in slot 0.
+
+2000-07-23 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c:
+ Include <wchar.h> even if ! (HAVE_MBRTOWC && 1 < MB_LEN_MAX), so that
+ mbstate_t is always defined.
+
+ Do not inspect MB_LEN_MAX, since it's incorrectly defined to be 1 in
+ some GCC installations, and this configuration error is likely to be
+ common.
+
+2000-07-22 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c:
+ When the system forces us to redefine mbstate_t, shadow its mbsinit
+ function. From Bruno Haible.
+
+2000-07-14 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xmalloc.c: Simplify exhausted message.
+
+ * lib/quotearg.h: Update copyright date; from Jim Meyering.
+
+2000-07-13 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.h (enum quoting style):
+ New constant clocale_quoting_style.
+
+ * lib/quotearg.c:
+ (quoting_style_args, quoting_style_vals, quotearg_buffer_restyled):
+ Add support for clocale_quoting_style, undoing previous change to
+ locale_quoting_style.
+
+2000-07-10 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c:
+ <wchar.h>: Include only if HAVE_MBRTOWC && 1 < MB_LEN_MAX,
+ since otherwise we don't need it.
+ (MB_CUR_MAX): Redefine to 1 if ! (HAVE_MBRTOWC && 1 < MB_LEN_MAX),
+ since we don't do multibytes in that case.
+ (quotearg_buffer_restyled): If a unibyte locale, don't bother to
+ invoke multibyte primitives.
+
+ * m4/mbstate_t.m4 (AC_MBSTATE_T):
+ Renamed from AC_MBSTATE_T_OBJECT. All uses changed.
+ Change from a two-part test, which defines both HAVE_MBSTATE_T_OBJECT
+ and mbstate_t, to a single-part test that simply defines mbstate_t.
+
+ * lib/quotearg.c (mbrtowc): Do not use HAVE_WCHAR_H in the definition.
+ Use defined mbstate_t, not HAVE_MBSTATE_T_OBJECT,
+ to decide whether to define the BeOS workaround macro;
+ this adjusts to the change to AC_MBSTATE_T.
+
+ * m4/strerror_r.m4: New file.
+
+2000-07-05 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c: Use double-quote to quote.
+
+ * lib/quotearg.c (N_): New macro.
+ (gettext_default): New function.
+ (quotearg_buffer_restyled): Use gettext_default ("{LEFT QUOTATION MARK}",
+ "\"") for left quote, and gettext_default ("{RIGHT QUOTATION MARK}", "\"")
+ for right quote.
+
+ * lib/quotearg.c (struct quoting_options):
+ Simplify quote_these_too dimension.
+ From Bruno Haible <haible@clisp.cons.org>.
+
+ * m4/mbstate_t.m4 (AC_MBSTATE_T_OBJECT):
+ Test for mbstate_t only if the test
+ for an object-type mbstate_t fails.
+
+ * lib/quotearg.c (mbrtowc): Declare returned type, since BeOS doesn't.
+
+2000-07-03 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mbstate_t.m4 (AC_MBSTATE_T_OBJECT): Port to autoconf 2.13.
+ Add AC_CHECK_HEADERS(stdlib.h), since we use HAVE_STDLIB_H.
+
+ * lib/quotearg.c (mbrtowc):
+ Assign to *pwc, and return 1 only if result is nonzero.
+ (iswprint): Define to ISPRINT if we are substituting our own mbrtowc.
+
+2000-07-02 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (mbstate_t):
+ Do not define; it should be defined with AC_CHECK_TYPE.
+
+2000-06-26 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mbstate_t.m4: Include stdio.h before wchar.h, to work around
+ a bug in glibc 2.1.3.
+
+ * lib/xmalloc.c: Fix inaccurate comment for xrealloc.
+
+2000-06-19 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (ISASCII): Add #undef and move definition to follow
+ inclusion of wctype.h to work around solaris2.6 namespace pollution.
+ (ISPRINT): Likewise.
+ Reported by Tom Tromey.
+
+2000-06-15 Paul Eggert <eggert@twinsun.com>
+
+ * lib/human.c (adjust_value): New function.
+ (human_readable_inexact): Apply rounding style even when printing
+ approximate values.
+
+ * lib/human.c: Avoid shadowing warnings.
+ From Jim Meyering.
+
+2000-06-14 Paul Eggert <eggert@twinsun.com>
+
+ * lib/human.c (human_readable_inexact): Allow an input block size
+ that is not a multiple of the output block size, and vice versa.
+
+ * lib/getdate.y (get_date): Apply relative times after time zone
+ indicator, not before.
+
+2000-05-31 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4: Rewrite so that we don't need to run getconf,
+ and thus don't need AC_CANONICAL_HOST.
+
+ (AC_SYS_LARGEFILE_FLAGS, AC_SYS_LARGEFILE_SPACE_APPEND): Remove.
+ (AC_SYS_LARGEFILE_TEST_INCLUDES): New macro.
+ (AC_SYS_LARGEFILE_MACRO_VALUE): Change arguments from
+ CODE-TO-SET-DEFAULT to VALUE, INCLUDES, FUNCTION-BODY. All uses
+ changed. Instead of inspecting the output of getconf, try to
+ compile the test program without and with the macro definition.
+ (AC_SYS_LARGEFILE): Do not require AC_CANONICAL_HOST or check for
+ getconf. Instead, check for the needed flags by compiling test
+ programs.
+
+ * configure.in (AC_CANONICAL_HOST): Remove; the largefile stuff no
+ longer needs it.
+ * config.guess, config.sub: Remove these files, for similar reasons.
+
+2000-05-03 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE): Define _XOPEN_SOURCE to be
+ 500, instead of _GNU_SOURCE to be 1, to work around glibc 2.1.3
+ bug. This avoids a clash when files like regex.c that define
+ _GNU_SOURCE.
+
+2000-05-02 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE):
+ Define _GNU_SOURCE if this is needed to make
+ ftello visible (e.g. glibc 2.1.3). Use compile-time test, rather than
+ inspecting host and OS, to decide whether to define _LARGEFILE_SOURCE.
+
+ * lib/quotearg.c (mbrtowc, mbstat_t):
+ Add definitions if !HAVE_MBSTATE_T_OBJECT.
+ (<wctype.h>): Include if HAVE_WCTYPE_H.
+ (iswprint): Define to 1 if we lack it
+
+2000-04-18 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mbstate_t.m4: New file.
+
+2000-04-17 Bruno Haible <haible@clisp.cons.org>
+
+ * tests/ignfail.sh: Test for uid 0 along with user "root".
+
+2000-04-05 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE_FLAGS):
+ Don't use -n32 on IRIX if the installer said
+ otherwise.
+
+2000-02-28 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (ALERT_CHAR): New macro.
+ (quotearg_buffer_restyled): Use it.
+
+2000-02-23 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * src/list.c (tartime): Fix off-by-one error when copying year if
+ OLD_CTIME.
+
+2000-02-18 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getdate.y: Handle two-digit years with leading zeros correctly.
+ (textint): New typedef.
+ (parser_control): Changed from struct parser_control to typedef
+ (for consistency). Member year changed from int to textint. All
+ uses changed.
+ (YYSTYPE): Removed; replaced by %union with int and textint
+ members.
+ (tID): Removed; not used.
+ (tDAY, tDAY_UNIT, tDAYZONE, tHOUR_UNIT, tID, tLOCAL_ZONE,
+ tMERIDIAN, tMINUTE_UNIT, tMONTH, tMONTH_UNIT tSEC_UNIT, tSNUMBER,
+ tUNUMBER, tYEAR_UNIT, tZONE, o_merid): Now of type <intval>.
+ (tSNUMBER, tUNUMBER): Now of type <textintval>.
+ (date, number, to_year): Use width of number in digits, not its
+ value, to determine whether it's a 2-digit year, or a 2-digit
+ time.
+ (yylex): Store number of digits of numeric tokens. Return '?' for
+ unknown identifiers, rather than (unused) tID.
+
+2000-01-16 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (quotearg_buffer_restyled):
+ Do not quote alert, backslash, formfeed,
+ and vertical tab unnecessarily in shell quoting style.
+
+2000-01-15 Paul Eggert <eggert@twinsun.com>
+
+ * m4/c-bs-a.m4:
+ Change quoting to be compatible with future autoconf versions.
+
+2000-01-11 Paul Eggert <eggert@twinsun.com>
+
+ * lib/exclude.c (FILESYSTEM_PREFIX_LEN, ISSLASH): Remove unused macros.
+
+2000-01-07 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AC_INIT_AUTOMAKE): Version 1.13.17.
+
+ Fix bug with fnmatch.h dependency, as follows:
+ * src/Makefile.am (OMIT_DEPENDENCIES): New macro.
+ * lib/Makefile.am (OMIT_DEPENDENCIES): New macro.
+
+ * src/common.h (apply_nonancestor_delayed_set_stat):
+ Renamed from apply_delayed_set_stat.
+ (apply_delayed_set_stat, decode_mode, chmod_error_details,
+ chown_error_details, close_warn, closedir_warn, mkdir_error,
+ read_error_details, read_fatal_details, read_warn_details,
+ seek_error_details, seek_warn_details, utime_error,
+ write_error_details, write_fatal_details): New decls.
+
+ Make diagnostic messages more regular.
+ * src/create.c (dump_file): Quote file names with colons if possible.
+ * src/compare.c (diff_archive): Likewise.
+ * src/extract.c (repair_delayed_set_stat, extract_archive): Likewise.
+ * src/incremen.c (get_directory_contents, gnu_restore): Likewise.
+ * src/mangle.c (extract_mangle): Likewise.
+ * src/misc.c (call_arg_error, call_arg_fatal, call_arg_warn):
+ Likewise.
+ * src/buffer.c (archive_write_error, flush_archive, close_archive,
+ new_volume, xclose):
+ Use error message functions to report errors consistently.
+ * src/compare.c (diff_sparse_files, diff_archive): Likewise.
+ * src/create.c (finish_sparse_file, dump_file): Likewise.
+ * src/extract.c (set_mode, set_stat, extract_sparse_file,
+ extract_archive): Likewise.
+ * src/list.c (list_archive): Likewise.
+ * src/update.c (append_file): Likewise.
+ * src/compare.c (diff_init, diff_sparse_files):
+ Use xalloc_die to report memory exhaustion.
+ * src/incremen.c (gnu_restore): Likewise.
+ * src/list.c (read_header): Likewise.
+ * src/mangle.c (extract_mangle): Likewise.
+ * src/misc.c (maybe_backup_file): Likewise.
+ * src/tar.c (decode_options): Likewise.
+ * src/compare.c (read_and_process, fill_in_sparse_array,
+ diff_sparse_files):
+ Use consistent terminology for unexpected-EOF message.
+ * src/extract.c (extract_sparse_file, extract_archive): Likewise.
+ * src/list.c (list_archive, read_header, skip_file,
+ skip_extended_headers): Likewise.
+ * src/buffer.c (archive_write_error): Add noreturn attribute to decl.
+ (xdup2): Regularize messages with rest of tar.
+
+ * src/buffer.c (flush_read): Don't read past EOF.
+
+ * src/extract.c (extr_init):
+ If we run out of memory, invoke apply_delayed_set_stat.
+ (prepare_to_extract): Don't complain if we can't remove ".".
+ (apply_delayed_set_stat): New function.
+ (apply_nonancestor_delayed_set_stat):
+ Renamed from apply_delayed_set_stat. All uses changed.
+ Don't remove head if it doesn't apply.
+
+ * src/create.c (find_new_file_size):
+ Return size instead of storing through pointer.
+ All callers changed.
+ (deal_with_sparse): Don't keep reading after read errors.
+ (finish_sparse_file): Just abort if there is an internal error.
+ (dump_file): Fix typo: stat_warn and stat_error were interchanged.
+ Don't restore access times on directories during incremental dumps
+ until after dealing with the directory.
+ If ignoring failed reads, count closedir, read, and unknown
+ file errors as warnings, not errors.
+ Fix buffer overrun problem when dumping sparse files.
+
+ * src/list.c (read_and):
+ Invoke apply_nonancestor_delayed_set_stat on file names
+ after handling them.
+ (decode_mode): Remove; moved to misc.c.
+
+ * src/misc.c (safer_rmdir): New function.
+ (remove_any_file): Use it to avoid problems with rmdir(".").
+ (maybe_backup_file): Regularize diagnostics.
+ (undo_backup_file): Likewise.
+ (decode_mode): Moved here from list.c.
+ (chmod_error_details, chown_error_details, close_fatal,
+ close_warn, closedir_warn, mkdir_error, read_error_details,
+ read_warn_details, read_fatal_details, seek_error_details,
+ seek_warn_details, utime_error, write_error_details,
+ write_fatal_details): New functions.
+
+ * src/delete.c (save_record): Remove static variable (now local).
+ (move_archive): Don't position before start of archive.
+ (write_record): Abort if count is zero at inopportune time.
+ Plug memory leak.
+
+ * src/tar.c (decode_options): --delete and -f - are now
+ incompatible, since we didn't have time to fix their bugs.
+
+ * tests/Makefile.am (TESTS): Remove delete02.sh.
+ * tests/ignfail.sh: Adjust to new quoting scheme again.
+
+2000-01-06 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getdate.y: Sync tm_diff with the GNU C Library.
+ (TM_YEAR_BASE): Renamed from TM_YEAR_ORIGIN. All uses changed.
+ (tm_diff): Renamed from difftm. All uses changed.
+ Replace body with that taken from GNU C Library 2.1.3pre1.
+ (get_date): Prefer tm_gmtoff to tm_diff if available.
+
+1999-12-29 "Melissa O'Neill" <oneill@cs.sfu.ca>
+
+ * tests/incremen.sh: Invoke stat on newly created file so that its
+ ctime is updated on Nextstep.
+
+1999-12-21 Machael Stone <mstone@cs.loyola.edu>
+
+ * lib/getdate.y (get_date):
+ Fix typo when checking for time_t overflow in time zone calculations.
+
+1999-12-13 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AC_INIT_AUTOMAKE): Version 1.13.16.
+
+ * README-alpha: New file.
+ * README: New sections for gzip and bzip2, Solaris.
+ Remove mention of BACKLOG.
+
+ * configure.in (AC_C_BACKSLASH_A): Add.
+ (AC_CHECK_HEADERS): Add wchar.h.
+ (AC_CHECK_FUNCS): Add mbrtowc.
+ (AC_FUNC_CLOSEDIR_VOID): Add.
+
+ * tests/Makefile.am (TESTS): Add delete02.sh.
+ (POSTPONED_TESTS): Remove.
+ (EXTRA_DIST): Remove $(POSTPONED_TESTS).
+
+ * tests/preset.in:
+ Set LC_ALL rather than LANGUAGE, LANG, and LC_MESSAGES.
+
+ * tests/ignfail.sh (err): Adjust to new quoting scheme.
+
+ * tests/delete02.sh: Fix typo: need to list archive2, not archive.
+
+ * tests/extrac03.sh: Use -P option, so that .. doesn't get diagnosed.
+
+ * src/tar.c ("quotearg.h"): New include.
+ (usage): Now has __attribute__ ((noreturn)).
+ (confirm): Report errno if we can't open tty.
+ (confirm, decode_options):
+ Quote arbitrary strings in diagnostics.
+ (OVERWRITE_OPTION): New constant.
+ (long_options, usage, decode_options): New --overwrite option.
+ (decode_options): --keep-old-files, --overwrite, and --unlink-first
+ are now mutually exclusive.
+ Don't assume that gettext preserves errno.
+ (main): Set default quoting style to escape_quoting_style.
+
+ * src/update.c (<quotearg.h>): New include.
+ (append_file):
+ Don't assume that gettext preserves errno.
+ Quote arbitrary strings in diagnostics.
+ Check for close error.
+
+ * src/names.c (<quotearg.h>): New include.
+ (name_init, name_next, name_close, names_notfound,
+ collect_and_sort_names): Don't assume that gettext preserves
+ errno. Quote arbitrary strings in diagnostics.
+ (excluded_name): Fix typo that caused empty patterns to be
+ mishandled.
+
+ * src/misc.c (<quotearg.h>): New include.
+ (quote_copy_string): Quote only newline and backslash; the output is no
+ longer meant for humans, and is locale-independent.
+ (contains_dot_dot): New function.
+ (remove_any_file): Don't use lstat; just rmdir the file and then use
+ unlink if the rmdir fails because the file isn't a directory.
+ Check for readdir and closedir errors.
+ (maybe_backup_file): Report "stat" for stat errors.
+ (maybe_backup_file, chdir_do):
+ Quote arbitrary strings in diagnostics.
+ (maybe_backup_file, undo_last_backup):
+ Don't assume that gettext preserves errno.
+ (call_arg_error, call_arg_fatal, call_arg_warn,
+ chdir_fatal, close_error, closedir_error, exec_fatal, mkfifo_error,
+ mknod_error, open_error, open_fatal, open_warn, opendir_error,
+ opendir_warn, read_error, read_fatal, readdir_error, readdir_warn,
+ readlink_error, readlink_warn, seek_error, seek_warn, stat_error,
+ stat_warn, truncate_error, truncate_warn, unlink_error, waitpid_error,
+ write_error, write_fatal, xfork, xpipe, quote_n, quote): New functions.
+
+ * src/system.h (__attribute__): New macro.
+ (O_NDELAY, O_NONBLOCK, O_APPEND): Remove.
+ (S_ISDOOR): New macro.
+ (closedir): New macro, if CLOSEDIR_VOID.
+
+ * src/rmt.c, src/rtapelib.c (decode_oflag):
+ O_APPEND might not be defined.
+
+ * src/list.c: (read_and, list_archive):
+ Quote arbitrary strings in diagnostics.
+ (from_header): Use locale_quoting_style to quote diagnostics.
+ (print_header, print_for_mkdir): Quote with quotearg, not quote_copy_string.
+
+ * src/rmt.h (REM_BIAS): Increase from 128 to (1 << 30).
+
+ * src/Makefile.am: Use ## for copyright comments.
+
+ * src/extract.c (<quotearg.h>): New include.
+ (enum permstatus): New enum.
+ (struct delayed_set_stat): file_name is now at end of buffer, to avoid
+ two mallocs. New members file_name_len, invert_permissions, permstatus.
+ (extr_init): Remove hack that silently adjusted newdir_umask.
+ (set_mode, set_stat): New args invert_permissions, permstatus, typeflag.
+ Use these args to decide whether and how to set modes.
+ (set_mode, set_stat, prepare_to_extract, extract_sparse_file, extract_archive):
+ Don't assume that gettext preserves errno.
+ (set_stat): Remove arg symlink_flag; subsumed by typeflag.
+ (delay_set_stat, repair_delayed_set_stat): New functions.
+ (make_directories): Avoid mkdir where last part of path is "..".
+ Create a struct delayed_set_stat for each directory made.
+ (prepare_to_extract): Renamed from unlink_destination, and
+ return 0 immediately if to_stdout_option; all callers changed.
+ (maybe_recoverable): New parameter interdir_made.
+ Add support for --overwrite.
+ (extract_sparse_file, extract_archive):
+ Quote arbitrary strings in diagnostics.
+ (extract_archive): By default, warn about ".." in member names, and skip them.
+ Don't open files with O_NONBLOCK or O_APPEND.
+ Open with O_TRUNC only if --overwrite; otherwise, use O_EXCL to avoid
+ overwriting them. Pass only rwxrwxrwx permissions to `open' and `mkdir',
+ minus the current umask. Keep track of intermediate directories made,
+ to avoid looping when making x/../x when x doesn't exist; the
+ earlier code solved this in a different way that didn't fit well
+ into the new scheme. Don't extract permissions onto existing
+ directories unless --overwrite is given. Do not add -wx------
+ permissions to new directories permanently; just do it temporarily.
+ Remove no-longer-needed hack with MSDOS and directory time stamps.
+ (apply_delayed_set_stat): New argument specifies which directories to
+ fix statuses of. Do not wait until the end of extraction to fix
+ statuses; instead, fix a directory's status once we exit that directory.
+ This requires less memory and does the right thing in some cases
+ where the old method didn't.
+ (fatal_exit): New function.
+
+ * src/incremen.c (<quotearg.h>): New include.
+ (get_directory_contents, gnu_restore):
+ Check for readdir and closedir errors.
+ (get_directory_contents, read_directory_file, gnu_restore):
+ Quote arbitrary strings in diagnostics.
+ (get_directory_contents, read_directory_file, write_directory_file):
+ Don't assume that gettext preserves errno.
+
+ * src/create.c (<quotearg.h>): New include.
+ (start_header): Use `member names' to refer to archive member names, not
+ `archive names'. Warn about `..' in member names.
+ (finish_sparse_file, dump_file):
+ Quote arbitrary strings in diagnostics.
+ (finish_sparse_file, dump_file):
+ Don't assume that gettext preserves errno.
+ (dump_file): Don't use `access' to determine whether a directory is readable;
+ this isn't reliable if tar is setuid. Use `opendir' instead.
+ Check for readdir and closedir failures.
+ Don't dump sockets as if they were fifos; just warn and skip.
+
+ * src/delete.c (move_archive):
+ Don't report fatal error merely because sizes don't fit
+ into struct mtop values; fall back on lseek instead.
+ Say `Cannot' uniformly, instead of `Could not' sometimes and `Cannot' others.
+ Say `reposition' instead of `re-position'.
+ (delete_archive_members):
+ Set archive to STDOUT_FILENO before outputting trailing buffer.
+
+ * src/compare.c (<quotearg.h>): New include.
+ (diff_init): Use `Cannot' uniformly, instead of `Could not' sometimes
+ and `Cannot' others.
+ (report_difference, diff_archive):
+ Quote arbitrary strings in diagnostics.
+ (process_rawdata, diff_sparse_files, get_stat_data, diff_archive, seek_warn):
+ Don't assume that gettext preserves errno.
+ (diff_archive): Don't open regular files with O_NONBLOCK.
+ Preserve access times of files if --atime.
+
+ * src/common.h (FATAL_ERROR): Use new fatal_exit function to exit.
+ (FATAL_ERROR, USAGE): Don't return 0.
+ (enum old files): New enum.
+ (old_files_option): New variable, replacing keep_old_files_option and
+ unlink_first_option.
+ (apply_delayed_set_stat): Now takes char const * param.
+ (fatal_exit, contains_dot_dot, chdir_fatal, close_error,
+ closedir_error, exec_fatal, mkfifo_error, mknod_error, open_error,
+ open_fatal, open_warn, opendir_error, opendir_warn, read_error,
+ read_fatal, readdir_error, readdir_warn, readlink_error,
+ readlink_warn, seek_error, seek_warn, stat_error, stat_warn,
+ truncate_error, truncate_warn, unlink_error, waitpid_error,
+ write_error, write_fatal, xfork, xpipe, quote, quote_n): New decls.
+
+ * src/buffer.c:
+ (xclose, xdup2, child_open_for_compress, child_open_for_uncompress,
+ archive_write_error, archive_read_error, flush_archive, close_archive,
+ init_volume_number, new_volume):
+ Don't assume that gettext preserves errno.
+
+ (xdup2): Don't report errno if dup returns an unexpected nonnegative value.
+ (open_archive): Reject multivolume verify attempts a bit earlier.
+ Rename local variable `access', in case it's defined by system header.
+
+ (open_archive, backspace_output): Use `Cannot' uniformly, instead of
+ `Could not' sometimes and `Cannot' others.
+
+ (open_archive, flush_read, flush_archive, close_archive, new_volume):
+ Quote arbitrary strings in diagnostics.
+
+ (read_error): Set archive to STDOUT_FILENO temporarily when writing
+ archive buffer.
+
+ (init_volume_number): Check for input and output errors in volno_file.
+
+ (new_volume): Use new fatal_exit function to exit, and new xfork
+ function to fork.
+
+ * m4/Makefile.am (EXTRA_DIST): Add c-bs-a.m4.
+
+ * Makefile.am (ACINCLUDE_INPUTS): Add $(M4DIR)/c-bs-a.m4.
+
+ * doc/tar.texi: Add --overwrite.
+ --absolute-names rejects ".." in names.
+
+ * lib/quotearg.c: Add support for multibyte characters.
+ (ISGRAPH): Remove.
+ (ISPRINT): New macro.
+ (<wchar.h>): Include if HAVE_MBRTOWC && HAVE_WCHAR_H.
+ (isprint, mbrtowc, mbsinit, mbstate_t): New macros,
+ defined if ! (HAVE_MBRTOWC && HAVE_WCHAR_H).
+ (quotearg_buffer_restyled): New function, with most of the old
+ quotearg_buffer's contents.
+ Major rewrite to support multibyte characters.
+ (quotearg_buffer): Now just calls quotearg_buffer_restyled.
+
+ * m4/c-bs-a.m4: New file.
+
+ * lib/Makefile.am: Use ## for copyright notice.
+
+ * scripts/Makefile.am: Use ## on copyright notice.
+
+ * doc/Makefile.am:
+ ($(srcdir)/tar.info, tar.dvi): We now use texinfo 4.0.
+
+1999-12-05 Paul Eggert <eggert@twinsun.com>
+
+ * doc/ChangeLog, lib/ChangeLog, scripts/ChangeLog,
+ src/ChangeLog, tests/ChangeLog: Remove these files.
+ * ChangeLog.1: New file, incorporating the above files, plus old
+ ChangeLog entries.
+ * Makefile.am (EXTRA_DIST): Add ChangeLog.1.
+
+1999-12-05 Dale Worley <worley@ariadne.com>
+
+ * src/compare.c (<utime.h>, struct utimbuf): Add.
+ (diff_archive): Restore access times if --atime.
+ * doc/tar.texi: Explain that --atime also preserves modification time.
+
+1999-12-04 Gerhard Poul <gpoul@gnu.org>
+
+ * ABOUT-NLS: Update to latest version from ftp.gnu.org.
+ * BACKLOG, TODO: Remove.
+ * Makefile.am (all-local, BABYL, dist-zoo, id, ID): Remove.
+ * README: Bring up to date.
+
+1999-12-03 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13.15.
+
+ * src/compare.c (diff_archive):
+ Do not set errno to EPIPE; we no longer use perror.
+
+ * src/create.c (dump_file):
+ If a parent directory said that a file should be there but it is
+ absent, diagnose it as being removed in the meantime.
+ Do not pass meaningless errno to ERROR when reporting that the
+ file changed as we read it.
+ Report that a file changed if its ctime changes; this is more
+ sensitive than mtime+size, and more accurate.
+
+ * src/incremen.c (enum children): New type.
+ (struct directory): Change old char allnew member to new enum children
+ children member.
+ All uses changed.
+ (get_directory_contents): When doing an incremental dump that does
+ not cross filesystem boundaries, dump the mount points, even though
+ they are in a different filesystem. This is for convenience when
+ restoring, and for consistency with non-incremental dumps.
+ This requires a 3-way flag for keeping track of which children we want,
+ so we use enum children rather than boolean.
+
+ * src/open3.c (modes): Remove.
+ (open3): Remove unportable assumptions about flag encodings.
+ Use `stat' instead of `access' for testing file existence,
+ to avoid problems with setuid programs.
+
+ * src/names.c (name_next): If file names are given both in the
+ command line (e.g. via -C) and in a file (via -T), do not
+ ignore the command-line names.
+
+ * m4/uintmax_t.m4: Backport to autoconf 2.13.
+
+ * doc/tar.texi: Clarify getdate authorship.
+
+1999-11-23 Paul Eggert <eggert@twinsun.com>
+
+ * lib/Makefile.am (DISTCLEANFILES): New macro.
+
+ * configure.in (tar_fnmatch_hin):
+ Remove; it runs afoul of a bug in autoconf 2.13.
+ Instead, always link fnmatch.h to some file, even if it's a throwaway.
+
+1999-11-19 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4: Update serial.
+
+1999-11-18 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE_FLAGS): Work around a bug in
+ the QNX shell, which doesn't propagate exit status of failed
+ commands inside shell assignments.
+
+1999-11-07 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13.14.
+
+ * configure.in (AC_PREREQ): Bump to 2.13.
+ (ALL_LINGUAS): Add pt_BR, ja.
+ (AC_FUNC_FNMATCH): Remove lib/funmatch.h before invoking, not after.
+ (tar_cv_path_RSH): Prefer a non-symlink rsh to a symlink one,
+ for AIX crossbuilds.
+
+ * doc/tar.texi: New node create options for --ignore-failed-read.
+ Remove unused version control symbols.
+ Modernize texinfo usage.
+
+ * src/tar.c (usage): Add examples.
+
+ * m4/fnmatch.m4 (AC_FUNC_FNMATCH):
+ Include fnmatch.h when testing fnmatch.
+
+ * src/common.h (collect_and_sort_names): New decl.
+
+ * src/list.c (from_header):
+ Handle 32-bit two's complement negative time stamps
+ even if the leading octal digit is 2 or 3.
+
+ * src/extract.c (set_stat): Remove duplicate code.
+
+ * src/create.c (to_chars): Remove trailing newline from warning.
+ (dump_file): Ignore doors.
+ (finish_header): Report block numbers with origin 0, not origin 1.
+
+ * src/rmt.c: Include getopt.h.
+ (long_opts): New constant.
+ (usage): New function.
+ (main): Implement --help and --version.
+ Output usage message if arguments are bad.
+
+1999-10-10 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13.13.
+
+ * README: Remove --with-dmalloc.
+ Add --disable-largefile.
+ Remove old NeXT dirent problems, or AIX valloc problems.
+ Remove old union wait advice, and old %lld advice.
+ Remove advice about FreeBSD 2.1.7, ISC 4.1mu, Ultrix `make'.
+
+ * doc/tar.texi: Clarify documentation for portable file names.
+
+ * configure.in (AM_WITH_DMALLOC): Remove.
+ (ALL_LINGUAS): Add ja.
+
+ * src/tar.c (decode_options):
+ Invalid dates are now treated as (time_t) -1.
+ Redo version message to conform to GNU standards.
+
+ * src/create.c (dump_file):
+ Fix typo: last two args to dump_file were interchanged.
+ * src/update.c (update_archive): Likewise.
+
+ * src/common.h (tartime): New decl.
+
+ * src/list.c (tartime): Now extern.
+ (read_and): Invalid headers cause errors, not warnings.
+
+1999-10-03 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getdate.y (__attribute__):
+ Don't use if GCC claims to be before 2.8; this is
+ needed for OPENStep 4.2 cc. Also, don't use if strict ANSI.
+
+1999-09-25 Paul Eggert <eggert@twinsun.com>
+
+ * lib/fnmatch.c, lib/fnmatch.hin: Merge changes from latest glibc.
+ * lib/getopt.c, lib/getopt.h, lib/getopt1.c: Likewise.
+
+ * tests/incremen.sh: Add yet another sleep.
+
+1999-09-24 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS: A read error now causes a nonzero exit status.
+
+ * src/create.c (to_chars): Fix base-256 output.
+
+ * src/buffer.c (write_error):
+ Read error is an error, not just a warning.
+
+1999-09-24 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13.12.
+
+ * src/tar.c (<time.h>): Include.
+ (time): Declare if not defined.
+ (confirm): Don't read past EOF.
+ (long_options, usage): Add --no-same-owner, --no-same-permissions.
+ (main): Use clock_gettime if available.
+
+ * tests/Makefile.am (TESTS): Add incremen.sh
+ (INCLUDES): Add -I../lib, for fnmatch.h.
+
+ * src/update.c (update_archive):
+ Remove call to name_expand; had no effect.
+ Use chdir_do to change into directory.
+ Use deref_stat instead of stat.
+ Use add_avoided_name to mark names to be avoided; the old method of
+ setting a bit with the name caused all descendants of that name to
+ be avoided, in some circumstances.
+
+ * tests/incremen.sh: Remove unnecessary sleeps.
+
+ * src/names.c (name_next): Go back to using plain chdir.
+ (name_gather): Use chdir_arg to keep track of arguments to chdir.
+ (addname): Likewise.
+ (name_match): Use chdir_do to act on chdir args.
+ (merge_sort): Moved here from incremen.c.
+ (compare_names, add_hierarchy_to_namelist, collect_and_sort_names):
+ Likewise.
+ (name_expand): Remove.
+ (name_from_list): Skip fake names.
+ Use chdir_do to act on chdir args.
+ (struct avoided_name): New struct.
+ (avoided_names): New var.
+ (add_avoided_name, is_avoided_name): New functions.
+
+ * src/system.h (stat, lstat): Define in terms of statx on
+ STX_HIDDEN && !_LARGE_FILES /* AIX */ hosts.
+ (UCHAR_MAX): New macro.
+ (TYPE_MAXIMUM): Cast to arg type, for types narrow than int.
+
+ * m4/largefile.m4: Work around GCC 2.95.1 bug with HP-UX 10.20.
+
+ * src/incremen.c (<time.h>): Remove include; no longer used.
+ (time): Remove decl.
+ (time_now): Remove.
+ (get_directory_contents): Use deref_stat.
+ Consider a subdirectory to be all new only if
+ listed_incremental_option or if it its timestamp is newer than the
+ cutoff.
+ (add_hierarchy_to_namelist, merge_sort): Move to names.c.
+ (read_directory_file): Now extern. Do not set time_now.
+ (write_directory_file): Renamed from write_dir_file.
+ Use start_time instead of time_now.
+ (compare_names, collect_and_sort_names): Move to names.c.
+
+ * src/mangle.c (<time.h>): Remove; not used.
+ (time): Do not declare.
+
+ * src/misc.c (chdir_from_initial_wd): Remove.
+ (deref_stat): New function.
+ (struct wd): New struct.
+ (wd, wds, wd_alloc): New variables.
+ (chdir_arg, chdir_do): New function.
+
+ * src/compare.c (get_stat_data): Use deref_stat.
+
+ * src/common.h (name_expand): Remove.
+
+ * src/list.c (time): Declare if not defined.
+ (base_64_digits): Moved here from create.c.
+ (base64_map): Use UCHAR_MAX for size, not less-clear (unsigned char)
+ -1.
+ (read_and): Don't get time from header unless we need it now;
+ as getting time can cause duplicate diagnostics if bogus.
+ Remove "Hmm, " from diagnostic.
+ Use "Skipping to next header" uniformly.
+ (from_header): Renamed from from_chars. All uses changed.
+ Allow different forms for unportable 2's complement numbers.
+ Don't check for extended forms when parsing checksums.
+ Parse base-256 output.
+ (gid_from_header): Renamed from gid_from_chars. All uses changed.
+ (major_from_header): Renamed from major_from_chars. All uses changed.
+ (minor_from_header): Renamed from minor_from_chars. All uses changed.
+ (mode_from_header): Renamed from mode_from_chars. All uses changed.
+ (off_from_header): Renamed from off_from_chars. All uses changed.
+ (size_from_header): Renamed from size_from_chars. All uses changed.
+ (time_from_header): Renamed from time_from_chars. All uses changed.
+ Warn about future timestamps.
+ (uid_from_header): Renamed from uid_from_chars. All uses changed.
+ (uintmax_from_header): Renamed from uintmax_from_chars.
+ All uses changed.
+ (tartime): New function, incorporating isotime.
+ (isotime): Delete.
+ (print_header): Use tartime.
+
+ * src/create.c (to_chars): Fix typo in decl.
+ Don't assign through char const *.
+ Rename name_expand back to collect_and_sort_names.
+
+ * src/extract.c (<time.h>): No need to include.
+ (time): No need to declare.
+ (now): Remove variable.
+ (extr_init): Don't initialize `now'.
+ Increment same_permissions_option and same_owner_option if we_are_root
+ is nonzero; this supports the new --no-same-owner option.
+ (set_stat): Use start_time instead of `now'.
+
+ * src/create.c (struct link): Remove unused linkcount member.
+ (base_64_digits): Move to list.c.
+ (base_8_digits): Remove.
+ (to_octal): New function, with some of old contents of to_base.
+ (to_base): Remove.
+ (to_base256): New function.
+ (to_chars): Use base 256, not base 64, for huge values.
+ (mode_to_chars): Don't use two's complement in GNU format or POSIX
+ format.
+ (dump_file): Interchange last two arguments. If TOP_LEVEL is negative,
+ it means we have an incremental dump where we don't know whether this
+ is a top-level call.
+ Use deref_stat instead of statx / stat / lstat.
+ Cast result of alloca.
+ Check for dates if 0 < top_level, not if listed_incremental_option.
+ Move multiple-link check after directory check.
+ Do not dump avoided names.
+ Dump hard links to symbolic names as links, not as separate
+ symbolic links.
+ start_header cannot return a null pointer, so don't test for it.
+ Likewise for find_next_block.
+
+ * src/buffer.c, src/common.h (<human.h>): Include.
+ (read_error): Read error is an error, not just a warning.
+ (print_total_written): Also print human-readable byte count, and
+ bytes/s.
+ (open_archive, flush_write): Use start_time, not current time.
+ (flush_read): Report about garbage bytes ignored at end of archive,
+ but act on non-garbage bytes (instead of ignoring them).
+ (new_volume): Use WARN for warnings.
+
+ * doc/Makefile.am:
+ ($(srcdir)/tar.info): Add -I$(srcdir) so that subdir builds work.
+
+ * Makefile.am (ACINCLUDE_INPUTS): Add $(M4DIR)/fnmatch.m4.
+
+ * m4/Makefile.am (EXTRA_DIST): Add fnmatch.m4.
+
+ * lib/Makefile.am (noinst_HEADERS):
+ Rename fnmatch.h to fnmatch.hin; add human.h.
+ (libtar_a_SOURCES): Add human.c, xstrtoul.c.
+ (INCLUDES): Remove -I.. -I$(srcdir) -- automake adds this for us.
+
+ * src/Makefile.am (rmt_LDADD, tar_LDADD): New macros.
+
+ * lib/fnmatch.c (strchrnul):
+ Define to __strchrnul if _LIBC, to our own replacement otherwise.
+ Do not define if !_LIBC and if it already exists.
+ (internal_fnmatch): Use it.
+
+ * configure.in (tar_LDADD): New variable, used only when linking tar.
+ (rmt_LDADD): Similarly, for rmt.
+ (AC_FUNC_FNMATCH): Link fnnmatch.hin to fnmatch.h if we're using our
+ fnmatch.c; otherwise, use the system fnmatch.h.
+
+ * doc/tar.texi: Add --no-same-owner, --no-same-permissions.
+ Modernize sample backup script.
+
+ * THANKS: Martin Goik's email address has changed.
+
+ * m4/fnmatch.m4: New file.
+
+1999-09-03 Paul Eggert <eggert@twinsun.com>
+
+ * lib/lchown.h (ENOSYS): Don't use ENOMSG; it's not in NeXTStep3.3.
+ Use EINVAL instead.
+
+1999-08-29 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getdate.y (get_date):
+ Rename outermost local `probe' to `quarter'.
+ Rename latter local `tm' to probe_tm.
+ From: Jim Meyering <meyering@ascend.com>
+ Message-ID: <uryn1vafyyc.fsf@ixi.eng.ascend.com>
+
+1999-08-28 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getdate.y (PC): New macro; use it when possible.
+ (number): Handle `Nov 11 1996' example correctly.
+ See Risks Digest 20.55 (1999-08-27)
+ http://catless.ncl.ac.uk/Risks/20.55.html#subj18
+
+1999-08-23 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13.11.
+
+ Remove minor cases of lint from many source files: this includes
+ unnecessary casts, uses of NULL, etc.
+
+ * configure.in (AC_PROG_YACC): Remove.
+ (YACC): Always use bison.
+ (AC_STRUCT_TIMEZONE): Add.
+ (AC_REPLACE_FUNCS): Add strcasecmp, strncasecmp.
+
+ * doc/tar.texi: --bzip2 is now -I. Remove obsolete time zone info.
+ Fix spelling.
+
+ * lib/Makefile.am (EXTRA_DIST): Add strcasecmp.c, strncasecmp.c.
+ ($(srcdir)/getdate.c): Rename y.tab.c to getdate.c only if successful.
+
+ * lib/strcasecmp.c, lib/strncasecmp.c: New files.
+
+ * src/common.h (merge_sort): Remove decl; no longer exported.
+
+ * src/system.h (voidstar): Remove.
+ (memcpy, memcmp): Cast args.
+ ("xalloc.h"): Add include.
+ (xmalloc, xrealloc): Remove decl.
+
+ * src/mangle.c (time): Do not declare if defined.
+ (first_mangle, mangled_num): Remove.
+
+ * src/list.c (from_chars): Report out-of-range values more precisely.
+ (off_from_chars): Do not allow negative offsets.
+ (uid_from_chars): Allow negative uids.
+
+ * src/create.c (linklist): Now static.
+ (to_chars): Fix wording of message to match from_chars.
+
+ * src/misc.c (merge_sort): Move to incremen.c.
+ * src/incremen.c (merge_sort): Move here from misc.c; now static.
+ It's too painful to make it both generic and portable.
+ (read_directory_file): "timestamp" -> "time stamp" in messages.
+
+ * src/tar.c (long_options, usage, main): -y is now -I (for --bzip).
+ (usage): Fix misspelling.
+ (OPTION_STRING): -y is now -I.
+ (decode_options): Use -1, not EOF, for getopt_long result.
+ Fix typo when invoking xstrtoumax: look for LONGINT_OK, not LONG_MAX.
+ Handle operands after any "--" argument.
+ (main): Report any output errors.
+
+ * src/rmt.c (main): status is ssize_t, not long.
+
+ * src/names.c (name_gather): Handle trailing -C option correctly.
+ (addname): use memcpy, not strncpy, to copy a string of known length.
+ (name_match): Handle trailing -C option correctly.
+ Propagate -C option to following files.
+ (name_match, name_scan): Remove redundant matching code.
+
+ * src/buffer.c (open_archive): Use American spelling in diagnostic.
+
+ * lib/getdate.y: Major rewrite. Add copyright notice.
+ (<stdio.h>): Include only if testing.
+ (ISUPPER): Remove.
+ (ISLOWER): New macro.
+ (<string.h>): Include if HAVE_STRING_H, not USG.
+ (bcopy): Remove.
+ (yymaxdepth, ..., yycheck): Don't bother to redefine, since we assume
+ bison.
+ (EPOCH_YEAR): Renamed from EPOCH.
+ (table): Renamed from TABLE.
+ (meridian): Now an anonymous enum.
+ (struct parser_control): New type.
+ (YYLEX_PARAM, YYPARSE_PARAM, YYSTYPE): New macros.
+ (yyInput, ..., yyRelYear): Migrated into struct parser_control.
+ (%pure_parser): Added, so that the parser is pure.
+ (%union): Removed; the type is now just plain int.
+ All %type directives removed.
+ (tLOCAL_ZONE): New %token.
+ (month_day_table): Renamed from MonthDayTable.
+ (gmtime, localtime, mktime, time): Declare only if not defined.
+ (meridian_table): New table.
+ (dst_table): New table.
+ (units_table): renamed from UnitsTable.
+ (relative_time_table): Renamed from OtherTable.
+ (time_zone_table): Renamed from TimezoneTable. Modernized.
+ (military_table): Renamed from MilitaryTable.
+ (to_hour): Renamed from ToHour.
+ (to_year): Renamed from ToYear.
+ (lookup_zone): New function.
+ (LookupWord): Renamed from lookup_word. Use lookup_zone for time
+ zones.
+ (yylex): Now reentrant. All callers changed.
+ (get_date): Add support for local time zone abbreviations.
+ Make it reentrant.
+
+1999-08-20 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13.10.
+
+ * src/create.c (to_chars): Generate GNU base-64 representation
+ if we are generating an old or new GNU format tar file for a
+ number that can't be represented with the POSIX format.
+
+ * configure.in (AC_CHECK_FUNCS): Add fchdir.
+ (AM_FUNC_GETLINE): Add.
+ (LIBOBJS): Add getline.o to workaround comment.
+ * Makefile.am (ACINCLUDE_INPUTS): Add $(M4DIR)/getline.m4.
+ * m4/Makefile.am (EXTRA_DIST): Add getline.m4.
+ * lib/Makefile.am (noinst_HEADERS): Add getline.h, save-cwd.h.
+ (libtar_a_SOURCES): Add save-cwd.c, xgetcwd.c.
+ * lib/getline.c, lib/getline.h, lib/save-cwd.c,
+ lib/save-cwd.h, m4/getline.m4: New files.
+
+ * src/misc.c (<save-cwd.h>): Include.
+ (chdir_from_initial_wd): New function.
+
+ * src/names.c (name_next): Use chdir_from_initial_wd, not chdir.
+ (name_gather): Handle `-C x -C y' correctly.
+ Do not rely on addname to handle -C.
+ (addname): New CHANGE_DIR parameter. All callers changed.
+ Remove ugly calls to getcwd; no longer needed.
+ (name_match, name_from_list): Use chdir_from_initial_wd, not chdir.
+
+ * src/incremen.c (listed_incremental_stream): New var.
+ (read_directory_file): Remove arbitrary limits on file name length.
+ Do not attempt to get the working directory; we can bypass this
+ on fchdir hosts. Open the listed_incremental_option file for both
+ read and write instead of opening it twice. Check for I/O errors
+ when doing I/O to this file. Check for invalid data in the file,
+ and report line numbers of invalid data.
+ (write_dir_file): Likewise.
+ (collect_and_sort_names): Use chdir_from_initial_wd, not chdir.
+ Do not invoke write_dir_file; that's our caller's responsibility.
+
+ * src/list.c (max): New macro.
+ (isotime): Now takes time_t, not time_t *. Report the decimal values
+ of times that can't be broken down.
+ (print_header): Don't assume that major and minor device numbers can
+ fit into uintmax_t.
+
+ * src/common.h (struct name): change_dir is now char const *.
+ (write_directory_file): Remove unused decl.
+ (STRINGIFY_BIGINT): Assume b always points to UINTMAX_STRSIZE_BOUND
+ chars; the old `sizeof (b)' broke when b was a pointer not an array.
+ (chdir_from_initial_wd): New decl.
+ (addname): New 2nd arg.
+
+ * THANKS: Torsten Lull -> Catrin Urbanneck
+
+1999-08-18 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (HAVE_GETHOSTENT, HAVE_SETSOCKOPT):
+ Don't depend on ac_cv_func variables.
+ From Albert Chin-A-Young <china@thewrittenword.com>.
+
+1999-08-18 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13.9
+
+ * m4/signedchar.m4: New file.
+ * configure.in (pe_AC_TYPE_SIGNED_CHAR): Add.
+ * src/system.h (signed_char): New macro.
+ * Makefile.am (ACINCLUDE_INPUTS): Add $(M4DIR)/signedchar.m4.
+ * m4/Makefile.am (EXTRA_DIST): Add signedchar.m4.
+
+ * src/create.c (write_eot): Write at least two zero blocks.
+
+ * src/extract.c (extract_archive): Fix sparse array bug:
+ we did not find end of array correctly.
+
+ * src/compare.c: (fill_in_sparse_array, diff_sparse_files):
+ Don't assume find_next_block yields nonnull.
+ * src/extract.c (extract_sparse_file, extract_archive): Likewise.
+ * src/list.c (skip_extended_headers): Likewise.
+
+ * src/list.c (read_and, list_archive): Simplify code.
+ (read_header): Fix computation of signed checksums on machines where
+ char is unsigned.
+ Do not consider a block to be zero unless all its bytes are zero,
+ even the checksum bytes. Do not attempt to parse the checksum of
+ a zero block. Fix memory leak with long names and links.
+ (from_chars): Accommodate a buggy tar that outputs leading NUL
+ if the previous field overflows.
+
+ * src/misc.c (quote_copy_string): Generate \177 for '\177', not
+ \?, for portability to non-ASCII hosts.
+
+1999-08-16 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (AM_INIT_AUTOMAKE), NEWS: Version 1.13.8.
+
+ * src/extract.c (make_directories): Do not chown intermediate
+ directories, even if we are root.
+
+ * src/list.c (read_header): Fix bugs when interpreting
+ POSIX-compliant headers that do not contain null bytes in the
+ header or link names.
+
+1999-08-14 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (AM_INIT_AUTOMAKE), NEWS: Version 1.13.7.
+
+ * configure.in (AC_CHECK_HEADERS): Remove sys/wait.h.
+ (AC_HEADER_SYS_WAIT): Add.
+ (AC_REPLACE_FUNCS): Add waitpid.
+ (tar_cv_header_union_wait, HAVE_UNION_WAIT): Remove.
+ * lib/waitpid.c: New file.
+ * lib/Makefile.am (EXTRA_DIST): Add waitpid.c.
+ * src/system.h (WCOREDUMP): Remove; no longer used.
+ (WIFSTOPPED): Likewise.
+ (WEXITSTATUS, WIFSIGNALED): Default to Solaris 7 versions.
+ * src/buffer.c (child_open_for_compress): Undo previous change.
+ (close_archive): Use waitpid, POSIX-style, instead of old BSD style.
+ (new_volume): Likewise.
+
+ * src/buffer.c, src/extract.c, src/incremen.c (time):
+ Don't declare if defined.
+ * src/extract.c (extr_init): Remove unneeded cast around 0 arg to time.
+ * src/incremen.c (read_directory_file):
+ Invoke `time' the same way everyone else does.
+ Check validity of --listed-incremental file contents a bit better.
+ Do not worry about --after-date-option; tar.c now checks this.
+ * src/list.c (isotime): Report ??? if localtime returns null.
+ Don't assume years fit into four digits.
+ Don't append trailing newline.
+ (print_header): Report ??? if localtime returns null;
+ Don't assume years fit into four digits.
+
+ * src/compare.c (diff_archive): Do not fall back on absolute name
+ when --absolute-names is not specified.
+
+ * src/create.c (start_header):
+ Include text of ignored filesystem prefix in warning.
+ (create_archive): Check for excluded names when doing incremental
+ pass through directory.
+ (dump_file): Do not dump old files explicitly given on command line
+ when using --listed-incremental. Do not strip ./ prefix from names.
+
+ * src/tar.c: -g now implies after_date_option = 1.
+ -g and -N are now incompatible options.
+
+ * doc/tar.texi: Explain --exclude better. Don't strip leading `./'.
+
+1999-08-11 Jeff Dairiki <dairiki@dairiki.org>
+
+ * src/list.c (read_header): Don't parse OLDGNU_FORMAT
+ incremental headers as POSIX prefixes.
+
+1999-08-11 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in: Version 1.13.6.
+
+ * configure.in (ALL_LINGUAS): Add pt_BR.
+ * po/pt_BR.po: New file.
+
+ * doc/Makefile.am ($(srcdir)/tar.info, $(srcdir)/header.texi):
+ Renamed from tar.info and header.texi; adjust actions so that
+ they work in other directories.
+
+ * doc/tar.texi: Add -y and --bzip2.
+ Patterns containing / now exclude only file names whose prefix match.
+
+ * lib/exclude.h (excluded_filename): New option parameter.
+ (add_exclude_file): New ADD_FUNC parameter.
+ (excluded_pathname): Remove decl.
+ * lib/exclude.c (_GNU_SOURCE):
+ Remove; no longer needed since we don't use FNM_ macros.
+ (excluded_filename): Renamed from excluded_filename_opts.
+ (excluded_filename, excluded_pathname): Remove.
+ (add_exclude_file): New ADD_FUNC parameter.
+
+ * po/POTFILES.in: Add lib/quotearg.c.
+
+ * src/buffer.c (_GNU_SOURCE): Define.
+ (<fnmatch.h>): Include unconditionally.
+ (child_open_for_compress): Dup after closing, to avoid possible file
+ descriptor exhaustion.
+ (flush_write): Use FILESYSTEM_PREFIX_LEN instead of MSDOS ifdef.
+ (flush_read): Likewise.
+
+ * src/common.h (LG_8, LG_64): New macros.
+ (excluded_with_slash, excluded_without_slash): New vars.
+ (excluded): Remove.
+ (base_64_digits): New decl.
+ (gid_to_chars, major_to_chars, minor_to_chars, mode_to_chars,
+ off_to_chars, size_to_chars, time_to_chars, uid_to_chars,
+ uintmax_to_chars,
+ GID_TO_CHARS, MAJOR_TO_CHARS, MINOR_TO_CHARS, MODE_TO_CHARS,
+ OFF_TO_CHARS, SIZE_TO_CHARS, TIME_TO_CHARS, UID_TO_CHARS,
+ UINTMAX_TO_CHARS):
+ Renamed from gid_to_oct, major_to_oct, minor_to_oct, mode_to_oct,
+ off_to_oct, size_to_oct, time_to_oct, uid_to_oct, uintmax_to_oct,
+ GID_TO_OCT, MAJOR_TO_OCT, MINOR_TO_OCT, MODE_TO_OCT, OFF_TO_OCT,
+ SIZE_TO_OCT, TIME_TO_OCT, UID_TO_OCT, UINTMAX_TO_OCT,
+ respectively. All definitions and uses changed.
+ (excluded_name): New decl.
+
+ * src/compare.c (diff_archive):
+ Open files with O_NONBLOCK instead of O_NDELAY.
+
+ * src/create.c (base_64_digits): New constant.
+ (base_8_digits): New macro.
+ (MAX_VAL_WITH_DIGITS): New macro.
+ (to_base): First half of old to_oct. Support base 64 too.
+ (to_chars): Other half of old to_oct, for 64-bit support.
+ (GID_NOBODY, UID_NOBODY): Don't define if the headers don't.
+ (gid_substitute, uid_substitute): Look up names dynamically if
+ GID_NOBODY and UID_NOBODY aren't defined; use -2 if all else fails.
+ (mode_to_chars): Renamed from mode_to_oct.
+ Support negative values in all the _to_chars functions.
+ (start_header): Use FILESYSTEM_PREFIX_LEN instead of MSDOS ifdef.
+ Abort if archive format is DEFAULT_FORMAT when it shouldn't be.
+ (dump_file): Inspect entire pathname, not just new file name
+ component, when deciding whether to exclude it.
+
+ * src/extract.c (extract_archive):
+ Open files with O_NONBLOCK instead of O_NDELAY.
+
+ * src/incremen.c (get_directory_contents):
+ Inspect entire pathname, not just new file name
+ component, when deciding whether to exclude it.
+
+ * src/list.c (<fnmatch.h>): Do not include.
+ (from_chars): Renamed from from_oct. New parameter specifying
+ the negative of the minimum allowed value. Support negative
+ and base-64 values.
+ (base64_map): New var.
+ (base64_init): New function.
+ (print_header): Output numeric uids and gids if numeric_owner_option.
+
+ * src/misc.c (quote_copy_string): Use LG_8 instead of constants.
+
+ * src/names.c (_GNU_SOURCE): Define.
+ (<fnmatch.h>): Include unconditionally.
+ (excluded_name): New function, taking over duties of excluded_pathname.
+ All uses changed.
+
+ * src/rmt.c (decode_oflag): New function.
+ (main): Use it to support symbolic open flags.
+
+ * src/rtapelib.c (encode_oflag): New function.
+ (rmt_open__): Do not allow newlines in the path.
+ Propagate errno correctly.
+ Decode symbolic open flags, if present.
+
+ * src/system.h (FILESYSTEM_PREFIX_LEN, ISSLASH, O_ACCMODE, O_NONBLOCK):
+ New macros.
+
+ * src/tar.c: (long_options, usage, OPTION_STRING, decode_options):
+ New -y or --bzip2 option.
+ (add_filtered_exclude): New function.
+ (decode_options): Put excluded patterns with / into
+ excluded_with_slash, and without / into excluded_without_slash.
+ Compare newer_mtime_option to its new initial value
+ TYPE_MINIMUM (time_t) when deciding whether more than one
+ threshold date was specified.
+
+1999-07-20 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in: Version 1.13.5.
+
+ * src/common.h (FATAL_ERROR): Invoke apply_delayed_set_stat
+ before exiting.
+ * src/buffer.c (new_volume): Likewise.
+ * src/incremen.c (read_directory_file): Likewise.
+ * src/tar.c (decode_options):
+ ERROR ((TAREXIT_FAILURE, ... -> FATAL_ERROR ((0,
+ for consistency.
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13.4.
+ * configure.in (AC_CHECK_FUNCS): Add lstat, readlink, symlink.
+
+ * src/system.h (lstat): Define only if !HAVE_LSTAT && !defined lstat.
+ (S_ISMPB, S_ISMPC, S_ISNWK): Remove unused macros.
+ (S_ISBLK, S_ISCHR, S_ISCTG, S_ISFIFO, S_ISLNK, S_ISSOCK):
+ Define to 0 if the corresponding S_IF* macro is not defined.
+ (mkfifo): Do not define if already defined, or if S_IFIFO
+ is not defined.
+
+ * src/compare.c (diff_archive): Use HAVE_READLINK, not
+ S_ISLNK, to determine whether to invoke readlink.
+ * src/create.c (dump_file): Likewise.
+
+ * src/extract.c (set_mode):
+ Do not chmod unless we are root or the -p option was given;
+ this matches historical practice.
+ (unlink_destination): New function, which checks for unlink failures.
+ (maybe_recoverable): Stay quiet if -U.
+ (extract_archive): Use O_EXCL if unlink_first_option.
+ Report unlink failures.
+ Use HAVE_SYMLINK, not S_ISLNK, to determine whether symlink exists.
+ Use HAVE_MKFIFO || defined mkfifo, not S_ISFIFO, to determine whether
+ mkfifo exists.
+
+ * src/incremen.c (get_directory_contents): Depend on
+ S_ISHIDDEN, not AIX, to determine whether to invoke S_ISHIDDEN.
+
+ * src/list.c: Remove S_IS* ifdefs.
+ * src/misc.c (maybe_backup_file): Likewise.
+
+ * src/misc.c (maybe_backup_file):
+ "Virtual memory exhausted" -> "Memory exhausted",
+ to conform to the other places this message is issued.
+
+ * src/mangle.c (extract_mangle):
+ Replace #ifdef S_ISLNK with #ifdef HAVE_SYMLINK.
+
+ * src/rtapelib.c (rmt_open__):
+ Remove typo that caused us to omit the first char
+ of the basename.
+
+1999-07-16 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): version 1.13.3.
+
+ * doc/tar.texi: A path name is excluded if any of its file name
+ components matches an excluded pattern, even if the path name was
+ specified on the command line.
+ * src/create.c (create_archive): Likewise.
+ * src/list.c (read_and): Likewise.
+ * src/update.c (update_archive): Likewise.
+ * lib/exclude.h (excluded_pathname): New decl.
+ * lib/exclude.c (_GNU_SOURCE): Define.
+ (FILESYSTEM_PREFIX_LEN, ISSLASH): New macros.
+ (excluded_filename_opts): New function.
+ (excluded_pathname): New function.
+
+ * lib/Makefile.am (EXTRA_DIST):
+ xstrtol.c moved here from libtar_a_SOURCES.
+ (libtar_a_SOURCES): Move xstrtol.c to EXTRA_DIST.
+ Remove xstrtoul.c; no longer needed.
+ * lib/xstrtol.c: Remove.
+
+ * src/tar.c (decode_options):
+ Set newer_time_option to TYPE_MINIMUM, so that
+ negative timestamps are handled correctly.
+ Replace invocations of xstrtol and xstrtoul with xstrtoumax, for
+ uniformity (and so that we don't need to have the other fns).
+ (main): Remove call to init_total_written; no longer needed.
+
+ * configure.in (AC_CHECK_SIZEOF): Remove no-longer-needed
+ checks for unsigned long and long long.
+ * src/arith.c: Remove.
+ * src/Makefile.am (tar_SOURCES): Remove arith.c.
+ * po/POTFILES.in: Remove src/arith.c.
+ * src/arith.h: Use double, to simplify configuration gotchas.
+ (tarlong): Now double.
+ (TARLONG_FORMAT): New macro.
+ (BITS_PER_BYTE, BITS_PER_TARLONG, SUPERDIGIT, BITS_PER_SUPERDIGIT,
+ LONGS_PER_TARLONG, SIZEOF_TARLONG, struct tarlong,
+ zerop_tarlong_helper, lessp_tarlong_helper, clear_tarlong_helper,
+ add_to_tarlong_helper, mult_tarlong_helper, print_tarlong_helper,
+ zerop_tarlong, lessp_tarlong, clear_tarlong, add_to_tarlong,
+ mult_tarlong, print_tarlong): Remove. All callers replaced with
+ arithmetic ops.
+
+ * src/common.h (init_total_written): Remove decl.
+
+ * src/buffer.c (total_written):
+ Remove; replaced with prev_written + bytes_written.
+ (prev_written): New var.
+ (init_total_written): Remove.
+ (print_total_written): Use TARLONG_FORMAT instead of print_tarlong.
+
+ * m4/ulonglong.m4 (jm_AC_TYPE_UNSIGNED_LONG_LONG):
+ Make sure that we can shift, multiply
+ and divide unsigned long long values; Ultrix cc can't do it.
+
+ * lib/modechange.c (mode_compile): Use uintmax_t, not unsigned long.
+ Check for any unknown bits, not just unknown bits left of the leftmost
+ known bit.
+
+ * lib/quotearg.c (quotearg_buffer):
+ Don't quote spaces if C quoting style.
+ * src/list.c (from_oct):
+ Use C quoting style for error; omit trailing NULs.
+
+1999-07-14 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (AM_INIT_AUTOMAKE), NEWS: Version 1.13.2.
+
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX): Check whether
+ <inttypes.h> defines strtoumax as a macro (and not as a function).
+ HP-UX 10.20 does this.
+
+ * src/tar.c (usage): tar-bugs@gnu.org -> bug-tar@gnu.org
+ * PORTS, README, TODO, doc/tar.texi: Likewise.
+
+1999-07-12 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (AM_INIT_AUTOMAKE): Version 1.13.1.
+ (LIBOBJS): Add mktime.o to automake 1.4 bug workaround.
+
+ * src/list.c (decode_header):
+ Do not assume that S_IFBLK and S_IFCHR are defined.
+
+ * src/create.c (start_header): Do not assume S_IFMT is defined.
+ (dump_file): Remove unnecessary check for screwy apollo lossage.
+ Do not assume S_IFBLK and S_IFCHR are defined.
+
+ * src/extract.c (extract_archive):
+ Test whether S_IFCHR and S_IFBLK are nonzero,
+ not whether they are defined, for consistency with other tests.
+
+ * src/buffer.c (is_regular_file):
+ Don't succeed on files that we can't access due to
+ permissions problems.
+ (open_archive): Fix wording on fatal error message.
+ Don't bother to stat /dev/null if the archive is not a character
+ special device.
+
+ * src/compare.c (process_rawdata, diff_sparse_files, diff_archive):
+ Report an error, not a warning, for I/O errors.
+ (process_rawdata, process_dumpdir, diff_sparse_files):
+ Change ungrammatical "Data differs" to "Contents differ".
+ (get_stat_data): Find hidden files on AIX.
+ Accept file name as argument; all uses changed.
+ (get_stat_data, diff_archive): Use system error message for
+ nonexistent files rather than rolling our own.
+ (diff_archive): Unknown file types are errors, not warnings.
+ Normalize spelling of message to "File type differs".
+ Use get_stat_data to get link status, for consistency.
+ Do not inspect st_rdev for fifos.
+ Do not assume st_mode values contain only file types and mode bits.
+ Check for mode changes and device number changes separately.
+
+ * src/update.c (append_file):
+ Open the file before statting it, to avoid a race.
+ Complain about file shrinkage only when we reach EOF.
+
+1999-07-08 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13 released.
+
+ * configure.in (AC_EXEEXT): Add.
+
+ * lib/Makefile.am (noinst_HEADERS):
+ Add basename.h, exclude.h. Remove full-write.h.
+ (libtar_a_SOURCES): Add exclude.c.
+
+ * lib/basename.h, lib/exclude.c, lib/exclude.h, lib/safe-read.h:
+ New files.
+ * lib/full-write.c: Include safe-read.h instead of full-write.h.
+ * lib/safe-read.h (safe_read): New decl.
+ * src/rmt.c: Include safe-read.h.
+ * src/rtapelib.c: Include basename.h, save-read.h.
+ (rmt_open__): Use base_name to compute base name.
+
+ * src/common.h:
+ Include basename.h, exclude.h; don't include full-write.h.
+ (exclude_option): Remove decl.
+ (excluded): New decl.
+ (add_exclude, add_exclude_file, check_exclude): Remove decls.
+
+ * src/list.c (read_and):
+ Use excluded_filename instead of check_exclude.
+ Check base name of incoming file name, not entire file name, when
+ deciding whether to exclude it.
+
+ * src/create.c (finish_sparse_file):
+ Use excluded_filename instead of check_exclude.
+ Don't bother to stat excluded file names.
+ * src/incremen.c (get_directory_contents): Likewise.
+
+ * src/names.c (exclude_pool, exclude_pool_size,
+ allocated_exclude_pool_size, simple_exclude_array,
+ simple_excludes, allocated_simple_excludes,
+ pattern_exclude_array, pattern_excludes,
+ allocated_pattern_excludes, add_exclude, add_exclude_file,
+ check_exclude):
+ Remove; now done in ../lib/exclude.c.
+
+ * src/tar.c (decode_options): Initialize `excluded'.
+ Use new add_exclude_file and add_exclude functions.
+
+1999-07-05 Paul Eggert <eggert@twinsun.com>
+
+ * m4/gettext.m4: Use changequote rather than [[ ]].
+
+ * lib/safe-read.c: Renamed from lib/full-read.c.
+ (safe_read): Renamed from full_read. All uses changed.
+ * lib/safe-read.h, lib/full-write.h: New files.
+ * lib/Makefile.am (noinst_HEADERS): Add full-write.h, safe-read.h.
+ (libtar_a_SOURCES): Rename full-read.c to safe-read.c.
+ * lib/full-write.c: Include full-write.h.
+ * src/common.h: Include full-write.h, safe-read.h.
+ * src/system.h: (full_read, full_write): Remove decls.
+
+ * src/Makefile.am (datadir): New var; needed for Solaris gettext.
+
+ * src/system.h (bindtextdomain, textdomain): undef before
+ defining, to avoid preprocessor warnings with --disable-nls
+ on hosts whose locale.h includes libintl.h.
+
+ * lib/xstrtol.c (__strtol): Remove decl; it doesn't work if __strtol
+ expands to a macro, which occurs in HP-UX 10.20 with strtoumax.
+ (strtol, strtoul): New decls (for pre-ANSI hosts), to replace
+ the above decl.
+
+1999-07-02 Paul Eggert <eggert@twinsun.com>
+
+ * Makefile.am (ACINCLUDE_INPUTS): Add $(M4DIR)/mktime.m4.
+ * m4/mktime.m4: New file.
+ * m4/Makefile.am.in, m4/README: Remove these files.
+ * m4/Makefile.am (EXTRA_DIST): Add mktime.m4;
+ remove README, Makefile.am.in.
+ (Makefile.am): Remove rule; it didn't work in BSD/OS 4.0.
+ * m4/jm-mktime.m4 (jm_FUNC_MKTIME): Invoke AC_FUNC_MKTIME,
+ not AM_FUNC_MKTIME.
+
+ * src/tar.c: Include signal.h.
+ (SIGCHLD): Define to SIGCLD if SIGCLD is defined but SIGCHLD is not.
+ (main): Ensure SIGCHLD is not ignored.
+
+ (BACKUP_OPTION, DELETE_OPTION, EXCLUDE_OPTION, GROUP_OPTION,
+ MODE_OPTION, NEWER_MTIME_OPTION, NO_RECURSE_OPTION, NULL_OPTION,
+ OWNER_OPTION, POSIX_OPTION, PRESERVE_OPTION, RECORD_SIZE_OPTION,
+ RSH_COMMAND_OPTION, SUFFIX_OPTION, USE_COMPRESS_PROGRAM_OPTION,
+ VOLNO_FILE_OPTION, OBSOLETE_ABSOLUTE_NAMES,
+ OBSOLETE_BLOCK_COMPRESS, OBSOLETE_BLOCKING_FACTOR,
+ OBSOLETE_BLOCK_NUMBER, OBSOLETE_READ_FULL_RECORDS, OBSOLETE_TOUCH,
+ OBSOLETE_VERSION_CONTROL): Make sure they can't be valid chars, so
+ they don't overlap with char codes. Use an enum instead of a lot
+ of #defines.
+
+ * src/system.h (ISASCII): Remove.
+ (CTYPE_DOMAIN, ISDIGIT, ISODIGIT, ISPRINT, ISSPACE, S_ISUID,
+ S_ISGID, S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP,
+ S_IROTH, S_IWOTH, S_IXOTH, MODE_WXUSR, MODE_R, MODE_RW,
+ MODE_RWX, MODE_ALL, SEEK_SET, SEEK_CUR, SEEK_END, CHAR_MAX,
+ LONG_MAX): New macros.
+
+ * src/incremen.c (ISDIGIT, ISSPACE): Remove; now in system.h.
+ (read_directory_file): Cast ISSPACE arg to unsigned char.
+ * src/misc.c (ISPRINT): Remove; now in system.h.
+ (remove_any_file): Add brackets to pacify gcc -Wall.
+ * src/list.c: Don't include <ctype.h>; system.h already does this.
+ (ISODIGIT, ISSPACE): Remove; now in system.h.
+ (decode_header): No need to AND mode with 07777; MODE_FROM_OCT
+ does this now.
+ (from_oct): Cast ISSPACE arg to unsigned char.
+
+ * src/create.c (mode_to_oct): Translate modes from internal to
+ external form.
+ * src/list.c (mode_from_oct): Translate modes from external to
+ internal form. Do not complain about unrecognized mode bits.
+ * src/common.h (TSUID, TSGID, TSVTX, TUREAD, TUWRITE, TUEXEC,
+ TGREAD, TGWRITE, TGEXEC, TOREAD, TOWRITE, TOEXEC): Remove undefs.
+
+ * src/extract.c: (extr_init, make_directories, extract_archive):
+ Do not assume mode bits have traditional Unix values.
+ * src/list.c (decode_mode): Likewise.
+ * src/create.c (start_header, dump_file): Likewise.
+ * src/buffer.c (child_open_for_compress,
+ child_open_for_uncompress, open_archive, (close_archive): Likewise.
+ * src/compare.c (diff_archive): Likewise.
+
+ * src/extract.c (set_mode): Use %04 not %0.4 format.
+ (extract_sparse_file): Do not use data_block uninitialized.
+ Check for lseek failures.
+
+ * src/rtapelib.c (rmt_lseek__):
+ Convert lseek whence values to portable integers on the wire.
+ * src/rmt.c (main): Likewise. Check for whence values out of range.
+
+ * src/create.c (finish_sparse_file): Use lseek whence macros
+ instead of integers.
+ * src/buffer.c (backspace_output): Likewise.
+ * src/compare.c (diff_archive, verify_volume): Likewise.
+ * src/delete.c (move_archive): Likewise.
+ * src/extract.c (extract_sparse_file): Likewise.
+
+ * src/create.c (dump_file): Do not invoke finish_sparse_file
+ on a negative file descriptor.
+
+ * src/buffer.c: Add braces to pacify gcc -Wall.
+
+ * src/compare.c (diff_sparse_files): Report lseek errors.
+
+ * configure.in (ALL_LINGUAS): Add cs, es, ru.
+
+ * PORTS, TODO: gnu.ai.mit.edu -> gnu.org
+
+ * src/arith.c, src/buffer.c (new_volume): Don't put ^G in
+ message to be internationalized; \a doesn't work with msgfmt.
+
+ * src/tar.c (long_options, main, usage, OPTION_STRING):
+ Remove -E or --ending-file.
+ * src/list.c (read_and): Likewise.
+ * src/common.h (ending_file_option): Likewise.
+ * src/buffer.c (close_archive): Likewise.
+
+ * tests/after: Don't run two commands together in a pipeline,
+ as some old shells mishandle pipeline exit status.
+
+1999-06-28 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (AM_INIT_AUTOMAKE): version 1.12.64015.
+ * NEWS: Describe changes since 1.12.
+ * README: Update bug reporting address; move paxutils ref to NEWS.
+
+ Handle EINTR correctly.
+ * lib/Makefile.am (libtar_a_SOURCES): Add full-read.c, full-write.c.
+ * lib/full-read.c, lib/full-write.c: New files.
+ * src/buffer.c (child_open_for_compress, child_open_for_uncompress):
+ Prefer full_read to read and full_write to write.
+ * src/compare.c (process_rawdata, diff_sparse_files): Likewise.
+ * src/create.c (deal_with_sparse, finish_sparse_file, dump_file):
+ Likewise.
+ * src/extract.c (extract_sparse_file): Likewise.
+ * src/rmt.c (get_string, main, report_error_message,
+ report_numbered_error): Likewise.
+ * src/rmt.h (rmtread, rmtwrite): Likewise.
+ * src/rtapelib.c (do_command, get_status_string, rmt_read__,
+ rmt_write__, rmt_ioctl__): Likewise.
+ * src/update.c (append_file): Likewise.
+ * src/system.h (full_read, full_write): New decls.
+
+ * po/POTFILES.in: Add lib/argmatch.c, lib/error.c lib/getopt.c,
+ lib/xmalloc.c, src/arith.c, src/misc.c.
+
+ * src/system.h (STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO):
+ New macros. All uses of STDIN and STDOUT changed.
+ * src/rmt.c (prepare_record_buffer, main): Use STDIN_FILENO
+ instead of 0 and STDOUT_FILENO instead of 1.
+ * src/rtapelib.c (_rmt_rexec): Use STDIN_FILENO and STDOUT_FILENO
+ instead of fileno (stdin) and fileno (stdout) or 0 and 1.
+
+ * src/rmt.c (private_strerror): Avoid const. Translate results.
+
+ * tests/Makefile.am (TESTS): Remove incremen.sh; it doesn't work
+ in the presence of NFS clock skew.
+
+1999-06-25 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (AM_INIT_AUTOMAKE): version 1.12.64014.
+
+ * src/buffer.c (write_archive_buffer): New function.
+ (child_open_for_compress, flush_write, flush_read): Use it to write
+ buffers.
+ (open_archive): Report error if fstat of archive fails.
+ Improve efficiency of check for /dev/null.
+ Also, fix some corner cases with remote archives and /dev/null checking.
+ (close_archive): Test for input fifo only if not remote.
+ Truncate output archive only if it's not remote.
+
+ * src/misc.c (remove_any_file):
+ Don't terminate if you see . or ..; just skip them.
+
+1999-06-18 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (AM_INIT_AUTOMAKE): version 1.12.64013.
+
+ Output sizes using a format that's more compatible with
+ traditional tar (and with GNU Emacs).
+ * src/common.h (GID_TO_OCT, MAJOR_TO_OCT, MINOR_TO_OCT,
+ MODE_TO_OCT, SIZE_TO_OCT, UID_TO_OCT, UINTMAX_TO_OCT):
+ Don't subtract 1 from size.
+ * src/create.c (to_oct): Prepend leading zeros, not spaces.
+ Output a trailing NUL unless the value won't fit without it.
+ (finish_header): No need to append NUL to chksum, now that
+ to_oct is doing it.
+
+1999-06-16 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): version 1.12.64012.
+
+ * src/Makefile.am (LDADD): Link libtar.a after @INTLLIBS@, since
+ @INTLLIBS@ might invoke rpl_realloc.
+
+ * src/tar.c (backup_type): Remove decl; backupfile.h now has it.
+ (intconv): Remove; use xstrto* fns instead.
+ ("xstrtol.h"): Include.
+ (check_decimal): Remove.
+ (long_options, usage, OPTION_STRING, decode_options):
+ Remove -y, --bzip2, --unbzip2.
+ (decode_options): Use xget_version instead of get_version.
+ Check for overflow with -b and -L and RECORD_SIZE_OPTION.
+ Replace invocations of check_decimal with xstrtoumax.
+
+ * tests/preset.in (echo_n, echo_c): Remove.
+
+ * tests/after: Don't rely on $echo_c and $echo_n.
+
+ * lib/addext.c, lib/dirname.c, lib/lchown.c, lib/lchown.h,
+ lib/malloc.c, lib/mktime.c, lib/realloc.c, lib/strtol.c, lib/strtoul.c,
+ lib/strtoull.c, lib/strtoumax.c, lib/utime.c, lib/xstrtol.c,
+ lib/xstrtol.h, lib/xstrtoul.c, lib/xstrtoumax.c,
+ m4/Makefile.am.in, m4/README, m4/ccstdc.m4, m4/d-ino.m4,
+ m4/gettext.m4, m4/inttypes_h.m4, m4/isc-posix.m4,
+ m4/jm-mktime.m4, m4/largefile.m4, m4/lcmessage.m4,
+ m4/malloc.m4, m4/progtest.m4, m4/realloc.m4, m4/uintmax_t.m4,
+ m4/ulonglong.m4, m4/utimbuf.m4, m4/utime.m4, m4/utimes.m4,
+ m4/xstrtoumax.m4: New files.
+
+ * configure.in(fp_PROG_ECHO): Remove; no longer needed.
+ (AC_SYS_LARGEFILE): Renamed from AC_LFS.
+ (jm_AC_HEADER_INTTYPES_H): Replaces inline code.
+ (jm_STRUCT_DIRENT_D_INO, jm_AC_TYPE_UINTMAX_T, jm_AC_PREREQ_XSTRTOUMAX): Add.
+ (AC_CHECK_FUNCS): Remove lchown.
+ (AC_REPLACE_FUNCS): Remove basename, dirname.
+ Add lchown, strtol, strtoul.
+ (jm_FUNC_MKTIME): Add.
+ (LIBOBJS): Replace .o with $U.o, so that the .o files in LIBOBJS
+ are also built via the ANSI2KNR-filtering rules.
+ Use a no-op line to work around bug in automake 1.4 with malloc and
+ realloc.
+ (AC_OUTPUT): Add m4/Makefile.
+
+ * lib/Makefile.am (EXTRA_DIST):
+ Add lchown.c, malloc.c, mktime.c, realloc.c,
+ strtol.c, strtoul.c, strtoull.c, strtoumax.c, utime.c.
+ (noinst_HEADERS): Add lchown.h, modechange.h, xstrtol.h.
+ (libtar_a_SOURCES): Add addext.c, basename.c, xstrtol.c,
+ xstrtoul.c, xstrtoumax.c. Remove getversion.c.
+ ($(srcdir)/getdate.c:): Remove `expect conflicts' line.
+
+ * src/system.h (uintmax_t): Don't declare; configure now does this.
+
+ * src/common.h (backup_type): New decl.
+ * src/common.h, src/misc.c, src/tar.c:
+ Move include of backupfile.h to common.h.
+
+ * src/misc.c (maybe_backup_file):
+ Pass backup_type to find_backup_file_name.
+
+ * src/list.c (print_header): Change sizes of uform and gform from 11 to
+ UINTMAX_STRSIZE_BOUND.
+
+ * doc/tar.texi: Remove --bzip2.
+ Fix @xref typos reported by latest makeinfo.
+
+ * Makefile.am (ACLOCAL_AMFLAGS): New macro.
+ (SUBDIRS): Add m4.
+ (M4DIR, ACINCLUDE_INPUTS): New macros.
+ ($(srcdir)/acinclude.m4): New rule.
+
+ * acconfig.h (ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT,
+ HAVE_INTTYPES_H, HAVE_LC_MESSAGES, HAVE_STPCPY): Remve #undefs;
+ now generated automatically by autoconf.
+
+1999-05-15 Paul Eggert <eggert@twinsun.com>
+
+ * doc/tar.texi: Remove -y.
+
+1999-04-09 Paul Eggert <eggert@twinsun.com>
+
+ * src/system.h (INT_STRLEN_BOUND): Fix off-by-factor-of-10 typo
+ (we were allocating too much storage).
+ (uintmax_t): Don't declare; configure now does this.
+
+ * ABOUT-NLS: Update to gettext 0.10.35 edition.
+
+1999-03-22 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): version 1.12.64010
+
+ * acinclude.m4 (AC_LFS_FLAGS):
+ Don't use -mabi=n32 with GCC on IRIX 6.2; it's the default.
+ (AC_LFS): -n32, -o32, and -n64 are CPPFLAGS, not CFLAGS.
+ (jm_FUNC_MALLOC, jm_FUNC_REALLOC): New macros.
+
+ * configure.in (jm_FUNC_MALLOC, jm_FUNC_REALLOC):
+ New macros; needed for latest GNU xmalloc.c.
+
+ * Makefile.am (noinst_HEADERS): Add quotearg.h, xalloc.h.
+ (libtar_a_SOURCES): Add quotearg.c.
+ * list.c: Include <quotearg.h>.
+ (from_oct): Add forward decl.
+ (read_header): Return HEADER_FAILURE if we can't parse the checksum.
+ (from_oct): Report an error only if TYPE is nonzero.
+ Quote any funny characters in bad header.
+
+1999-03-20 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): version 1.12.64009
+
+ * acinclude.m4 (AC_LFS_FLAGS): Add support for IRIX 6.2 and later.
+ (AC_LFS_SPACE_APPEND): Assume $2 is quoted properly; all callers
+ changed.
+ (AC_LFS): Simplify AIX revision number test.
+
+1999-03-17 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): version 1.12.64008
+
+ * configure.in (AC_VALIDATE_CACHED_SYSTEM_TUPLE):
+ Remove; it doesn't work that well
+ with AC_CANONICAL_HOST.
+ (fp_WITH_INCLUDED_MALLOC): Remove; we'll just use the system malloc.
+
+ * Makefile.am (EXTRA_DIST): Remove AC-PATCHES, AM-PATCHES, BI-PATCHES.
+
+ * Makefile.am (EXTRA_DIST): Remove gmalloc.c.
+
+ * acinclude.m4 (fp_WITH_INCLUDED_MALLOC): Remove.
+
+ * tar.texi: Fix bug-report addr.
+
+ * README: Remove --with-included-malloc.
+ Upgrade version numbers of build software.
+
+1999-03-07 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.12.64007.
+
+ * acinclude.m4 (AM_WITH_NLS): Port to Solaris 2.5.1,
+ where bindtextdomain and gettext require -lintl.
+ (AC_LFS_FLAGS): Simplify so that it only gets the flags;
+ `no' means it failed.
+ (AC_LFS_SPACE_APPEND, AC_LFS_MACRO_VALUE): New macros.
+ (AC_LFS): Use them. Set _FILE_OFFSET_BITS, _LARGEFILE_SOURCE, and
+ _LARGE_FILES from LFS_CFLAGS, so that in the normal case we don't need
+ to add anything to the command line (it's all in config.h).
+ Put any extra -D and -I options into CPPFLAGS, the rest into CFLAGS.
+
+1999-03-01 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.12.64006.
+
+ * acinclude.m4 (AC_LFS_FLAGS): Port to AIX 4.2.
+
+ * src/list.c: (gid_from_oct, major_from_oct, minor_from_oct,
+ mode_from_oct, off_from_oct, size_from_oct, time_from_oct,
+ uid_from_oct, uintmax_from_oct): Use TYPE_MAXIMUM instead of macros
+ like OFF_MAX, which are not reliable
+ (e.g. OFF_MAX in AIX 4.2 is incorrect).
+ * src/system.h (GID_MAX, MAJOR_MAX, MINOR_MAX, MODE_MAX, OFF_MAX,
+ SIZE_MAX, TIME_MAX,UID_MAX, UINTMAX_MAX): Remove; no longer used.
+
+ * src/incremen.c (get_directory_contents):
+ Don't use statx if _LARGE_FILES; it doesn't work under AIX 4.2.
+ Have statx depend on STX_HIDDEN, not AIX.
+
+ * src/create.c (to_oct):
+ New parameter substitute, giving a substitute value to use
+ when the original value is out of range. Do not append a space to the
+ output; modern tars don't. When a value is out of range, specify the
+ maximum value, not the number of bits.
+ (GID_NOBODY, UID_NOBODY): New macros.
+ (gid_to_oct, uid_to_oct): Use them as substitutes.
+ (finish_header): Do not assume that UINTMAX_TO_OCT appends a space.
+ (dump_file): Check whether the file changed as we read it.
+
+ * src/rmt.c (main): Remove suspicious AIX/386 code.
+
+1999-02-19 Paul Eggert <eggert@twinsun.com>
+
+ * intl/localealias.c (read_alias_file): Don't assume that memcpy
+ returns a type compatible with char *; it doesn't on SunOS
+ 4.1.4 with Sun cc, since <string.h> doesn't declare memcpy.
+
+ * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.12.64005.
+
+ * src/tar.c (long_options, usage): Prefer --unbzip2 to --bunzip2.
+ * doc/tar.texi: Add --bzip2, --unbzip2 options.
+
+ * configure.in (AC_CANONICAL_HOST, AC_VALIDATE_CACHED_SYSTEM_TUPLE):
+ Add.
+ (AC_LINK_FILES): Omit; AM_GNU_GETTEXT now does this.
+ (AC_OUTPUT): Omit munging of po/Makefile; AM_GNU_GETTEXT now does this.
+ * acinclude.m4 (AM_WITH_NLS):
+ Update to latest gettext version (serial 5).
+ (AC_LFS_FLAGS): New macro
+ (AC_LFS): Use it. Append to CFLAGS, LDFLAGS, LDLIBS instead of
+ working only with unset variables. Append to CFLAGS, not CPPFLAGS.
+ Work properly in cross-compilation scenario, by checking for getconf
+ with AC_CHECK_TOOL and by ditching uname in favor of
+ AC_CANONICAL_HOST and $host_os. Add --disable-lfs option.
+
+ * lib/getdate.y: Update to fileutils 4.0 getdate.y, with one patch:
+ replace FORCE_ALLOCA_H with HAVE_ALLOCA_H.
+ * lib/Makefile.am (AUTOMAKE_OPTIONS): Append ../src/ansi2knr,
+ since getdate.y now uses ANSI code.
+
+ * config.guess, config.sub: New files; taken from automake 1.4.
+
+ * intl/Makefile.in, intl/VERSION, intl/bindtextdom.c,
+ intl/cat-compat.c, intl/dcgettext.c, intl/dgettext.c,
+ intl/explodename.c, intl/finddomain.c, intl/gettext.c,
+ intl/gettext.h, intl/gettextP.h, intl/hash-string.h,
+ intl/l10nflist.c, intl/libgettext.h, intl/loadinfo.h,
+ intl/loadmsgcat.c, intl/localealias.c, intl/textdomain.c:
+ Update to GNU gettext 0.10.35, with patches as per GCC snapshot 990109.
+
+1999-02-01 Paul Eggert <eggert@twinsun.com>
+
+ * src/tar.c: Update copyright.
+
+ * NEWS: 1.12.64004
+
+1999-02-01 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in: Version 1.12.64004
+
+ * configure.in (AC_LFS): Use this macro, instead of open-coding it.
+
+ * acinclude.m4 (AC_LFS, AM_PROG_CC_STDC): New macros.
+
+ * src/extract.c (extract_archive): Fix bug when extracting sparse
+ files: they were trashing the tar file header.
+
+ * src/tar.c: (long_options, usage, OPTION_STRING, decode_options):
+ Add -y or --bzip2 or --bunzip2 option.
+
+1999-01-30 Paul Eggert <eggert@twinsun.com>
+
+ * src/names.c (cached_no_such_uname, cached_no_such_gname,
+ cached_no_such_uid, cached_no_such_gid): New vars.
+ (uid_to_uname, gid_to_gname, uname_to_uid, gname_to_gid):
+ Cache failures, too.
+
+ * src/tar.c (decode_options):
+ Don't pass names longer than UNAME_FIELD_SIZE to
+ uname_to_uid, as it messes up the cache. Similarly for gname_to_uid.
+
+1999-01-27 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in: Version 1.12.64003
+
+ * src/buffer.c (backspace_output, close_archive): Cast
+ rmtlseek position arg to off_t, for benefit of K&R compilers
+ with long long.
+ * src/compare.c (verify_volume): Likewise.
+
+ * NEWS, configure.in: Version 1.12.64002
+
+ * src/create.c (gid_to_oct, major_to_oct, minor_to_oct, mode_to_oct,
+ off_to_oct, size_to_oct, time_to_oct, uid_to_oct):
+ Cast arg to uintmax_t for benefit of pre-ANSI compilers with long long.
+ * src/list.c: (gid_from_oct, major_from_oct, minor_from_oct,
+ mode_from_oct, off_from_oct, size_from_oct, time_from_oct,
+ uid_from_oct): Likewise.
+
+1999-01-25 Paul Eggert <eggert@twinsun.com>
+
+ * incremen.sh: Fix timing bug in regression test.
+
+1999-01-22 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, configure.in: Update version
+
+ * Makefile.am (localedir): Change to $(datadir)/locale.
+ (DEFS): New macro, defining LOCALEDIR.
+ (tar.o, tar._o, rmt.o, rmt._o): Remove.
+ (INCLUDES): Add -I..
+
+ * Makefile.am (localedir): Change to $(datadir)/locale.
+
+1999-01-21 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, README, configure.in: Unofficial version 1.12.64001.
+
+ * tests/Makefile.am (localedir): Change to $(datadir)/locale.
+ * src/Makefile.am (localedir): Likewise.
+ (DEFS): New macro, defining LOCALEDIR.
+ (tar.o, tar._o, rmt.o, rmt._o): Remove.
+ (INCLUDES): Add `-I..'.
+
+ * tests/incremen.sh: Fix timing bug.
+
+1999-01-20 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, README, configure.in: Unofficial version 1.12.64000.
+ `lfs.7' changed to `64000' in version number
+ to conform to gnits standards.
+
+ * COPYING, INSTALL, doc/texinfo.tex, install-sh, missing,
+ mkinstalldirs, ansi2knr.c: Update to latest public versions.
+
+ Rebuild with automake 1.4 and autoconf 2.13, to work around some
+ porting problems.
+
+1998-12-07 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, README, configure.in: Unofficial version 1.12.lfs.6.
+
+ * src/list.c (read_header):
+ Accept file names as specified by POSIX.1-1996 section 10.1.1.
+
+1998-11-30 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in: Quote the output of uname.
+
+ * src/extract.c (set_stat): chmod after chown even when not root;
+ if we are using --same-owner this is needed e.g. on Solaris 2.5.1.
+
+1998-11-15 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, README, configure.in: Unofficial version 1.12.lfs.5.
+
+ * configure.in (ac_test_CPPFLAGS, ac_test_LDFLAGS, ac_test_LIBS,
+ ac_getconfs, ac_result): Special case for HP-UX 10.20 or later.
+
+1998-10-28 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, README, configure.in: Unofficial version 1.12.lfs.4.
+
+ * src/system.h (voidstar): Use void * if __STDC__ is defined,
+ not merely nonzero.
+
+ * src/rtapelib.c: Don't use rexec code unless compiled with WITH_REXEC.
+ On many installations, rexec is disabled.
+
+1998-08-07 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, README, configure.in: Unofficial version 1.12.lfs.3.
+
+ * src/names.c (uid_to_uname, gid_to_gname): Don't used cached name
+ for nameless users and groups.
+
+1998-02-17 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, README, configure.in: Unofficial version 1.12.lfs.2.
+ * NEWS, README: Add explanation of why this isn't an official version.
+
+1998-02-02 Paul Eggert <eggert@twinsun.com>
+
+ * NEWS, README, configure.in: Unofficial version 1.12.lfs.1.
+ This is an unofficial version.
+
+1997-12-17 Paul Eggert <eggert@twinsun.com>
+
+ * src/incremen.c (ST_DEV_MSB): New macro.
+ (NFS_FILE_STAT): Use most significant bit of st_dev,
+ even if it's unsigned.
+
+1997-12-08 Paul Eggert <eggert@twinsun.com>
+
+ * src/system.h (ST_NBLOCKS): Fix typo in definition.
+
+1997-11-19 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (HAVE_INTTYPES_H):
+ Don't ignore cache variable if it's already set.
+
+1997-11-10 Paul Eggert <eggert@twinsun.com>
+
+ * src/rmt.c (main): Don't assume mt_count is of type daddr_t.
+ * src/delete.c (records_read): Now off_t.
+ (move_archive): Don't assume mt_count is of type daddr_t.
+
+1997-10-30 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (CPPFLAGS, LDFLAGS, LIBS):
+ Set to appropriate values if large file support
+ needs explicit enabling.
+ (HAVE_INTTYPES_H, HAVE_ST_FSTYPE_STRING, daddr_t, major_t, minor_t,
+ ssize_t):
+ New macros to configure.
+ (AC_TYPE_MODE_T, AC_TYPE_PID_T, AC_TYPE_OFF_T): Add.
+
+ * acconfig.h (daddr_t, HAVE_INTTYPES_H, HAVE_ST_FSTYPE_STRING,
+ major_t, minor_t, ssize_t): New macros.
+
+ * src/arith.h (TARLONG_FORMAT):
+ Fix typo: %uld -> %lu. Use unsigned when long long
+ (%lld -> %llu).
+ (add_to_tarlong_helper, mult_tarlong_helper): 2nd arg is now unsigned long.
+ (add_to_tarlong, mult_tarlong): Cast 2nd arg to unsigned long.
+
+ * src/arith.c (add_to_tarlong_helper, mult_tarlong_helper):
+ 2nd arg is now unsigned long.
+
+ * src/rmt.c (allocated_size): Now size_t, and now initialized to 0.
+ (prepare_record_buffer): Arg is now size_t.
+ Remove now-useless casts.
+
+ (main): Use `long' for status, so that it can store ssize_t.
+ Use daddr_t, mode_t, size_t, off_t when appropriate.
+ Convert daddr_t and off_t values ourselves, since they might be longer
+ than long. Convert other types using `long' primitives.
+ When processing MTIOCTOP, do not try to pass resulting
+ count back, since it won't work (it could be too large) and it's
+ not expected anyway.
+
+ * src/update.c:
+ (append_file) Use off_t, size_t, ssize_t when appropriate. Remove
+ now-useless casts. Use unsigned long to print *_t types, except use
+ STRINGIFY_BIGINT for off_t.
+ (update_archive): Cast -1 to dev_t when necessary.
+
+ * src/tar.c (check_decimal):
+ Now returns 1 if successful, 0 otherwise, and returns
+ uintmax_t value into new arg. Check for arithmetic overflow.
+ (decode_options): Avoid overflow if record_size fits in size_t but not int.
+ Check for overflow on user or group ids.
+
+ * src/compare.c (diff_init, process_rawdata, read_and_process,
+ diff_sparse_files, diff_archive):
+ Use off_t, pid_t, size_t, ssize_t when appropriate.
+ Remove now-useless casts. Use unsigned long to print *_t types,
+ except use STRINGIFY_BIGINT for off_t.
+
+ (process_noop, process_rawdata, process_dumpdir, read_and_process):
+ Size arg is now size_t.
+
+ (diff_sparse_files): Arg is now off_t. Check for size_t overflow
+ when allocating buffer.
+
+ * src/rtapelib.c:
+ (do_command, rmt_open__, rmt_read__, rmt_lseek__, rmt_ioctl__):
+ Use pid_t, size_t, ssize_t when appropriate. Remove now-useless casts.
+ Use unsigned long to print *_t types, except use STRINGIFY_BIGINT for
+ off_t.
+
+ (get_status_string, get_status_off): New function.
+ (get_status): Now returns long, so that it can store ssize_t.
+ Invoke get_status_string to do the real work.
+ (rmt_read__, rmt_write__): Now returns ssize_t. Size arg is now size_t.
+ (rmt_lseek__): Now returns off_t, using new get_status_off function.
+ (rmt_ioctl__): Convert mt_count by hand,
+ since it might be longer than long.
+
+ * src/mangle.c (extract_mangle):
+ Check for overflow when converting off_t to size_t.
+ Use off_t, size_t when appropriate. Remove now-useless casts.
+
+ * src/system.h (mode_t): Remove; now done by autoconf.
+ (ST_NBLOCKS): Do not overflow if st_size is near maximum.
+ Return number of ST_NBLOCKSIZE-byte blocks,
+ not number of 512-byte blocks;
+ this also helps to avoid overflow.
+ (st_blocks): Declare if needed.
+ (ST_NBLOCKSIZE): New macro.
+ (<limits.h>, <inttypes.h>): Include if available.
+ (CHAR_BIT): New macro.
+ (uintmax_t): New typedef.
+ (TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM, INT_STRLEN_BOUND,
+ UINTMAX_STRSIZE_BOUND, GID_MAX, MAJOR_MAX, MINOR_MAX, MODE_MAX,
+ OFF_MAX, SIZE_MAX, TIME_MAX, UID_MAX, UINTMAX_MAX): New macros.
+
+ * src/names.c (name_init):
+ Fix typo in error message: FILE* was passed, but char*
+ was wanted.
+
+ (read_name_from_file, name_gather, addname, name_match, name_scan,
+ add_exclude): Use size_t when appropriate. Remove now-useless casts.
+
+ (exclude_pool_size, allocated_exclude_pool_size): Now size_t.
+
+ * src/extract.c (newdir_umask, current_umask): Now mode_t.
+ (extract_sparse_file): Args now use off_t.
+
+ (set_mode, set_stat, make_directories, extract_sparse_file,
+ extract_archive): Use off_t, size_t, ssize_t when appropriate. Remove
+ now-useless casts. Use unsigned long to print *_t types, except use
+ STRINGIFY_BIGINT for off_t.
+
+ * src/misc.c (quote_copy_string):
+ Use size_t when appropriate. Remove now-useless casts.
+
+ * src/list.c (read_and, list_archive, read_header, decode_mode,
+ print_header, print_for_mkdir):
+ Use mode_t, off_t, size_t when appropriate. Remove
+ now-useless casts. Use unsigned long to print *_t types, except use
+ STRINGIFY_BIGINT for off_t.
+
+ (read_header): Check for overflow when converting header size.
+
+ (from_oct): Now static. Now returns uintmax_t. `where' arg is now
+ const char *. Size arg is now size_t. Now takes new type and maxval
+ args. Compute result using uintmax_t, not long. Report error if
+ field does not contain octal number in range.
+ (gid_from_oct, major_from_oct, minor_from_oct, mode_from_oct,
+ off_from_oct, size_from_oct, time_from_oct, uid_from_oct,
+ uintmax_from_oct): New functions.
+
+ (stringify_uintmax_t_backwards): New function.
+
+ (decode_mode, print_for_mkdir): Mode arg is now mode_t.
+ (skip_file): Offset arg is now off_t.
+
+ * src/buffer.c (record_start_block, save_totsize, save_sizeleft,
+ real_s_totsize, real_s_sizeleft, current_block_ordinal):
+ Now off_t.
+ (write_error): Arg is now ssize_t.
+ (child_pid): Now pid_t.
+ (available_space_after): Now size_t.
+
+ (child_open_for_compress, child_open_for_uncompress, flush_write,
+ open_archive, flush_write, write_error, flush_read, close_archive):
+ Use pid_t, ssize_t, size_t when appropriate. Remove now-useless
+ casts. Use unsigned long to print *_t types, except use
+ STRINGIFY_BIGINT for off_t.
+
+ * src/delete.c (records_read): Now daddr_t.
+ (move_archive): Arg is now daddr_t. Check for overflow when
+ computing offset.
+ (move_archive, delete_archive_members): Use daddr_t, off_t when
+ appropriate. Remove now-useless casts.
+
+ * src/rmt.h (rmt_read__, rmt_write__): Now returns ssize_t.
+ (rmt_lseek): Now returns off_t.
+
+ * src/create.c (to_oct):
+ Now static. Value arg is now uintmax_t. Accept new args
+ giving name of type of octal field, for error messages. Report an
+ error if the value is too large to fit in the field.
+ (gid_to_oct, major_to_oct, minor_to_oct, mode_to_oct, off_to_oct,
+ size_to_oct, time_to_oct, uid_to_oct, uintmax_to_oct): New functions.
+
+ (write_eot, write_long, finish_header, deal_with_sparse,
+ finish_sparse_file, dump_file): Use dev_t, off_t, ssize_t, size_t when
+ appropriate. Remove now-useless casts. Use unsigned long to print
+ *_t types, except use STRINGIFY_BIGINT for off_t.
+
+ (find_new_file_size): 1st arg is now off_t*.
+ (finish_sparse_file): Args now use off_t, not long.
+ Check for lseek error.
+ (create_archive, dump_file): Cast -1 to dev_t when necessary.
+ (dump_file): Device arg is now dev_t.
+ Avoid overflow when testing whether file has holes
+ by using the new ST_NBLOCKSIZE macro.
+
+ * src/incremen.c (struct accumulator, add_to_accumulator,
+ get_directory_contents, add_hierarchy_to_namelist, gnu_restore):
+ Use size_t for sizes.
+ (struct directory, get_directory_contents, add_hierarchy_to_namelist):
+ Use dev_t, ino_t for devices and inodes.
+ (gnu_restore): Use off_t for file offsets.
+ (struct directory): Use char for flags. Add new flag `nfs'.
+ (nfs): New constant
+ (NFS_FILE_STAT): New macro.
+ (note_directory): Accept struct stat * instead of
+ device and inode number. All callers changed.
+ (note_directory, get_directory_contents):
+ Use NFS_FILE_STAT to determine whether directory is an NFS directory.
+ (write_dir_file): Cast time_t to unsigned long before printing as %lu.
+
+ * src/common.h (record_size, struct name, struct sp_array,
+ available_space_after):
+ Use size_t for sizes.
+ (save_sizeleft, save_totsize, current_block_ordinal, skip_file):
+ Use off_t for file offsets.
+ (struct name): dir_contents is now const char *, not char *.
+ (dump_file, get_directory_contents): Use dev_t for devices.
+ (to_oct): Remove decl.
+ (GID_TO_OCT, MAJOR_TO_OCT, MINOR_TO_OCT, MODE_TO_OCT, SIZE_TO_OCT,
+ UID_TO_OCT, UINTMAX_TO_OCT, OFF_TO_OCT, TIME_TO_OCT, STRINGIFY_BIGINT,
+ GID_FROM_OCT, MAJOR_FROM_OCT, MINOR_FROM_OCT, MODE_FROM_OCT,
+ OFF_FROM_OCT, SIZE_FROM_OCT, TIME_FROM_OCT, UID_FROM_OCT,
+ UINTMAX_FROM_OCT): New macros.
+ (gid_to_oct, major_to_oct, minor_to_oct, mode_to_oct, off_to_oct,
+ size_to_oct, time_to_oct, uid_to_oct, uintmax_to_oct,
+ stringify_uintmax_t_backwards, gid_from_oct, major_from_oct,
+ minor_from_oct, mode_from_oct, off_from_oct, size_from_oct,
+ time_from_oct, uid_from_oct, uintmax_from_oct): New decls.
+ (print_for_mkdir): 2nd arg is now mode_t.
+
+ -----
+
+ See ChangeLog.1 for earlier changes.
+
+ -----
+
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007
+ Free Software Foundation, Inc.
+
+ This file is part of GNU tar.
+
+ GNU tar is free software; you can 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.
+
+ GNU tar is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU tar; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
diff --git a/ChangeLog.1 b/ChangeLog.1
new file mode 100644
index 0000000..726fe72
--- /dev/null
+++ b/ChangeLog.1
@@ -0,0 +1,5887 @@
+Currently there is just one ChangeLog file for tar, but
+there used to be separate ChangeLog files for each subdirectory.
+This file records what used to be in those separate files.
+
+Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+Free Software Foundation, Inc.
+
+This file is part of GNU Tar.
+
+GNU Tar is free software; you can 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.
+
+GNU Tar is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Tar; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.
+
+
+----- ChangeLog -----
+
+1997-04-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.12.
+
+ * configure.in: Check for the inline keyword.
+
+1997-04-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (BABYL): Delete admin/RMAIL, renamed rmail/announce.
+
+ * PORTS: New file.
+ (EXTRA_DIST): Adjusted.
+
+1997-04-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * BI-PATCHES: Patches for Bison 1.25.
+ * Makefile.am (EXTRA_DIST): Adjusted.
+
+ * configure.in (AC_PROG_INSTALL): Call deleted. AM_INIT_AUTOMAKE
+ takes care of this already.
+
+1997-04-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11q.
+
+ * configure.in: Use gethostent instead of gethostbyname while
+ checking for -lnsl. It seems SINIX systems require this.
+ Reported by Bruno Haible.
+
+1997-04-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * acinclude.m4: New fp_WITH_INCLUDED_MALLOC macro.
+ * configure.in: Use it instead of the HP/UX test for GNU malloc.
+ Reported by Bruno Haible.
+
+1997-04-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11p.
+
+ * acinclude.m4 (cl_FUNC_GMALLOC): New macro, yet still unused, as
+ it requires config.guess. I have to think more about this.
+ Reported by Bruno Haible.
+
+1997-04-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * AC-PATCHES: Patches for Autoconf 2.12.
+ * AM-PATCHES: Patches for Automake 1.1n.
+ * Makefile.am (EXTRA_DIST): Adjusted.
+
+1997-04-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Ensure all cpp directives are left justified.
+ Reported by Kaveh R. Ghazi.
+
+1997-04-12 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Add fnmatch.o to LIBOBJS if AC_FUNC_FNMATCH
+ says no working copy was found. This is not done automatically.
+ Reported by Bruno Haible, Bryant Fujimoto, John David Anglin,
+ Kaveh R. Ghazi, Laurent Caillat-Vallet, Sakai Kiyotaka and
+ Santiago Vila Doncel.
+
+1997-04-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Much simplify the -lsocket and -lnsl tests.
+ Reported by Larry Schwimmer.
+
+1997-04-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11o.
+
+ * configure.in: Do not check for gettimeofday anymore.
+
+ * configure.in: Do not anymore blindly add -lnsl if gethostname
+ is found, nor -lsocket if setsockopt is found. Instead, for
+ resolving setsockopt, try none, -lsocket, and -lsocket -lnsl,
+ in that order. For resoving gethostbyname, try none, than -lnsl.
+ Reported by Ariel Faigon, Heiko Schlichting, Jean-Philippe
+ Martin-Flatin, John J. Szetela, John R. Vanderpool, Kaveh
+ R. Ghazi, Larry Schwimmer, Marcus Daniels, Mark Bynum and
+ Russell Cattelan.
+
+1997-04-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Define _GNU_SOURCE to get FNM_LEADIR_DIR, etc.
+ * acconfig.h: Document _GNU_SOURCE.
+ Reported by Andreas Jaeger, Becki Kain, Brendan Kehoe, David
+ N. Brown, J. Dean Brock, James V. DI Toro III, Jeffrey Mark
+ Siskind, Jürgen Reiss, Paul Eggert, Roland McGrath, Rolf
+ Niepraschk, Roman Gollent, Thomas Bushnell n/BSG and Ulrich
+ Drepper.
+
+1997-03-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in (ALL_LINGUAS): Add it.
+
+1997-03-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Require Autoconf 2.12.
+
+1997-02-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Use AM_CONFIG_HEADER and AM_GNU_GETTEXT instead
+ of AC_CONFIG_HEADER and ud_GNU_GETTEXT. Use AC_FUNC_FNMATCH
+ instead of AM_FUNC_FNMATCH. Do not take care anymore of stamp-h
+ in AC_OUTPUT, leave it to Automake.
+ * acinclude.m4: Replaced whole, from elsewhere.
+ * Makefile.am (EXTRA_DIST): Leave README-alpha to Automake.
+
+1997-02-12 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Delete README-alpha code, Automake handles it now.
+
+1996-11-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.14.
+
+ * Makefile.am (BABYL): Add admin/RMAIL.
+
+ * configure.in: Check for sys/buf.h, as BSD/OS.
+ Reported by Dan Reish.
+
+1996-11-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Replace a missing basename.
+ Reported by Bryant Fujimoto, Erick Branderhorst, Greg Black, John
+ David Anglin, John J. Szetela, Kaveh R. Ghazi, Kurt Jaeger, Marcus
+ Daniels, Santiago Vila Doncel and William Bader.
+
+1996-11-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.13.
+
+ * configure.in: Replace a missing dirname.
+
+1996-10-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Clean out some macro calls made useless since
+ AM_INIT_AUTOMAKE implies them.
+
+1996-09-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Do not check anymore for regex.
+
+1996-09-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.12
+
+ * configure.in: Check echo for newline suppression.
+
+1996-09-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Do not add open3.o to LIBOBJS anymore.
+
+1996-09-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in (ALL_LINGUAS): Add pl.
+
+1996-09-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in (AC_OUTPUT): Prepare tests/Makefile and tests/preset.
+ * Use AM_ version of fp_ macros.
+
+ * Makefile.am (SUBDIRS): Add tests/.
+
+1996-07-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.11.
+
+ * configure.in: Use AC_PREREQ(2.10).
+
+1996-07-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in (ALL_LINGUAS): Add nl.
+ Reported by Erick Branderhorst.
+
+1996-07-12 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.10.
+
+ * configure.in (ALL_LINGUAS): Add ko and sl.
+
+1996-05-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for fsync, and linux/fd.h.
+ Reported by Marty Leisner.
+
+1996-04-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (EXTRA_DIST): New name for DIST_OTHERS.
+
+ * configure.in (ALL_LINGUAS): Add no.
+
+ * Makefile.am (BABYL): Consider rmail/* instead of rmail/*/*.
+
+1996-02-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Avoid PROGRAMS, instead use RMT to substitute rmt.
+ * Makefile.am (SUBDIRS): Use intl and po instead of @INTLSUB@ and
+ @POSUB@.
+
+ * configure.in: Check for poll.h and stropts.h.
+ Check for nap, napms, poll, select and usleep.
+
+1996-02-12 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Remove CONFIG_HEADER, not required by Automake 0.29.
+ * configure.in: Temporarily remove a \ in AC_OUTPUT for automake.
+
+1996-02-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check size of unsigned long (assume 32 bits if
+ cross-compiling) and long long (assume not available).
+
+1996-01-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Select gnits and dist-shar.
+ (dist-zoo): New goal, experimental for now.
+
+1996-01-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Force distribution of BACKLOG.
+ Reported by Jonathan Thornburg.
+
+ * Makefile.am: Declare BABYL. Force distribution of AUTHORS
+ and rebox.el. Add id, ID and dist-shar targets. Add parts of
+ previous Makefile.in as FIXME comments.
+
+1995-12-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Ensure there is a link for libintl.h.
+ Reported by Daniel S. Barclay, Göran Uddeborg, Jonathan Thornburg,
+ Ken Raeburn and Minh Tran-Le.
+
+1995-12-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.9.
+
+ * Makefile.am: New file.
+
+ * configure.in: Decide if README-alpha should be distributed.
+ From Ulrich Drepper.
+
+1995-12-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in (AC_OUTPUT): Call sed for po/Makefile.in.
+
+ * Makefile.in: Distribute ABOUT-NLS rather than NLS, and do not
+ distribute config.guess or config.sub anymore.
+
+ * configure.in: Test for lchown.
+
+1995-12-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Prefer avoiding union wait, and use it only if
+ using int fails. This turns around the previous test, as directly
+ checking for union wait is seemingly seeking for trouble.
+ Reported by Alan Bawden, Chris Arthur, Coranth Gryphon,
+ Jean-Philippe Martin-Flatin, Robert Bernstein and Tarang Kumar
+ Patel.
+
+ * configure.in: Check for strerror, so lib/error.c will not try to
+ define sys_errlist in the case strerror is already provided.
+ Reported by Coranth Gryphon, Chris Arthur, David J. MacKenzie,
+ Erich Stefan Boleyn, Greg Black, Jason R. Mastaler, Michael
+ Innis Bushnell, Robert Bernstein, Santiago Vila Doncel, Skip
+ Montanaro and Thomas Krebs.
+
+ * configure.in: Quote the selected shell. I wonder why this
+ error did not show up before!
+
+ * configure.in: Check <sys/tprintf.h> and <sys/device.h> for BSDi.
+ Reported by Chris Arthur and Skip Montanaro.
+
+1995-12-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Be more systematic at caching test results.
+ Reported by Ulrich Drepper.
+
+ * configure.in: While checking for remote tape header files, only
+ include <sgtty.h> if it was found to exist.
+
+ * configure.in: Prefer #if to #ifdef while checking for open3.
+
+1995-11-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for net/errno.h and sys/inet.h, trying to
+ get EOPNOTSUPP defined.
+
+ * configure.in: Check for sgtty.h.
+
+1995-11-06 François Pinard <pinard@iro.umontreal.ca>
+
+ * acconfig.h: Document HAVE_STPCPY for the time being. I do not
+ understand yet why this is mandatory: it should be automatic
+ from AC_CHECK_FUNCS(stpcpy) in aclocal.m4, through autoheader.
+
+ * configure.in: Use fp_FUNC_FNMATCH, to get around non-working
+ versions on SCO Unix 3.2v4.2, and Solaris.
+ Reported by Chad Hurwitz, Dennis Pixton, Per Foreby, Richard
+ Westerik, Robert Weiner and Tom Tromey.
+
+1995-10-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Add /usr/bin/rcmd as a possible remote shell, as
+ this is the name used by SCO Unix 3.2.4.
+ Reported by Bela Lubkin and Rodney Brown.
+
+1995-07-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Adapt for GNU gettext 0.8.
+
+1995-07-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (default): Define to all.
+
+1995-06-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: For mknod, also include <sys/types.h> prior to
+ <sys/stat.h>, as Ultrix needs this.
+ Reported by Bruce Jerrick, Bryant Fujimoto, Conrad Hughes, Erich
+ Stefan Boleyn, Jason R. Mastaler, Joshua R. Poulson, Jurgen Botz,
+ Serge Granik, Simon Wright, Ulrich Drepper and Vince Del Vecchio.
+
+ * configure.in: Replace execlp as needed (for Minix, mainly).
+
+ * configure.in: Force compilation of lib/open3.c if required.
+ Clean out old NO_OPEN3 code.
+
+1995-06-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.11.8.
+
+ * Makefile.in (DISTFILES): Distribute config.guess and config.sub.
+ Reported by Ulrich Drepper.
+
+ * acconfig.h, aclocal.m4, configure.in: Last minutes
+ additions, and glimpses to the future gettext 0.6.1.
+ Reported by Ulrich Drepper.
+
+ * acconfig.h: Document HAVE_MKNOD.
+ * configure.in: Test for mknod only once <sys/stat.h> included.
+ Reported by Alan Modra, Ray Dassen and Ulrich Drepper.
+
+ * aclocal.m4: Test for re_rx_search instead of rx_compile, the
+ latter not being exported unless RX_WANT_RX_DEFS is defined.
+ Reported by Alan Modra.
+
+1995-06-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (dist): Do not hide copying rule.
+
+ * configure.in: Adjustments to NLS, so .sed scripts may now all
+ reside in intl/.
+
+1995-06-13 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (pot): New goal, triggering po/tar.pot.
+
+1995-06-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Substitute POTFILES by contents of po/POTFILES.
+
+ * configure.in: More adjustments for GNU gettext 0.6.
+ * config.guess, config.sub: New files, all taken from gettext 0.6.
+
+1995-06-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (check): New goal.
+
+1995-05-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (DISTFILES): Do not distribute SUPPORT, now
+ integrated in the documentation.
+ Reported by Karl Berry.
+
+1995-05-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for isascii, not iascii.
+ Reported by Alan Modra, Bruno Haible and Greg McGary.
+
+1995-05-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.7.
+
+ * Makefile.in (DISTFILES): Distribute NLS.
+ * configure.in, acconfig.h: Many adjustments for GNU gettext.
+
+1995-05-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Clean glocale out.
+ * Makefile.in (SUBDIRS): Add po.
+ * Makefile.in (pofile): New goal.
+
+1995-05-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Call ud_WITH_NLS, create intl/Makefile.in.
+ Compute size of unsigned short and unsigned int.
+
+ * acconfig.h: Document ENABLE_NLS, HAVE_CATGETS and HAVE_GETTEXT.
+ * Makefile.in: Process intl subdirectory.
+
+ * configure.in (LINGUAS): Add pt.
+ * src/pt.po: New file, for Portuguese.
+ Reported by Antonio Jose Coutinho.
+
+1995-03-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Remove GLOCALE, add LINGUAS, use fp_WITH_CATALOGS.
+ * acconfig.h: Add description for WITH_CATALOGS.
+
+1995-02-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in, Makefile.in: Replace `date' by `echo timestamp'.
+
+1995-02-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Support ID files. Do not distribute TAGS.
+
+1995-02-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (maintainer-clean): New name for realclean.
+
+1995-01-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for <sys/ioccom.h>.
+ Reported by Joseph E. Sacco.
+
+1995-01-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (DISTFILES): Distribute SUPPORT, with *pre*-releases.
+
+1994-12-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for isascii.
+ Reported by Bruno Haible.
+
+1994-12-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Use fp_WITH_REGEX.
+ * acconfig.h: Document WITH_REGEX.
+
+1994-12-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * src/de.tt: New file, for German.
+ Reported by Ulrich Drepper.
+
+1994-12-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.6.
+
+ * configure.in: Localize, adapting from how it is done in sharutils.
+
+ * src/fr.tt: New file, for French.
+
+ * configure.in, {,*/}Makefile.in, acconfig.h:
+ Rename PRODUCT to PACKAGE.
+
+1994-11-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for <libintl.h> and <locale.h>.
+
+1994-11-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for const only after having found possible
+ ANSIfying compiler flags, this is of no use to check it before.
+
+1994-11-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * {,*/}Makefile.in: Clean up, following those of GNU m4. I will
+ not detail all the changes here.
+ * configure.in: Likewise.
+ * acconfig.h: Document PRODUCT and VERSION.
+
+1994-10-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Correct shell assignment for ac_cv_path_RSH.
+ Reported by Kaveh R. Ghazi.
+
+1994-09-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Cleanup... Use subshells for all cd's.
+ (MDEFINES): Do not use $(INSTALL...), because ./install-sh will
+ not be relocated correctly.
+ (DISTFILES): Distribute install-sh, not install.sh.
+ (tags): Make only in lib and src.
+ (TAGS): Deleted.
+ (distclean, realclean): Remove config.status.
+ (distclean-local): Don't.
+ (*-recursive): Combine, use sed to strip -recursive in subgoals.
+ (Makefile): Have ./config.status create this Makefile only.
+ (stamp-h): Have ./config.status create config.h only. Do not
+ create stamp-h here, it is now done from configure.
+ (stamp-h.in): Use date instead of touch.
+ * configure.in (AC_OUTPUT): Create stamp-h.
+
+1994-09-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Use fp_ macros for accessing aclocal.m4. Revert
+ _OS_ macros to their previous names, to follow Autoconf.
+
+1994-09-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Delete AC_OS_XENIX, now within AC_HEADER_DIRENT.
+
+1994-09-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in (PROGS): Warn if $DEFAULT_ARCHIVE was specified,
+ while not being found on the current system.
+ Reported by Robert Bernstein.
+
+1994-08-31 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Distribute it.
+
+ * Makefile.in (distclean-local): Delete config.log.
+
+1994-08-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * acconfig.h: Document HAVE_UNION_WAIT, no more in Autoconf.
+
+1994-08-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Replace AC_SYS_REMOTE_TAPE by its definition,
+ distillating it around. It is going out of Autoconf.
+ Do not backslash quotes anymore while defining unquoted, this is
+ now corrected in Autoconf.
+
+1994-08-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Do not define RTAPELIB nor HAVE_RTAPELIB.
+
+1994-08-22 François Pinard <pinard@iro.umontreal.ca>
+
+ Little cleanup in installation:
+ * configure.in: Do not check for wait3, this function is not used.
+ * Makefile.in: Remove useless RSH substitutions.
+
+ * configure.in: Use `-g -O' instead of `-g' as CFLAGS default
+ value, when GNU C is being used. Delay testing for presets.
+ Reported by Chris Arthur.
+
+1994-08-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.5.
+
+ * Makefile.in (BACKLOG, dist, shar): Correct for when a different
+ build directory.
+
+ * configure.in: Check for union wait. Adapted from make 3.71.
+
+ * configure.in: Replace both mkdir and rmdir, not just mkdir,
+ because NS32016 running SysVr2.2 has mkdir and lacks rmdir.
+ Reported by Greg Black.
+
+ * configure.in: Do not try anymore to discover the archive device
+ by looking around for various device names. If the installer does
+ not override it, nicely use `-' as a convenient default.
+ Reported by Andreas Schwab and Kaveh R. Ghazi.
+
+1994-08-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Correct a checking message.
+ Reported by Bruno Haible.
+
+1994-08-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Replace AC_PROG_RSH with its expansion. Correct
+ the no/true confusion in tests. Do not substitute RSH anymore in
+ src/Makefile, instead define REMOTE_SHELL in config.h. Replace
+ NO_REMOTE by HAVE_RTAPELIB, with inverted meaning. Substitute
+ RTAPELIB by $Urtapelib.o instead of rtapelib.o.
+ * acconfig.h: Document HAVE_RTAPELIB and REMOTE_SHELL.
+ Reported by Andreas Schwab.
+
+ * configure.in: Checking for remote shell, use the RSH environment
+ variable if set. This is done only when not already in the cache.
+ Reported by Kaveh R. Ghazi.
+
+ * configure.in: Include <sys/types.h> when testing <utime.h>.
+ Reported by Andreas Schwab.
+
+ * configure.in: Also create doc/Makefile.
+ * Makefile.in: Add doc in subdirs, set infodir, update MDEFINES.
+
+1994-08-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Undo the `test -b' patch of 1994-08-05. Ultrix
+ 4.2 test does not know about -b. Grrr...
+ Reported by Kaveh R. Ghazi.
+
+ * configure.in: Check for <sys/gentape.h>, HAVE_SYS_GENTAPE_H
+ is tested in rmt.c. Check for <sys/tape.h>, to avoid playing
+ with M_UNIX anymore in rmt.c.
+ Reported by Daniel R. Guilderson and Kaveh R. Ghazi.
+
+ * configure.in: Use proper function names in AC_CHECK_LIB's.
+ Reported by Alexander Dupuy and Kurt Jaeger.
+
+ * configure.in: Use $LIBOBJS, not LIBOJBS, while adding to it.
+ Reported by Demizu Noritoshi and Kaveh R. Ghazi.
+
+1994-08-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.4.
+
+1994-08-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Decide MTIO_CHECK_FIELD by grepping <sys/mtio.h>.
+ * acconfig.h: Document it.
+ Reported by Ben A. Mesander.
+
+ * Makefile.in: Substitute CC, INSTALL, INSTALL_PROGRAM,
+ INSTALL_DATA, RSH, CFLAGS, LDFLAGS, LIBS, prefix, exec_prefix,
+ binprefix, bindir and libexecdir.
+ (MDEFINES): New, using the previous substitutions.
+ (all, install, uninstall): Use it.
+ Reported by Bruno Haible.
+
+1994-08-13 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for <sys/wait.h>.
+
+1994-08-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: For <utime.h>, also ensure struct utimbuf is
+ defined by the header file before defining HAVE_UTIME_H. Some
+ systems will not define the structure without _POSIX_SOURCE.
+ * acconfig.h: Document HAVE_UTIME_H.
+ Reported by James W. McKelvey and Robert E. Brown.
+
+ * configure.in: Instead of replacing strstr, check for it, so
+ HAVE_STRSTR gets defined, then replace it explicitely if required.
+
+1994-08-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Updated for Autoconf 2.0.
+
+1994-08-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Replace memset, mkdir (and rmdir), rename, strstr,
+ ftruncate, when not found.
+ Reported by Kaveh R. Ghazi (for memset and strstr).
+ Reported by Bruno Haible (for mkdir and rename).
+
+1994-08-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Remove padding test.
+ * acconfig.h: Remove PADDING_IN_TAR_HEADER.
+ Reported by Bruno Haible.
+
+ * configure.in: While defining DEFAULT_ARCHIVE, check for a block
+ device, instead of mere existence. But is `test -b' portable?
+ Test for /dev/fd0, instead of for /dev/fd. Put rct tests last.
+ Reported by Andreas Schwab.
+
+ * configure.in: Define uid_t and gid_t if necessary.
+ Reported by Jonathan I. Kamens.
+
+ * Makefile.in (distclean-local): Delete config.cache.
+ Reported by Thomas Koenig.
+
+ * configure.in: Change malloc_dbg to dmalloc, mutatis mutandi.
+ * acconfig.h: According changes.
+
+ * configure.in: Test for broken stat macros, and for mkfifo.
+
+ * configure.in: Check for ST_BLKSIZE and ST_BLOCKS.
+
+1994-08-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.3.
+
+ * Makefile.in (dist, shar): Distribute the scripts directory.
+
+1994-08-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for <memory.h>.
+
+1994-07-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: When --with-malloc-dbg, define WITH_MALLOC_DBG and
+ add -lmalloc_dbg to LIBS.
+ * acconfig.h: Document WITH_MALLOC_DBG.
+
+ * configure.in: Try deciding DEVICE_PREFIX and DENSITY_LETTER from
+ the selected DEFAULT_ARCHIVE.
+ * acconfig.h: Document DEVICE_PREFIX and DENSITY_LETTER.
+ Reported by Danny R. Johnston.
+
+1994-07-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * aclocal.m4: Adapt AC_PROTOTYPES to caching.
+
+ * Using configure as generated by a more recent Autoconf solves a
+ problem of rename being rejected on HP-UX in ANSI mode, because of
+ a conflicting prototype from <stdio.h>. In this context, Autoconf
+ now uses ctype.c instead for defining __stub macros.
+ Reported by Alan Modra, Burkhard Plache, Edward Welbourne,
+ Henrik Bakman, Jeffrey Goldberg, Jim Farrell, Kimmy Posey,
+ Michael Maass, Mike Nolan, Richard Lloyd, Robert McGraw,
+ Robert W. Kim, Stefan Skoglund, Tarang Kumar Patel, Tilman
+ Schmidt, Tim Ramsey, Van Snyder and W. Phillip Moore.
+
+1994-07-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for <fcntl.h>. Do not define BSD42, do
+ not look anymore if /vmunix, /sdmach or /../../mach exist.
+ * acconfig.h: Remove BSD42.
+
+1994-07-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Add gmalloc.o to LIBOBJS, instead of AC_SUBST'ing
+ MALLOC. Check for valloc only if gmalloc.o is not being selected.
+ valloc was possibly defined both in "port.h" and GNU malloc.
+ * acconfig.h: Add a description for HAVE_VALLOC.
+ J.T. Conklin, Nelson H.F. Beebe and Tilman Schmidt.
+
+1994-07-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Use provided fnmatch only as a replacement.
+
+ * configure.in: Check for <sys/io/trioctl.h>, needed for
+ defining _IOW and _IOR on the Tektronix XD88.
+ Reported by Kaveh R. Ghazi.
+
+1994-07-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (BACKLOG): New goal, for summarizing the
+ maintainance backlog. Distribute file BACKLOG.
+
+1994-07-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * regex.c, regex.h: Use newer versions. This solves a few
+ problems reported by users.
+ Reported by Chris Hopps and John David Anglin.
+
+1994-07-06 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for <utime.h>.
+
+1994-07-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Substitute DEFAULT_ARCHIVE and DEFAULT_BLOCKING
+ from the environment. Check for /dev/tape first while trying to
+ decide the default archive, because it is often symlinked right.
+ * acconfig.h: Explain DEFAULT_ARCHIVE and DEFAULT_BLOCKING.
+
+ * configure.in: Use AC_SET_MAKE.
+ * Makefile.in: Use @SET_MAKE@.
+ Reported by Jim Meyering.
+
+ * configure.in: Integrate the check, previously in testpad.c,
+ about a needed padding field in the tar header struct.
+ * acconfig.h: Explain PADDING_IN_TAR_HEADER.
+
+1994-07-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Check for -linet, this library is required on
+ a few systems for gettimeofday() or getservbyname(). Also, on ISC
+ 4.0, this avoids a broken version of rename().
+ Reported by Dean Gaudet, Goeran Uddeborg, Mike Rogers and
+ Peder Chr. Norgaard.
+
+ * configure.in: Ensure -lsocket is tested after -lnsl. This is
+ required in particular for SINIX-Z, an SVR4.0 system.
+ Reported by Manfred Weichel and Mark Frost.
+
+ * configure.in: All tests reordered for clarity.
+
+1994-07-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: Use AC_TIME_WITH_SYS_TIME, test for <sys/time.h>.
+ This should solve the problem of multiple inclusions of <time.h>.
+ Also, also check for <sys/timeb.h>, for getdate.y tests this.
+ Reported by Jim Meyering, John Rouillard, Karl Berry and Rick
+ Emerson.
+
+1994-06-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * configure.in: AC_CONST was already added since 1.11.2, but no
+ ChangeLog entry for it, so here is one, with list of reporters.
+ * AIX 3.2 RS/6000 IBM's compiler was unable to compile regex.c,
+ this might be solved already through improved Autoconf tests.
+
+ Reported by Alexey Vovenko, Ben A. Mesander, Bryant
+ Fujimoto, Christian. T. Dum, Christopher Vickery, Dan Bloch,
+ David K. Drum, David Lemson, Demizu Noritoshi, Dimitris
+ Fousekis, Ezra Peisach, Hugh Secker-Walker, Indra Singhal,
+ J.T. Conklin, Jan Hoeglund, Janice Burton, Jeff Siegel,
+ Jim Blandy, John L. Chmielewski, John Rouillard, Jonathan
+ N. Sherman, Kevin D Quitt, Kurt Jaeger, Mark Frost, Matthew
+ Braun, Michael Kubik, Michael Helm, Moritz D. Klingholz,
+ Neil Jerram, Nelson H.F. Beebe, Nick Barron, Paul Eggert,
+ R. Scott Butler, Rob Parry, Ron Guilmette, Scott Grosch,
+ Sherwood and Stephen Saroff.
+
+ * Makefile.in: Completely replaced, lurking at the previous one.
+ At the same time, solve a few minor problems reported by users.
+ The most frequently reported ones pertained to a trailing \ in a
+ comment, and rmt installing in /etc.
+ Reported by Dean Gaudet, Gerben Wierda, James W. McKelvey,
+ John L. Chmielewski, Karl Berry, Mike Rogers, Ralf Suckow and
+ Richard Lloyd.
+
+ * configure.in: Also process lib/Makefile.in and src/Makefile.in.
+ Substitute CFLAGS, LDFLAGS and YFLAGS from the environment.
+ Use AC_CHECKING instead of using echo explicitely.
+ Use AC_HEADER_CHECK(unistd.h) instead of obsolete AC_UNISTD_H.
+
+ * configure.in: Generate a configuration header file. This not
+ only puts less clutter in make output, but also goes around some
+ compilers' limits about the number of allowed -D options.
+ Reported by Nelson H.F. Beebe.
+
+ * acconfig.h: New file.
+
+ * Split distribution into a few subdirectories, for easing
+ maintainance. So far: src, lib, scripts, msdos which are to be
+ distributed; then rmail, texinfo, ARCH and misc to be kept here.
+ * scripts/ChangeLog: Initialized by moving entries related to
+ scripts out of this ChangeLog.
+
+ * Taking over maintenance duties.
+
+
+----- doc/ChangeLog -----
+
+1997-04-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.12.
+
+ * Makefile.am (EXTRA_DIST): Remove tar-mew.texi for the release.
+ (tar.dvi) [!PUBLISH]: Delete @smallbook. Call sed in all cases.
+
+1997-04-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11o.
+
+ * Makefile.am (tar.info): Comment about needed makeinfo version.
+ Reported by Sherwood Botsford.
+
+1997-04-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (EXTRA_DIST): Add tar-mew.texi.
+
+1997-03-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (tar.dvi): Merely use tar.texi and rely on -I to
+ resolve it in $(srcdir). Remove tmp-tar.info* files right away.
+ (CLEANFILES): Define to tmp-*.
+
+1997-03-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Rename RENDERING, QUALITY, DRAFT and DEBUG to
+ RENDITION, PUBLISH, DISTRIB and PROOF respectively. Ensure that
+ `@set DISTRIB' gets replaced after macro-expansion and before TeX.
+
+1996-11-06 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.13.
+
+ * getdate.texi: New file, from elsewhere.
+ * tar.texi: Replace a lot of text by an include of getdate.texi.
+ * Makefile.am: Adjusted.
+
+1996-08-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.12.
+
+ * Makefile.am (EXTRA_DIST): Remove texinfo.tex, now that Automake
+ handles it automatically.
+
+1996-07-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.11.
+
+ * Makefile.am (tar.info): Remove -I$(srcdir), which was useless.
+
+1996-07-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (EXTRA_DIST): Include texinfo.tex, until Automake
+ does it automatically.
+
+1996-07-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.10.
+
+ * Makefile.am (EXTRA_DIST): Distribute convtexi.pl, for now.
+
+1996-04-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Implement rendering levels (QUALITY, DRAFT or DEBUG).
+
+1996-04-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (EXTRA_DIST): New name for DIST_OTHER.
+
+1996-03-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (tar.dvi): Comment about needed makeinfo version.
+ Reported by Jonathan Thornburg.
+
+1996-02-12 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Replace TEXINFO by info_TEXINFOS for Automake 0.29.
+
+1996-01-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Select gnits.
+
+1996-01-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: New file.
+ * tar.texi: New name for tar.texinfo.
+
+1995-12-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (check): New goal, doing nothing.
+ Reported by Cesar Romani, Joachim Seelig, Mark Bynum and Ulrich
+ Drepper.
+
+1995-11-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (clean): Remove tmp-* files.
+
+1995-11-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Use -I$(srcdir) with makeinfo, and -otmp-tar.info
+ so tar.info in build directory does not shadow the real one.
+ (tar.dvi): Depend on version.texi. Add $(srcdir) to TEXINPUTS so
+ texinfo.tex is found, as texi2dvi gets no clue from the file name.
+ (DISTFILES): Also distribute tar.info-8.
+
+1995-11-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (DISTFILES): Distribute ChangeLog.
+ * ChangeLog: New file, extracted from top-level ChangeLog.
+
+1995-06-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Get rid of docwarn.texi, now replaced by
+ the @UNREVISED macro, right into tar.texinfo.
+
+1995-06-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (tar.dvi): First macro-expand tar.texinfo.
+
+1995-06-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Use subdir and distdir.
+
+1995-06-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.texinfo: Use header.texi.
+ * Makefile.in: Prepare header.texi from src/tar.h.
+ Distribute it.
+
+1995-05-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (DISTFILES): Add tar.info-3.
+ Reported by Bruno Haible.
+
+1995-02-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Replace `date' by `echo timestamp'.
+
+1995-02-13 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Use top_srcdir.
+
+1995-02-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (maintainer-clean): New name for realclean.
+
+1994-12-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (DISTFILES): Include docwarn.texi.
+
+1994-11-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (stamp-vti): Use new -r option to date.
+
+1994-11-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (realclean): Also remove stamp-vti.
+
+1994-09-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Cleanup...
+ (texclean): Deleted, merged into mostlyclean.
+ (Makefile): Have ./config.status create this Makefile only.
+
+1994-08-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (tar.info): Make the documentation in the source
+ directory only.
+
+1994-08-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Correct for when a different build directory.
+
+ * docwarn.texi: New file.
+ * Makefile.in: Distribute it.
+
+1994-08-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: New file.
+ * tar.texinfo: New file.
+ * texinfo.tex: New, from elsewhere.
+
+
+----- lib/ChangeLog -----
+
+1997-04-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.12.
+
+1997-04-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11p.
+
+ The distribution did not have getdate.c updated:
+ * Makefile.am (libtar_a_SOURCES): Use getdate.y, not getdate.c.
+ (EXTRA_DIST): Do not include getdate.y anymore.
+ * getdate.c: Specify $(srcdir)/, to silence GNU make.
+ Reported by Bruno Haible.
+
+1997-04-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (getdate.c): Announce 13 conflicts, not 10.
+ Reported by Bruno Haible, Bryant Fujimoto and Wolfram Wagner.
+
+1997-04-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11o.
+
+ * getdate.h: New file.
+ * Makefile.am: Adjusted.
+
+1997-04-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * modechange.c, modechange.h: New files.
+ * Makefile.am: Adjusted.
+
+1997-02-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Adapt library name to Automake 1.1l.
+
+1996-11-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.14.
+
+ * basename.c: New file.
+
+1996-11-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.13.
+
+ * Makefile.am: Use tar_DEPENDENCIES. Avoid BUILT_SOURCES,
+ put getdate.c instead of getdate.y in tar_SOURCES and keep
+ getdate.c in EXTRA_DIST.
+
+1996-11-06 François Pinard <pinard@iro.umontreal.ca>
+
+ * argmatch.c, argmatch.h, backupfile.c, backupfile.h, dirname.c,
+ getversion.c: New files.
+ * Makefile.am: Adjusted.
+ Reported by Marty Leisner.
+
+1996-10-31 François Pinard <pinard@iro.umontreal.ca>
+
+ * safe-stat.h: Deleted.
+ * Makefile.am (noinst_HEADERS): Adjusted.
+ Reported by Jim Meyering.
+
+1996-09-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * regex.c, regex.h, rx.c, rx.h: Deleted.
+ * Makefile.am: Adjusted.
+
+1996-09-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.12.
+
+ * execlp.c: Include stdio.h, not only stdio!
+
+1996-09-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * open3.h: File deleted after being merged into system.h.
+ * open3.c: File deleted, moved back into src/.
+ * Makefile.am: Adjusted.
+ Reported by Jim Meyering.
+
+1996-08-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (EXTRA_DIST): $(BUILT_SOURCES) is no longer
+ necessary, as Automake now handles it automatically.
+
+1996-07-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.11.
+
+ * Makefile.am (EXTRA_DIST): Move stpcpy.c there, from tar_SOURCES.
+ Reported by Ulrich Drepper.
+
+1996-04-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.10.
+
+ * Makefile.am (EXTRA_DIST): New name for DIST_OTHER.
+
+1996-02-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * msleep.c: New file, from elsewhere.
+ * Makefile.am: Adjusted.
+
+1996-02-12 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Remove CONFIG_HEADER, not required by Automake 0.29.
+
+1996-01-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Select gnits.
+
+1996-01-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Add parts of previous Makefile.in as FIXME comments.
+
+1996-01-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * error.h: New file, from elsewhere.
+ * Makefile.am: Add error.h to HEADERS.
+ Reported by Jim Meyering.
+
+1995-12-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (INCLUDES): Add -I../intl to get libintl.h.
+ Reported by Daniel S. Barclay, Göran Uddeborg, Jonathan Thornburg
+ and Minh Tran-Le.
+
+1995-12-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.9.
+
+ * Makefile.am: New file.
+
+1995-11-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (DISTFILES): Distribute ChangeLog.
+ * ChangeLog: New, extracted from the top-level ChangeLog.
+
+1995-06-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * execlp.c (execlp): New, extracted from src/port.c.
+ * Makefile.in: Adjusted.
+
+ * open3.h: New, moved from src/.
+ * open3.c: New, extracted from src/port.c.
+ * Makefile.in: Adjusted.
+ Clean out old NO_OPEN3 code.
+
+ * insremque.h, insremque.c: Deleted.
+ * Makefile.in: Adjusted.
+
+1995-06-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (DISTFILES): Remove COPYING.LIB.
+ * COPYING.LIB: Deleted.
+
+1995-06-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (dist): Do not hide copying rule.
+
+1995-06-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Use subdir and distdir.
+
+ * stpcpy.c, xgetcwd.c: New functions needed by gettext.
+ * Makefile.in: Adjusted to always compile these.
+
+1995-05-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * insremque.h, insremque.c: New files, from GNU gettext.
+ * Makefile.in: Take care of insremque.[hc].
+
+1995-03-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Remove GLOCALE, add LINGUAS, use fp_WITH_CATALOGS.
+
+1995-02-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Support ID files. Do not distribute TAGS.
+
+1995-02-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (maintainer-clean): New name for realclean.
+
+1994-12-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * safe-stat.h: New, from elsewhere. This solves the fact that
+ mkdir.c, rmdir.c and rename.c were needing it.
+ * Makefile.in (Makefile): Distribute it.
+ Reported by Bruno Haible and Sherwood Botsford.
+
+1994-12-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * rx.c, rx.h: New, from elsewhere.
+ * Makefile.in: Adjust accordingly.
+
+1994-12-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Localize, adapting from how it is done in sharutils.
+
+1994-09-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Cleanup...
+ (DISTFILES): Distribute TAGS.
+ (check): Deleted.
+ (TAGS): Make TAGS in $(srcdir) only.
+ (distclean): Do not remove TAGS.
+ (realclean): Remove TAGS.
+ (Makefile): Have ./config.status create this Makefile only.
+
+1994-08-22 François Pinard <pinard@iro.umontreal.ca>
+
+ Little cleanup in installation:
+ * Makefile.in (install, check): Depend on all.
+
+1994-08-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Correct for when a different build directory.
+
+ * rmdir.c: New, split out of mkdir.c.
+ * Makefile.in: Distribute it.
+ Reported by Greg Black.
+
+1994-08-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * ftruncate.c: Revised, because there is no ftruncate
+ capability whatsoever in Interactive Unix.
+ Reported by Peder Chr. Norgaard.
+
+1994-08-08 François Pinard <pinard@iro.umontreal.ca>
+ * memset.c, mkdir.c, rename.c, strstr.c and
+ ftruncate.c: New, from elsewhere.
+ * Makefile.in: Distribute them.
+
+1994-08-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (getdate.c): Tell the installer to expect 10
+ shift/reduce conflicts instead of 9.
+ Reported by Andreas Schwab.
+
+ * fileblocks.c: New, from elsewhere.
+ * Makefile.in: Distribute it.
+
+1994-08-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * xstrdup.c: New, from elsewhere.
+ * Makefile.in: Adjusted.
+
+1994-07-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * error.c: Add error_print_progname virtual routine.
+
+1994-07-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * gmalloc.c: New, from elsewhere. This renames and updates
+ what was previously malloc.c. This also solves __const vs const.
+ * Makefile.in: Distribute gmalloc.c.
+ Reported by Cliff Krumvieda, Francois Pinard, Henrik Bakman,
+ J.T. Conklin, Nelson H.F. Beebe and Tilman Schmidt.
+
+1994-07-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (LIBOBJS): Get configured list of replacements.
+ * fnmatch.h: Undefine FNM_PATHNAME and FNM_PERIOD, for HP-UX
+ defines them in <unistd.h>.
+
+ * getdate.y: Acknowledging here a few reports which are
+ likely solved by going to an updated version of getdate.y.
+ Reported by Andrey A. Chernov, Bruce Evans, Dean Gaudet, Ian
+ T. Zimmerman, Jeff Prothero, Mike Nolan, Milan Hodoscek, Peder
+ Chr. Norgaard, Sarah Quady, Tarang Kumar Patel and Thomas
+ Koenig.
+
+1994-07-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * xmalloc.c: New file, from elsewhere.
+ * error.c: New, from elsewhere.
+ * Makefile.in: Adjusted.
+
+1994-06-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: New file.
+
+
+----- po/ChangeLog -----
+
+1997-04-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.12.
+
+1997-04-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11p.
+
+ * fr.po: Updated file.
+
+1997-04-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11o.
+
+1997-03-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * it.po: New file.
+
+1997-02-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * pl.po: Updated file.
+
+1996-11-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * POTFILES.in: Add src/common.h.
+ Reported by Christian Kirsch.
+
+1996-11-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.14.
+
+ * POTFILES.in: Adjust for changes in src/.
+
+1996-09-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.12.
+
+ * pl.po: New file.
+
+1995-06-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.11.8.
+
+ * Makefile.in (.po.gmo): Force moving the created .gmo file to
+ $(srcdir), in case it was not already found and replaced there.
+ (install-data): Find files in $(srcdir) if not in current dir,
+ because .gmo files are taken there, right out the distribution.
+ * intl/Makefile.in (DISTFILES): Ensure an all ready stamp-cat-id
+ and cat-id-tbl.c into the distribution.
+ (stamp-cat-id): Rewrite rule so it replaces files in $(srcdir),
+ remove a useless rm and cat.
+
+ * intl/cat-compat.c, int/gettext.h, intl/po-to-tbl.sed,
+ Makefile.in: Last minutes additions, and glimpses to the future
+ gettext 0.6.1.
+ Reported by Ulrich Drepper.
+
+ * Makefile.in (install-data, uninstall): Avoid using basename.
+
+1995-06-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (dist): Comment out tupdate action for now, it
+ needs more tweeking before being distributed active.
+
+ * intl/Makefile.in (dist), Makefile.in (dist): Correct
+ missing reference to $(srcdir) on cp call, also avoid outputting
+ clutter while doing the work.
+
+ * intl/Makefile.in: Use top_srcdir for referring to $(PACKAGE).pot.
+
+ * Makefile.in (.po.gmo): Get around what seems to be an msgfmt
+ bug, which adds .mo even to FILE in `-o FILE'.
+
+ * intl/Makefile.in, Makefile.in: Adjustments to NLS, so .sed
+ scripts may now all reside in intl/.
+
+1995-06-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * POTFILES: New file.
+ * Makefile.in: Use POTFILES instead of TRANSCSRCS, also use
+ top_srcdir.
+
+ * intl/linux-msg.sed, intl/po-to-tbl.sed, intl/xopen-msg.sed: New
+ files, all taken from gettext 0.6.
+
+1995-06-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * intl/*: New from GNU gettext 0.6, replacing the previous
+ version of this directory. This change should solve many problems.
+
+ Reported by Bruno Haible, Christopher Vickery, Jan Carlson,
+ Jean-Philippe Martin-Flatin, John David Anglin, Joseph E.
+ Sacco, Kaveh R. Ghazi, Kurt Jaeger, Mark W. Eichin, Marty
+ Leisner, Minh Tran-Le, Stephen Saroff, Thomas Koenig, Thomas
+ Krebs and William Bader.
+
+1995-05-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * intl/Makefile.in, Makefile.in: Many adjustments for GNU gettext.
+
+1995-05-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: New file.
+ * de.po, fr.po, pt.po, sv.po: New files, adapted from
+ the corresponding .tt files in src/.
+
+1995-05-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * intl/*: New, from nlsutils.
+
+1995-01-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * src/de.tt: New file, for Swedish.
+ Reported by Jan Djarv.
+
+1994-12-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * de.tt: New file, for German.
+ Reported by Ulrich Drepper.
+
+
+----- scripts/ChangeLog -----
+
+1997-04-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.12.
+
+ * level-1, level-0: Replace --block-size by --blocking.
+
+1996-04-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.10.
+
+ * Makefile.am (EXTRA_DIST): New name for DIST_OTHER.
+
+1996-01-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Select gnits.
+
+1996-01-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: New file.
+
+1995-12-31 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (check, dvi): New goals, doing nothing.
+ Reported by Cesar Romani and Ulrich Drepper.
+
+1995-06-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.9.
+
+ * Makefile.in: Distribute the ChangeLog, now recovered!
+ Reported by Andreas Schwab.
+
+1995-06-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.11.8.
+
+ * WARNING: New file.
+ * Makefile.in (DISTFILES): Distribute it.
+
+1995-06-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * sripts/Makefile.in (dist): Do not hide copying rule.
+
+1995-06-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Use subdir and distdir.
+
+1995-02-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.7.
+
+ * Makefile.in (maintainer-clean): New name for realclean.
+
+1994-12-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.6.
+
+ * ChangeLog: Replaced by a warning for now. It has
+ seemingly been overwritten by the weekly script :-(.
+
+ * Makefile.in (dist): Correct .../examples to .../scripts.
+
+1994-09-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Cleanup...
+ (check): Deleted.
+ (Makefile): Have ./config.status create this Makefile only.
+
+1994-06-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.5.
+
+ * ChangeLog: Initialized by moving entries related to
+ scripts out of this ChangeLog.
+
+1993-11-24 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * dump-remind: Send mail notification to the original recipients
+ that the dump has been continued when that is the case.
+
+1993-03-31 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * level-0, level-1 (LOGFILE): Put logfile in `log' subdirectory.
+
+1993-03-28 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * dump-remind (volno): Don't increment by one.
+
+1993-03-25 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * level-0, level-1 (TAR_PART1): Use `--block-size', not just
+ `--block', which is now ambiguous.
+
+1993-03-24 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * backup-specs (TAR): New variable.
+
+ * level-0, level-1 (TAR_PART1): Get path of GNU tar from `TAR'
+ variable, don't hardcode it.
+
+1993-03-20 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * backup-specs (SLEEP_MESSAGE): put backslashes in front of nested
+ double quotes.
+
+ * level-0, level-1 (BACKUP_DIRS): Don't put in quotes.
+ (LOGFILE): Use sed to construct name, not awk.
+
+ * dump-remind (recipients): Replaced inefficient pipeline with a
+ single, simple sed script.
+ (volno): Deal with the possibility that VOLNO_FILE may not be
+ created yet.
+
+1993-03-19 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * backup-specs (VOLNO_FILE): Removed abusive comment by Noah.
+
+1993-03-18 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * Makefile.in (AUX): Include `dump-remind' in distribution.
+
+ * backup-specs (SLEEP_MESSAGE): New variable.
+ level-0, level-1: Use it instead of external `dont_touch' file.
+
+ * level-0, level-1: Put most of the script in () and pipe
+ everything from the subshell through tee -a $LOGFILE. Since you
+ really want most of the output to go to the logfile anyway, and
+ since all those pipelines were preventing one from getting the
+ exit status of most commands, this seems like the right idea.
+
+ * level-0, level-1 (LOGFILE): Use YYYY-MM-DD (all numeric) format
+ for log file name, since that makes the file names sortable in a
+ coherent way. Suffix should always be `level-n' where n is the
+ dump level. level-0 script was just using `-full' instead.
+
+ * level-0, level-1 (DUMP_LEVEL): New variable. Set to `0' or `1'
+ in each script as appropriate.
+
+ * level-0, level-1 (HOST): Renamed to `localhost' for clarity.
+ (host): renamed to `remotehost' for clarity.
+
+ * level-0, level-1 (startdate): New variable. Use it in Subject
+ line of mailed report.
+
+ * level-0, level-1: Fixed all instances where sed is called with a
+ script on the command line to use `-e' option.
+
+ * level-0, level-1: Don't try to call logfile.sed to filter
+ LOGFILE. It's not distributed with tar and was never really used
+ anyway.
+
+ * level-0, level-1: Put quotes around most variable names (barring
+ those that are known to intentionally contain text that should be
+ expanded into multiple words, like `TAR_PART1').
+
+ * level-0, level-1: Got rid of annoying trailing backslashes in awk
+ scripts. They were gratuitous. Made them a little more readable
+ by adding some whitespace.
+
+1992-10-21 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * level-0, level-1: put curly braces around variables for clarity.
+
+ * backup-specs (DUMP_REMIND_SCRIPT): define it (but commented out
+ so that distributed dump scripts won't use it by default).
+ level-0, level-1 (TAR_PART1): use --info-script if
+ DUMP_REMIND_SCRIPT is defined.
+ dump-remind: new file (intended as an example).
+
+1992-10-15 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * level-0, level-1: remove $LOGFILE.tmp files before exiting.
+
+1992-09-24 Michael I Bushnell <mib@churchy.gnu.ai.mit.edu>
+
+ * level-0, level-1 (TAR_PART1): remove --atime-preserve
+ because of a total screw.
+
+1992-09-10 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * level-0, level-1 (TAR_PART1): put --atime-preserve inside quotes.
+
+1992-09-09 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * level-0, level-1 (TAR_PART1): Use --atime-preserve.
+
+1992-07-10 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * level-0, level-1: Avoid silly Sun awk lossage.
+
+1992-04-30 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * level-1: Added `$' before VOLNO_FILE in definition of TAR_PART1.
+ Added line to remove $VOLNO_FILE from any previous dump before
+ starting.
+
+ * level-0, level-1: Change long options to use `--' instead of `+'
+ (support for `+' will go away soon)
+
+1991-10-17 Michael I Bushnell <mib@churchy.gnu.ai.mit.edu>
+
+ * level-0: Repair damage from previous mod: stdin to rsh must
+ be the terminal or tar's questions lose.
+
+1991-08-31 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * level-0: Fixed several syntax errors associated with
+ stdout/stderr redirection.
+ Made sure remote host executes commands from sh where redirection
+ is necessary, since root's shell might be csh in some places and
+ the redirect syntax differs.
+
+1991-07-01 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * Fix a misplaced quote in level-0 and change some >& into
+ 2>&1.
+
+
+----- src/ChangeLog -----
+
+1997-04-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.12.
+
+ * tar.c (main): Attempt to clarify the delayed error exit message.
+ Reported by Richard Stallman.
+
+ * list.c (decode_mode): New name for demode.
+
+ * list.c (read_and): Set current_stat.st_mtime before testing it.
+ Reported by Sven Verdoolaege.
+
+1997-04-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * create.c (dump_file): Before asserting that we cannot access
+ a directory, make sure tar is not installed suid root.
+ Reported by Dietmar Braun.
+
+ * misc.c (quote_copy_string): Undo 1996-05-02 change, meant for
+ the file mangler, now obsolete. This will do neater listings.
+ Reported by Max Hailperin and Noah Friedman.
+
+ * buffer.c, incremen.c, misc.c, tar.c: Replace dangling semicolons
+ by continue; or break; depending on context.
+ Reported by Robert E. Brown.
+
+1997-04-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * arith.c (add_to_tarlong_helper): Compare a superdigit against a
+ value, rather than an unsigned sum against zero.
+ Reported by Bruno Haible.
+
+ * misc.c (quote_copy_string): Replace many if's by a switch.
+
+1997-04-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11q.
+
+ * extract.c (extract_archive): Check if directory extraction was
+ attempted over an existing directory before attempting recovery,
+ so avoiding extraction loops in cases like DIR/../DIR.
+ Reported by Marc Boucher.
+
+ * delete.c (delete_archive_members): New name for junk_archive.
+ * common.h, tar.c (main): Adjusted.
+
+1997-04-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (usage): Update comment about --mode.
+
+1997-04-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c: Include <fnmatch.h> if necessary.
+ Reported by Bruno Haible.
+
+ * common.h: Declare write_dir_file for incremen.c.
+ Reported by Bruno Haible.
+
+ * incremen.c (get_directory_contents): Nest an assignment and test
+ within another set of aesthetical parentheses.
+ Reported by Bruno Haible.
+
+ * tar.c (check_octal): Deleted.
+ Reported by Bruno Haible.
+
+ * buffer.c (flush_archive): Add one impossible switch case.
+ * delete.c (junk_archive): Add two impossible switch cases.
+ * list.c (read_and): Add one impossible switch case.
+ * update.c (update_archive): Add two impossible switch cases.
+ Reported by Bruno Haible.
+
+ * names.c (name_gather): Explicitly declare allocated_length as
+ an int, do not imply it.
+ Reported by Bruno Haible.
+
+1997-04-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11p.
+
+ * Makefile.am (tar._o, rmt._o): Revise rules further.
+ Reported by Bruno Haible and Ken Steube.
+
+1997-04-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * arith.h: Prefer a single long over a long long, if possible.
+ Also reject long long if it is not long enough :-).
+ Reported by Bruno Haible.
+
+1997-04-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c, tar.c, update.c, common.h: Replace _COMMAND suffixed
+ constants by _SUBCOMMAND suffixed. Rename enum command by
+ enum subcommand, main_command_option by subcommand_option and
+ set_main_command_option by set_subcommand_option.
+
+ * create.c (dump_file): Remove badperror label, call WARN
+ explicitly at the two other needed places instead. Remove
+ badfile label, expand the proper code at the three other
+ needed places instead. Delete the critical_error flag, just
+ set exit_status to TAREXIT_FAILURE rather than setting this flag.
+
+1997-04-12 François Pinard <pinard@iro.umontreal.ca>
+
+ * delete.c (move_archive): Declare it void.
+ Reported by Bruno Haible and Kaveh R. Ghazi.
+
+1997-04-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11o.
+
+ * Makefile.am: Duplicate rules for the ansi2knr case.
+ Reported by Kaveh R. Ghazi and Marcus Daniels.
+
+1997-04-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * common.h: Change mode_option from int to struct mode_change *.
+ * tar.c (decode_option): Use mode_compile.
+ * create.c (start_header): Use mode_adjust.
+
+1997-04-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * All: Replace all flag_ prefixed variables by _option suffixed.
+ * tar.c: Replace OPTION_ prefixed macros by _OPTION suffixed.
+
+ * buffer.c, tar.c, update.c, common.h: Replace COMMAND_ prefixed
+ macros by _COMMAND suffixed, COMMAND_NONE by UNKNOWN_COMMAND,
+ and delete TOO_MANY_COMMAND. Turn these into an enum and declare
+ main_command_option of this enum type, to replace command_mode,
+ which was an int, everywhere.
+ * tar.c (decode_options): Initialise main_command_option.
+ (set_main_command_option): New function to replace
+ SET_COMMAND_MODE. Diagnostic ambiguous command as soon as seen.
+ However, be forgiving if command has merely been repeated.
+
+ * buffer.c, tar.c, common.h: Have info_script_option be at the
+ same time a flag and the option value, no need for a separate
+ info_script variable. Rename rsh_command to rsh_command_option,
+ tape_length to tape_length_option, compress_program to
+ use_compress_program_option, volno_file to volno_file_option.
+ * tar.c (set_use_compress_program_option): New function.
+
+ * buffer.c, names.c, tar.c, common.h: Have files_from_option
+ be at the same time a flag and the option value, no need for
+ a separate namefile_name variable.
+
+ * buffer.c, create.c, tar.c, commun.h: Rename volume_label to
+ volume_label_option.
+
+ * incremen.c, tar.c, common.h: Rename gnu_dumpfile to
+ listed_incremental_option. Let it unitialised for just incremental.
+ * create.c (create_archive): No need to check both
+ incremental_option and listed_incremental_option, as the later
+ implies the former already.
+
+ * create.c, tar.c, common.h: Rename preset_owner to owner_option,
+ preset_group to group_option and preset_mode to mode_option.
+
+ * create.c, incremen.c, list.c, tar.c, commun.h: Have
+ after_date_option be a Boolean instead of a three-valued flag.
+ Rename threshold_time to newer_mdate_option, which may be looked
+ at without checking after_date_option first, as threshold_time
+ before. Make newer_cdate_option an alias for newer_mdate_option.
+
+1997-04-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c: Use int after extern to declare time_to_start_writing.
+ * extract.c: Use int after static to declare we_are_root.
+ Reported by Ariel Faigon.
+
+1997-04-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * list.c (read_and): Use the proper enum constants in switch,
+ instead of oldish and wrong numbers.
+ Reported by Martin Mares.
+
+1997-04-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * arith.c [SUPERDIGIT] (zerop_tarlong, lessp_tarlong,
+ clear_tarlong, add_to_tarlong, add_to_tarlong, mult_tarlong,
+ print_tarlong): Rename all functions by adding a _helper suffix.
+ * arith.h [SUPERDIGIT]: Replace function prototypes by macros,
+ each calling the function with _helper appended, and extracting
+ pointers out of the tarlong structures.
+ Reported by Andrew A. Ivanov and Kaveh R. Ghazi.
+
+ * buffer.c (child_open_for_compress): Copy all records coming out
+ of the compressor, not only the last one.
+ Reported by Alois Steindl, Mark Bynum, Martin Mares, Nelson
+ H. F. Beebe, Scott J. Kramer and Torkel Hasle.
+
+1997-03-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * create.c (dump_file): Ignore unreadable directories when
+ --ignore-failed-read.
+ Reported by Ralph Schleicher.
+
+ * create.c (deal_with_sparse): Chain the last partial zero block
+ with the preceding data, do not try sparing it. This correction
+ is approximative, as the whole thing should be rethought.
+ Reported by Andreas Degert.
+
+1997-03-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * All: Rename head to current_header, hstat to current_stat, and
+ header_format to current_format.
+ * update.c (update_archive): Rename nstat to stat_data.
+ * create.c: Do not extern hstat, as common.h does it.
+ (deal_with_sparse): Get rid of amidst_data, since numbytes is
+ already usable as a flag for the same thing.
+
+1997-03-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * names.c (name_gather): Do not declare static variables which
+ do not need to be. Have allocated_length represent the full
+ allocated length, instead of only the name part. It's clearer.
+ (addname): Similar cleanups.
+
+1997-03-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * compare.c: Always call report_difference when there is a
+ problem, so the exit status will be set in all cases. Build the
+ message string if necessary, so avoiding stdargs/varargs.
+ (report_difference): If NULL argument, just set the exit status
+ without reporting a message. Move out the word `differs'
+ in all callers, do not insert into an English message.
+ (read_and_process): Return void, as the int result is never used.
+ Assume processors returns nonzero for success and zero for
+ failure, instead of 0 for success and -1 for error.
+ (process_rawdata, process_dumpdir): Adjusted.
+
+ * compare.c: Remove different as a global variable, it is useless.
+ (diff_sparse_files): Make different a local variable, reinitialise
+ it on each call. Otherwise, after any error elsewhere, all sparse
+ files were always and falsely reported as erroneous.
+ Reported by James E. Carpenter and Tim Towers.
+
+1997-02-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c: Adjust copyright years in --version output.
+
+ * create.c (dump_file): Allow saving directories even with -o.
+ Reported by Daniel Trinkle.
+
+1996-11-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * compare.c (verify_volume) [FDFLUSH]: Use fsync even in that case.
+ Reported by Marty Leisner.
+
+1996-11-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c (new_volume): Write file name in two words.
+ * names.c (name_next): Idem.
+ * buffer.c (flush_read): Speak of record size instead of blocksize.
+ Reported by Christian Kirsch.
+
+1996-11-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * list.c (read_header): Return failure, instead of success,
+ whenever checksums do not match.
+ Reported by Marc Boucher and Marty Leisner.
+
+ * incremen.c (get_directory_contents): Use stat_data instead of
+ current_header for checking normal files. Otherwise, new or
+ modified files in old directories were not dumped, that is, if a
+ directory was older than the listed entry, it was skipped
+ completely without checking the contained files.
+ Reported by David Johnson, John David Anglin and Wolfram Wagner.
+
+ * buffer.c (open_archive): When updating the archive, initialize
+ the access variable with reading mode, not update mode.
+ Reported by Andreas Schwab.
+
+ * delete.c (junk_archive): Initially jump directly into the loop,
+ so deleting a file after a big one will not destroying the archive.
+ Reported by Akiko Matsushita, Andreas Schwab, Eric Backus, Jeff
+ Siegel, Saul Lubkin, Stuart Kemp and Yasushi Suzudo.
+
+1996-11-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * incremen.c (get_directory_contents): Compute distance using the
+ start of the proper buffer.
+ Reported by David Johnson, Donald H. Locker, John David Anglin,
+ Marc Boucher and Noah Friedman.
+
+ * tar.c (usage): Revise the mandatory/optional sentence again.
+ Reported by Karl Berry.
+
+1996-11-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.14.
+
+ * tar.c (usage): Explain the purpose of the program.
+
+ * tar.c (usage): Clarify the mandatory/optional sentence.
+ Reported by Alex Schmidt.
+
+ * system.h [HAVE_SYS_TAPE_H]: Include sys/buf.h if it exists, to
+ avoid many warnings on BSD/OS.
+ Reported by Dan Reish.
+
+1996-11-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * incremen.c (write_directory_file): Renamed from write_dir_file.
+ (get_directory_contents): Renamed from get_dir_contents.
+ * common.h: Adjusted.
+
+ * all: Cleanup around local variables, renaming them more
+ appropriately, using initializers when natural, and moving them
+ closer to the blocks where they are used.
+
+ A bit of reorganisation in the sources:
+ * common.h: New file, for holding all GNU tar specific definitions,
+ which were previously held in tar.h.
+ * tar.h: Now limited to the archive format description only.
+ * all: Include common.h instead of tar.h.
+ * delete.c: New file, holding delete code out of update.c.
+ * update.c: Now limited to appending type of commands.
+ * compare.c: New name for diffarch.c.
+ * incremen.c: New name for increm.c.
+ * names.c: Moved over all name processing from tar.c.
+ * tar.c, common.h: Adjusted.
+ * Makefile.am: Adjusted.
+
+ * system.h (lstat) [!S_ISLNK]: Define as stat.
+ * create.c, diffarch.c, increm.c: Remove similar definitions.
+
+ * tar.c: Merge --version-control into --backup, make it obsolete.
+
+1996-11-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * all: Add a FIXME comment everywhere errno is modified by tar.
+
+ * buffer.c (new_volume): Return nonzero/zero for success/failure,
+ instead of zero/negative. Callers adjusted. Use xstrdup on
+ file name given by user with the answer "n", so avoiding the
+ apparently useless allocation of one extra byte. Avoid using p.
+
+ * buffer.c: Add DEBUG_FORK conditional code.
+ Reported by Thomas König and Ulrich Drepper.
+
+ * misc.c (maybe_backup_file): In the renaming message, say that
+ the previous file is being renamed, not the newly extracted one.
+
+ * buffer.c (backspace_output): Change return type to void, since
+ returned values were never used.
+ * update.c (move_arch): Idem.
+ (xdup2): New name for redirect, order of arguments was not natural.
+
+1996-11-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * all: Remove all white lines between open braces and comments.
+
+ * tar.h: Declare access_mode as an enum and as a variable.
+ Adjust declaration of open_archive.
+ * buffer.c: (open_archive, new_volume): Use access instead of
+ reading. Callers adjusted for using enum access_mode arguments.
+ (flush_archive, close_archive): Use access_mode, and cleanup.
+ * diffarch.c (verify_volume): Use access_mode.
+
+ * buffer.c (child_open_for_compress, child_open_for_uncompress):
+ Split of previous child_open_for_compress. Clean up.
+ (open_archive): Adjusted for calling the proper function above.
+
+1996-11-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.13.
+
+ * tar.c (usage): Do not tie --posix anymore to 1.12.
+
+ * extract.c (set_stat): Until we know better, for the time being,
+ limit restoring symbolic link attributes to lchown only.
+
+ * all: Mini clean up. Systematically set logical variables to
+ one instead of auto-incrementing them (PDP-11 time is over by
+ now! :-). Replace some single letter counters or cursors by
+ variables named counter or cursor. Simplify a few C constructs.
+
+ * buffer.c, tar.h: Delete read_error_flag, set but never used.
+ Rename r_error_count to read_error_count.
+
+ * create.c (clear_buffer): Use memset instead of explicit loop.
+ (zero_block_p): Renamed from zero_block, callers adjusted.
+
+1996-11-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * rmt.c (private_strerror): Add const's to sys_errlist declaration.
+ Reported by Fabio d'Alessi.
+
+1996-11-06 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Add OPTION_BACKUP, OPTION_SUFFIX, OPTION_VERSION_CONTROL.
+ Renumber options from 3 instead of from 10. Declare flag_backup.
+ * tar.c: Include backupfile.h. Implement --backup, --suffix and
+ --version-control decoding. Adjust usage documentation.
+
+ * misc.c (maybe_backup_file, un_backup_file): New functions.
+ * tar.h: Adjusted.
+ * buffer.c (child_open_for_compress, open_archive, new_volume):
+ Use the new functions.
+ * extract.c (extract_archive): Idem.
+ Reported by Jeffrey Mark Siskind, Karl Berry, Karl Heuer, Marty
+ Leisner, Melissa Weisshaus and William Bader.
+
+ * misc.c (assign_string): Moved over from tar.c.
+ * tar.h: Adjusted.
+
+1996-10-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Declare enum read_header, for return values of read_header.
+ * diffarch.c (verify_volume): Adjusted.
+ * list.c (read_and, read_header): Adjusted.
+ * update.c (junk_archive, update_archive): Adjusted.
+ * update.c: Rename prev_status to previous_status.
+ * update.c (junk_archive): Delete found_stuff, use logical_status.
+
+1996-10-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c (new_volume, open_archive): Soften messages.
+ * create.c, extract.c: Add quotes around slashes in some messages.
+ * tar.c (usage): Added a missing equal sign after --directory.
+ Reported by Jan Djarv.
+
+1996-09-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c: Write --no-recursion instead of --no-recurse.
+ Reported by Noah Friedman.
+
+1996-09-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Delete label_pattern.
+ * tar.c (main): Do not compile anymore volume_label as a regexp.
+ (usage): Document --label as accepting a globbing pattern.
+ * buffer.c, tar.c: Do not include regex.h neither rx.h.
+ * buffer.c (check_label_pattern): New function.
+ (open_archive, flush_read): Use it, instead of re_match.
+
+ * tar.c (decode_options): Better space --version output.
+
+1996-09-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.12
+
+ * Makefile.am (EXTRA_PROGRAMS): Compile rmt properly, instead of
+ letting make use default .c to executable rule.
+
+ * tar.c: Include getopt.h.
+ * system.h: Don't.
+
+ * increm.c (get_dir_contents): Consider all NFS devices as equal
+ before deciding that a directory was renamed, so automount will
+ not fool GNU tar into spurious incremental redumping.
+ Reported by Frank Koenen, Giorgio Signorini, Joachim Holzfuss,
+ Konno Hiroharu, R. Kent Dybvig and Wolfram Wagner.
+
+ * tar.c (usage): Add bug report address in --help output.
+ (decode_options): Add copyright and authors in --version output.
+
+ * increm.c: New name for gnu.c.
+ * Makefile.am (tar_SOURCES): Adjusted.
+
+ * gnu.c (init_buffer, add_buffer, get_buffer, flush_buffer): Moved
+ over from misc.c. Deleted is_dot_or_dot_dot and remove_any_file.
+ * misc.c (is_dot_or_dotdot, remove_any_file): Moved over from gnu.c.
+ Deleted init_buffer, add_buffer, get_buffer and flush_buffer.
+ * tar.h: Adjusted.
+
+1996-09-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c (write_error): Obey --totals before aborting.
+ Reported by Greg Chung.
+
+ * buffer.c (read_error, write_error): Renamed from readerror and
+ writeerror.
+ * tar.c (read_name_from_file): Rename c to character.
+
+1996-09-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * arith.h (tarlong): The typedef tarlong, when an array, is now
+ wrapped inside a struct to avoid bugs in EWS 4.2 C compiler.
+ * arith.c: Adjusted.
+ Reported by Paul Eggert.
+
+ * buffer.c: Declare archive_stat statically.
+ (open_archive): Do not declare archive_stat locally.
+ (close_archive): Limit archive draining to while reading a pipe.
+ Reported by Andreas Schwab.
+
+1996-09-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * system.h: Define protected defaults for open parameter symbols.
+ [EMUL_OPEN3]: Intercept open calls and redirect them to open3.
+ * open3.c: New file, moved over from lib/. Merely include
+ system.h rather than config.h, errno.h and open3.h.
+ [EMUL_OPEN3]: The compilation of the file depends on this symbol.
+ When it was in lib/, we were using LIBOBJS to control this.
+ * Makefile.am: Adjusted.
+ * extract.c: Don't call open3.h.
+ Reported by Jim Meyering.
+
+1996-09-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (libexec_PROGRAMS): Rely on @RMT@, not rmt.
+ (bin_PROGRAMS): Do not include @RMT@.
+
+ * gnu.c (remove_any_file): Protect value of errno in case
+ of failure to remove a directory, in non-recursive mode.
+ This should correct spurious diagnostics while extracting
+ directories over already existing hierarchies.
+ Reported by Martin Mares and Marty Leisner.
+
+1996-09-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * gnu.c (read_dir_file): Diagnose file names over PATH_MAX.
+ (get_dir_contents, add_dir_name): Increase namebuf many times if
+ this is needed to receive a loong file name.
+ Reported by Carsten Heyl.
+
+ * Makefile.am (tar.o, rmt.o): Special rules for defining
+ LOCALEDIR, instead of having it defined on all compiles.
+
+ * Makefile.am: Remove check related lines, moved over to tests/.
+
+1996-09-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Use genfile in check_PROGRAMS, not noinst_PROGRAMS.
+ (check-local): Do not depend on genfile.
+
+1996-08-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (EXTRA_DIST): Do not mention ansi2knr.1 nor
+ ansi2knr.c, as Automake now handle them automatically.
+
+1996-07-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * arith.h: Include tar.h, not arith.h, so FATAL_ERROR is defined.
+ [!SUPER_DIGIT]: Declare arguments to ..._tarlong routines as
+ pointers to unsigned long and not arrays, for avoiding pointers
+ to arrays, and nevertheless have arrays passed by reference
+ rather than by value.
+ * arith.c: Adjusted function headers accordingly.
+ * buffer.c, tar.c: Removed address-of operators, using tarlongs.
+ Reported by Christian T. Dum, Jim Meyering and Kaveh R. Ghazi.
+
+ * arith.h [SUPER_DIGIT]: Avoid indirection in all macros for
+ Accumulators. This, in particular, solves a bug where the pointer
+ value itself was printed, rather than the pointed to value.
+ Reported by Drew Sullivan and Wolfram Wagner.
+
+ * Makefile.am (EXTRA_DIST): Include ansi2knr.[1c] for now.
+ Reported by Christian T. Dum, Jim Meyering and Kaveh R. Ghazi.
+
+1996-07-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.11.
+
+ * Makefile.am (check-local): Ensure relinking if the service
+ libraries where modified (waiting for Automake to do it!).
+
+1996-07-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * rmt.c (strerror): It is a macro on some systems.
+ Reported by Santiago Vila Doncel.
+
+1996-07-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.10.
+
+ * checktar.sh: Use a more regular WARNING in message.
+
+1996-07-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Declare that unquote_string as returning int, not char *.
+ * misc.c (unquote_string): New name for un_quote_string. Clean
+ up a bit, return a boolean indicator for success, not a string.
+ * gnu.c (read_dir_file), mangle.c (extract_mangle), tar.c
+ (add_exclude): Callers adjusted, so they never use a NULL return
+ as an actual string. In fact, the result of unquote_string is
+ always used, even if the quoting was improper.
+ Reported by Johan Vromans.
+
+1996-05-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Define TTY_NAME as a macro, instead of an external array.
+ * tar.c: Remove declaration of TTY_NAME.
+
+ * tar.h: Rename new_time to threshold time. Make it GLOBAL.
+ * tar.c, create.c, gnu.c, list.c: Adjusted.
+ (decode_options): Clarify -N and --newer-mtime decoding, ensure
+ one of them is called at most, otherwise it would misbehave.
+
+1996-05-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * misc.c (quote_copy_string): Ensure spaces are backslash-quoted.
+ Reported by Max Hailperin.
+
+ * list.c (decode_header): Some clean up. Recognize POSIX archive
+ headers, avoid fetching atime or ctime in this case.
+ [!S_IFBLK || !S_IFCHR]: Ensure st_rdev is cleared appropriately.
+ * tar.h: Rename head_standard to header_format, so turning an
+ int to an enum archive_format. Adjust decode_header prototype.
+ * diffarch.c, extract.c, list.c, update.c: Usages changed.
+ * create.c: Ensure oldgnu_header is only used when OLDGNU_FORMAT.
+ (Correction just starting to be made--will be comprehensive...)
+ Reported by Anders Andersson, Bdale Garbee, Chris G Demetriou and
+ David J. MacKenzie.
+
+ * buffer.c, gnu.c, rtapelib.c, tar.c: Diagnose errors on fclose.
+ Reported by Jim Meyering.
+
+1996-05-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c (close_archive): If reading and the archive is
+ finished, read until end of archive, for avoiding an error
+ message from the upstream process if we are reading from a pipe.
+ Reported by Bennett Todd, Dick Streefland, Don Bennett, Ian Lance
+ Taylor, Jean-loup Gailly and Piercarlo Grandi.
+
+ * create.c (dump_file): Add note about accuracy of st_blocks.
+ Reported by Dick Streefland.
+
+ * diffarch.c: Include <linux/fd.h> if it exists.
+ (verify_volume): fsync, than ioctl(, FDFLUSH) first.
+ Reported by Marty Leisner.
+
+1996-04-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * list.c (isotime): New function.
+ (print_header) [!USE_OLD_CTIME]: Use it instead of ctime.
+ Reported by Karl Berry and Markus Kuhn.
+
+1996-04-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * extract.c (set_stat): Accept a new parameter telling if this is
+ a symbolic link. In this case, and if lchown exists, use it
+ instead of chown. Callers adjusted.
+ (extract_archive): Do call set_stat over restored symbolic links.
+ Reported by Andreas Koppenhoefer, Bernard Derval, Ian Jackson,
+ Matt Power, Warren Dodge and Wolfram Gloger.
+
+ * extract.c (extr_init): If the umask was very restrictive at
+ start of tar, nevertheless ensure we create intermediate
+ directories with such permissions that we can at least add files
+ into them.
+ (extract_archive): Same, but for final directory. Ensure
+ directory attributes are restored in all cases.
+ Reported by Piercarlo Grandi.
+
+ * tar.c: Implement --owner, --group and --mode options.
+ * tar.h: Declare preset_owner, preset_group and preset_mode.
+ * create.c: Obey these variables.
+ Reported by Ken Raeburn, Richard Stallman and Stephen Gildea.
+
+ * create.c (dump_file): When wanting the length of the link
+ name, use strlen, rather then doing wrong arithmetic giving
+ the number of removed slashes at the beginning of it.
+ Reported by Brian R. Smith.
+
+ * create.c (start_header): Try removing leading slashes even for
+ long file names.
+ Reported by Art Isbell, Fritz Elfert and Robert E. Brown.
+
+ * buffer.c (new_volume): Avoid calling closeout_volume_number if
+ the --volno-file option was not specified, so avoiding crashes.
+ * tar.c (usage): Document the --volno-file option.
+ Reported by Christoph Litauer, Daniel S. Barclay, David Taylor,
+ Erik D. Frederick, Larry Creech, Loïc Prylli, Loren J. Rittle,
+ Marty Leisner, Neil Faulks, Paul Mitchell, Rocky Giannini, Roy
+ Marantz, Sylvain Rougier, Timothy J. Lee and Werner Almesberger.
+
+1996-04-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * system.h (N_): Define marking macro for delayed translations.
+ * rmt.c: Use N_ instead of _ for returned strings. It does not
+ make sense translating messages in a remote process, not knowing
+ the language in use in the local process.
+
+1996-04-18 François Pinard <pinard@iro.umontreal.ca>
+
+ Instead of -UU for removing directories, request a long option.
+ * tar.c: Implement --recursive-unlink.
+ (usage): Document --recursive-unlink.
+ (decode_options): Have --recursive-unlink imply --unlink-first.
+ * tar.h: Declare --recursive-unlink.
+ * extract.c (extract_archive): Use flag_recursive_unlink instead
+ of flag_unlink_first > 1.
+ Reported by Andreas Schwab.
+
+1996-04-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (EXTRA_DIST): New name for DIST_OTHER.
+
+ * tar.c (addname, name_gather): Zero out freshly allocated struct
+ name, to prevent garbage to get into the structure.
+ Reported by Jonathan Kamens.
+
+1996-03-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * create.c (dump_file): Cast %ld argument to (long).
+ Reported by Constantin Belous and Jörgen Hägg.
+
+1996-03-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (main): Return int, not void.
+ Reported by Timothy J. Lee and Peter Seebach.
+
+1996-02-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Use RMT instead of PROGRAMS and noinst_HEADERS
+ instead of HEADERS.
+
+1996-02-12 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Remove CONFIG_HEADER, not required by Automake 0.29.
+
+1996-02-03 François Pinard <pinard@iro.umontreal.ca>
+
+ Ensure --totals work correctly for huge archives:
+ * arith.h, arith.c: New files.
+ * Makefile.am: Use arith.h and arith.c.
+ * tar.h: Do not declare tot_written anymore, include "arith.h".
+ * tar.c (main): Call init_total_written and print_total_written.
+ * buffer.c: Rename tot_written to total_written, make it tarlong.
+ (init_total_written, print_total_written): New routines.
+ Reported by Albert W. Dorrington, Chris F.M. Verberne, David
+ Martin, Eduardo Villasenor de Rivas, Greg Chung, Jim Meyering,
+ John R. Vanderpool, Jon Lewis, Jörg Weule, Jörgen Hägg, Rod
+ Thompson, Russell Cattelan, Ted Rule and Tor Lillqvist.
+
+ Ensure --tape-length is usable for huge media:
+ * tar.h: Declare tape_length as tarlong instead of int.
+ * tar.c (decode_option): Decode tape_length as tarlong, and use
+ its value pre-multiplied by 1024.
+ * buffer.c (flush_write): Use bytes_written and tape_length as
+ tarlongs. Declare bytes_written outside flush_write.
+ (init_total_written): Zero out bytes_written as well.
+ Reported by Dave Barr.
+
+1996-01-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * rtapelib.c (rmt_open__) [MSDOS]: Do not call setuid/setgid.
+ Reported by Yasushi Suzudo.
+
+1996-01-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Select gnits and ansi2knr.
+
+1996-01-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * create.c: Initialize linklist to NULL.
+ Reported by Bradley A. Smith.
+
+1996-01-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: Add parts of previous Makefile.in as FIXME comments.
+
+1996-01-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (usage): Avoid an unescaped new line.
+ Reported by Kaveh R. Ghazi and Mark Bynum.
+
+ * system.h: Declare valloc if it exists and is not #defined.
+ * create.c (start_header): Add missing DEFAULT_FORMAT case.
+ * gnu.c (read_dir_file): Use NULL instead of (char *) 0.
+
+ * Makefile.am: Install rmt in $(libexec), not in sbin.
+
+ * tar.c (decode_options): Add a semicolon so default case is
+ not completely empty, for better ANSI C compliance.
+ Reported by John David Anglin, Kaveh R. Ghazi and Mark Bynum.
+
+1996-01-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c (open_archive): Allocate real_s_name at run time
+ instead of statically, because PATH_MAX is not always constant.
+ Reported by Bruno Haible, John David Anglin, Jonathan Thornburg,
+ Kaveh R. Ghazi, Martin Bellenberg, Marty Leisner, Nelson
+ H. F. Beebe, Roland McGrath and Thomas König.
+
+ * Makefile.am (DIST_OTHER): Distribute BACKLOG.
+ Reported by Marty Leisner.
+
+1996-01-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * system.h: Include "error.h" instead of declaring error ().
+ Reported by Jim Meyering.
+
+1995-12-31 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am: New file.
+
+1995-12-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Define LOCALEDIR in DEFS.
+ * system.h [!ENABLE_NLS]: Add replacement for bindtextdomain.
+ * tar.c (main): Add call to bindtextdomain.
+ * rmt.c (main): Add calls to bindtextdomain and textdomain.
+ Reported by Ulrich Drepper.
+
+ * buffer.c, create.c, diffarch.c, gnu.c, list.c, rmt.h, system.h,
+ tar.h, update.c: Replace __P by PARAMS, to respect ANSI C.
+ * rtapelib.c, rmt.h: Replace all __rmt* symbols by rmt*__.
+
+1995-12-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.9.
+
+ * extract.c (extr_init): Initialize variables in any case,
+ instead of partly relying on static initializations. Remove
+ static initializations for those variables.
+
+1995-12-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * extract.c (extract_archive): On systems not having symbolic
+ links, attempt extracting symbolic links as hard links instead,
+ as POSIX suggests. Emit a diagnostic on first occurrence.
+
+ * extract.c (extract_archive): On systems not having contiguous
+ files, continue extracting them as regular files as before, but
+ emit a diagnostic on first occurrence.
+
+1995-12-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Declare remove_any_file.
+ * gnu.c (remove_any_file): New name for recursively_delete.
+ Add a parameter to control recursion. Inverse return value,
+ so 0 is failure. Ensure errno is always valid in this case.
+ (gnu_restore): Specify recursion when calling remove_any_file.
+ * extract.c (maybe_recoverable): New routine.
+ (extract_archive): Call maybe_recoverable rather than
+ make_directories, so deleting files is also tried. Some cleanup.
+
+ * tar.h: Declare flag_unlink_first.
+ * tar.c (decode_options): Decode --unlink-first (-U).
+ (usage): Document it.
+ * extract.c (extract_archive): With -U, call remove_any_file
+ prior to extraction for everything except directories.
+
+ Reported by Andrew J. Schorr, Andrey A. Chernov, Axel Boldt, Bo
+ Nygaard Bai, Chris F.M. Verberne, Chris G. Demetriou, Christian
+ Callsen, Daniel S. Barclay, Ian Jackson, James Stevens, Seth
+ Robertson, Tito Flagella, Warner Losh and Wolfram Wagner.
+
+1995-12-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (name_close): Specify static.
+ (main): Call name_close after create_archive.
+ * create.c (create_archive): Do not call name_close.
+
+ * tar.c: Clean out names_arg[cv] crumb.
+ (name_next): Simplify routine by merging both loops.
+ (addname): Avoid xstrdup'ing result of new_name, this corrects a
+ memory leak.
+
+ * extract.c: Normalize error message so the file is identified at
+ the beginning of it.
+
+ * tar.h (USAGE_ERROR): New macro.
+ * tar.c: Use USAGE_ERROR as far as possible. Cleanup and
+ normalization in string for usage errors. Better detection of
+ conflicting options about archive format or compression program.
+
+ * tar.c (decode_options): Decouple cases for -C and files. Count
+ number of input files. Cowardly refuse to create an empty archive
+ file, if -c is given without input file or list.
+ Reported by Karl Berry and Robert Bernstein.
+
+1995-12-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c: Rename a few err variables to status.
+ * extract.c: Rename a few check variables to status.
+
+ Corrections to speed-up the sizeing pass in Amanda:
+ * tar.h: Declare dev_null_output.
+ * buffer.c (open_archive): Detect when archive is /dev/null.
+ (flush_write): Avoid writing to /dev/null.
+ * create.c (dump_file): Do not open file if archive is being
+ written to /dev/null, nor read file nor restore times.
+ Reported by Greg Maples and Tor Lillqvist.
+
+ * gnu.c: Have dir_list properly initialized to NULL.
+ Reported by Paul Nordstrom and Tim Lashua.
+
+ * extract.c: Rename ourmask to newdir_umask. Rename and
+ complement notumask to current_umask.
+ * list.c (print_for_mkdir): New name for pr_mkdir.
+ * tar.h: Adjust declaration.
+ * extract.c (make_directories): New name for make_dirs. Some
+ cleanup in variable names.
+
+ * extract.c: Let newdir_umask be a global variable.
+ (make_directories): Use newdir_umask while creating intermediate
+ directories. They used to be 0777 unconditionally.
+ Reported by Bruce Evans, Harald König and James Crawford Ralston.
+
+1995-12-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * create.c (finish_header): Avoid printing the header for long
+ names or links, this avoids spurious `Visible longname error's.
+
+ Reported by Arne Wichmann, Chris F.M. Verberne, Frank Koenen,
+ Franz-Werner Gergen, Ian Jackson, Jon Lewis, Mark Kollert, Paul
+ Nordstrom, Ted Rule, Thomas Priesner, Tim Rylance and Tom Tromey.
+
+1995-12-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c: Have real_s_name able to hold PATH_MAX characters,
+ not only NAME_FIELD_SIZE. It was breaking --multi-volume
+ --listed-incremental when backing up long file names.
+ Many symptoms really: a screwed-up date on the incremental data
+ file, dumping incremental which should not have been, etc.
+ * (flush_read): Avoid altering save_name pointer value, use
+ cursor instead. Also avoid the optimization of cleaning each
+ save_name only once per flush_read if it did not change: it
+ was using `save_name = real_s_name;', and since save_name may
+ be freed at any time, this is/was really running after trouble.
+
+ Reported by Alexander V. Lukyanov, Axel Habermann, Chance
+ Reschke, Claus Heine, Christian von Roques, Daniel Hagerty,
+ Daniel S. Barclay, Dirk Herr-Hoyman, Donald H. Locker, Ed Childs,
+ Heiko Schinke, Hunyue Yau, Goeran Uddeborg, Grant McDorman,
+ Joachim Seelig, Joe DeBattista, Jonathan Thornburg, Joutsiniemi
+ Tommi Il, Jürgen Lüters, Keith Young, Kelly Stephens, Kevin
+ Dalley, Konno Hiroharu, Larry Creech, Martin Mares, Michael
+ Dietrich, Michael Giddings, Michael Meissner, Michael P Urban,
+ Paul Siddall, Pierce Cantrell, Peter Fox, Robert Frey, Roderich
+ Schupp, Sam Richards, Stephen J Bevan, Torsten Lull, Wolfram
+ Gloger and Yu-Min Liang.
+
+ * system.h: Include <sys/tprintf.h> and <sys/device.h> for BSDi.
+ Reported by Chris Arthur, Dan Reish, Karl Berry and Skip Montanaro.
+
+ * rmt.c (private_strerror): New, copied from lib/error.c.
+ Remove sys_errlist declaration, and use syserror instead.
+ Reported by Chris Arthur, Coranth Gryphon, Erich Stefan Boleyn,
+ Fabio d'Alessi, Greg Hudson, Jason R. Mastaler, Skip Montanaro,
+ Thomas Krebs and Troy Rudolph.
+
+1995-12-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * extract.c (extract_archive): Unrecognized types were defaulted
+ to sparse files instead of regular files, because of an improper
+ /* Fall through. */.
+
+ * create.c, diffarch.c, extract.c, gnu.c, list.c, rtapelib.c,
+ tar.c: Drop register specifications, useless in GNU's tar, as
+ tar does not use longjmp, and GNU C has -O automagically set.
+
+ * extract.c (extract_archive): Inhibit creation of links, special
+ devices, directories, etc., when --to-stdout option is being used.
+ Reported by Donald B Gordon, Gerben Wierda, Greg Chung, Norbert
+ Kiesel and Roman Czyborra.
+
+1995-12-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Implement FATAL_ERROR, telling error is not recoverable.
+ * tar.c (main): Diagnose delayed error, for TAREXIT_FAILURE only.
+ * buffer.c, diffarch.c, gnu.c, list.c, tar.c, update.c: Replace
+ all `ERROR ((TAREXIT_FAILURE,' by `FATAL_ERROR ((0,'.
+ Reported by Marty Leisner.
+
+ * list.c (read_and): When telling block numbers in verbose output,
+ clearly list block numbers for NUL blocks and end of file.
+ Reported by Jörg Weule.
+
+ * tar.c (usage): Document --newer-time.
+ Reported by Greg Chung.
+
+1995-11-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * system.h: Conditionally include <sgtty.h> prior to <mtio.h>.
+ * rmt.c: Do not include <sgtty.h> anymore.
+ Reported by Harald König and Kaveh R. Ghazi.
+
+ * rtapelib.c: Remove seemingly useless include of setjmp.h.
+
+ * rtapelib.c: Try to get EOPNOTSUPP defined in all cases.
+ If needed, include net/errno.h or sys/inet.h when they exist.
+ Reported by Goeran Uddeborg, J.J. Bailey, John L. Chmielewski,
+ Peder Chr. Norgaard and Yasushi Suzudo.
+
+1995-11-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (decode_options): Diagnose --block-compress properly.
+ Was segment violating because falling into --blocking-factor.
+
+ * buffer.c, create.c, diffarch.c, genfile.c, gnu.c, tar.c:
+ Uniformly write nonzero instead of non-zero.
+ Reported by Karl Berry.
+
+ * system.h, buffer.c, create.c, diffarch.c, tar.c, update.c [MSDOS]:
+ Instead of __MSDOS__, all occurrences.
+ * extract.c (extract_archive) [MSDOS]: Avoid delaying restoration
+ of timestamps for directories.
+ * buffer.c (child_open_for_compress): Add a missing semi-colon.
+ * diffarch.c (diff_archive): Avoid comparing uid and gid.
+ Reported by Yasushi Suzudo.
+
+ * tar.c (usage): Correct absolute-paths to absolute-names.
+ Reported by Jonathan Kamens.
+
+ * tar.c (usage): Indicate that --exclude uses globbing, and that
+ --label uses regexps.
+ Reported by John R. Vanderpool and Matti Aarnio.
+
+ * tar.c (names_notfound): Do not report a fake namelist entry, so
+ gzipped empty archives will not produce spurious diagnostics.
+ Reported by Jonathan Kamens.
+
+1995-11-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (name_scan, name_match): Avoid labels and gotos.
+
+1995-11-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (DISTFILES): Distribute ChangeLog.
+
+ * ChangeLog: New, extracted from top-level ChangeLog.
+
+ * tar.c (main, decode_options): Delay request_stdin for `-f'
+ until all options processed, so we now for sure that `-' means
+ standard input, not standard output.
+
+ * tar.c (usage): Document that users should not count on
+ POSIX support yet, saying it is only partially implemented so far.
+
+1995-10-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * rtapelib.c (_rmt_shutdown): Add the errno_value parameter.
+ (__rmt_open): Call shutdown if remote open fails, or else, we lose
+ file descriptors.
+ Reported by Holger Teutsch.
+
+1995-10-20 Tom Tromey <tromey@drip.colorado.edu>
+
+ * tar.c (request_stdin): New function.
+ (stdin_used_by): New variable.
+ (name_init, add_exclude_file, decode_options): Use request_stdin
+ if required.
+ (confirm): Check stdin_used_by to see if stdin in use.
+
+ * list.c (read_header): Consistently use sizeof to find size
+ of checksum field.
+
+1995-08-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * names.c (uid_to_uname, gid_to_gname): Ensure that the empty
+ string is returned when not found, instead of the previous one.
+
+1995-08-06 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c (new_volume): Use stderr rather than stdlis for
+ interactions. Clarify `archive == 0' into `archive == STDIN'.
+ Reported by Scott Hunziker.
+
+1995-08-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * diffarch.c (diff_archive): When symlink differs, report the
+ file name, not the link name.
+ Reported by Dale R. Worley and Wolfram Wagner.
+
+1995-07-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (Makefile): Remove some useless lines.
+
+1995-06-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Sort out declarations a little better.
+ * tar.c (decode_options): Reorder the cases in the big switch.
+
+ * tar.h: Introduce OLDGNU_COMPATIBILITY, enum archive_format,
+ variable archive_format. Delete flag_old_archive, flag_standard.
+ * tar.c (decode_options): Initialize archive_format so that -o
+ yields V7_FORMAT, nothing yields OLDGNU_FORMAT, --posix yields
+ GNU_FORMAT, and --posix with POSIXLY_CORRECT yields POSIX_FORMAT.
+ * create.c (start_header): Use TMAGIC and TVERSION if required.
+ Replace all flag_old_archive and flag_standard appropriately.
+
+ * tar.c: Implement a --record-size option, which is an
+ alternate way of saying --blocking-factor, in bytes this time.
+
+ * tar.h, tar.c, create.c (dump_file): Implement
+ a --no-recurse option, to help using tar with find.
+ Reported by Chris G. Demetriou, Jamie Zawinski, Kimball
+ Collins, Oswald P. Backus IV and Stuart Poulin.
+
+ * tar.h, tar.c, buffer.c (child_open_for_compress):
+ Delete --block-compress, issue a warning if used. It was never
+ obeyed while outputting on disk files, where it would have been
+ useful. It was only obeyed for pipes, remotes and devices, that
+ is, exactly when it would be an error not to specify it.
+
+ Reported by Hans Guerth, James H Caldwell Jr, Jean-loup Gailly,
+ Jeffrey W. Parker, John D. Sybalsky, Kai Schlichting, Marcin
+ Matuszewski, Mike Silano, Paul O'Connor, Pete Geenhuizen and
+ Richard Stallman.
+
+ * buffer.c (open_archive): Cosmetic changes.
+
+ * buffer.c, diffarch.c, tar.h, update.c: Rename fl_read by
+ flush_read and fl_write by flush_write.
+
+1995-06-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (usage): Remind that `USER@' may be specified.
+ Reported by John J. Szetela and Oliver Trepte.
+
+ * tar.c (usage): Replace `modificators' by `modifiers'.
+ Reported by Alan Modra.
+
+ * extract.c (set_mode, set_stat): New functions, from
+ previous code, elsewhere. Replace various occurrences of code
+ appropriately with function calls. Ensure mode bits are properly
+ set in all circumstances. This may imply calling set_mode twice.
+ Reported by Piercarlo Grandi and Tim Magill.
+
+ * extract.c: Save the whole stat information in saved
+ directory information, instead of parts of it, all mistyped.
+ (restore_saved_dir_info): Free information as we consume it.
+ Simplify code by using set_mode and set_times. Rename routine to
+ apply_delayed_set_stat, and do some other cleanup around it.
+
+ * *.[hc]: Replace flag_confirm by flag_interactive,
+ flag_do_chown by flag_same_owner,
+ flag_exstdout by flag_to_stdout,
+ flag_follow_links by flag_dereference,
+ flag_gnudump by flag_incremental,
+ flag_ignorez by flag_ignore_zeros,
+ flag_keep by flag_keep_old_files,
+ flag_local_filesys by flag_one_file_system,
+ flag_modified by flag_touch,
+ flag_multivol by flag_multi_volume,
+ flag_namefile by flag_files_from,
+ flag_new_files by flag_after_date,
+ flag_oldarch by flag_old_archive,
+ flag_reblock by flag_read_full_records,
+ flag_run_script_at_end by flag_info_script,
+ flag_sayblock by flag_block_number,
+ flag_sorted_names by flag_same_order,
+ flag_sparse_files by flag_sparse,
+ flag_startfile by flag_starting_file,
+ flag_use_protection by flag_same_permissions,
+ OPTION_COMPRESS_PROG by OPTION_USE_COMPRESS_PROGRAM,
+ flag_volhdr by volume_label,
+ flag_compressprog by compress_program,
+ flag_rsh_command by rsh_command,
+ and flag_volno_file by volno_file.
+
+ * tar.c: Rename --modification-time by --touch, and provide a
+ warning for the old option.
+
+1995-06-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * list.c (decode_header): At extraction time, use the stored
+ uid if uname is unknown in this system, and use the stored gid if
+ gname is unknown in this system, instead. This solves a long
+ lasting bug by which restored files were all owned by root, using
+ an incomplete /etc/passwd or /etc/group file.
+ * names.c: Rename finduname to uid_to_uname and findgname to
+ gid_to_gname, exchanging the order of arguments. Use uid_t and
+ gid_t instead of int's. Use empty strings in cached_[ug]name for
+ marking there is no valid cached translation, instead of using
+ magic values for cached_[ug]id. Rename finduid to uname_to_uid
+ and findgid to gname_to_gid, adding a second argument to store the
+ result if found, and returning a success/failure indication, not
+ anymore assuming the current [ug]id by default.
+ * tar.h, create.c, list.c: Adjust prototypes and callers.
+
+ Reported by Anders Andersson, Bernard Derval, Brian Perkins,
+ Charles Fu, Daniel Trinkle, Ian Jackson, Johannes Helander,
+ Michael Lin, Richard Sims, Robert E. Brown, Tim P. Starrin and
+ Torkel Hasle.
+
+ * tar.h, create.c, list.c, names.c, tar.c:
+ Implement --numeric-owner, to replace the NONAMES define. Then,
+ ensure some reasonable values to magic and linkflags if POSIX.
+ Reported by Benedikt Stockebrand, Ian Jackson and Stephen Gildea.
+
+ * buffer.c: Delete save_block function, as well as
+ saved_block_pointer and saved_block variables. Blocks were
+ carefully saved indeed, but never consulted after the fact.
+ * tar.h: Delete save_block prototype.
+ * *.c: Delete all usages of save_block.
+
+ * rmt.c: Add static to variable declarations.
+ * list.c (read_header): Rename recsum to recorded_sum.
+
+1995-06-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * *.[hc]: Rename --read-full-blocks to --read-full-records,
+ --block-size to --blocking-factor, and --record-number to
+ --block-number.
+ * tar.c (decode_options): Diagnose usage of old names.
+
+ * *.[hc]: Rename saverec to save_block, findrec to
+ find_next_block, and userec to set_next_block_after.
+ Replace endofrecs by available_space_after which does the space
+ computation instead of returning the end pointer, adjust and
+ simplify all callers, by using variable data_block systematically.
+ Also, rename union block field charptr to buffer.
+
+1995-06-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * *.[hc]: Exchange "record" and "block" almost everywhere and
+ whenever appropriate, to follow the terminology used in
+ P1003.1-1990, and so removing a lot of confusion in sources.
+
+ * tar.h: Prefer naming constants and fields per P1003-1.1990 as
+ far as possible. Rename those remaining LF_xxx to GNUTYPE_xxx.
+ * *.c: Adjusted accordingly.
+
+ * tar.h: Clean up the header structure. Make very clear what is
+ specified by POSIX, and what is GNU format, and what is extended
+ header for sparse files. Use xxx_FIELD_SIZE instead of NAMSIZ,
+ TUNMLEN and TGNMLEN. Dismangle some other names, on the way...
+ * *.c: Adjusted accordingly.
+
+ * tar.h: Do not declare baserec, declare current_block_ordinal.
+ * buffer.c (current_block_ordinal): New function.
+ Rename baserec to record_start_block, and make it static.
+ * list.c: Use current_block_ordinal, avoid baserec computations.
+ * buffer.c, list.c: Get rid of saved_recno and annofile.
+
+ * buffer.c, diffarch.c: Move no_op and wantbytes from
+ buffer.c to diffarch.c. Correct prototypes so first arg is long.
+ * tar.h: Do not declare no_op nor wantbytes, anymore.
+
+ * tar.h, buffer.c: Move ar_block, ar_record and ar_last
+ from tar.h to buffer.c, renaming them to record_start,
+ current_block, record_end respectively.
+ * update.c: Add temporary extern declaration for record_start,
+ current_block and record_end.
+
+ * tar.h, buffer.c: Move ar_reading from tar.h to buffer.c,
+ renaming it to reading_archive.
+ * diffarch.c: Add temporary extern declaration for
+ reading_archive.
+
+ * buffer.c, create.c, diffarch.c, extract.c, gnu.c,
+ list.c, names.c, rmt.c, rmt.h, rtapelib.c,
+ tar.c, update.c: Replace many #ifdef's by #if's, and
+ #ifndef's by #if !'s.
+
+ * buffer.c (redirect): New name for dupto. Callers changed.
+
+ * create.c (dump_file), extract.c (extract_archive,
+ extract_sparse_file), tar.h: Remove crumb about ending_blanks
+ and end_nulls.
+
+ * Makefile.in (all): Do not prepare genfile by default, as it
+ is only needed for checking.
+
+ * tar.c (decode_options): Diagnose lacking arguments to old
+ options.
+ Reported by Aage Robeck, Alan Cox, Benny Holmgren, Bruno Haible,
+ Daniel Quinlan, Michael Schmidt, Richard J. Kettlewell and Robert
+ Leslie.
+
+1995-06-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * rtapelib.c (__rmt_open): Avoid dereferencing remote_user
+ when NULL.
+
+ Reported by Alois Steindl, Amos Yahil, Anders Liljeborg, Andre
+ Novaes Cunha, Andreas Haumer, Andreas Reuter, Andy Gay, Bdale
+ Garbee, Bradley A. Smith, Brett Gaines, Bruce Jerrick, Calvin
+ Cliff, Cameron Elliott, Charles Lopes, Charles M. Hannum, Chris
+ Metcalf, Christophe Colle, Christopher T. Johnson, Dale Wiles,
+ David Shaw, Dimitri Bougoulias, Daniel Hagerty, Dave Gregorich,
+ David Mansfield, David Nugent, David Shaw, David Steiner,
+ Douglas Scott, Dunstan Vavasour, Edgar Taube, Eduardo Kortright,
+ Elmer Fittery, Eric Benson, Eric M. Boehm, Gerd Knorr, Graham
+ Whitted, Harald Milz, Heiko Schlichting, James V. Di Toro III,
+ Jan Carlson, Janne Snabb, Jeff Sorensen, Jens Henrik Jensen,
+ Jim Clausing, John J. Szetela, John R. Vanderpool, Jurgen Botz,
+ Karl Berry, Karlos Z. Smith, Karsten Thygesen, Koji Kishi,
+ Luke Mewburn, Manuel Munier, Marc Ewing, Matthew J. D'Errico,
+ Martin Goik, Maxime Taksar, maximum entropy, Michael Hayes,
+ Michael Schwingen, Michael Smolsky, Michael Kaufman, Mike Walker,
+ Minh Tran-Le, Mitsuaki Masuhara, Nelson H. F. Beebe, Noel Cragg,
+ Olaf Wucknitz, Oliver Trepte, Olivier Roussel, Patrick Fulconis,
+ Paul Kanz, Paul Nordstrom, Pekka Janhunen, Peter Carah, Peter
+ Kutschera, Phil Hands, Randy Bias, Reuben J. Ravago, Ricardo
+ Marek, Robert Anthony Nader, Rod Buchanan, Roderich Schupp,
+ Russell Cattelan, Scott J. Kramer, Scott L. Burson, Simon
+ Wright, Sisira Jayasinghe, Steffen Stempel, Thomas M. Browder
+ Jr., Thomas Waas, Tim Bradshaw, Tim Lashua, Timothy J. Lee, Tom
+ Popovitch, Toshiaki Nishi, Victor J. Griswold, Wayne Christopher,
+ William J. Eaton, Wlodzimierz Jan Martin, Wolfgang Rupprecht
+ and Wolfram Wagner.
+
+ * tar.h: Remove external prototypes related to rtapelib.c, as
+ those are already declared in rmt.h.
+
+1995-06-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c (xclose): New, from port.c (ck_close).
+ Replace ck_close by xclose in all modules.
+ * port.c: Remove ck_close.
+
+ * port.c: Remove ck_malloc, because xmalloc can be used
+ instead, now that it protects against malloc(0) returning NULL.
+ * gnu.c (gnu_restore), list.c (read_header): Replace
+ ck_malloc with xmalloc. In gnu_restore, remove skipping code in
+ case of failed allocation, because tar already aborted in xmalloc.
+ * tar.h: Delete ck_malloc declaration.
+
+ * port.c: Remove mknod, link, chown and geteuid, which
+ normally exist on Unix. To be reinserted later, as needed.
+ Reported by Jyh-Shyang Wang, Nelson H. F. Beebe, Philippe Defert
+ and Serge Granik.
+
+ * tar.c: Declare TTY_NAME, moved over from port.c.
+
+ * extract.c (extract_archive), tar.c (decode_options):
+ Clean out old NO_OPEN3 code.
+ * Makefile.in: Adjusted.
+
+ * buffer.c (child_open): In-line previous ck_pipe code.
+ * tar.h: Delete ck_pipe declaration.
+ * port.c: Delete ck_pipe function.
+
+ * misc.c: New, reorganizing remaining code from port.c.
+ * port.c: Deleted.
+ * Makefile.in: Adjusted.
+
+ * misc.c (un_quote_string): If `\' ends a string to unquote,
+ just pass it undisturbed.
+ From Robert Lipe.
+
+ * system.h: Replace many #ifdef by #if, #ifndef by #if !.
+
+1995-06-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.11.8.
+
+ * Makefile.in (mostlyclean): Remove also _*.c and _*.o.
+
+ * create.c (dump_file), gnu.c (get_dir_contents): Cast
+ (int) explicitely for test.
+
+ * Makefile.in ($(OBJECTS)): Depend on ../intl/libgettext.h
+ instead of ../intl/libintl.h, which does not always exist.
+
+ * genfile.c: Define EXIT_SUCCESS and EXIT_FAILURE if not.
+ * tar.c (main): Use TAREXIT_SUCCESS instead of EXIT_SUCCESS.
+
+ * tar.h: Use off_t instead of long for the second argument in
+ __rmt_lseek declaration.
+ * system.h: Remove typedef of off_t, because AC_TYPE_OFF_T
+ takes care of it now.
+ Reported by Coranth Gryphon, Jim Blandy and Thomas Krebs.
+
+1995-06-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * checktar.sh: Send a message saying that it is still useless.
+
+1995-06-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h, tar.c (decode_options), extract.c
+ (extract_archive), diffarch.c (diff_archive), create.c
+ (dump_file, start_header), tar.c (decode_options): Replace
+ flag_absolute_paths by flag_absolute_names.
+ * tar.c (decode_options): Implement OBSOLETE_ABSOLUTE_NAMES for
+ reporting --absolute-paths as obsolete.
+
+ * system.h: Conditionnaly include <locale.h> and define
+ setlocale to void independently of ENABLE_NLS.
+ Reported by Ulrich Drepper.
+
+1995-06-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (long_options): Use no_argument and require_argument,
+ instead of constants. Have long option names translated to short
+ options whenever possible, rather than setting flags directly:
+ easing option management is worth a few extra nanoseconds.
+
+ * tar.c (long_options): Add --gunzip as meaning -z.
+ Reported by Bruno Haible.
+
+1995-06-07 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Use subdir and distdir.
+
+ * system.h [NLS]: Simplify by merely including <libintl.h>.
+ Also, define setlocale to empty only if the setlocale function is
+ not known, instead of when <locale.h> is missing.
+ * Makefile.in (INCLUDES): Use ../intl in compilations,
+ taking care of the fact libintl.h might have been symlinked there.
+
+1995-06-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c, tar.h: Rename TAR_EXTERN to GLOBAL.
+
+ * tar.h: Delete COMMAND_VERSION.
+ * tar.c: Replace OPTION_HELP and OPTION_VERSION commands by
+ show_help and show_version variables, so `--version --create' will
+ not diagnose `Too many commands'. Adjust things so this works.
+ Reported by Marty Leisner.
+
+1995-06-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (check): New goal.
+ * checktar.sh: New script.
+ * genfile.c: New file.
+ * Makefile.in (all): Prepare genfile.
+ * Makefile.in: Distribute checktar.sh and genfile.c.
+
+1995-06-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Adjust so extracted doc/header.texi is neater.
+
+1995-05-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (name_match): Use %s for printing directory, not %d.
+ Reported by Marty Leisner.
+
+ * tar.c (name_gather, addname): chdir_name receives string
+ pointers which might later be overwritten, but nevertheless saved
+ into structures, so, use xstrdup for the time being.
+ Reported by Michael Holmes.
+
+ * tar.c (name_next, name_from_list): Abort when chdir fails.
+ Reported by Ian Jackson and Marty Leisner.
+
+1995-05-28 François Pinard <pinard@iro.umontreal.ca>
+
+ * rmt.h: Declare second argument of __rmt_lseek to be off_t
+ instead of long, so it is the same as in rmt.c.
+ Reported by Chris Arthur.
+
+ * buffer.c (close_archive): Compensate for the addition of 2
+ to ar_block at open_archive time, for when -M used, just before
+ calling free.
+ Reported by Bruno Haible, Clinton Carr, Hernan Prieto Schmidt,
+ Kevin Dalley, Loren J. Rittle and Marty Leisner.
+
+ * rmt.c: Replace SSIZE by STRING_SIZE, avoiding a conflict
+ with some header files.
+ Reported by Kaveh R. Ghazi and William Bader.
+
+ * tar.c: Use DEVICE_PREFIX instead of DEVICE_PREXIX, and
+ WITH_REGEX instead of WITH_REGEC.
+ Reported by Bruno Haible.
+
+1995-05-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.7.
+
+ * Makefile.in (tar): Have $(OBJECTS) depend on system.h.
+
+ * system.h: Many adjustements for GNU gettext.
+
+1995-05-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Clean glocale out.
+
+1995-05-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Use libintl.a while linking.
+ * system.h: Include <libintl.h> unconditionally, instead only
+ if WITH_CATALOG. Let <libintl.h> define _() appropriately.
+ * tar.c (main): Call textdomain.
+
+1995-05-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * system.h, gnu.c, list.c, port.c: Avoid
+ superfluous parentheses in macro definitions.
+ * port.c: Capitalize macro arguments.
+ * buffer.c, create.c, diffarch.c, tar.c: Use comma
+ operator when assignment in test.
+
+1995-04-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * port.c (link): Use WARN to report the message.
+ Reported by Sherwood Botsford.
+
+1995-03-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Remove GLOCALE, add LINGUAS, use fp_WITH_CATALOGS.
+ * system.h: Use WITH_CATALOGS to define _() differently.
+
+1995-03-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * rtapelib.c (__rmt_open): Close the unused side of each
+ pipe, instead of the useful one, prior to processing.
+ Reported by Charles Lopes and Minh Tran-Le.
+
+1995-02-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Replace `date' by `echo timestamp'.
+
+1995-02-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Support ID files. Do not distribute TAGS.
+
+1995-02-13 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Use top_srcdir.
+
+1995-02-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * gnu.c (is_dot_or_dotdot): Through NFS, readdir might deliver
+ empty filenames under old Solaris 2.4, causing endless loops in
+ tar. As a workaround, avoid `' as done already for `.' and `..'.
+ Reported by Jan Carlson.
+
+1995-02-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (maintainer-clean): New name for realclean.
+
+1995-01-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * extract.c (make_dirs) [MSDOS]: Correct for Turbo C, which may
+ return EACCES instead of EEXIST on mkdir.
+ Reported by Jeffrey Goldberg.
+
+ * tar.c (usage) [MSDOS]: Do not tell about -N and related.
+ (decode_options) [MSDOS]: Be blind to -N and related.
+ Reported by Jeffrey Goldberg.
+
+ * rmt.h (_remdev): A filename is not remote if the colon is
+ preceeded by a slash, to take care of `/:/' which is a shorthand
+ for `/.../<CELL-NAME>/fs' on OSF's Distributing Computing
+ Environment (DCE) and Distributed File System (DFS).
+ Reported by Travis L. Priest.
+
+1995-01-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (decode_options): Renamed from options. Convert
+ oldish-style non-dashed options to modern writing before
+ performing option decoding. Diagnose when modern options are met
+ before old style options are fully converted. This allows
+ mixing of option styles on a single call. Avoid getoldopt and
+ use getopt_long instead.
+ * getoldopt.c: Deleted.
+ * tar.h: Prototype deleted.
+ * Makefile.in: Adjusted.
+ Reported by Bruno Haible, Les Mikesell, Patrick Timmons and Saul
+ Lubkin.
+
+1995-01-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * system.h: New file, split out of tar.h.
+ * buffer.c, create.c, diffarch.c, extract.c,
+ getoldopt.c, gnu.c, list.c, mangle.c, names.c,
+ port.c, tar.c, update.c: Include "system.h", and move
+ the inclusion of "tar.h" down after system dependent definitions.
+ * Makefile.in: Distribute system.h.
+
+ * rmt.c: Include "system.h", and simplify accordingly.
+ * rtapelib.c: Include "system.h", and simplify accordingly.
+ * rmt.h: Simplify according to the inclusion of "system.h".
+
+ * system.h: Include conditionnaly <sys/gentape.h>,
+ <sys/tape.h>, <sys/mtio.h>, <sys/ioctl.h> and <sys/io/trioctl.h>.
+ * buffer.c, diffarch.c, rmt.c, rtapelib.c,
+ update.c: Simplify accordingly.
+
+ * system.h: If it exists, include <sys/ioccom.h> prior to
+ <sys/mtio.h>, to account for problems when GNU libc 1.0x is
+ installed over SunOS 4.1.3: GNU libc does not provide sys/mtio.h,
+ so it is taken from Sun header files which use things like _IOW,
+ which GNU libc despises, sys/ioccom.h then provides definitions.
+ Reported by Joseph E. Sacco.
+
+1994-12-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * rmt.h: Ensure strrchr is defined to rindex in some cases.
+ Reported by Karl Vogel.
+
+1994-12-18 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Include <ctype.c> and declare ISASCII.
+ * gnu.c: Adjust, declare and use ISDIGIT and ISSPACE.
+ * list.c: Adjust, declare and use ISODIGIT and ISSPACE.
+ * port.c: Adjust, declare and use ISPRINT.
+ Reported by Bruno Haible, Konno Hiroharu and Max Hailperin.
+
+1994-12-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c, tar.c [WITH_REGEX]: Check it.
+
+1994-12-03 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.6.
+
+ * rmt.c: Adjust for localization, by including <locale.h> and
+ <libintl.h>, by defining _(), by defining and calling setlocale,
+ and by defining and initializing program_name.
+ * Makefile.in: Use locale.o and libtar.a with rmt.
+
+ * Makefile.in: Ensure INSTALL_DATA is defined.
+
+ * Makefile.in, tar.h, tar.c:
+ Localize, adapting from how it is done in sharutils.
+
+ * Makefile.in, tar.c: Rename PRODUCT to PACKAGE.
+
+1994-11-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c (backspace_output): Change cur from long to off_t.
+ * diffarch.c (diff_archive): Idem for offset.
+ * extract.c (extract_archive): Idem for offset.
+ * rmt.c: Idem for lseek ().
+ (main): For case 'L', use atol instead of atoi, and cast the
+ result to (off_t) rather than (long).
+ * rtapelib.c (__rmt_lseek): Idem of offset argument.
+ * tar.h: Change offset of sp_array from int to off_t.
+ * update.c (move_arch): Change cur from long to off_t.
+ Reported by David J. MacKenzie.
+
+1994-11-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * rmt.h, tar.h, buffer.c, create.c,
+ diffarch.c, extract.c, gnu.c, list.c,
+ rtapelib.c, update.c: Rename _ to __P.
+ * tar.h, rmt.h: Declare _ as a macro returning its
+ argument, or else, include <libintl.h> and declare _ as gettext.
+ * tar.c: Possibly include <locale.h> and call setlocale.
+ * rmt.c, buffer.c, create.c, diffarch.c,
+ extract.c, getoldopt.c, gnu.c, list.c,
+ mangle.c, port.c, rtapelib.c, tar.c,
+ update.c: Use _ macro over all localizable strings.
+
+ * rtapelib.c: Declare prototype for xstrdup. Do not declare
+ strstr, which is not needed.
+
+1994-11-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Clean up, following those of GNU m4. I will
+ not detail all the changes here.
+ * tar.c: Use PRODUCT and VERSION instead of version_string.
+
+1994-10-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h [__STDC__]: Use #if instead of #ifdef.
+
+1994-10-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * rmt.h, tar.h, buffer.c, create.c, diffarch.c,
+ extract.c, gnu.c, list.c, mangle.c, tar.c,
+ update.c: Rename all f_* variables to flag_*.
+
+ * tar.h, buffer.c, tar.c, update.c: Rename cmd_mode into command_mode.
+ * tar.c (SET_COMMAND_MODE): New macro, use it.
+
+ * port.c (quote_copy_string): Prevent sign extension of
+ character while copying it to an int.
+ * (un_quote_string): Increment to_there pointer in all cases.
+ Reported by Konno Hiroharu, Mats Lofkvist, Max Hailperin and
+ Ryutaro Susukita.
+
+1994-10-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * rmt.c, rtapelib.c, tar.h: Get rid of CONFIG_BROKETS.
+
+1994-10-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * diffarch.c (fill_in_sparse_array): Add a cast for Pyramid's
+ dumb compiler. Later remove the cast and compare to 0 instead.
+ * extract.c (extract_archive): Idem.
+ Reported by Karl Vogel and Kaveh R. Ghazi.
+
+1994-09-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * diffarch.c: Normalize capitalization in diagnostics.
+
+1994-09-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (name_next, name_match): Abort tar if directory cannot
+ be changed, instead of going on. This is not an innocuous error.
+ Reported by Marty Leisner.
+
+1994-09-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * rtapelib.c: Include "rmt.h" only once <sys/types.h> has been
+ included, because off_t might not be defined otherwise.
+ Reported by James W. McKelvey, John L. Chmielewski, Karl
+ Vogel, Kaveh R. Ghazi an and Jim Meyering and Tilman Schmidt.
+
+1994-09-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in: Cleanup...
+ (DISTFILES): Distribute TAGS.
+ (ansi2knr): Use $(LIBS).
+ (TAGS): Make TAGS in $(srcdir) only.
+ (distclean): Do not remove TAGS.
+ (realclean): Remove TAGS.
+ (Makefile): Have ./config.status create this Makefile only.
+
+1994-09-13 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c: Remove the presetting of stdlis, because stdout is
+ not a constant in GNU libc.
+ Reported by Joseph E. Sacco and Thomas Bushnell n/BSG.
+
+ * buffer.c (new_volume): Pass an otherwise unused argument to
+ wait, do not use NULL.
+ Reported by Thomas Bushnell n/BSG.
+
+1994-09-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.in (TAGS): Remove -t on etags call. It has been
+ the default behavior for a few releases of Emacs and it seems that
+ option -t is now disappearing (from Emacs 19.25, at least).
+ Reported by Goeran Uddeborg.
+
+1994-09-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * gnu.c (get_dir_contents): Do not set dp->allnew if dp is not
+ set itself.
+ Reported by Piercarlo Grandi.
+
+ * extract.c (extract_archive): Issue diagnostic or verbose
+ messages to msg_file, instead of stdout.
+ Reported by Piercarlo Grandi.
+
+1994-08-23 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Do not declare alloca if already defined, so HP's
+ +Olibcalls compiler option works.
+ Reported by John David Anglin.
+
+ * rtapelib.c (__rmt_open): Use REMOTE_SHELL only if defined.
+ Otherwise, if the command argument has been specified and
+ REMOTE_SHELL is not defined, immediately return an error.
+ Reported by Bruno Haible, Kaveh R. Ghazi, Marty Leisner,
+ Torkel Hasle and William Bader.
+
+ Because --rsh-command may always be given, even if no remote shell
+ was found at configure time, remote capabilities are always
+ compiled. This also solve other problems related to RTAPELIB.
+ * Makefile.in: Always compile $Urtapelib.o.
+ * buffer.c (child_open): Always test _remdev, do not depend
+ anymore on HAVE_RTAPELIB.
+ * rmt.h [!HAVE_RTAPELIB]: Remove some code.
+ Reported by Andreas Schwab and Vic Abell.
+
+ * rtapelib.c: Remove unused COMPAT (mis)feature. Remove most
+ length limitations for remote host name, remote user name and
+ remote device name. Duplicate path, and free it in all cases.
+ * (_rmt_rexec): The `user' parameter may never by the empty
+ string. Remove code for that case.
+
+1994-08-22 François Pinard <pinard@iro.umontreal.ca>
+
+ Little cleanup in installation:
+ * Makefile.in: Remove rule for ../lib/libtar.a.
+
+1994-08-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.5.
+
+ * Makefile.in: Correct for when a different build directory.
+
+ * tar.h: Replace W* definitions. Adapted from make 3.71.
+ * buffer.c (close_archive): Replace WIFCOREDUMPED by
+ WCOREDUMP. Previous WIFSIGNALED definition was excluding SIGSTOP,
+ new definition do not exclude it anymore. We'll see.
+ Reported by Demizu Noritoshi, Greg Black, Kaveh R. Ghazi,
+ Robert E. Brown and Russ Evans.
+
+1994-08-20 François Pinard <pinard@iro.umontreal.ca>
+
+ This might (?) solve the dirent problems on NeXT's and Apollo's:
+ * tar.h: Change includes and defines from older AC_DIR_HEADER
+ style to newer and clearer AC_HEADER_DIRENT style.
+ * create.c, gnu.c: Replace NLENGTH by NAMLEN.
+ Reported by Drew Trieger, Hugh Secker-Walker, James W. McKelvey,
+ Robert E. Brown and Thomas Krebs.
+
+1994-08-17 François Pinard <pinard@iro.umontreal.ca>
+
+ Remove some shadowings.
+ * update.c (update_archive): Rename head_standard to unused.
+ * buffer.c (open_archive): Rename head to label.
+ (fl_read): Rename head to cursor.
+
+ * gnu.c (dirent_cmp): Use (char *const *), not (const char **)
+ for not loosing the const specifier while casting.
+
+ * mangle.c (extract_mangle): Remove unused argument.
+ * tar.h: Adjust prototype.
+ * extract.c (extract_archive): Caller changed.
+
+ * rtapelib.c (__rmt_open): Remove useless mode parameter.
+ * rmt.h, tar.h: Adjust prototype.
+ * rmt.h: Adjust macros calling __rmt_open.
+ * create.c (deal_with_sparse): Remove unused argument.
+ * create.c (dump_file): Caller changed.
+ Reported by Greg Black.
+
+ * Makefile.in: Avoid $U in defining RTAPELIB. Remove both
+ rtapelib.o and _urtapelib.o explicit rules, not needed anymore.
+ * rmt.h, buffer.c [HAVE_RTAPELIB]: Instead of !NO_REMOTE.
+ Reported by Andreas Schwab.
+
+ * Makefile.in: Correct a typo in $Ubuffer.o dependencies.
+ Reported by Andreas Schwab.
+
+ * rtapelib.c (__rmt_ioctl): Compile the MTIOCGET case only if
+ this symbol is defined. This also solves a missing mt_type field
+ on NS32016 running SysVr2.2.
+ Reported by Greg Black.
+
+ * rtapelib.c (__rmt_ioctl) : Conditionnalize only the MTIOCTOP
+ case, not the whole routine, with the MTIOCTOP symbol. In case of
+ unrecognized operation, return EOPNOTSUPP instead of EINVAL.
+ * rmt.h: Always provide a prototype for __rmt_ioctl. Delete
+ the RMTIOCTL machinery.
+
+1994-08-16 François Pinard <pinard@iro.umontreal.ca>
+
+ * rmt.c, buffer.c: Use a more uniform way of including
+ <sys/mtio.h> or its alternates.
+ Reported by Daniel R. Guilderson and Kaveh R. Ghazi.
+
+ * Makefile.in: Split rule for $Urtapelib.o into one rule for
+ rtapelib.o and one rule for _rtapelib.o, taking care of the fact
+ that rtapelib.c is in $(srcdir) while _rtapelib.c is in current
+ directory.
+ Reported by Andreas Schwab, Kaveh R. Ghazi, Minh Tran-Le and
+ Per Foreby.
+
+ * rmt.c (string_error): Correct DEBUG2 into DEBUG1, and strint
+ into string.
+ Reported by Anders Andersson, Bruno Haible, Thomas Krebs and
+ Thomas König.
+
+ * Makefile.in: Add $U's to rtapelib and rmt specific rules.
+ Reported by Thomas König.
+
+1994-08-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.4.
+
+ * rmt.c (numeric_error): Renamed from error.
+ (string_error): New, to replace ERROR ((...)), unavailable in rmt.c.
+
+ * rmt.c (checkbuf): Do not accept, nor return record. Use the
+ global instead. This will get rid of useless shadowings.
+
+ * rmt.h: Give prototypes for __rmt_* routines.
+ * rtapelib.c: Include "rmt.h".
+ * update.c (move_arch): Cast last rmtioctl argument to char *.
+ * buffer.c (backspace_output): Idem.
+ * diffarch.c (verify_volume): Idem.
+
+ * Makefile.in (rmt): Declare dependencies over rmt.h.
+
+1994-08-14 François Pinard <pinard@iro.umontreal.ca>
+
+ * rtapelib.c: Use MTIO_CHECK_FIELD instead of mt_type.
+ Reported by Ben A. Mesander.
+
+1994-08-13 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Include <sys/wait.h> if it exists, whether POSIX or not.
+ Check if WIFSTOPPED is defined, to decide if defining others WIF*.
+ Reported by Bruno Haible.
+
+1994-08-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * extract.c (extract_archive) [O_CTG]: Declare longname variable.
+ Initialize it as NULL. This dirty kludge will allow the module to
+ compile on Masscomp's, for the time being.
+ Reported by Ben A. Mesander.
+
+ * tar.h, rtapelib.c: Declare strstr if we replaced it.
+ Reported by Ben A. Mesander, Christian T. Dum and Kaveh R. Ghazi.
+
+1994-08-10 François Pinard <pinard@iro.umontreal.ca>
+
+ * create.c (dump_file): Do not test only for hpux, but also
+ for __hpux. I added __hpux__ too, as done in tar.h.
+ Reported by Richard Lloyd.
+
+ * tar.h: Do not include <sys/mknod.h> anymore for HP-UX from
+ HP-UX 8 and after, for which definitions are in <sys/sysmacros.h>,
+ and reorganize the tests in this area.
+ Reported by Christian T. Dum, Dimitris Fousekis, Kimmy Posey,
+ Michael Maass, Richard Lloyd and Thomas König.
+
+1994-08-09 François Pinard <pinard@iro.umontreal.ca>
+
+ These changes for const-cleaning gnu.c and tar.c:
+ * tar.c (read_name_from_file): Work directly on global
+ variables instead of accepting parameters. Return success or
+ failure as an int instead of the relocated name_buffer.
+ (name_next): Caller changed, internal clean-up of the function.
+ Remove trailing slashes on the command call too, not only when
+ reading from a file through -T option.
+ * gnu.c: Add const to name and dir_text in struct dirname.
+ Reported by Ben A. Mesander, Bruno Haible, Christian T. Dum,
+ Dean Gaudet, James W. McKelvey, Richard Lloyd and Robert E. Brown.
+
+1994-08-08 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (name_next, name_gather, addname): Use strcmp for
+ checking for "-C", instead of decomposed tests, just for clarity.
+
+ * Makefile.in (RSH): Define from configuration.
+ (rtapelib.o): Define REMOTE_SHELL from $(RSH) while compiling.
+ * rtapelib.c (__rmt_open): If command not given, use
+ REMOTE_SHELL, instead of cascading tries of filenames.
+ Reported by Bruno Haible.
+
+ * tar.c: Include <fnmatch.h> if FNM_LEADING_DIR is not
+ defined, instead of checking for FNM_PATHNAME, because some
+ <unistd.h> define the later without defining the former.
+ Reported by Thomas König.
+
+ * create.c (dump_file): Cast alloca results, for those
+ compilers not processing void * properly.
+ Reported by Kaveh R. Ghazi.
+
+ * Makefile.in: Get prefix and exec_prefix from configure.
+ Reported by Andreas Schwab, Christian T. Dum and Dean Gaudet.
+
+ * src/port.c: Delete mkdir (and rmdir), rename, strstr and
+ ftruncate replacements.
+ Reported by Kaveh R. Ghazi (for memset and strstr).
+ Reported by Bruno Haible (for mkdir and rename).
+
+1994-08-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Replace msg_file by stdlis.
+ * buffer.c, gnu.c, list.c, diffarch.c: Idem.
+
+ * tar.c (main): Print version on stdout, not stderr.
+
+ * tar.h: Unconditionnaly insert the pad. Why play the game of
+ forcing the compiler to do it for us? (Hum! I'm not so sure.)
+ Reported by Bruno Haible.
+
+ * list.c (read_header): Initialize signed_sum to 0. Use this
+ opportunity for slightly reorganizing the code around.
+ Reported by Anders Andersson, Andrey A. Chernov, Bruno Haible
+ and Chris Ransom.
+
+ * tar.c: Declare name_buffer_length as size_t instead of int.
+ Reported by Andreas Schwab, J.T. Conklin, Kaveh R. Ghazi and
+ Robert E. Brown.
+
+ * rmt.h: Have the NO_REMOTE case be a particular case of the
+ other, for rmtopen and rmtcreat were not transmitting the proper
+ number of parameters to open and creat (since 26 July 1994).
+ Reported by Andreas Schwab.
+
+ * extract.c (extract_archive): Delay changing owner to after
+ doing utime, for keeping long enough the permission of utime'ing.
+ (extract_archive, restore_saved_dir_info): Idem for directories.
+ Reported by Jonathan I. Kamens.
+
+ * tar.h: Change malloc_dbg to dmalloc, mutatis mutandis.
+
+ * tar.h: Undefine many macros if stat macros found to be
+ broken. Define mkfifo only if configure did not find it.
+ Include <sys/param.h> if not _POSIX_SOURCE, then <unistd.h> if
+ we have it, than "pathmax.h". Move _POSIX_VERSION dependent
+ code further down. Do not declare getcwd if we do not have it.
+ * tar.c: Do not include <unistd.h>, now in "tar.h".
+ Reported by Bernard Chen, Jean-Michel Soenen, John L.
+ Chmielewski and Kaveh R. Ghazi.
+
+ * tar.h: Define DEV_BSIZE, ST_BLKSIZE and ST_NBLOCKS,
+ borrowing this code from both fileutils-3.9's "lib/system.h" and
+ textutils-1.9's "system.h".
+ * create.c (dump_file): Straighten the test for sparseness,
+ which was requiring one block too much, most probably for trying
+ to get around DEV_BSIZE/st_blksize confusion. Use ST_NBLOCKS,
+ instead of computing a variable block_size and doing specific
+ tests for HP-UX or Linux. Also rewrite the test so it works
+ when ST_NBLOCKS is unsigned.
+ Reported by Bruno Haible, Dean Gaudet, Dick Streefland, Harald
+ König, Jim Meyering, Kai Petzke, Kaveh R. Ghazi and Torkel Hasle.
+
+1994-08-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c: Do not include <unistd.h> if we do not have it.
+ Reported by Kaveh R. Ghazi.
+
+ * Makefile.in (RTAPELIB): Prefix by $U for unprotoization.
+ Reported by Kaveh R. Ghazi and Christian T. Dum.
+
+ * port.c: Remove many static specifiers.
+ Reported by Demizu Noritoshi, Kaveh R. Ghazi and William Bader.
+
+ * rtapelib.c (__rmt_open): Replace system by remote, twice.
+ Reported by Ben A. Mesander, Christian T. Dum, Demizu Noritoshi
+ and Kaveh R. Ghazi.
+
+ * tar.c (addname): Replace a forgotten EX_SYSTEM by
+ TAREXIT_FAILURE.
+ Reported by Demizu Noritoshi, James W. McKelvey, Kaveh R.
+ Ghazi and Robert E. Brown.
+
+1994-08-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.3.
+
+ * tar.c (assign_string): New routines.
+ * create.c (dump_file, start_header), extract.c
+ (extract_archive), list.c (list_archive, read_header),
+ buffer.c (open_archive), diffarch.c (diff_archive): Use
+ assign_string for setting these variables to a string value or
+ NULL.
+ * buffer.c (open_archive): Sets current_file_name,
+ current_link_name and save_name to NULL.
+ (close_archive): Free each of them if not NULL.
+ (fl_write): Take a copy of save_name into cursor, and advance the
+ cursor instead, because save_name should stay free-able.
+ Reported by Dave Gentzel, Harald Anlauf, Mark Clements, Robert
+ Weissenfels, Ronald van Loon, Tsutomu Yamada and Vic Abell.
+
+ * extract.c (extract_archive): Use xstrdup, for clarity.
+ * gnu.c (add_dir): Idem.
+
+ * list.c (print_header): Correct a little bug by which
+ non-symbolic links were not printed properly quoted.
+
+ * diffarch.c (diff_archive): Allocate tmpbuf to the proper
+ size. NAMSIZ + 2 is not necessarily enough.
+
+1994-08-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Refresh str*/mem* configured declarations. Among
+ other things, this will solve previously missing #undef's.
+ * rmt.h: Revise strchr configured declaration.
+ * *.c: Replace bzero by memset, bcopy by memcpy, bcmp by
+ memcmp, index by strchr and rindex by strrchr.
+ * port.c: Delete functions bzero and bcmp, said to not exist
+ on Minix. AC_MINIX in configure.in should guarantee POSIX things.
+ Reported by Drew Trieger, Hugh Secker-Walker and Vic Abell.
+
+ * tar.h, tar.c, buffer.c, update.c: Change CMD_* to COMMAND_*.
+
+ * buffer.c (open_archive): Use strcmp to compare archive name
+ to `-', instead of doing it explicitely. Just for clarity.
+
+ * tar.h, tar.c, buffer.c: Replace ar_files by
+ archive_name_array, n_ar_files by archive_names and ar_files_len
+ by allocated_archive_names. Replace the index cur_ar_file by
+ archive_name_cursor, which is a cursor in archive_name_array.
+
+ * tar.c (main): Move the initialization of
+ archive_name_array at beginning, taken from options routine.
+ Free it at end of main.
+ (options): Use xrealloc instead of ck_realloc for archive_name,
+ for the already saved names to be preserved.
+ Reported by Per Bojsen.
+
+ * tar.h, tar.c: Replace name_file by namefile_name.
+ * tar.c: Replace n_ind by name_array, n_indused by names,
+ n_indalloc by allocated_names, and n_indscan by name_index.
+ Replace namef by name_file, n_argv by names_argv and n_argc by
+ names_argc.
+ (main): Make an initial allocation for name_array at beginning,
+ moved out from name_add, free it at end of main.
+
+ * buffer.c (close_archive): Free ar_block at end.
+
+1994-07-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h [WITH_MALLOC_DBG]: Include "malloc_dbg.h".
+
+ * create.c (create_archive): Do not attempt creating a
+ directory summary file if -G, since -G sets gnu_dumpfile to 0.
+ Reported by Alexander Dupuy.
+
+ * create.c (dump_file): Avoid a NULL dereference with -G when
+ trying to dump an empty directory.
+ * gnu.c (add_dir_name): Same thing.
+ Reported by Rainer Orth.
+
+ Correction for the improper `data differs' diagnostic given when
+ the continuation of a multi-volume was compared.
+ * diffarch.c (diff_archive): If multi-volume, update save_name
+ and save_totsize before calling wantbytes.
+ * buffer.c (wantbytes): If multi-volume, update save_sizeleft.
+ Reported by Andreas Schwab, Denis Fortin, François Pinard,
+ Hiroyuki Bessho, Olaf Schlueter, Simon Wright and Saul Lubkin.
+
+1994-07-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c (options): Implement DEVICE_PREFIX and DENSITY_LETTER.
+ Reported by Danny R. Johnston.
+
+ * gnu.c (gnu_restore): Use CURRENT_FILE_NAME abbreviation.
+ * extract.c (extract_archive): Idem.
+ Reported by Timothy Fossum.
+
+1994-07-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * create.c (dump_file): Abort if no memory for a possible
+ link, remove related bogus code, and the variable nolinks.
+ Reported by Andreas Schwab.
+
+ * create.c (dump_file): Detect file sparseness correctly for
+ Linux ext2 filesystem.
+ Reported by Kai Petzke.
+
+ * port.c (link) [!MSDOS]: Do not call setmode.
+ Reported by Richard Deal.
+
+ Reorganization for `tar -d' to provide a different exit status.
+ * tar.h: Replace errors by exit_status. Declare TAREXIT_*.
+ * buffer.c (child_open): Exit with exit_status.
+ * tar.c (main): Initialize exit_status to TAREXIT_SUCCESS, and
+ exit with exit_status.
+ * buffer.c, diffarch.c, gnu.c, list.c, port.c,
+ rmt.c, tar.c, update.c: Replace EXIT_FAILURE by
+ TAREXIT_FAILURE, and EXIT_SUCCESS by TAREXIT_SUCCESS.
+ * tar.h (ERROR), create.c (dump_file): Set exit_status to
+ TAREXIT_FAILURE instead of increasing errors.
+ * diffarch.c (sigh, diff_sparse_files): On differences, set
+ exit_status to TAREXIT_DIFFERS if nothing more serious already.
+ Reported by Tilman Schmidt.
+
+ * rmt.c: Define EXIT_FAILURE and EXIT_SUCCESS if not already.
+ * rtapelib.c: Define EXIT_ON_EXEC_ERROR to 128 and use it.
+
+1994-07-27 François Pinard <pinard@iro.umontreal.ca>
+
+ * diffarch.c (sigh): Increment errors, so a difference will
+ yield a non-zero exit status at end.
+ Reported by Nick Holloway.
+
+ * tar.h: Rename TARERROR to WARN, then add ERROR which is similar,
+ but increments the errors counter.
+ * *.c: Replace all TARERROR by WARN or ERROR, deciding for each
+ case. Many errors were not reflected in exit status.
+
+ Reported by Carl Streeter, Esa Karell, George Chyu, Ian Jackson,
+ Judy Ricker, Massimo Dal Zotto, Roland McGrath, Tilman Schmidt
+ and Torkel Hasle.
+
+ * buffer.c (child_open): Exit with EXIT_FAILURE if any error.
+
+ * rtapelib.c: Use error for reporting errors.
+ (do_command): New name for command.
+ (get_status): New name for status.
+
+ * buffer.c: Remove definition of MAGIC_STAT.
+ (close_archive): Do not check MAGIC_STAT for an exit value, since
+ this value is never returned.
+
+ * *.c: Use TARERROR or exit with EXIT_FAILURE, instead of various
+ esoteric statuses. Normalize using TARERROR with an exit status,
+ instead of calling TARERROR with 0 first, then _exit. On exit
+ calls, use EXIT_SUCCESS instead of 0.
+ * tar.c: Do not use the exit status anymore for outputting an
+ error counter value. Wrap around was creating spurious success.
+ * tar.h: Remove EX_* definitions for tar exit statuses.
+ Reported by Bob Mende and Torbjorn Granlund.
+
+1994-07-26 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Add f_rsh_command variable.
+ * tar.c: Add and process --rsh-command option.
+ * buffer.c (open_archive, child_open, new_volume): Pass
+ f_rsh_command to rmtopen and rmtcreat calls.
+ * rmt.h (rmtopen, rmtcreat): Pass a supplementary argument.
+ * rtapelib.c (__rmt_open): Accept and process a command
+ argument, to replace rsh.
+ Reported by Jonathan I. Kamens.
+
+ * tar.h: Instead of including <sys/file.h> with BSD42 or
+ <fcntl.h> for V7, merely include <fcntl.h> if it exists,
+ otherwise <sys/file.h>.
+ * buffer.c, diffarch.c, extract.c, list.c,
+ port.c, update.c: Do not include <fcntl.h> or
+ <sys/file.h>, because they are indirectly included through
+ "tar.h".
+
+ * create.c (dump_file): Remove the BSD42 conditional. If not
+ f_sparse_files, initialize upperbound as when not BSD42.
+ Reported by Alan Bawden, Claude Scarpelli, Laurent
+ Sainte-Marthe, Noah Friedman, Reuben Sumner, Tom Quinn and
+ William Bader.
+
+1994-07-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Merely define valloc as being malloc if valloc does
+ not exist.
+ * port.h: Remove valloc, which was only a dummy for malloc.
+ Reported by Cliff Krumvieda, Francois Pinard, Henrik Bakman,
+ J.T. Conklin, Nelson H.F. Beebe and Tilman Schmidt.
+
+1994-07-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * create.c (start_header): Cast NAMSIZ to size_t before
+ comparing it to strlen result.
+ Reported by Mark Frost.
+
+ * tar.c (main): Zero out label_pattern before compiling in
+ regular expressions, instead of using uninitialized memory.
+ Reported by Holger Teutsch.
+
+ * tar.c [!FNM_PATHNAME]: Include fnmatch.h only if unistd.h fails
+ to define this symbol.
+ Reported by Alan Modra, Christian T. Dum, Eddy ?, John
+ Oleynick and Richard Lloyd.
+
+ * buffer.c, diffarch.c, rtapelib.c, update.c:
+ Include <sys/io/trioctl.h> before <sys/mtio.h>, if it exists.
+ Reported by Kaveh R. Ghazi.
+
+ * tar.c (options): Use defined OPTION_* constants instead of
+ anonymous numbers for long options not having a short option form.
+
+ * rmt.h [!MTIOCTOP]: Do not define RMTIOCTL, so __rmt_ioctl
+ will not be called if it has not been compiled in rtapelib.c.
+
+ * tar.h: Add CMD_TOO_MANY.
+ * tar.c (main): Use CMD_TOO_MANY, and get rid of badopt label.
+ Reported by David J. MacKenzie.
+
+ * tar.c (usage): New name for describe(). Rewritten with
+ better help formatting and more logical grouping of options.
+ Accepts an exit status argument. Callers adapted.
+ Reported by Richard O'Neill.
+
+1994-07-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * port.c (rename): Constify the arguments.
+ Reported by Elmar Heeb, Jeff Prothero and John Clark.
+
+ * tar.c (main): Declare version_string locally.
+ * version.c: Deleted.
+ * Makefile.in: Adjusted.
+
+1994-07-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.h: Merge "port.h" towards the beginning of tar.h.
+ Include <stdio.h> and <errno.h>, and define errno if needed.
+ * *.c: Do not include "port.h" anymore after "tar.h", do not
+ include <stdio.h>, <errno.h> nor <sys/types.h>. Also move
+ "tar.h" as the first file included in every module. This
+ would solve, among other things, the problem of RE_DUP_MAX
+ being redefined by <limits.h>, when included after "regex.h".
+ * port.h: Deleted.
+ * Makefile.in: Adjusted.
+ Reported by Alan Modra, Christian T. Dum, Dimitris Fousekis,
+ John David Anglin, Matthew Braun, Michael Maass, Richard Lloyd
+ and Stefan Skoglund.
+
+ * create.c (dump_file): Do not cast alloca result to (char *).
+ The problem reported was that alloca result was seen as int, but
+ with the changes just made, alloca should be properly declared.
+ Reported by Bryant Fujimoto and Michael Kubik.
+
+1994-07-06 François Pinard <pinard@iro.umontreal.ca>
+
+ * create.c, extract.c [HAVE_UTIME_H]: Instead of _POSIX_VERSION,
+ for choosing to include <utime.h>.
+ Reported by Carl Swanson and Thomas Krebs.
+
+1994-07-05 François Pinard <pinard@iro.umontreal.ca>
+
+ * tar.c: Replace DEF_AR_FILE with DEFAULT_ARCHIVE, replace
+ DEFBLOCKING with DEFAULT_BLOCKING.
+
+ * rtapelib.c: Replace "??'" by "?? '" at two places in a
+ comment, so avoiding Pyramid's DC/OSx compiler to complain about
+ ANSI trigraph sequences. Even comments can trigger bugs, now!
+ Reported by Mark Frost.
+
+ * tar.h: Declare valloc.
+ * buffer.c, diffarch.c: Remove declaration for valloc.
+
+ * testpad.c: Deleted.
+ * tar.h: Do not include "testpad.h" anymore.
+ * Makefile.in: Delete testpad matters.
+
+ * buffer.c (new_volume): Inside case 'n', strcpy into r then
+ assign r to p, instead of strcpy'ing directly into p, for making
+ the module const clean.
+
+1994-07-03 François Pinard <pinard@iro.umontreal.ca>
+
+ Rename a few variables to avoid shadowing variables or functions:
+ * list.c (print_header): Change name to quoted_name.
+ * buffer.c (child_open): Change pipe to local_pipe.
+ * extract.c (extract_archive): Change namelen to namelen_bis.
+ * rtapelib.c (__rmt_open): Change system to remote.
+
+ * tar.c (options): Add two missing arguments to getoldopt
+ call, NULL is not necessarily implied on all systems.
+
+ * list.c (print_header): Add a few missing long specification
+ in formats.
+ * diffarch.c (compare_chunk, diff_sparse_files): Idem.
+ * port.c (msg, msg_perror): Idem.
+
+ * tar.h: Include prototypes for all functions which call from
+ one module to another. Declare voidstar (use it everywhere
+ instead of PTR). Move in the include <sys/stat.h> from
+ <port.h>, and the include of option.h from tar.c and
+ getoldopt.c, waiting for a better solution for all these things.
+ * port.c: Removed PTR declaration and including <sys/stat.h>.
+ * getoldopt.c, tar.c: Remove including "option.h".
+
+1994-07-02 François Pinard <pinard@iro.umontreal.ca>
+
+ * *: Protoized all function headers. Added static to
+ functions which can take it. Add many const specifiers. Remove
+ unused variables.
+
+ * port.c (xmalloc): Delete function, do not mask the true one.
+ * port.c (ck_malloc): Use xmalloc, waiting for annihilation.
+ * port.c (ck_realloc): Use xrealloc, waiting for annihilation.
+ * *: Begin switching from ck_malloc (or even pure malloc) to
+ xmalloc. Same for ck_realloc (pure realloc) to xrealloc.
+ Doing this correctly is a delicate matter, which I'll continue
+ without reporting it anymore, while doing other modifications.
+
+ * *: Replace msg and msg_perror calls by TARERROR macro calls.
+ Capitalize first word of all error messages, remove ending
+ punctuation or newline. Systematically avoid contractions for
+ `Cannot' and `Could not'. Always write `WARNING:' all in capitals.
+ * tar.h: Declare TARERROR as calling error(). Rename
+ variable tar to program_name.
+ * tar.c (main, options), buffer.c (child_open), port.c
+ (msg, msg_perror), gnu.c (gnu_restore): Rename variable tar to
+ program_name.
+ * gnu.c (gnu_restore): Remove a spurious repetition of
+ program_name in error message.
+
+1994-07-01 François Pinard <pinard@iro.umontreal.ca>
+
+ * buffer.c, create.c extract.c, gnu.c, list.c,
+ names.c, rmt.c, tar.c, update.c: Remove all (void)
+ prefixes to function calls. There are limits to lint clutter.
+
+1994-06-30 François Pinard <pinard@iro.umontreal.ca>
+
+ * port.h: Remove definition of const. Let configure do it.
+
+ * tar.h, rmt.c, rtapelib.c, version.c, testpad.c: Add a block
+ for including <config.h> or "config.h". If "tar.h" was included
+ everywhere, the block will only be needed there.
+
+ * *.[ch]: Reindented to GNU standards (they were not far).
+ Got rid of all `* ' left prefixes in comments and refilled them.
+ There is still a lot of cosmetic changes needed everywhere.
+ I will not report them any more, doing them along the way of
+ other things in the future.
+
+ * Makefile.in: New file.
+
+ * Split distribution into a few subdirectories, for easing
+ maintainance.
+
+ * Taking over maintenance duties.
+
+1993-08-31 David J. MacKenzie <djm@goldman.gnu.ai.mit.edu>
+
+ * rmt.c [M_UNIX]: Include sys/tape.h instead of sys/mtio.h.
+ Reported by Drew Sullivan and William Bader.
+
+1993-07-29 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * Makefile.in (config.status): Run config.status --recheck, not
+ configure, to get the right args passed.
+
+1993-07-19 David J. MacKenzie <djm@churchy.gnu.ai.mit.edu>
+
+ * Makefile.in (libdir): Use standard GNU value --
+ $(exec_prefix)/lib, not /etc.
+
+1993-07-08 David J. MacKenzie <djm@goldman.gnu.ai.mit.edu>
+
+ * Makefile.in (installdirs, configure, config.status,
+ Makefile): New targets.
+
+1993-06-14 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * Makefile.in (.c.o): Put -I. before -I$(srcdir), and make
+ $(CFLAGS) last.
+
+1993-05-22 The King <elvis@graceland.gnu.ai.mit.edu>
+
+ * extract.c (extract_archive, restore_saved_dir_info): Print
+ mode in octal, not in decimal.
+ Reported by Scott S. Bertilson.
+
+1993-03-26 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * configure.in: Better way of detecting HP-UX.
+ Reported by Noah Friedman.
+
+1993-03-25 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * version.c: Released version 1.11.2.
+
+ * Makefile.in (dist): Do the link differently; some of the
+ files have changed filesystems which makes it more complex.
+
+ * Makefile.in (dist, shar): Use gzip instead of compress.
+
+ * create.c (dump_file): Test for curdev == -1, not curdev < 0.
+ Some losing NFS systems give negative device numbers sometimes.
+ Reported by Thorbjxrn Willoch.
+
+1993-03-19 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * buffer.c (new_volume): Write the global volume number to the
+ volno file before running the info script, so that the script
+ can look at it.
+
+1993-03-17 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * tar.c (describe, long_options): Changed --compress-block to
+ --block-compress.
+ (options): Fixed f_compress_block sanity check error message
+ to give the correct name of the option.
+
+1993-03-16 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * extract.c (extract_archive): case LF_DIR: Do chown when
+ necessary. Don't bother jumping to set_filestat for
+ f_modified; repeat the chmod code here. Replace `break',
+ deleted on 2 September 1992.
+
+ * tar.c (describe, long_options, options): Added gzip options
+ and use-compress-program option.
+ * tar.h: Added new compression options.
+ * buffer.c (child_open, open_archive): Use new compression options.
+
+ * create.c (start_header): Only mask off high bits when
+ creating old-style archives.
+ * list.c (decode_header): Mask off potentially misleading
+ high bits from the mode when reading headers.
+ Reported by Paul Eggert.
+
+1993-03-15 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * extract.c (extract_archive): Put arguments in the right
+ order for error message.
+ Reported by Bruno Haible.
+
+ * create.c (deal_with_sparse): If the last byte was null, we
+ didn't write it out.
+
+ * gnu.c, create.c, extract.c, diffarch.c, list.c:
+ Replace malloc calls with ck_malloc and realloc with ck_realloc.
+ Reported by Jonathan Kamens.
+
+ * tar.c (describe): Improve doc for -L.
+
+ * tar.c (name_next): Don't apply exclusion to explicitly named
+ files.
+
+ * tar.c (long_options, describe): Added new-volume-script as
+ an alias for info-script.
+
+ * extract.c (extract_archive): LF_DUMPDIR case; misplaced paren.
+
+ * extract.c (extract_archive): extract_file case, first if,
+ include space for null in namelen computation.
+
+ * extract.c (extract_sparse_file): Use value returned by write
+ to properly create error message.
+
+ * create.c (create_archive): Don't assume we have anything to
+ dump.
+
+ * buffer.c (open_archive): Set current_file_name for the
+ volume header so that verbose listings work properly.
+
+ * Makefile.in (realclean): Added getdate.c.
+
+ * create.c (deal_with_sparse): If exactly 26 elements in
+ sparsearray, only 25 were written.
+ Reported by Jim Murray.
+
+ * create.c (deal_with_sparse): If the file ends with a zero
+ block, the last byte was not written. This is fixed in create
+ rather than extract: if amidst_data is not set at EOF, put out a
+ block with just the last byte of the file.
+ Reported by Jim Murray.
+
+1993-01-14 David J. MacKenzie <djm@kropotkin.gnu.ai.mit.edu>
+
+ * tar.c: Include fnmatch.h after port.h to make sure we get our FNM_*
+ (e.g. on HPUX 8).
+
+1992-11-24 David J. MacKenzie <djm@goldman.gnu.ai.mit.edu>
+
+ * tar.c (addname), gnu.c (read_dir_file) [HAVE_GETCWD]: Instead of USG.
+
+ * port.h, rmt.h [HAVE_STRING_H]: Instead of USG.
+
+ * port.h: Add dir header decls.
+ * create.c, gnu.c: Use SYSNDIR, SYSDIR, and NDIR
+ instead of BSD42 and USG. Rename DP_NAMELEN to NLENGTH.
+ Use `struct dirent' instead of `struct direct'.
+ * create.c, gnu.c, tar.c: Remove dir header decls.
+
+1992-11-18 David J. MacKenzie <djm@goldman.gnu.ai.mit.edu>
+
+ * tar.c: Change FNM_TARPATH to FNM_LEADING_DIR to match change
+ in fnmatch.[ch].
+
+1992-10-02 David J. MacKenzie <djm@goldman.gnu.ai.mit.edu>
+
+ * tar.c (describe): Fix some tab alignments.
+
+ * Makefile.in (SRC3): Add getdate.c, for systems without bison/yacc
+ (like MS-DOS).
+
+ * diffarch.c (diff_sparse_files): Add missing arg to fprintf calls.
+
+ * extract.c (extract_archive, restore_saved_dir_info),
+ buffer.c (child_open), list.c (decode_header, print_header):
+ Delete unused vars.
+
+ * port.c [__MSDOS__]: Have strstr, rename, and mkdir. Don't
+ define ck_pipe.
+
+ * buffer.c, tar.c (init_volume_number, closeout_volume_number),
+ create.c (write_long): Declare as void, not int, since they
+ don't return a value.
+
+1992-09-22 Michael I Bushnell <mib@wookumz.gnu.ai.mit.edu>
+
+ * buffer.c (close_archive): Removed leftover `break' from when
+ this was a switch.
+
+1992-09-22 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * create.c, port.h: indented #pragma directives with 1 space.
+
+1992-09-18 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * All source files: re indented using GNU indent.
+
+ * rtapelib.c (__rmt_read): Only read the amount left in the
+ buffer; otherwise a broken rmt server (which puts too much
+ data out) could overwrite past our buffer.
+
+1992-09-17 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * configure.in: Check for getpwuid and getgrgid.
+ Reported by J.T. Conklin.
+
+ * create.c: Throughout, use struct utimbuf rather than array
+ of longs.
+ Reported by J.T. Conklin and Michael Ellis.
+
+ * Makefile.in (SRC3, AUX): Move alloca.c to SRC3.
+ (OBJ3): Add @ALLOCA@.
+
+ * Makefile.in (getdate.c): Look in srcdir for getdate.y.
+
+ * buffer.c (close_archive): We can't check WTERMSIG
+ meaningfully unless we already know tha WIFSIGNALED is true.
+ (There is no guarantee it WTERMSIG will return zero when
+ WIFSIGNALED is false.)
+ * port.c (rmdir, mkdir): Check WIFSIGNALED rather than
+ WTERMSIG.
+
+ * Makefile.in (getdate.c): Use $(YACC) instead of `yacc'.
+
+1992-09-15 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * version.c: Released version 1.11.1.
+
+ * Makefile (AUX): Added NEWS.
+
+ * Makefile.in (rmt): Added $(LIBS).
+
+ * mangle.c (extract_mangle): Null terminate link name for
+ losing archives missing it.
+
+ * configure.in: Added tests for libraries needed on Solaris.
+
+ * Makefile.in: added target and rule for getdate.c: getdate.y;
+ some makes don't have one built in.
+
+1992-09-14 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * tar.c (options, main): Advise use of --help rather than
+ +help.
+ Reported by J.T. Conklin.
+
+ * create.c (write_long): Using hstat here is a Bad Idea, and
+ totally unnecessary at that.
+
+ * list.c (read_header): Compute both signed and normal
+ checksums.
+ Reported by Robert E. Brown.
+
+ * diffarch.c, buffer.c: Declare valloc as void* rather than
+ char*.
+ Reported by Robert E. Brown.
+
+ * Makefile.in: Don't install info files.
+
+ * port.h: Undefine index and rindex if necessary; some
+ string.h's define them for us.
+
+ * tar.c (addname): Missing braces after if.
+ * gnu.c (read_dir_file): Missing braces after if.
+
+ * names.c: Add include of <stdio.h>,
+
+ * create.c (start_header): Set current_file_name so that
+ print_header, used for verbose create, works properly.
+ (dump_file): Set current_link_name when setting up symlink
+ and hardlink records.
+ Reported by Robert Crowe.
+
+ * configure.in: Define BSD in the presence of /sdmach or
+ /../../mach.
+ Reported by Robert E. Brown.
+
+ * configure.in: Check for malloc was scrambled.
+
+1992-09-11 David J. MacKenzie <djm@nutrimat.gnu.ai.mit.edu>
+
+ * fnmatch.[ch]: New files.
+ * wildmat.c: File removed.
+ * tar.c: Include fnmatch.h and use fnmatch instead of wildmat.
+ * Makefile.in, makefile.pc: Replace wildmat.o(bj) with fnmatch.
+
+1992-09-10 David J. MacKenzie <djm@nutrimat.gnu.ai.mit.edu>
+
+ * buffer.c, tar.c: Remove redundant decls of getenv, rindex.
+
+ * Makefile.in: Add uninstall target.
+ Define libdir instead of hardcoding /etc for installing rmt.
+
+1992-09-10 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * list.c (read_header): On second thought, that doesn't work
+ either, so just store the names in malloced areas. Sigh.
+
+ * NEWS: New file.
+ * README: Removed things that belong in NEWS; point to it.
+
+ * list.c (read_header): current_file_name and
+ current_link_name need to be set to the arrays in head rather
+ than header; header is the actual read buffer and will change.
+
+ * extract.c (extract_archive):
+ * buffer.c (new_volume): `#' directives need to start in
+ column 1.
+ Reported by J.T. Conklin.
+
+1992-09-09 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * version.c: Release of version 1.11.
+
+ * Makefile.in (AUX): Add getpagesize.h.
+ (AUX): Comment out manuals.
+ (all): Comment out dependency on tar.info.
+
+ * Makefile, configure.in: Arrange to use local malloc on HP-UX.
+
+ * port.h Use the canonical Autoconf chunk for alloca instead
+ of just looking for gcc.
+
+1992-09-09 Noah Friedman <friedman@nutrimat.gnu.ai.mit.edu>
+
+ * port.h: If compiling with gcc, use __builtin_alloca.
+
+1992-09-08 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * extract.c: Removed long name support from here.
+ * list.c (read_header): Understand and skip longname/longlink
+ headers here. Names for current file are stored in new global
+ variables. All source files except create.c changed to refer
+ to current_file_name and current_link_name instead of fields
+ directly from the current header.
+
+1992-09-03 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * create.c (write_long): New function.
+ (dump_file): When writing link records or symlink records, use
+ new write_long function instead of mangling when the link
+ target is too long.
+ (start_header): Use write_long instead of mangling for long
+ names.
+ * extract.c (saverec): Recognize LF_LONGNAME and LF_LONGLINK.
+ (saverec): Throughout, use longname and longlink if they are set.
+
+1992-09-02 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * mangle.c: This is now deprecated; retain extract_mangle for
+ backward compatibility.
+
+ * list.c (print_header): Prevent printing 0 when the gid or uid is
+ null.
+ Reported by Chris Arthur.
+
+ * list.c (decode_header): Use the gid field when the gid is empty,
+ and similarly for uid.
+ Reported by Chris Arthur.
+
+ * extract.c: saved_dir_info, saved_dir_info_head: new type and
+ var.
+ (extract_archive): When extracting directories, now save info
+ in saved_dir_info_head.
+ (restore_saved_dir_info): New function.
+ * list.c (read_and): Call restore_saved_dir_info at the end of
+ the run.
+ Reported by Chris Arthur.
+
+1992-08-31 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * create.c (create_archive): If there are no names specified,
+ write nothing on the archive instead of dumping ".".
+
+ * buffer.c (open_archive): Useful error message.
+
+ * tar.c, tar.h: Recognize f_atime_preserve.
+ * create.c (dump_file): Implement f_atime_preserve.
+
+ * rmt.h (_remdev): Don't require /dev/ to be in remote archive
+ names; obey new force-local flag.
+ * tar.c, tar.h: Implement new force-local flag.
+ Reported by Roland Schemers III.
+
+ * tar.c (describe): same-owner and same-order were confused.
+
+ * create.c (dump_file): Check for toplevel had sense reversed.
+
+ * buffer.c (new_archive): Don't free old_name...when these
+ come from the command line, they aren't malloced, and it isn't
+ important to save this trivial amount of memory.
+
+ * tar.h: replace ar_file with ar_files, n_ar_files,
+ cur_ar_files.
+ * buffer.c (open_archive): multi-volume compressed archives
+ never worked; give an appropriate error. Change open of
+ ar_file to open of ar_files[0].
+ (writeerror, readerror, flush_archive): use
+ ar_files[cur_ar_file] instead of ar_file.
+ (new_archive): Necessary changes to support ar_files.
+ * tar.c (options): handle multiple tape drive arguments.
+
+1992-08-28 Michael I Bushnell <mib@wookumz.gnu.ai.mit.edu>
+
+ * list.c (decode_header), create.c (start_header), tar.h (TMAGIC):
+ Undo djm's changes below; tar does not support the final
+ Posix.1 format; it's bad to make it look like it does.
+
+1992-07-19 David J. MacKenzie <djm@nutrimat.gnu.ai.mit.edu>
+
+ * port.h: Try to prevent redefining major.
+ * port.c [minix]: Implies HAVE_BZERO. Fix a typo.
+
+ * list.c (decode_header): Recognize the final POSIX.1 magic as
+ well as the early draft magic for ustar.
+ * create.c (start_header): Create a final POSIX.1 magic string
+ instead of an early draft string for ustar.
+ * tar.h (TMAGIC): Remove the trailing blanks.
+
+ * rmt.c, rtapelib.c: Use POSIX and STDC headers if available.
+ * rmt.h: Declare the external functions defined in rtapelib.c.
+
+1992-07-14 David J. MacKenzie <djm@apple-gunkies.gnu.ai.mit.edu>
+
+ * pathmax.h: New file.
+ * port.h: Include it.
+ * create.c (create_archive): Allocate PATH_MAX instead of
+ NAME_MAX for temporary buffer so we don't have to figure out
+ what NAME_MAX is (portably).
+
+1992-07-10 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * gnu.c (collect_and_sort_names): write_dir_file has no argument.
+
+1992-07-06 David J. MacKenzie <djm@nutrimat.gnu.ai.mit.edu>
+
+ * port.c (rename): If unlinking the source at the end fails,
+ unlink the destination instead to avoid leaving a mess.
+
+1992-07-03 David J. MacKenzie <djm@nutrimat.gnu.ai.mit.edu>
+
+ * buffer.c, diffarch.c, update.c, rtapelib.c [HAVE_SYS_MTIO_H]:
+ Instead of NO_MTIO.
+
+ * port.c, tar.h [HAVE_FOO]: Instead of FOO_MISSING.
+
+1992-06-23 David J. MacKenzie <djm@goldman.gnu.ai.mit.edu>
+
+ * rmt.c: Add #ifdefs to work on ISC.
+
+1992-05-20 David J. MacKenzie <djm@churchy.gnu.ai.mit.edu>
+
+ * port.h: Define major, minor, makedev if the system doesn't.
+
+1992-05-13 Michael I Bushnell <mib@apple-gunkies.gnu.ai.mit.edu>
+
+ * gnu.c (add_dir_name): Store legitimate value into
+ dir_contents when get_dir_contents returns NULL.
+
+1992-05-07 Michael I Bushnell <mib@apple-gunkies.gnu.ai.mit.edu>
+
+ * gnu.c (add_dir_name): Check for return of NULL from
+ get_dir_contents; see djm's change of Fri Jul 26 01:12:58 1991.
+
+1992-05-04 David J. MacKenzie <djm@churchy.gnu.ai.mit.edu>
+
+ * tar.h: Make comments for option names say -- instead of +.
+
+1992-04-29 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * tar.c, tar.t: Added +volno-file option.
+ buffer.c (init_volume_number, closeout_volume_number): New functions.
+ tar.c (main): Call new functions in the right place.
+
+ * buffer.c (fl_write, fl_read): Mod to allow losing tape
+ drives which use short counts to indicate end of tape
+ correctly handle the multi-tape stuff. The read half won't
+ co-exist with f_reblock; there's no way to fix that, of
+ course.
+
+ * tar.c, tar.h: Added new option +show-omitted-dirs.
+ list.c (read_and): Implemented show-omitted-dirs.
+ Reported by Karl Berry.
+
+ * tar.c, tar.h: Added new option +checkpoint.
+ buffer.c (fl_read, fl_write): Implemented +checkpoint lazily.
+
+ * create.c (dump_file): Added toplevel argument; some devices
+ can be negative, so the old method was bogus. All callers
+ changed.
+ Reported by Max Hailperin.
+
+ * tar.c, tar.h: Added new option +ignore-failed-read.
+ create.c (dump_file): Implemented +ignore-failed-read.
+ Reported by Bob Mende Pie.
+
+ * create.c (finish_sparse_file): Commented out debugging printf.
+
+ * tar.c, tar.h: Added new option +remove-files to delete files
+ after they are added to the archive.
+ create.c (dump_file): Implemented +remove-files for
+ everything but directories. I don't think they need it.
+
+1992-04-28 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * create.c: (dump_file): save_name needs to be set equal to p,
+ not something inside the header, because the header changes at
+ the first buffer flush.
+
+1992-04-24 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * create.c: Djm incorrectly moved the include of port.h to
+ precede the include of sys/file.h; restored.
+
+ * tar.c (main): Cases CMD_EXTRACT and CMD_LIST: declare error
+ string with const.
+
+ * gnu.c (collect_and_sort_names): Leave if around
+ write_dir_file in place.
+
+1992-04-22 David J. MacKenzie <djm@churchy.gnu.ai.mit.edu>
+
+ * rtapelib.c: SIGTYPE -> RETSIGTYPE.
+
+1992-03-09 David J. MacKenzie <djm@nutrimat.gnu.ai.mit.edu>
+
+ * rtapelib.c: Reformat and make comments more complete.
+ Rename a few variables for clarity.
+
+1992-03-05 David J. MacKenzie <djm@nutrimat.gnu.ai.mit.edu>
+
+ * tar.c (describe): Document long options as starting with --.
+
+1992-01-23 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * tar.c (options): Check get_date return value for error indication.
+
+1991-12-24 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * tar.c, gnu.c, extract.c, create.c, port.h, rmt.h [HAVE_UNISTD_H,
+ _POSIX_VERSION]: Instead of POSIX ifdefs.
+
+1991-12-20 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * testpad.c (main): flush stderr so perror and fprintf
+ cooperate right.
+
+1991-12-18 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * port.h [MAJOR_IN_MKDEV, MAJOR_IN_SYSMACROS]: To find where to
+ get major, minor and makedev.
+ * create.c, list.c, update.c: Don't check USG to include
+ sys/sysmacros.h.
+
+1991-12-12 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * mangle.c (extract_mangle): Correctly null terminate name of
+ link target.
+
+1991-11-21 Michael I Bushnell <mib@nutrimat>
+
+ * create.c (dump_file, at start of ISREG output loop): use
+ filename from header instead of real name to make sure that we
+ get the mangled version and not one that is too long and
+ overflows buffers.
+
+1991-11-16 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * tar.h: Use new criteria for STDC version of msg.
+
+1991-11-02 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * create.c, gnu.c, tar.c [USG]: Use DIRENT instead of NDIR to select
+ between dirent.h and ndir.h.
+
+ * port.c [FOO_MISSING]: Instead of WANT_FOO, to make sharing code
+ and configure script with other utilities easier.
+ [VPRINTF_MISSING, DOPRNT_MISSING]: Instead of FOO_MSG, to select
+ error reporting routines.
+
+1991-08-29 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * tar.c (long_options). Fixed info-script long option.
+ Reported by Eric Norum.
+
+1991-08-26 David J. MacKenzie <djm@pogo.gnu.ai.mit.edu>
+
+ * configure, Makefile.in: Only put $< in Makefiles if VPATH
+ is being used, because older makes don't understand it.
+
+1991-08-19 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * create.c: Indent '#pragma alloca' so non-ANSI compilers
+ don't choke on it.
+
+1991-08-14 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * list.c (UGSWIDTH): Increase from 11 (sort of like Unix tar) to
+ 18, so that with normal user and group names of <= 8 chars,
+ the columns never shift in a tar -t listing.
+
+1991-08-02 David J. MacKenzie <djm@apple-gunkies>
+
+ * Makefile.in (dist): Include texinfo.tex and tar.info*.
+ (install): Install tar.info*.
+ * configure: Set INSTALLDATA.
+
+ * configure: Create config.status. Remove it and Makefile if
+ interrupted while creating them.
+
+ * configure: Check for +srcdir etc. arg and look for
+ Makefile.in in that directory. Set VPATH if srcdir is not `.'.
+ * Makefile.in: Add `prefix'.
+ (tar.info): New target.
+
+1991-07-30 David J. MacKenzie <djm@apple-gunkies>
+
+ * configure [FTIME_MISSING]: Instead of NEED_TZSET.
+
+1991-07-29 David J. MacKenzie <djm@wombat.gnu.ai.mit.edu>
+
+ * port.c [F_CHSIZE]: Additional version.
+
+1991-07-27 David J. MacKenzie <djm@wombat.gnu.ai.mit.edu>
+
+ * rmt.h: Clean up ifdefs.
+
+ * makefile.pc: Fix typo.
+ * port.h [__MSDOS__]: Instead of MSDOS.
+ [__MSDOS__]: Define off_t. Include io.h and not sys/param.h.
+ [__TURBOC__]: Use void * and don't define const.
+
+1991-07-26 David J. MacKenzie <djm@bleen>
+
+ * buffer.c: Rename `eof' to `hit_eof' to avoid conflict with an
+ MSDOS function.
+ * gnu.c (get_dir_contents): Return NULL, not "\0\0\0\0", on error.
+ * diffarch.c (diff_archive): Open files in binary mode.
+ Don't use or free a non-malloc'd return value from get_dir_contents.
+ * msd_dir.c [__TURBOC__]: Include stdlib.h.
+ * rmt.h: lseek returns off_t, not long.
+
+ * tar.c (describe): -X is +exclude-from, not +exclude.
+ (names_notfound): Free memory only if amiga, not !unix.
+
+ * tar.h, tar.c: Add +null option to make -T read
+ null-terminated filenames (such as those produced by GNU find
+ -print0), and disable -C option.
+ This guarantees that odd filenames will get archived.
+ * tar.c (read_name_from_file): New function.
+ (name_next): Call it instead of fgets.
+ From David J. MacKenzie.
+
+1991-07-24 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * create.c [_AIX]: Declare alloca.
+
+ * buffer.c (open_archive): Check for successful open before,
+ not after, fstatting the fd.
+
+1991-07-23 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * configure: Only define BSD42 if sys/file.h exists.
+ If alloca is missing and /usr/ucblib exists (SVR4), use it
+ instead of -lPW.
+
+ * port.h [!__STDC__]: #define const.
+ * gnu.c (dirent_cmp): Fix args to agree with ANSI C prototype.
+ * create.c: Declare ck_realloc.
+ * gnu.c, diffarch.c: Move check for symlinks to after port.h include.
+
+1991-07-20 David J. MacKenzie <djm@apple-gunkies>
+
+ * msd_dir.[ch]: Use POSIX-style `struct dirent' instead of
+ `struct direct'.
+ * create.c, gnu.c, tar.c: Adjust callers.
+
+1991-07-18 David J. MacKenzie <djm@bleen>
+
+ * port.c (ck_malloc, ck_realloc): Return PTR, not char *.
+ * gnu.c, create.c, tar.c: Fix decls.
+
+ * port.c: Don't use the preprocessor to guess missing
+ functions on Unix; let configure do it.
+ [WANT_GETWD] (getwd): Function removed; not needed because
+ getcwd is used if needed.
+ * gnu.c, tar.c [POSIX]: Use getcwd.
+
+ * rtapelib.c: Use SIGTYPE instead of testing SIGNAL_VOID.
+ Default to void (more common these days) instead of int.
+
+ * tar.c, gnu.c, mangle.c: Remove VOIDSTAR defn. Use PTR instead.
+ * port.h: Define PTR.
+
+ * gnu.c, tar.c [__MSDOS__ || USG]: Remove incorrect getcwd decl.
+ [!POSIX]: Put correct one in port.h.
+
+ * tar.c (describe): Print on stdout instead of stderr; it's
+ not so much a usage message (since you have to ask for it
+ explicitly) as on-line help, and you really need to be able to
+ page it because it's more than a screen long.
+
+ * Make #ifdefs for sys/file.h or fcntl.h, directory header,
+ sys/mtio.h consistent between files. Use NO_MTIO instead of
+ tricks with USG and HAVE_MTIO and NO_RMTIOCTL.
+ * Move decls of ANSI C and POSIX functions to port.h and
+ use standard headers to declare them if available
+ [STDC_HEADERS or POSIX].
+ * Add many missing function declarations and return types.
+ * Some places used __MSDOS__, some MSDOS; standardize on __MSDOS__.
+ * Change S_IF macros to S_IS for POSIX.
+ * port.h: Define appropriate S_IS macros if missing.
+ * port.h [POSIX]: Rename macros for testing exit status to conform to
+ POSIX; use the system's versions if available.
+ * Use POSIX PATH_MAX and NAME_MAX instead of MAXPATHLEN and MAXNAMLEN.
+ * port.h: Define PATH_MAX and NAME_MAX.
+ * create.c, gnu.c, tar.c: Use ck_malloc and free instead of
+ auto arrays of size PATH_MAX or NAME_MAX, since with pathconf
+ they might not be constants.
+ * Move all definitions of O_* to port.h to reduce redundancy.
+ * Make all source files that now need to include port.h do so.
+ * port.c: Remove #undefs of WANT_* so you can use -DWANT_*
+ when compiling, instead of having to edit port.c.
+ [WANT_DUMB_GET_DATE] (get_date): Function removed.
+ Even systems without bison can get bison output and compile it.
+ [WANT_STRING] (index, rindex, bcopy, bzero, bcmp): Functions
+ removed; the translation is now done by macros in port.h.
+ * wildmat.c (wildmat): Use POSIX.2 '!' instead of '^' to negate
+ character classes.
+
+1991-07-15 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * testpad.c (main): Return type void.
+
+ * port.c [WANT_STRING]: Don't include memory.h if NO_MEMORY_H.
+
+ * create.c (dump_file) [AIX]: Fix typo, `allocate' for `alloca'.
+ * gnu.c (collect_and_sort_names): Move misplaced brace out of #ifdef.
+ Reported by Minh Tran-Le.
+
+ * configure: Also look in sys/signal.h for signal decl.
+
+1991-07-10 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * Rename rtape_server.c to rmt.c and rtape_lib.c to rtapelib.c.
+
+ * configure, Makefile.in: $(INSTALLPROG) -> $(INSTALL).
+
+1991-07-09 David J. MacKenzie <djm@wookumz.gnu.ai.mit.edu>
+
+ * Most files: Refer to GPL version 2.
+ * COPYING: Use version 2.
+
+ * port.c [__TURBOC__] (utime): New function.
+
+ * xmalloc: New function (just calls ck_malloc), for alloca.c
+ and bison.simple (in getdate.y output).
+
+ * Makefile.in (AUX): Include alloca.c and tcexparg.c, a
+ command line globber for Turbo C.
+
+1991-07-08 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * testpad.c: Open and write to testpad.h instead of stdout,
+ because some MS-DOS makes (Borland's at least) can't do
+ redirection in commands.
+ * Makefile.in: Don't redirect testpad output.
+
+1991-07-08 Michael I Bushnell <mib@churchy.gnu.ai.mit.edu>
+
+ * buffer.c (fl_read): Missing \n in printf.
+
+1991-07-08 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * create.c, extract.c, gnu.c, diffarch.c, tar.c: Comment out
+ unused variables.
+
+ * tar.c (options): Cast get_date arg to VOIDSTAR instead of
+ `struct timeb *', since on some non-BSD systems the latter is
+ undefined.
+
+1991-07-06 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * Replace Makefile with configure, Makefile.in, and makefile.pc.
+ Update README with current compilation instructions.
+
+ * port.c [WANT_RENAME] (rename): New function.
+
+1991-07-03 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * testpad.c (main): Avoid warning from some compilers on array
+ address.
+
+ * rtape_server.c (sys_errlist): Should be declared extern.
+ Reported by Stuart Kemp.
+
+1991-07-01 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * Release of version 1.10; appropriate changes to README.
+
+ * create.c: Removed printf's about sparse files.
+
+1991-06-21 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * list.c (skip_extended_headers): Userec was being called in
+ the wrong place.
+
+1991-06-20 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * tar.h [STDC_MSG]: Use ANSI prototypes for msg and msg_perror,
+ even if BSD42 is also.
+
+ * Makefile: Replace DESTDIR with bindir.
+ (install): Don't install tar.texinfo. There's no standard
+ place for texinfo files, and /usr/local/man is inappropriate.
+ Add TAGS, distclean, and realclean targets and SHELL= line.
+
+ * version.c: Move old change history to bottom of ChangeLog.
+
+1991-06-12 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * rtape_lib.c (__rmt_write) [SIGNAL_VOID]: Instead of USG.
+
+1991-06-05 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * tar.c (name_match, addname): Ugly hack to handle -C without
+ any files specified.
+ tar.h (struct name): New field for ugly hack.
+
+1991-06-03 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * testpad.c: New file to determine if we need special padding
+ in struct header in tar.h.
+
+ * tar.h (struct header): include padding if necessary, include
+ testpad.h.
+
+ * Makefile: rules to create testpad.h, etc.
+
+1991-05-22 Michael I Bushnell <mib@churchy.gnu.ai.mit.edu>
+
+ * tar.c (options): -L takes an argument.
+
+ * rtape_lib.c (__rmt_open): add /usr/bin/nsh to the list of
+ remote shell programs.
+
+ * create.c: define MAXPATHLEN if we don't get it from a system
+ header file.
+
+ * create.c (deal_with_sparse): return a real return value if
+ we can't open the file.
+
+ * tar.c (long_options): +newer takes an argument.
+ (describe): fix printing in various trivial ways
+
+1991-05-21 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * tar.c (long_options): +get and +concatentate don't require arguments
+
+1991-05-20 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * create.c (write_eot): Don't try and write an EOF if we are
+ already at one.
+
+ * port.c (strstr): Looking for null string should return zero.
+
+1991-05-19 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * tar.c (options): -l doesn't take an argument
+
+ * Makefile: Minor fix for SGI 4D defines.
+ Reported by Andrew Torda.
+
+ * rtape_server.c (main.c): For 386/AIX. I'm suspicious about this
+ one.
+ * create.c (dump_file): For hidden files on AIX.
+ gnu.c (collect_and_sort_name, get_dir_contents): AIX hidden file mod.
+ Reported by Minh Tran-Le.
+
+ * tar.c: (name_next): Allow -C inside a file list given to -T.
+ Reported by David Taylor.
+
+ * Makefile: Comment describing presence of USE_REXEC.
+
+ * extract.c (extract_archive, case LF_SPARSE): zero check for
+ last element on numbytes needs to look at value after
+ converted from octal.
+
+ * port.c [HAVE_STRSTR]: Check it, instead of always demanding strstr.
+ Makefile: Comment describing presence of HAVE_STRSTR option.
+
+1991-05-19 David J. MacKenzie <djm@churchy.gnu.ai.mit.edu>
+
+ * port.c (get_date): Renamed from getdate, to avoid SVR4 conflict.
+ * tar.c: Call get_date instead of getdate.
+
+1991-05-10 Noah Friedman <friedman@nutrimat>
+
+ * tar.c: added "\n\" to the end of some documentation strings
+ where they were left off.
+
+1991-05-09 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * Makefile: added level-0, level-1, and backup-specs to AUX.
+ * version.c: changed to 1.10 beta.
+ * README: updated for 1.10 beta release.
+
+1991-04-02 Michael I Bushnell <mib@godwin>
+
+ * create.c (dump_file): HPUX's st_blocks is in 1024 byte units
+ instead of 512 like the rest of the world, so I special cased
+ it.
+ * tar.c: Undo Noah's changes.
+
+1991-04-01 Noah Friedman <friedman@wookumz.gnu.ai.mit.edu>
+
+ (This ought to be temporary until things are fixed properly. )
+
+ * tar.c: (struct option long_options): flag for "sparse" zero if
+ compiling under hpux.
+ tar.c: (functon options): case 'S' is a no-op if compiling under
+ hpux.
+
+1991-03-30 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * tar.h: new variable tape_length.
+
+ * tar.c (options): add new option +tape-length / -L.
+
+ * buffer.c (fl_write): Turn #ifdef TEST code for limited tape
+ length on always, for tape-length option.
+
+ * create.c (dump_file): avoid apollo lossage where S_IFIFO == S_IFSOCK.
+
+ * buffer.c: include regex.h
+ * buffer.c (fl_read, open_archive): Use regex routines for
+ volume header match.
+ * xmalloc.c: removed file; wasn't necessary.
+ * tar.c: (main) use ck_malloc instead of xmalloc.
+
+1991-03-28 Noah Friedman <friedman@goldman>
+
+ * regex.c, regex.o: New links.
+ * tar.c: include regex.h.
+ * Makefile (OBJ2): Add regex.o.
+ (regex.o, tar.o): Depend on regex.h
+ (SRC2, AUX): Add the new files.
+
+1991-03-23 Noah Friedman <friedman@wookumz.gnu.ai.mit.edu>
+
+ * Makefile: added default flags and options for compiling under
+ hpux.
+
+ * Added files alloca.c and xmalloc.c.
+
+1991-03-23 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
+
+ * port.c [HPUX]: Define WANT_VALLOC.
+
+1991-03-15 David J. MacKenzie <djm@geech.ai.mit.edu>
+
+ * rtape_lib.c [USG && !HAVE_MTIO]: Define NO_RMTIOCTL automatically.
+ (_rmt_rexec): Temporarily re-open stdin and stdout to
+ /dev/tty, to guarantee that rexec() can prompt and read the
+ login name and password from the user.
+ * Makefile: Mention -DUSE_REXEC.
+ Reported by Pascal Meheut.
+
+1991-03-08 Michael I Bushnell <mib@wookumz.ai.mit.edu>
+
+ * tar.h, Makefile [HAVE_SIZE_T]: Might be useful for some people.
+
+ * gnu.c: lstat->stat define where appropriate
+
+ * buffer.c (fl_write): keep track of amount written for +totals.
+ * tar.c, tar.h: set flag f_totals from +totals option.
+ * tar.h (f_totals, tot_written): new variables.
+ * tar.c (main): print total written with CMD_CREATE.
+
+ * tar.c (main): return appropriate exit status
+
+1991-01-17 David J. MacKenzie <djm@apple-gunkies>
+
+ * port.c: Remove a spurious `+' between functions (a remnant
+ of a context diff, apparently).
+
+1991-01-09 Michael I Bushnell <mib@pogo.ai.mit.edu>
+
+ * create.c (where_is_data): Rewritten to be better, and then
+ #ifdef-ed out.
+ (deal_with_sparse): Severly pruned. Now we write or don't
+ write only complete blocks, not worrying about partial blocks.
+ This simplifies calculations, removes bugs, and elides the
+ second scan through the block. The first was zero_record, the
+ second was where_is_data.
+
+1991-01-07 Michael I Bushnell <mib@wookumz.ai.mit.edu>
+
+ * create.c (deal_with_sparse): Second computation (for short
+ reads) of numbytes increment had subtraction backwards.
+ Need to handle calling where_is_data better when we did a
+ short read (it might go past the end of the read), also, set
+ sparsearray[...].offset in this case too.
+
+1991-01-04 Jay Fenlason <hack@ai.mit.edu>
+
+ * buffer.c: Return a special error code if the archive
+ you're trying to read starts with a different label than
+ the one specified on the command line.
+
+1991-01-02 Jay Fenlason <hack@ai.mit.edu>
+
+ * gnu.c: Prepend the current directory to the gnu_dumpfile, so that
+ -C's won't affect where the output goes. (sigh.)
+
+1990-12-18 Jay Fenlason <hack@ai.mit.edu>
+
+ * gnu.c: Don't complain if the gnudumpfile we're reading info
+ from doesn't exist.
+
+ * create.c: Write out gnudumpfile after finishing writing the archive.
+
+ * tar.c: Add +exclude FNAME, and make +exclude-from do what +exclude
+ used to.
+ * Make +version an operation, not an option.
+ * Add +confirmation alias for +interactive.
+
+1990-12-04 Jay Fenlason <hack@ai.mit.edu>
+
+ * tar.c (check_exclude): Don't let MUMBLE match MUMBLE.c or
+ fooMUMBLE but only foo/MUMBLE.
+
+ * mangle.c: New file.
+ * create.c, extract.c: According changes.
+
+ * extract.c: Don't complain when extracting an already existing link.
+ Don't complain when extracting a directory iff it already exists.
+ Don't ad u+wx to directories when running as root.
+ Reported by Chip Salzenberg.
+
+ * gnu.c: Make +listed-incremental work.
+ Reported by Chip Salzenberg.
+
+ * port.c: Add the F_FREESP emulation of the ftruncate syscall.
+
+1990-11-21 Jay Fenlason <hack@ai.mit.edu>
+
+ Remove excess \n from lots of msg() calls.
+
+1990-11-19 Jay Fenlason <hack@ai.mit.edu>
+
+ * tar.c: Rename +volume to +label.
+
+1990-11-16 David J. MacKenzie <djm@apple-gunkies>
+
+ * tar.c (describe): Include the default values for -b and -f
+ (as set in the Makefile) in the message.
+
+1990-11-15 Jay Fenlason <hack@ai.mit.edu>
+
+ * extract.c (extract_archive): Do the utime() call before the
+ chmod() call, 'cuz some versons of utime() trash the file's mode
+ bits.
+
+ * list.c (read_and): Call do_something on volume headers and
+ multivol files even if they don't match the names we're looking
+ for, etc.
+
+1990-11-06 Jay Fenlason <hack@ai.mit.edu>
+
+ * port.c (un-quote-string): Don't try to write a null if there's
+ already one there.
+
+1990-11-01 Jay Fenlason <hack@ai.mit.edu>
+
+ * buffer.c (new_volume): fflush(msg_file) before reading for
+ confirmation on new volume. On EOF or error, print error msg and
+ abort.
+
+1990-10-29 Jay Fenlason <hack@ai.mit.edu>
+
+ * getdate.y: Use new version of getdate().
+
+ * tar.c (name_add): Use sizeof(char *) instead of sizeof(int)
+
+ * README: Give the correct return address.
+
+1990-10-25 Jay Fenlason <hack@ai.mit.edu>
+
+ rtape_lib.c [NO_RMTIOCTL]: Instead of RMTIOCTL, so it is on by default.
+
+ rmt.h [NO_REMOTE]: Add _isrmt() #define.
+
+ gnu.c: Add forward reference for add_dir_name().
+
+1990-10-16 Jay Fenlason <hack@ai.mit.edu>
+
+ Version 1.09 --- New -G file implementation of gnu-dump stuff.
+
+ * tar.c (name_add): Get the calls to ck_realloc and ck_malloc right.
+
+1990-10-11 Jay Fenlason <hack@ai.mit.edu>
+
+ * gnu.c: Fix A couple of typos.
+
+1990-09-19 David J. MacKenzie <djm@apple-gunkies>
+
+ * getdate.y [USG && !DAYLIGHT_MISSING] (ftime): Use `daylight'.
+
+1990-09-17 Jay Fenlason <hack@ai.mit.edu>
+
+ * gnu.c (gnu_restore): Don't use a passed char* for the
+ file name, use skipcrud+head->header.name, just like everything
+ else does. This means that gnu_restore will still work with
+ small buffers, etc.
+
+1990-09-13 Jay Fenlason <hack@ai.mit.edu>
+
+ * tar.c (add_exclude): Don't bus-error if the exclude file doesn't
+ end with a newline.
+
+1990-09-09 David J. MacKenzie <djm@albert.ai.mit.edu>
+
+ * Makefile (dist): Remove .fname when done.
+
+1990-09-06 Jay Fenlason <hack@ai.mti.edu>
+
+ * gnu.c (gnu_restore): Rember to skip_file() over the directory
+ contents, even if we don't have to do anything with them.
+
+ * create.c, extract.c, diffarch.c: Free sparsearray after we're
+ done with it.
+
+1990-09-04 Jay Fenlason <hack@ai.mit.edu>
+
+ * Makefile: Include gnu.c in dist
+
+ * gnu.c: Move add_dir above read_dir_file so that cc doesn't
+ complain about add_dir returning void.
+
+1990-09-02 David J. MacKenzie <djm@apple-gunkies>
+
+ * getdate.y: Declare some more functions and add storage
+ classes where omitted to shut compiler up.
+ [USG] (ftime): Don't use extern var `daylight'; appears that
+ some systems don't have it.
+
+1990-08-29 David J. MacKenzie <djm@apple-gunkies>
+
+ * getdate.y (lookup): In the code that allows `Aug.' to be
+ recognized as `Aug', don't chop off the final `.' from words
+ like `a.m.', so they can be recognized.
+
+1990-08-16 Jay Fenlason <hack@ai.mit.edu>
+
+ * buffer.c (open_archive): If -O, write verbosity to stderr
+ instead of stdout.
+
+1990-08-10 Jay Fenlason <hack@ai.mit.edu>
+
+ * getdate.y: Handle an explicit DST in the input string.
+ Reported by Per Foreby.
+
+1990-07-16 Jay Fenlason <hack@ai.mit.edu>
+
+ * tar.c: rename -g -G +incremental, +listed-imcremental, etc.
+
+1990-07-13 Jay Fenlason <hack@ai.mit.edu>
+
+ * tar.c: Make +newer and +newer-mtime work according to their names.
+
+ * gnu.c: If +newer or +newer-mtime, use the time specified on the
+ command line.
+
+ * buffer.c, create.c: Add test to see if dimwit is trying to
+ archive the archive.
+
+ * tar.c (long_options[]): Re-ordered, so that groups of similar
+ options are next to each other... I think.
+
+ (describe): Modified to more closely reflect reality.
+
+1990-07-06 Jay Fenlason <hack@ai.mit.edu>
+
+ * tar.c: Add compile-time option for SYS V (?) style
+ tape-drive names /dev/rmt/{n}[lmh]
+
+ * tar.c: Fix getopt-style stuff so that -C always works correctly.
+
+ * gnu.c, tar.c: Make filename to -G optional.
+
+ * {all over}: Replace some fprintf(stderr...) calls with calls
+ to msg().
+
+ * port.c: Make -Dmumble_MSG option on command line override
+ internal assumptions.
+
+ * Makefile: Mention -Dmumble_MSG options
+
+1990-07-06 David J. MacKenzie <djm@apple-gunkies>
+
+ * tar.c (options): Don't change `c' if it is 0, as getopt now
+ handles that internally.
+
+1990-07-02 Jay Fenlason <hack@ai.mit.edu>
+
+ * gnu.c (new file): Moved all the f_gnudump stuff here where we
+ can keep track of it easier. Also made -G take a file name where
+ it stores the inode information about directories so that we can
+ detect moved directores.
+
+ * create.c (dump_file): Changed slightly to work with the new
+ f_gnudump.
+
+ * tar.c: Moved the f_gnudump stuff to gnu.c
+
+ * tar.c, extract.c: Added the +do-chown option, which forces tar
+ to always try to chown the created files to their original owners.
+
+ * version.c: New version 1.09
+
+1990-06-24 David J. MacKenzie <djm@albert.ai.mit.edu>
+
+ * create.c: Change ifdefs for directory library header
+ selection to be like the ones in tar.c.
+ * Makefile [Xenix]: Link with -ldir to get the dirent.h
+ directory library.
+
+1990-06-07 David J. MacKenzie <djm@albert.ai.mit.edu>
+
+ * Makefile, buffer.c, diffarch.c [HAVE_MTIO]: Instead of MTIO, as
+ SCO Xenix defines 'MTIO' for an incompatible tape driver system in
+ a file included by termio.h.
+ * tar.h: Don't define size_t for Xenix.
+
+1990-06-05 Jay Fenlason <hack@ai.mit.edu>
+
+ * create.c (dump_file): Only print the
+ "... is on a different filesystem..." if f_verbose is on.
+ also add a case for S_IFSOCK and treat it like a FIFO.
+ (Not sure if that's the right thing to do or not, but it's better
+ than all those Unknown File Type msgs.)
+
+1990-05-31 Jay Fenlason <hack@ai.mit.edu>
+
+ * port.c [sparc]: Use instead of SPARC since the lowercase version
+ is defined, and the uppercase one isn't.
+
+1990-05-22 Jay Fenlason <hack@ai.mit.edu>
+
+ * port.c (ck_malloc): if size==0 pretend size=1
+ (ck_realloc): if(!ptr) call ck_malloc instead.
+
+1990-05-15 Jay Fenlason <hack@ai.mit.edu>
+
+ * diffarch.c (diff_archive): If not f_absolute_paths, and attempt
+ to open a file listed in the archive fails, try /filename also.
+ This will allow diff to open the wrong file if both /filename and
+ filename exist, but there's nothing we can do about that.
+
+1990-05-11 Jay Fenlason <hack@ai.mit.edu>
+
+ * Makefile: Describe new -DMTIO option.
+
+ * buffer.c, diffarch.c: Change ifdefs slightly, so that -DMTIO
+ will include sys/mtio.h even if USG is defined. This is for HPUX
+ and similar BSD/USG crossovers.
+
+1990-05-08 Jay Fenlason <hack@ai.mit.edu>
+
+ * update.c (update_archive): Call reset_eof() when appropriate.
+
+ * buffer.c (reset_eof): New function, that turns of EOF flag, and
+ re-sets the ar_record and ar_last pointers. This will allow
+ 'tar rf non-existant-file' to not core-dump.
+
+1990-05-04 David J. MacKenzie <djm@albert.ai.mit.edu>
+
+ * tar.c: Recognize the +sparse option. It was documented, but
+ only the short form (-S) was actually recognized.
+
+1990-04-17 Jay Fenlason <hack@ai.mit.edu>
+
+ * create.c: Don't access location 0 if ->dir_contents is null.
+
+1990-04-11 Jay Fenlason <hack@ai.mit.edu>
+
+ * buffer.c (flush_archive, close_archive, new_volume): Always
+ check the return value of rmtclose(), and only give a warning msg
+ if it is <0. Some device drivers (including Sun floppy disk, and
+ HP streaming tape) return -1 after an IO error (or something like
+ that.)
+
+1990-03-23 Jim Kingdon <kingdon@mole.ai.mit.edu>
+
+ * tar.c (long_options): Make it so +append +extract +list +update
+ +catenate and +delete don't take arguments.
+
+1990-03-12 Jay Fenlason <hack@ai.mit.edu>
+
+ * buffer.c (open_archive, fl_write): Set the mtime of the volume
+ header to the current time.
+
+1990-03-07 Jay Fenlason <hack@ai.mit.edu>
+
+ * buffer.c Fix +compress-block A two character patch from
+ Juha Sarlin.
+ Replace #ifdef __GNU__ with #ifdef __STDC__.
+ (new_volume): If open of new archive fails, ask again, as it
+ probably is user error.
+
+ * tar.c: Replace #ifdef __GNU__ with #ifdef __STDC__
+
+ * port.c: Clean up #ifdef and #defines a bit.
+ (quote_copy_string): Sometimes the malloc'd buffer would be up to
+ two characters too short.
+
+ * extract.c (extract_archive): Don't declare ind static.
+
+ * create.c (dump_file): Don't declare index_offset static.
+
+ * diffarch.c: Remove diff_name variable, and always use
+ head->header.name, which will always work, unlike diff_name, which
+ becomes trash when the next block is read in.
+
+1990-03-01 Jay Fenlason <hack@wookumz.ai.mit.edu>
+
+ * Makefile: Mention the -NO_REMOTE option.
+ * port.c [i386]: Fix typo, and define WANT_FTRUNCATE.
+
+1990-02-26 Jim Kingdon <kingdon@pogo.ai.mit.edu>
+
+ * getdate.y: Declare yylex and yyerror as static.
+ #define yyparse to getdate_yyparse.
+
+1990-02-25 David J. MacKenzie <djm@albert.ai.mit.edu>
+
+ * tar.c: Remove +old option, since it is a valid abbreviation of
+ +old-archive, which does the same thing.
+ (describe): A few small cleanups in message.
+
+1990-02-05 Jay Fenlason <hack@wookumz>
+
+ * port.c [sparc]: Define LOSING_MSG, since doprnt_msg doesn't work.
+ [WANT_GETWD]: Fix typo.
+
+1990-01-26 Jay Fenlason <hack@wookumz>
+
+ Version 1.08 --- Sparse file support added. Also various other
+ features.
+
+ * diffarch.c (compare_chunk): Include correct arguments in
+ a call to fprintf() for an error msg.
+ (compare_chunks, compare_dir): First argument is a long, not an int.
+
+ * tar.c (options): Use tar variable (argv[0]) as the name to print
+ in an error msg, instead of a constant "tar".
+ (confirm): Use external variable char TTY_NAME[] for name of file
+ to open for confirmation input.
+
+ * buffer.c (new_volume): Ditto.
+
+ * port.c: Add declaration for TTY_NAME[].
+
+ * rmt.h: Add long declarations for lseek() and __rmt_lseek();
+
+1990-01-23 Jay Fenlason <hack@wookumz>
+
+ * tar.c, create.c: Create the +newer-mtime option, which is like
+ +newer, but only looks for files whose mtime is newer than the
+ given date.
+
+ * rtape_lib.c [USG]: Make *both* instances of signal-handler stuff
+ use void (*foo)().
+
+1990-01-11 Jay Fenlason <hack@wookumz>
+
+ * getdate.y : Parse European dates of the form YYMMDD.
+ In ftime(): Init timezone by calling localtime(), and remember that
+ timezone is in seconds, but we want timeb->timezone to be in minutes.
+ Reported by Jörgen Haegg.
+
+ * rtape_lib.c (__rmt_open): Also look for /usr/bsd/rsh.
+ Declare signal handler as returning void instead of int if USG is
+ defined.
+
+ * port.c: Declare WANT_GETWD for SGI 4-D IRIS.
+
+ * Makefile: Include defines for SGI 4D version.
+ Reported by Mike Muuss.
+
+ * buffer.c (fl_read): Work properly on broken Ultrix systems where
+ read() returns -1 with errno==ENOSPC on end of tape. Correctly go
+ on to the next volume if f_multivol.
+
+ * list.c (list_archive, print_header): Flush msg_file after
+ printing messages.
+
+ * port.c: Delete unused references to alloca().
+ Don't crash if malloc() returns zero in quote_copy_string.
+ Flush stderr in msg() and msg_perror().
+
+ * tar.c: Flush msg_file after printing confirmation msg.
+
+1990-01-10 David J. MacKenzie <djm@hobbes.ai.mit.edu>
+
+ * tar.c (main): Change -help option and references to it to +help,
+ and remove suggestion to run info (which is unreleased, so not
+ likely to be of any help).
+
+1990-01-09 Jay Fenlason <hack @wookumz>
+
+ * create.c (dump_file): Close file descriptor if start_header()
+ fails.
+ (dump_file): Change test for `./'-ness to not think that `.' {any
+ character} is a `./'.
+ Reported by Piercarlo Grandi.
+
+ * diffarch.c (diff_init): Print correct number of bytes in error
+ message.
+
+1990-01-09 David J. MacKenzie <djm@hobbes.ai.mit.edu>
+
+ * Makefile: Add comment at top noting that two source files also
+ contain #defines that might need to be changed by hand.
+
+ * create.c, diffarch.c, extract.c: Change L_SET to 0 in lseek
+ calls, because only BSD defines it.
+ * create.c (dump_file) [BSD42]: Make sparse file checking code
+ conditional because it uses st_blocks, which the other systems lack.
+
+1990-01-02 Jay Fenlason <hack@gnu>
+
+ * port.c (quote_copy_string): Fix so it doesn't scramble memory if
+ the last character is non-printable.
+ Reported by Kian-Tat Lim.
+
+1989-12-19 Jim Kingdon <kingdon@pogo>
+
+ * port.c [BSD42]: Define DOPRNT_MSG.
+ tar.h [BSD42]: Do not prototype msg{,_perror}.
+
+1989-12-08 Jay Fenlason <hack@gnu>
+
+ * create.c (dump_file): Remove typo in msg.
+
+1989-12-01 David J. MacKenzie <djm@trix>
+
+ * Makefile: Remove comments referring to certain systems lacking
+ getopt, since it is now provided always and needed by all systems.
+
+ * port.c: Remove copy of getopt.c, as it is now linked in
+ separately to always get the current version.
+
+ * tar.c: Rename +cat-tars option to +catenate or +concatenate,
+ and +local-filesystem to +one-file-system (preferred by rms
+ and used in GNU cp for the same purpose).
+ (describe): Reflect changes.
+
+1989-11-28 David J. MacKenzie <djm@hobbes.ai.mit.edu>
+
+ * port.c: Move declaration of alloca into #else /* sparc */
+ so it will compile on sparcs.
+
+1989-11-27 David J. MacKenzie <djm@hobbes.ai.mit.edu>
+
+ * tar.c (options): Remove -version option (replaced by +version).
+ (describe): Mention long options.
+
+1989-11-25 David J. MacKenzie <djm@hobbes.ai.mit.edu>
+
+ * getoldopt.c (getoldopt): Make `opt_index' argument a pointer to
+ an int, not char.
+
+ * tar.c: Modify long options per rms's suggestions:
+ Make preserve-permissions an alias for same-permissions.
+ Make preserve-order an alias for same-order.
+ Define preserve to mean both of those combined.
+ Make old an alias for old-archive.
+ Make portability an alias for old-archive, also.
+ Rename sym-links to dereference.
+ Rename gnudump to incremental.
+ Rename filename to file.
+ Make compare an alias for diff. Leave diff but prefer compare.
+ Rename blocking-factor to block-size.
+ Rename chdir to directory.
+ Make uncompress an alias for compress.
+ Rename confirm to interactive.
+ Make get an alias for extract.
+ Rename volume-header to volume.
+
+ Also make +version an alias for -version.
+
+ (options): Shorten code that interprets long options by using
+ the equivalent short options' code. This also makes it tons
+ easier to change the long options.
+
+ (describe): Make usage message more internally consistent
+ stylistically.
+
+1989-11-20 hack@ai.mit.edu
+
+ * list.c (read_and): Call check_exclude() to see if the files
+ should be skipped on extract or list.
+
+1989-11-09 Jim Kingdon <kingdon@hobbes.ai.mit.edu>
+
+ * buffer.c (fl_read): Fix typos in error message
+ "tar EOF not on block boundary".
+
+1989-10-23 <hack@ai.mit.edu>
+
+ * tar.c (long_options[]): Add an option for blocked compression.
+
+1989-10-19 <hack@ai.mit.edu>
+
+ * buffer.c (writeerror): Print a more useful error msg.
+
+1989-09-27 <hack@ai.mit.edu>
+
+ * tar.c (main): Mention "tar -help" if the luser types a non-workable
+ set of options.
+
+1989-09-11 <hack@ai.mit.edu>
+
+ * tar.c (options): Have -F correctly set info_script.
+
+1989-08-29 <hack@ai.mit.edu>
+
+ * Makefile Include ChangeLog in tar.tar and tar.tar.Z
+
+1989-08-28 <hack@ai.mit.edu>
+
+ * tar.c (options) Made -F imply -M.
+ Also remind tar that the -f option takes an argument!
+
+ * Modified -F option to make it do what (I think) it
+ should. e.g, if you say -F, tar won't send a msg to
+ msg_file and wait for a <return> It'll just run the program
+ it was given, and when the prog returns, the new tape had
+ *better* be ready...
+
+ * buffer.c (open_archive): Give error message and abort if
+ the luser didn't give an archive name.
+
+1989-08-25 Joy Kendall <jak@hobbes>
+
+ * Added code to make a new option to run a specified script at
+ the end of each tape in a multi-volume backup. Changed: tar.c:
+ made new switch, -F, and new long-named option, "info-script".
+ Code is where you would expect.
+ * tar.h: added flag f_run_script_at_end, and an extern char *
+ called info_script, which optarg gets set to.
+ * buffer.c (new_volume): if f_run_script_at_end is set, we give
+ info_script to system(), otherwise we do what we've always done.
+
+1989-08-24 Joy Kendall <jak@spiff>
+(These changes made over the course of 6/89 - 8/89)
+
+ * diffarch.c: diff_archive: Added switches for LF_SPARSE in the
+ case statements that needed it. Also, skip any extended headers
+ if we need to when we skip over a file. (need to change the bit
+ about, if the size doesn't agree AND the file is NOT sparse,
+ then there's a discrepancy, because I added another field to
+ the header which should be able to deal with the sizes): If
+ the file is sparse, call the added routine "diff_sparse_files"
+ to compare. Also added routine "fill_in_sparse_array".
+
+ * extract.c: extract_archive: added the switch LF_SPARSE to the
+ case statement as needed, and code to treat the sparse file.
+ At label "again_file", modified opening the file to see if we
+ should have O_APPEND be one of the modes. Added code at label
+ "extract_file" to call the new routine "extract_sparse_file"
+ when we have an LF_SPARSE flag.
+
+ Note: really should erase the commented-out code in there,
+ because it's confusing.
+
+ * update.c: made sure that if a file needed to be "skipped"
+ over, it would check to see if the linkflag was sparse, and if
+ so, would then make sure to skip over any "extended headers"
+ that might come after the header itself. Do so by calling
+ "skip_extended_headers".
+
+ * create.c: create_archive: added code to detect a sparse file
+ when in the long case statement. Added ways to detect extended
+ headers, and label "extend" (ack! should get rid of that, is
+ atrocious). Call the new routine "finish_sparse_file" if the
+ linkflag is LF_SPARSE to write the info to the tape. Also added
+ routines "init_sparsearray", "deal_with_sparse", "clear_buffer",
+ "where_is_data", "zero_record", and "find_new_file_size".
+
+ * tar.h: Added the #define's SPARSE_EXT_HDR and SPARSE_IN_HDR.
+ Added the struct sparse and the struct sp_array. Added the
+ linkflag LF_SPARSE. Changed the tar header in several ways:
+ - added an array of struct sparse's SPARSE_IN_HDR long
+ - added a char flag isextended
+ - added a char string realsize to store the true size of a sparse file
+ Added another choice to the union record called a struct
+ extended_header, which is an array of 21 struct sparse's and a
+ char isextended flag. Added flag f_sparse_file to list of flags.
+
+ * tar.c: added long-named options to make tar compatible with
+ getopt_long, changed Makefile.
+
+1989-03-03 David MacKenzie (edf at rocky2.rockefeller.edu)
+(I'm not completely sure all these have been integrated -- FP.)
+
+ * buffer.c [USG]: ifdef'd out #include <sys/file.h>.
+ (close_archive): SysV doesn't have ftruncate, so substituted
+ fmtwrite (just copied the code for MS-DOS).
+ * create.c: Unos lacks <sys/sysmacros.h> so provided a substitute.
+ (start_header): Only strip leading paths if f_relative_paths is true.
+ * extract.c:
+ (extract_archive): Only strip leading paths if
+ f_relative_paths is true. Because the Unos filesystem has
+ only one timestamp, moved the utime call to after the chown
+ and chmod calls.
+ * getdate.y: Don't define ftime if Unos.
+ * list.c: Defined size_t for Unos. [USG]: Don't include <sys/file.h>.
+ Define <sys/sysmacros> stuff manually for Unos.
+ (decode_header): Add braces around switch cases; some compilers
+ require them.
+ (print_header): Changed UGSWIDTH from 11 to 25 because the smaller
+ value made tape listings of files owned by more than one user
+ gradually get wider, making them hard to read.
+ * port.c: Don't include <sys/file.h> if SysV. Define
+ size_t for Unos.
+ (mkdir): Add code to support Unos makedir sys call.
+ (getopt): Use malloc instead of alloca, because tar doesn't
+ use alloca anywhere else and many systems lack it. A few other
+ changes from the current version of getopt.c incorporated.
+ * rtape_lib.c: Undefine RMTIOCTL. Doesn't seem to be needed,
+ and can't compile on Unos/SysV with it defined. Might need to be
+ ifdef'd.
+ * tar.c: Alias addname to add_name and rmdir to deldir on Unos
+ due to C library weirdness.
+ (options): Recognize new -P option to set f_relative paths.
+ (describe): Clean up error message and add -P description.
+ * tar.h: Add variable, f_relative_paths, to cause tar to strip
+ leading `/' characters in pathnames during create and extract.
+ * tar.texinfo: Fixed a couple of typos, detected by texi2roff.
+ * update.c: Simulate <sys/sysmacros.h> for Unos.
+
+Previous releases by Jay Fenlason (hack@ai.mit.edu)
+
+ * Version 1.07 --- New version to go on beta tape with GCC 1.35.
+ Better USG support. Also support for __builtin_alloca if we're
+ compiling with GCC.
+
+ * diffarch.c: Include the correct header files so MTIOCTOP
+ is defined.
+ * tar.c: Don't print the verbose list of options unless
+ given -help. The list of options is *way* too long.
+
+ * Version 1.06 --- [__STDC__]: Use STDC_MSG.
+ ENXIO meand end-of-volume in archive (for the UNIX PC)
+ Added break after volume-header case (line 440) extract.c
+ Added patch to rtape_lib.c (reported by Arnold Robbins).
+ Added f_absolute_paths option.
+ Deleted refereces to UN*X manual sections (dump(8), etc)
+ Fixed to not core-dump on illegal options
+ Modified msg_perror to call perror("") instead of perror(0)
+ patch so -X - works
+ Fixed tar.c so 'tar cf - -C dir' doesn't core-dump
+ tar.c (name_match): Fixed to chdir() to the appropriate
+ directory if the matching name's change_dir is set. This
+ makes tar xv -C foo {files} work.
+
+ * Version 1.05 --- A fix to make confirm() work when the archive is
+ on stdin; include 'extern FILE *msg_file;' in pr_mkdir().
+ * tar.h [__STDC__]: Fix to work.
+
+ Added to port.c: mkdir() ftruncate(): Removed: lstat()
+ Fixed -G to work with -X
+ Another fix to tar.texinfo
+ Changed tar.c to say argv[0]":you must specify exactly ...
+ buffer.c: modified child_open() to keep tar from hanging when
+ it is done reading/writing a compressed archive
+ added fflush(msg_file) before printing error messages
+ create.c: fixed to make link_names non-absolute
+
+ * Version 1.04 --- Added functions msg() and msg_perror(): Modified
+ all the files to call them. Also checked that all (I hope) calls
+ to msg_perror() have a valid errno value.
+ (modified anno() to leave errno alone), etc.
+ Re-fixed the -X option. This time for sure...
+ re-modified the msg stuff. flushed anno() completely
+ Modified the directory stuff so it should work on sysV boxes
+ added ftime() to getdate.y
+ Fixed un_quote_string() so it won't wedge on \" Also fixed
+ \ddd (like \123, etc)
+ More fixes to tar.texinfo
+
+ * Version 1.03 --- Fixed buffer.c so 'tar tzf NON_EXISTENT_FILE'
+ returns an error message instead of hanging forever.
+ More fixes to tar.texinfo.
+
+ * Version 1.02 --- Fixed tar.c so 'tar -h' and 'tar -v' don't cause
+ core dump. Also fixed the 'usage' message to be more up-to-date.
+ * diffarch.c [!MTIOCTOP]: Fixed so verify should compile.
+
+ * Version 1.01 --- Fixed typoes in tar.texinfo.
+ Fixed a bug in the #define for rmtcreat().
+ Fixed the -X option to not call realloc() of 0.
+
+ * Version 1.00 --- version.c added. -version option added.
+ Installed new version of the remote-tape library.
+ Added -help option.
+
+
+----- tests/ChangeLog -----
+
+1997-04-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * Release 1.12.
+
+ * gzip.sh, ignfail.sh: Adjust to new delayed error exit message.
+
+ * Makefile.am (BUILT_SOURCES): Define as preset, so preset is
+ regenerated if configuration changes.
+
+ * Makefile.am (TESTS): Nevertheless include delete01.sh.
+ (POSTPONED_TESTS): Adjusted.
+ Reported by Andreas Schwab.
+
+ * delete02.sh: Mention f - explicitly, do not assume it, in case
+ $TAPE is defined or the default archive has been overridden.
+ Reported by Andreas Schwab.
+
+1997-04-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * after: Unredirect stdout and stderr before removing the files.
+ If redirections are to NFS files, removing them while they are
+ still opened may have strange effects, failing almost all tests.
+ Reported by Kaveh R. Ghazi.
+
+1997-04-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11q.
+
+ * extrac03.sh: New file.
+ * Makefile.am (TESTS): Adjusted.
+ Reported by Marc Boucher.
+
+ * preset.in (LC_MESSAGES): Clear value before tests.
+ Reported by Sven Verdoolaege.
+
+ * Makefile.am (INCLUDES): Adjust so config.h gets found.
+
+ * genfile.c (usage): Corrected.
+
+ * delete01.sh: New name for delete.sh.
+ * delete02.sh: New file.
+ * Makefile.am (TESTS): Adjusted.
+ Reported by Vince Del Vecchio.
+
+ * Makefile.am (POSTPONED_TESTS): To contain the --delete tests.
+ (TESTS): Adjusted.
+ (EXTRA_DIST): Include $(POSTPONED_TESTS). The purpose is getting
+ the tests distributed, but not executed. These flaky tests are to
+ be addressed only after 1.12 is released.
+
+1997-04-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Declare ../src/ansi2knr.
+ * (DEFS): New, for defining LOCALEDIR.
+ * (genfile.o): Deleted, will be implied from DEFS above.
+ Reported by Bruno Haible and Kaveh R. Ghazi.
+
+1997-04-17 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11p.
+
+ * genfile.c (usage): Add a program description.
+ (main): Output --version according to recent GNU standards.
+
+1997-04-15 François Pinard <pinard@iro.umontreal.ca>
+
+ * ignfail.sh: Ensure the test does not fail if run as super-user.
+ Reported by John David Anglin.
+
+1997-04-12 François Pinard <pinard@iro.umontreal.ca>
+
+ * genfile.c (pattern): Remove trailing comma for last enum item.
+ Reported by Bruno Haible.
+
+1997-04-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11o.
+
+1997-03-29 François Pinard <pinard@iro.umontreal.ca>
+
+ * ignfail.sh: New file.
+ * Makefile.am (TESTS): Adjusted.
+ Reported by Ralph Schleicher.
+
+1997-03-24 François Pinard <pinard@iro.umontreal.ca>
+
+ * genfile.c: Implement --pattern=default/zeros.
+
+1997-02-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * old.sh: New file.
+ * Makefile.am (TESTS): Adjusted.
+ Reported by Daniel Trinkle.
+
+1997-01-21 François Pinard <pinard@iro.umontreal.ca>
+
+ * extrac01.sh: New name for extract.sh.
+ * extrac02.sh: New file.
+ * Makefile.am (TESTS): Adjusted.
+ Reported by Axel Boldt.
+
+1996-11-25 François Pinard <pinard@iro.umontreal.ca>
+
+ * genfile.c (usage): Typo in message.
+ Reported by Christian Kirsch.
+
+1996-11-22 François Pinard <pinard@iro.umontreal.ca>
+
+ * incremen.sh: New file.
+ Reported by Wolfram Wagner.
+
+ * append.sh, delete.sh: New files.
+ * Makefile.am (TESTS): Adjusted.
+ Reported by Andreas Schwab.
+
+ * before: Ensure .. on PATH, so genfile may be found.
+ * Makefile.am ($(TESTS)): Depend on genfile, waiting for Automake
+ to be adjusted to do the proper thing for parallel make.
+
+ * gzip.sh: New name for childerr.sh.
+ * extract.sh: New name for direxist.sh.
+ * volume.sh: New name for volcheck.sh.
+ * Makefile.am: Adjusted.
+
+ * All tests: Use set -e whenever appropriate. Use "" instead of
+ '' for out and err, so allowing us to use escaped newlines. In
+ case of multiple output in a single test, ensure separator lines.
+
+1996-11-06 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.13.
+
+ * childerr.sh, direxist.sh, volcheck.sh: Use sh, not bash.
+ Reported by John David Anglin.
+
+1996-09-20 François Pinard <pinard@iro.umontreal.ca>
+
+ * volcheck.sh: New.
+ * Makefile.am (TESTS): Adjusted.
+
+1996-09-19 François Pinard <pinard@iro.umontreal.ca>
+
+ * Prerelease 1.11.12.
+
+ * Makefile.am ($(TESTS)): Depend on preset.
+ * version.sh (PATH): Adjust for multi-line --version output.
+ * preset.in (LANG, LANGUAGE): Export them, so gzip does not
+ localise its own output.
+ (echo_n, echo_c): Define from the result of echo configuration.
+ * after: Handle echo with newline suppressed.
+
+1996-09-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * childerr.sh, direxist.sh, before, after: New files.
+ * Makefile.am: Adjusted.
+
+1996-09-04 François Pinard <pinard@iro.umontreal.ca>
+
+ * ChangeLog, Makefile.am, pretest.in, version.sh: New files.
+ * checktar.sh, genfile.c: New files, moved from src/.
+
+ A regression test is an old dream for GNU tar.
+ Reported by Tom Tromey and Robert Bernstein.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..5458714
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,234 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006 Free Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+Briefly, the shell commands `./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.
+
+ 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.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. 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.
+
+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 `..'.
+
+ 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.
+
+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'.
+
+ 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.
+
+ 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'.
+
+Optional Features
+=================
+
+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.
+
+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 bug. Until the bug is fixed you can use this workaround:
+
+ CONFIG_SHELL=/bin/bash /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 the options to `configure', and exit.
+
+`--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.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..b8e5719
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,31 @@
+# Main Makefile for GNU tar.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003 Free
+# Software Foundation, Inc.
+
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+## 02110-1301, USA.
+
+ACLOCAL_AMFLAGS = -I m4
+EXTRA_DIST = ChangeLog.1 PORTS
+SUBDIRS = doc lib rmt src scripts po tests
+
+dist-hook:
+ -rm -f $(distdir).cpio
+ find $(distdir) | cpio -Hcrc -o | \
+ GZIP=$(GZIP_ENV) gzip -c > $(distdir).cpio.gz
+
+distclean-local:
+ -rm -f $(distdir).cpio.gz
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..420a6cd
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,920 @@
+# Makefile.in generated by automake 1.10a from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007 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@
+
+# Main Makefile for GNU tar.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003 Free
+# Software Foundation, Inc.
+VPATH = @srcdir@
+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 = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/config.hin \
+ $(top_srcdir)/configure ABOUT-NLS AUTHORS COPYING ChangeLog \
+ INSTALL NEWS THANKS TODO 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/mkinstalldirs build-aux/texinfo.tex build-aux/ylwrap
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/absolute-header.m4 \
+ $(top_srcdir)/m4/alloca.m4 $(top_srcdir)/m4/allocsa.m4 \
+ $(top_srcdir)/m4/argmatch.m4 $(top_srcdir)/m4/argp.m4 \
+ $(top_srcdir)/m4/backupfile.m4 $(top_srcdir)/m4/bison.m4 \
+ $(top_srcdir)/m4/canonicalize-lgpl.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/chown.m4 \
+ $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close-stream.m4 $(top_srcdir)/m4/closeout.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/d-ino.m4 \
+ $(top_srcdir)/m4/dirfd.m4 $(top_srcdir)/m4/dirname.m4 \
+ $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/double-slash-root.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eealloc.m4 \
+ $(top_srcdir)/m4/eoverflow.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exclude.m4 $(top_srcdir)/m4/exitfail.m4 \
+ $(top_srcdir)/m4/extensions.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-safer.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+ $(top_srcdir)/m4/fileblocks.m4 $(top_srcdir)/m4/float_h.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fpending.m4 \
+ $(top_srcdir)/m4/ftruncate.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdate.m4 $(top_srcdir)/m4/getdelim.m4 \
+ $(top_srcdir)/m4/getline.m4 $(top_srcdir)/m4/getopt.m4 \
+ $(top_srcdir)/m4/getpagesize.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/hash.m4 \
+ $(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intmax_t.m4 \
+ $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lchown.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/lstat.m4 $(top_srcdir)/m4/mbchar.m4 \
+ $(top_srcdir)/m4/mbiter.m4 $(top_srcdir)/m4/mbrtowc.m4 \
+ $(top_srcdir)/m4/mbscasecmp.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mempcpy.m4 \
+ $(top_srcdir)/m4/memrchr.m4 $(top_srcdir)/m4/memset.m4 \
+ $(top_srcdir)/m4/mkdtemp.m4 $(top_srcdir)/m4/mktime.m4 \
+ $(top_srcdir)/m4/modechange.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/pathmax.m4 \
+ $(top_srcdir)/m4/paxutils.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quote.m4 \
+ $(top_srcdir)/m4/quotearg.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/rmdir.m4 \
+ $(top_srcdir)/m4/rmt.m4 $(top_srcdir)/m4/rpmatch.m4 \
+ $(top_srcdir)/m4/rtapelib.m4 $(top_srcdir)/m4/safe-read.m4 \
+ $(top_srcdir)/m4/safe-write.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/savedir.m4 $(top_srcdir)/m4/setenv.m4 \
+ $(top_srcdir)/m4/sleep.m4 $(top_srcdir)/m4/ssize_t.m4 \
+ $(top_srcdir)/m4/stat-time.m4 $(top_srcdir)/m4/stdarg.m4 \
+ $(top_srcdir)/m4/stdbool.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/string_h.m4 $(top_srcdir)/m4/strndup.m4 \
+ $(top_srcdir)/m4/strnlen.m4 $(top_srcdir)/m4/strtoimax.m4 \
+ $(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoll.m4 \
+ $(top_srcdir)/m4/strtoul.m4 $(top_srcdir)/m4/strtoull.m4 \
+ $(top_srcdir)/m4/strtoumax.m4 $(top_srcdir)/m4/sys_stat_h.m4 \
+ $(top_srcdir)/m4/sys_time_h.m4 $(top_srcdir)/m4/sysexits.m4 \
+ $(top_srcdir)/m4/system.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/time_r.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
+ $(top_srcdir)/m4/unlinkdir.m4 $(top_srcdir)/m4/unlocked-io.m4 \
+ $(top_srcdir)/m4/utimbuf.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wchar.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wctype.m4 \
+ $(top_srcdir)/m4/wcwidth.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xgetcwd.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/xstrtol.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-dvi-recursive install-exec-recursive \
+ install-html-recursive install-info-recursive \
+ install-pdf-recursive install-ps-recursive install-recursive \
+ installcheck-recursive installdirs-recursive pdf-recursive \
+ ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 \
+ $(distdir).shar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ABSOLUTE_DIRENT_H = @ABSOLUTE_DIRENT_H@
+ABSOLUTE_FCNTL_H = @ABSOLUTE_FCNTL_H@
+ABSOLUTE_FLOAT_H = @ABSOLUTE_FLOAT_H@
+ABSOLUTE_INTTYPES_H = @ABSOLUTE_INTTYPES_H@
+ABSOLUTE_STDINT_H = @ABSOLUTE_STDINT_H@
+ABSOLUTE_STDIO_H = @ABSOLUTE_STDIO_H@
+ABSOLUTE_STDLIB_H = @ABSOLUTE_STDLIB_H@
+ABSOLUTE_STRING_H = @ABSOLUTE_STRING_H@
+ABSOLUTE_SYSEXITS_H = @ABSOLUTE_SYSEXITS_H@
+ABSOLUTE_SYS_STAT_H = @ABSOLUTE_SYS_STAT_H@
+ABSOLUTE_SYS_TIME_H = @ABSOLUTE_SYS_TIME_H@
+ABSOLUTE_TIME_H = @ABSOLUTE_TIME_H@
+ABSOLUTE_UNISTD_H = @ABSOLUTE_UNISTD_H@
+ABSOLUTE_WCHAR_H = @ABSOLUTE_WCHAR_H@
+ABSOLUTE_WCTYPE_H = @ABSOLUTE_WCTYPE_H@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOM4TE = @AUTOM4TE@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BACKUP_LIBEXEC_SCRIPTS = @BACKUP_LIBEXEC_SCRIPTS@
+BACKUP_SBIN_SCRIPTS = @BACKUP_SBIN_SCRIPTS@
+BACKUP_SED_COND = @BACKUP_SED_COND@
+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@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFAULT_ARCHIVE = @DEFAULT_ARCHIVE@
+DEFAULT_ARCHIVE_FORMAT = @DEFAULT_ARCHIVE_FORMAT@
+DEFAULT_BLOCKING = @DEFAULT_BLOCKING@
+DEFAULT_QUOTING_STYLE = @DEFAULT_QUOTING_STYLE@
+DEFAULT_RMT_COMMAND = @DEFAULT_RMT_COMMAND@
+DEFAULT_RMT_DIR = @DEFAULT_RMT_DIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRENT_H = @DIRENT_H@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EOVERFLOW = @EOVERFLOW@
+EXEEXT = @EXEEXT@
+FCNTL_H = @FCNTL_H@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+GETOPT_H = @GETOPT_H@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GREP = @GREP@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_MKDIR = @HAVE_DECL_MKDIR@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_IO_H = @HAVE_IO_H@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_READLINK = @HAVE_READLINK@
+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_SLEEP = @HAVE_SLEEP@
+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_STRNDUP = @HAVE_STRNDUP@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_SYSEXITS_H = @HAVE_SYSEXITS_H@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE__BOOL = @HAVE__BOOL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTTYPES_H = @INTTYPES_H@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTAR_LIBDEPS = @LIBTAR_LIBDEPS@
+LIBTAR_LTLIBDEPS = @LIBTAR_LTLIBDEPS@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_SETSOCKOPT = @LIB_SETSOCKOPT@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PU_RMT_PROG = @PU_RMT_PROG@
+RANLIB = @RANLIB@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_FCHDIR = @REPLACE_FCHDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STRPTIME = @REPLACE_STRPTIME@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYSEXITS_H = @SYSEXITS_H@
+SYS_STAT_H = @SYS_STAT_H@
+SYS_TIME_H = @SYS_TIME_H@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WCHAR_H = @WCHAR_H@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WCTYPE_H = @WCTYPE_H@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+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@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ACLOCAL_AMFLAGS = -I m4
+EXTRA_DIST = ChangeLog.1 PORTS
+SUBDIRS = doc lib rmt src scripts po tests
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnits '; \
+ cd $(srcdir) && $(AUTOMAKE) --gnits \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnits Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/config.hin $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.hin: $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (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"
+
+$(RECURSIVE_CLEAN_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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 || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) config.hin $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.hin $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @case `sed 15q $(srcdir)/NEWS` in \
+ *"$(VERSION)"*) : ;; \
+ *) \
+ echo "NEWS not updated; not releasing" 1>&2; \
+ exit 1;; \
+ esac
+ $(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 $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 \
+ test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(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
+ $(am__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:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-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-hdr distclean-local \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+ install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+ all all-am am--refresh check check-am clean clean-generic \
+ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+ dist-hook dist-shar dist-tarZ dist-zip distcheck distclean \
+ distclean-generic distclean-hdr distclean-local distclean-tags \
+ distcleancheck distdir distuninstallcheck dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-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-recursive uninstall uninstall-am
+
+
+dist-hook:
+ -rm -f $(distdir).cpio
+ find $(distdir) | cpio -Hcrc -o | \
+ GZIP=$(GZIP_ENV) gzip -c > $(distdir).cpio.gz
+
+distclean-local:
+ -rm -f $(distdir).cpio.gz
+# 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..c1a1892
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,915 @@
+GNU tar NEWS - User visible changes. 2007-06-08
+Please send GNU tar bug reports to <bug-tar@gnu.org>
+
+version 1.17 - Sergey Poznyakoff, 2007-06-08
+
+* Fix archivation of sparse files in posix mode. Previous versions padded
+ sparse members with spurious zero blocks.
+
+* Fix operation of --verify --listed-incremental. Version 1.16.1 produced
+ a full dump when both options were given.
+
+* Fix --occurence. In previous versions it continued scanning the archive
+ even though all requested members has already been extracted.
+
+* Scope of --transform and --strip-components options.
+
+In addition to affecting regular archive members, the --transform
+option affects hard and soft link targets and the --strip-components
+option affects hard link targets as well.
+
+* End-of-volume script can send the new volume name to tar by writing
+ it to the file descriptor stored in the environment variable `TAR_FD'.
+
+
+version 1.16.1 - Sergey Poznyakoff, 2006-12-09
+
+* New option --exclude-tag allows to specify "exclusion tag files", i.e.
+ files whose presence in a directory means that the directory should not
+ be archived.
+
+* The --exclude-cache option excludes directories that contain the
+ CACHEDIR.TAG file from being archived. Previous versions excluded
+ directory contents only, while the directories themselves were
+ still added to the archive.
+
+* Support for reading ustar type 'N' header logical records has been removed.
+ This GNU extension was generated only by very old versions of GNU 'tar'.
+ Unfortunately its implementation had security holes; see
+ <http://archives.neohapsis.com/archives/fulldisclosure/2006-11/0344.html>.
+ We don't expect that any tar archives in practical use have type 'N'
+ records, but if you have one and you trust its contents, you can
+ decode it with GNU tar 1.16 or earlier.
+
+* Race conditions have been fixed that in some cases briefly allowed
+ files extracted by 'tar -x --same-owner' (or plain 'tar -x', when
+ running as root) to be accessed by users that they shouldn't have been.
+
+
+version 1.16 - Sergey Poznyakoff, 2006-10-21
+
+* After creating an archive, tar exits with code 1 if some files were
+changed while being read. Previous versions exited with code 2 (fatal
+error), and only if some files were truncated while being archived.
+
+* New option --mtime allows to set modification times for all archive
+members during creation.
+
+* Bug fixes
+** Avoid running off file descriptors when using multiple -C options.
+** tar --index-file=FILE --file=- sent the archive to FILE, and
+the listing to stderr.
+
+
+version 1.15.91 - Sergey Poznyakoff, 2006-06-16
+
+* Incompatible changes
+
+** Globbing
+
+Previous versions of GNU tar assumed shell-style globbing when
+extracting from or listing an archive. For example:
+
+ tar xf foo.tar '*.c'
+
+would extract all files whose names end in '.c'. This behavior
+was not documented and was incompatible with traditional tar
+implementations. Therefore, starting from this version, GNU tar
+no longer uses globbing by default. For example, the above invocation
+is now interpreted as a request to extract from the archive the file
+named '*.c'.
+
+To treat member names as globbing patterns, use --wildcards option.
+If you wish tar to mimic the behavior of versions up to 1.15.90,
+add --wildcards to the value of the environment variable TAR_OPTIONS.
+
+The exact way in which tar interprets member names is controlled by the
+following command line options:
+
+ --wildcards use wildcards
+ --anchored patterns match file name start
+ --ignore-case ignore case
+ --wildcards-match-slash wildcards match `/'
+
+Each of these options has a '--no-' counterpart that disables its
+effect (e.g. --no-wildcards).
+
+These options affect both the interpretation of member names from
+command line and that of the exclusion patterns (given with --exclude
+and --exclude-from options). The defaults are:
+
+ 1. For member names: --no-wildcards --anchored
+ 2. For exclusion patterns: --wildcards --no-anchored --wildcards-match-slash
+
+The options can appear multiple times in the command line, thereby
+changing the way command line arguments are interpreted. For example,
+to use case-insensitive matching in exclude patterns and to revert to
+case-sensitive matching for the rest of command line, one could write:
+
+ tar xf foo.tar --ignore-case --exclude-from=FILE --no-ignore-case file.name
+
+** Short option -l is now an alias of --check-links option, which complies
+with UNIX98. This ends the transition period started with version 1.14.
+
+* New features
+
+** New option --transform allows to transform file names before storing them
+in the archive or member names before extracting. The option takes a
+sed replace expression as its argument. For example,
+
+ tar cf foo.tar --transform 's,^,prefix/,'
+
+will add 'prefix/' to all file names stored in foo.tar.
+
+** --strip-components option works when deleting and comparing. In previous
+versions it worked only with --extract.
+
+** New option --show-transformed-names enables display of transformed file
+or archive. It generalizes --show-stored-names option, introduced in
+1.15.90. In particular, when creating an archive in verbose mode, it lists
+member names as stored in the archive, i.e., with any eventual prefixes
+removed and file name transformations applied. The option is useful,
+for example, while comparing `tar cv' and `tar tv' outputs.
+
+** New incremental snapshot file format keeps information about file names
+as well as that about directories.
+
+** The --checkpoint option takes an optional argument specifying the number
+of records between the two successive checkpoints. Optional dot
+starting the argument intructs tar to print dots instead of textual
+checkpoints.
+
+** The --totals option can be used with any tar operation (previous versions
+understood it only with --create). If an argument to this option is
+given, it specifies the signal upon delivery of which the statistics
+is to be printed. Both forms of this option (with and without
+argument) can be given to in a single invocation of tar.
+
+* Bug fixes
+** Detect attempts to update compressed archives.
+
+
+version 1.15.90 - Sergey Poznyakoff, 2006-02-19
+
+* New features
+
+** Any number of -T (--files-from) options may be used in the command line.
+The file specified with -T may include any valid `tar' options,
+including another -T option.
+Compatibility note: older versions of tar would only recognize -C
+as an option name within the file list file. Now any file whose name
+starts with - is handled as an option. To insert file names starting with
+dash, use the --add-file option.
+
+** List files containing null-separated file names are detected and processed
+automatically. It is no longer necessary to give the --null option.
+
+** New option --no-unquote disables the unquoting of input file names.
+This is useful for processing output from `find dir -print0'.
+An orthogonal option --unquote is provided as well.
+
+** New option --test-label tests the archive volume label.
+If an argument is specified, the label is compared against its value.
+Tar exits with code 0 if the two strings match, and with code 2 if
+they do not.
+
+If no argument is given, the --verbose option is implied. In this case,
+tar prints the label name if present and exits with code 0.
+
+** New option --show-stored-names. When creating an archive in verbose mode,
+it lists member names as stored in the archive, i.e., with any eventual
+prefixes removed. The option is useful, for example, while comparing
+`tar cv' and `tar tv' outputs.
+
+** New option --to-command pipes the contents of archive members to the
+specified command.
+
+** New option --atime-preserve=system, which uses the O_NOATIME feature
+of recent Linux kernels to avoid some problems when preserving file
+access times.
+
+** New option --delay-directory-restore delays restoring modification times
+and permissions of extracted directories until the end of extraction.
+This is necessary for restoring from archives with unusual member
+ordering (in particular, those created with --no-recursion option).
+This option is implied when restoring from incremental archives.
+
+** New option --restrict prohibits use of some potentially harmful tar
+options. Currently it disables '!' escape in multi-volume name menu.
+
+** New options --quoting-style and --quote-chars control the way tar
+quotes member names on output. The --quoting-style takes an argument
+specifying the quoting style to use (literal, shell, shell-always,
+c, escape, locale, clocale). The argument to --quote-chars is a string
+specifying characters to quote, even if the selected quoting style
+would not quote them otherwise. The option --no-quote-chars is
+provided to disable quoting certain characters.
+
+** The end-of-volume script (introduced with --info-script option) can
+get current archive name from the environment variable TAR_ARCHIVE and
+the volume number from the variable TAR_VOLUME. It can alter the
+archive name by writing new name to the file descriptor 3.
+
+** Better support for full-resolution time stamps. Tar cannot restore
+time stamps to full nanosecond resolution, though, until the kernel
+guys get their act together and give us a system call to set file time
+stamps to nanosecond resolution.
+
+** The -v option now prints time stamps only to 1-minute resolution,
+not full resolution, to avoid using up too many output columns.
+Nanosecond resolution is now supported, but that would be too much.
+
+* Bug fixes
+
+** Allow non-option arguments to be interspersed with options.
+** When extracting or listing archives in old GNU format, tar
+used to read an extra block of data after a long name header
+if length of the member name was divisible by block size (512).
+Consequently, the file pointer was set off and the next member
+was not processed correctly.
+** Previous version created invalid archives when files shrink
+during reading.
+** Compare mode (tar d) hung when trying to compare file contents.
+** Previous versions in certain cases failed to restore directory
+modification times.
+** When creating an archive, do not attempt to store files whose
+meta-data cannot be stored in the header due to format limitations
+(for ustar and v7 formats).
+** The --version option now also outputs information about copyright,
+license, and credits. This reverts to the behavior of tar 1.14 and
+earlier, and conforms to the GNU coding standards. The --license (-L)
+option introduced in tar 1.15 has been removed, since it's no longer
+needed.
+
+
+version 1.15.1 - Sergey Poznyakoff, 2004-12-21
+
+This version fixes a bug introduced in 1.15 which caused
+tar to refuse to extract files from standard input.
+
+
+version 1.15 - Sergey Poznyakoff, 2004-12-20
+
+* Compressed archives are recognised automatically, it is no longer
+necessary to specify -Z, -z, or -j options to read them. Thus, you can
+now run `tar tf archive.tar.gz'.
+
+* When restoring incremental dumps, --one-file-system option
+prevents directory hierarchies residing on different devices
+from being purged.
+
+With the previous versions of tar it was dangerous to create
+incremental dumps with --one-file-system option, since they
+would recursively remove mount points when restoring from the
+back up. This change fixes the bug.
+
+* Renamed --strip-path to --strip-components for consistency with
+the GNU convention.
+
+* Skipping archive members is sped up if the archive media supports
+seeks.
+
+* Restore script starts restoring only if it is given --all (-a) option,
+or some patterns. This is to prevent accidental restores.
+
+* `tar --verify' prints a warning if during archive creation some of
+the file names had their prefixes stripped off.
+
+* New option --exclude-caches instructs tar to exclude cache directories
+automatically on archive creation. Cache directories are those
+containing a standardized tag file, as specified at:
+
+ http://www.brynosaurus.com/cachedir/spec.html
+
+* New configure option --with-rmt allows to specify full path name to
+the `rmt' utility. This supersedes DEFAULT_RMT_COMMAND variable
+introduced in version 1.14
+
+* New configure variable DEFAULT_RMT_DIR allows to specify the directory
+where to install `rmt' utility. This is necessary since modifying
+--libexecdir as was suggested for version 1.14 produced a side effect: it
+also modified installation prefix for backup scripts (if
+--enable-backup-scripts was given).
+
+* Bug fixes:
+** Fixed flow in recognizing files to be included in incremental dumps.
+** Correctly recognize sparse archive members when used with -T option.
+** GNU multivolume headers cannot store filenames longer than 100 characters.
+Do not allow multivolume archives to begin with such filenames.
+** If a member with link count > 2 was stored in the archive twice,
+previous versions of tar were not able to extract it, since they
+were trying to link the file to itself, which always failed and
+lead to removing the already extracted copy. Preserve the first
+extracted copy in such cases.
+** Restore script was passing improper argument to tar --listed option (which
+didn't affect the functionality, but was logically incorrect).
+** Fixed verification of created archives.
+** Fixed unquoting of file names containing backslash escapes (previous
+versions failed to recognize \a and \v).
+** When attempting to delete a non-existing member from the archive, previous
+versions of tar used to overwrite last archive block with zeroes.
+
+
+version 1.14 - Sergey Poznyakoff, 2004-05-11
+
+* Added support for POSIX.1-2001 and ustar archive formats.
+* New option --format allows to select the output archive format
+* The default output format can be selected at configuration time
+ by presetting the environment variable DEFAULT_ARCHIVE_FORMAT.
+ Allowed values are GNU, V7, OLDGNU and POSIX.
+* New option --strip-path allows to cut off a given number of
+ path elements from the name of the file being extracted.
+
+* New options --index-file, --no-overwrite-dir. The --overwrite-dir
+ option is now the default; use --no-overwrite-dir if you prefer
+ the previous default behavior.
+
+* The semantics of -o option is changed. When extracting, it
+ does the same as --no-same-owner GNU tar option. This is compatible
+ with UNIX98 tar. Otherwise, its effect is the same as that of
+ --old-archive option. This latter is deprecated and will be removed
+ in future.
+
+* New option --check-links prints a message if not all links are dumped
+ for a file being archived. This corresponds to the UNIX98 -l option.
+ The current semantics of the -l option is retained for compatibility
+ with previous releases, however such usage is strongly deprecated as
+ the option will change to its UNIX98 semantics in the future releases.
+
+* New option --occurrence[=N] can be used in conjunction with one of
+ the subcommands --delete, --diff, --extract or --list when a list of
+ files is given either on the command line or via -T option. This
+ option instructs tar to process only the Nth occurrence of each named
+ file. N defaults to 1, so `tar -x -f archive --occurrence filename'
+ extracts the first occurrence of `filename' from `archive'
+ and terminates without scanning to the end of the archive.
+
+* New option --pax-option allows to control the handling of POSIX
+ keywords in `pax' extended headers. It is equivalent to `pax'
+ -o option.
+
+* --incremental and --listed-incremental options work correctly on
+ individual files, as well as on directories.
+
+* New scripts: backup (replaces old level-0 and level-1) and restore.
+The scripts are compiled and installed if --enable-backup-scripts
+option is given to configure.
+
+* By default tar searches "rmt" utility in "$prefix/libexec/rmt",
+which is consistent with the location where the version of "rmt"
+included in the package is installed. Previous versions of tar
+used "/etc/rmt". To install "rmt" to its traditional location,
+run configure with option --libexecdir=/etc. Otherwise, if you
+already have rmt installed and wish to use it, instead of the
+shipped in version, set the variable DEFAULT_RMT_COMMAND to
+the full path name of the utility, e.g., ./configure
+DEFAULT_RMT_COMMAND=/etc/rmt.
+
+Notice also that the full path name of the "rmt" utility to
+use can be set at runtime, by giving option --rmt-command to
+tar.
+
+* Removed obsolete command line options:
+** --absolute-paths superseded by --absolute-names
+** --block-compress is not needed any longer
+** --block-size superseded by --blocking-factor
+** --modification-time superseded by --touch
+** --read-full-blocks superseded by --read-full-records
+** --record-number superseded by --block-number
+** --version-control superseded by --backup
+
+* New message translations fi (Finnish), gl (Galician), hr (Croatian),
+ hu (Hungarian), ms (Malaysian), nb (Norwegian), ro (Romanian), sk
+ (Slovak), zh_CN (Chinese simplified), zh_TW (Chinese traditional).
+ The code 'no' for Norwegian (Bokmål) has been withdrawn; use 'nb' instead.
+
+* Bug fixes.
+
+
+version 1.13.25 - Paul Eggert, 2001-09-26
+
+* Bug fixes.
+
+
+version 1.13.24 - Paul Eggert, 2001-09-22
+
+* New option --overwrite-dir.
+* Fixes for buffer overrun, porting, and copyright notice problems.
+* The message translations for Korean are available again.
+
+
+version 1.13.23 - Paul Eggert, 2001-09-13
+
+* Bug, porting, and copyright notice fixes.
+
+
+version 1.13.22 - Paul Eggert, 2001-08-29
+
+* Bug fixes.
+
+
+version 1.13.21 - Paul Eggert, 2001-08-28
+
+* Porting and copyright notice fixes.
+
+
+version 1.13.20 - Paul Eggert, 2001-08-27
+
+* Some bugs were fixed:
+ - security problems
+ - hard links to symbolic links
+
+* New option --recursion (the default) that is the inverse of --no-recursion.
+
+* New options --anchored, --ignore-case, --wildcards,
+ --wildcards-match-slash, and their negations (e.g., --no-anchored).
+ Along with --recursion and --no-recursion, these options control how
+ exclude patterns are interpreted.
+
+* The default interpretation of exclude patterns is now --no-anchored
+ --no-ignore-case --recursion --wildcards --wildcards-match-slash.
+ This is a quiet change to the semantics of --exclude. The previous
+ semantics were a failed attempt at backward compatibility but it
+ became clear that the semantics were puzzling and did not satisfy
+ everybody. Rather than continue to try to revive that dead horse we
+ thought it better to substitute cleaner semantics, with options so
+ that you can change the behavior more to your liking.
+
+* New message translations for Indonesian and Turkish.
+ The translation for Korean has been withdrawn due to encoding errors.
+ It will be reissued once those are fixed.
+
+
+version 1.13.19 - Paul Eggert, 2001-01-13
+
+* The -I option has been withdrawn, as it was buggy and confusing.
+ Eventually it is planned to be reintroduced, with the same meaning as -T.
+
+* With an option like -N DATE, if DATE starts with "/" or ".", it is taken
+ to be a file name; the last-modified time of that file is used as the date.
+
+
+version 1.13.18 - Paul Eggert, 2000-10-29
+
+* Some security problems have been fixed. `tar -x' now modifies only
+ files under the working directory, unless you also specify an unsafe
+ option like --absolute-names or --overwrite.
+
+* The short name of the --bzip option has been changed to -j,
+ and -I is now an alias for -T, for compatibility with Solaris tar.
+
+* The manual is now distributed under the GNU Free Documentation License.
+
+* The new environment variable TAR_OPTIONS holds default command-line options.
+
+* The --no-recursion option now affects extraction too.
+
+* The wording in some diagnostics has been changed slightly.
+
+* Snapshot files now record whether each file was accessed via NFS.
+ The new file format is upward- and downward-compatible with the old.
+
+* New language supported: da.
+
+* Compilation by traditional (K&R) C compilers is no longer supported.
+ If you still use such a compiler, please use GCC instead.
+
+* This version of tar works best with GNU gzip test version 1.3 or later.
+ Please see <ftp://alpha.gnu.org/gnu/gzip/>.
+
+* `tar --delete -f -' now works again.
+
+
+version 1.13.17 - Paul Eggert, 2000-01-07.
+
+* `tar --delete -f -' is no longer allowed; it was too buggy.
+* Diagnostic messages have been made more regular and consistent.
+
+
+version 1.13.16 - Paul Eggert, 1999-12-13.
+
+* By default, tar now refuses to overwrite an existing file when
+ extracting files from an archive; instead, it removes the file
+ before extracting it. If the existing file is a symbolic link, the
+ link is removed and not the pointed-to file. There is one
+ exception: existing nonempty directories are not removed, nor are
+ their ownerships or permissions extracted. This fixes some
+ longstanding security problems.
+
+ The new --overwrite option enables the old default behavior.
+
+ For regular files, tar implements this change by using the O_EXCL
+ option of `open' to ensure that it creates the file; if this fails, it
+ removes the file and tries again. This is similar to the behavior of
+ the --unlink-first option, but it is faster in the common case of
+ extracting a new directory.
+
+* By default, tar now ignores file names containing a component of `..'
+ when extracting, and warns about such file names when creating an archive.
+ To enable the old behavior, use the -P or --absolute-names option.
+
+* Tar now handles file names with multibyte encodings (e.g., UTF-8, Shift-JIS)
+ correctly. It relies on the mbrtowc function to handle multibyte characters.
+
+* The file generated by -g or --listed-incremental now uses a format
+ that is independent of locale, so that users need not worry about
+ locale when restoring a backup. This is needed for proper support
+ of multibyte characters. Old-format files can still be read, and
+ older versions of GNU tar can read new-format files, unless member
+ names have multibyte chars.
+
+* Many diagnostics have been changed slightly, so that file names are
+ now output unambiguously. File names in diagnostics now are either
+ `quoted like this' (in the default C locale) or are followed by
+ colon, newline, or space, depending on context. Unprintable
+ characters are escaped with a C-like backslash conventions.
+ Terminating characters (e.g., close-quote, colon, newline)
+ are also escaped as needed.
+
+* tar now ignores socket files when creating an archive.
+ Previously tar archived sockets as fifos, which caused problems.
+
+
+version 1.13.15 - Paul Eggert, 1999-12-03.
+
+* If a file's ctime changes when being archived, report an error.
+ Previously tar looked at mtime, which missed some errors.
+
+
+version 1.13.14 - Paul Eggert, 1999-11-07.
+
+* New translations ja, pt_BR.
+* New options --help and --version for rmt.
+* Ignore Solaris door files when creating an archive.
+
+
+version 1.13.13 - Paul Eggert, 1999-10-11.
+
+* Invalid headers in tar files now elicit errors, not just warnings.
+* `tar --version' output conforms to the latest GNU coding standards.
+* If you specify an invalid date, `tar' now substitutes (time_t) -1.
+* `configure --with-dmalloc' is no longer available.
+
+
+version 1.13.12 - Paul Eggert, 1999-09-24.
+
+* `tar' now supports hard links to symbolic links.
+
+* New options --no-same-owner, --no-same-permissions.
+
+* --total now also outputs a human-readable size, and a throughput value.
+
+* `tar' now uses two's-complement base-256 when outputting header
+ values that are out of the range of the standard unsigned base-8
+ format. This affects archive members with negative or huge time
+ stamps or uids, and archive members 8 GB or larger. The new tar
+ archives cannot be read by traditional tar, or by older versions of
+ GNU tar. Use the --old-archive option to revert to the old
+ behavior, which uses unportable representations for negative values,
+ and which rejects large files.
+
+* On 32-bit hosts, `tar' now assumes that an incoming time stamp T in
+ the range 2**31 <= T < 2**32 represents the negative time (T -
+ 2**32). This behavior is nonstandard and is not portable to 64-bit
+ time_t hosts, so `tar' issues a warning.
+
+* `tar' no longer gives up extracting immediately upon discovering
+ that an archive contains garbage at the end. It attempts to extract
+ as many files as possible from the good data before the garbage.
+
+* A read error now causes a nonzero exit status, not just a warning.
+
+* Some diagnostics have been reworded for consistency.
+
+
+version 1.13.11 - Paul Eggert, 1999-08-23.
+
+* The short name of the --bzip option has been changed to -I,
+ for compatibility with paxutils.
+
+* -T /dev/null now matches nothing; previously, it matched anything
+ if no explicit operands were given.
+
+* The `--' option now works the same as with other GNU utilities;
+ it causes later operands to be interpreted as file names, not options,
+ even if they begin with `-'.
+
+* For the --newer and --after-date options, the table of time zone
+ abbreviations like `EST' has been updated to match current practice.
+ Also, local time abbreviations are now recognized, even if they are
+ not in tar's hardwired table. Remember, though, that you should use
+ numeric UTC offsets like `-0500' instead of abbreviations like
+ `EST', as abbreviations are not standardized and are ambiguous.
+
+
+version 1.13.10 - Paul Eggert, 1999-08-20.
+
+* `tar' now uses signed base-64 when outputting header values that are
+ out of the range of the standard unsigned base-8 format. [This
+ change was superseded in 1.13.12, described above.]
+
+
+version 1.13.9 - Paul Eggert, 1999-08-18.
+
+* `tar' now writes two zero blocks at end-of-archive instead of just one.
+ POSIX.1 requires this, and some other `tar' implementations check for it.
+
+* `tar' no longer silently accepts a block containing nonzero checksum bytes
+ as a zero block.
+
+* `tar' now reads buggy tar files that have a null byte at the start of a
+ numeric header field.
+
+
+version 1.13.8 - Paul Eggert, 1999-08-16.
+
+* For compatibility with traditional `tar', intermediate directories
+ created automatically by root are no longer given the uid and gid of
+ the original file or directory.
+
+
+version 1.13.7 - Paul Eggert, 1999-08-14.
+
+* --listed-incremental and --newer are now incompatible options.
+
+* When creating an archive, leading `./' is no longer stripped,
+ to match traditional tar's behavior (and simplify the documentation).
+
+* --diff without --absolute-names no longer falls back on absolute names.
+
+
+version 1.13.6 - Paul Eggert, 1999-08-11.
+
+* An --exclude pattern containing / now excludes a file only if it matches an
+ initial prefix of the file name; a pattern without / continues to
+ exclude a file if it matches any file name component.
+
+* The protocol for talking to rmt has been extended slightly.
+ Open flags are now communicated in symbolic format as well as numeric.
+ The symbolic format (e.g., "O_WRONLY|O_CREAT|O_TRUNC") is for portability
+ when rmt is operating on a different operating system from tar.
+ The numeric format is retained, and rmt uses it if symbolic format is absent,
+ for backward compatibility with older versions of tar and rmt.
+
+* When writing GNU tar format headers, tar now uses signed base-64
+ for values that cannot be represented in unsigned octal.
+ This supports larger files (2**66 - 1 bytes instead of 2**33 - 1 bytes),
+ larger uids, negative time stamps, etc.
+
+* When extracting files with unknown ownership, tar now looks up the
+ uid and gid "nobody" on hosts whose headers do not define UID_NOBODY
+ and GID_NOBODY, and falls back on uid/gid -2 if there is no "nobody".
+
+* tar -t --numeric-owner now prints numeric uids and gids, not symbolic.
+
+* New option -y or --bzip2 for bzip2 compression, by popular request.
+
+
+version 1.13.5 - Paul Eggert, 1999-07-20.
+
+* Do the delayed updates of file metadata even after a fatal error.
+
+
+version 1.13.4 - Paul Eggert, 1999-07-20.
+
+* Do not chmod unless we are root or the -p option was given;
+ this matches historical practice.
+
+
+version 1.13.3 - Paul Eggert, 1999-07-16.
+
+* A path name is excluded if any of its file name components matches an
+ excluded pattern, even if the path name was specified on the command line.
+ Also see 1.13.6 for later changes in this area.
+
+
+version 1.13.2 - Paul Eggert, 1999-07-14.
+
+* Bug reporting address changed to <bug-tar@gnu.org>.
+
+
+version 1.13.1 - Paul Eggert, 1999-07-12.
+
+* Bug fixes only.
+
+version 1.13 - Paul Eggert, 1999-07-08.
+
+* Support for large files, e.g., files larger than 2 GB on many 32-bit hosts.
+ Also, support for larger uids, device ids, etc.
+* Many bug fixes and porting fixes.
+* This release is only for fixes. A more ambitious test release,
+ with new features, is available as part of the paxutils. Please see:
+ ftp://alpha.gnu.org/gnu/paxutils/
+ The fixes in this release are intended to be merged with paxutils
+ at some point, but they haven't been merged yet.
+* An interim GNU tar alpha had new --bzip2 and --ending-file options,
+ but they have been removed to maintain compatibility with paxutils.
+ Please try --use=bzip2 instead of --bzip2.
+
+Version 1.12 - François Pinard, 1997-04.
+
+Sensitive matters
+* Use shell globbing patterns for --label, instead of regular expressions.
+* Do not quote anymore internally over the quoting done by the shell.
+
+Output for humans
+* Offer internationalization capabilities of most recent GNU gettext.
+* Messages available in many more languages, thanks to all translators!
+* Usage of ISO 8601 dates in listings, instead of local American dates.
+* More normalization and cleanup in error messages.
+
+Creation
+* For helping using tar with find, offer a --no-recursion option.
+* Implement --numeric-owner for ignoring symbolic names at create time.
+* New --owner, --group --mode options, still preliminary.
+* Recognize creating an archive on /dev/null, so Amanda works faster.
+* Object to the creation of an empty archive (like in `tar cf FILE').
+* Barely start implementing --posix and POSIXLY_CORRECT.
+
+Extraction
+* Make a better job at restoring file and directory attributes.
+* Automatically attempt deleting existing files when in the way.
+* Option --unlink-first (-U) removes most files prior to extraction.
+* Option --recursive-unlink removes non-empty directories when in the way.
+* Option --numeric-owner ignores owner/group names, it uses UID/GID instead.
+* Use global umask when creating missing intermediate directories.
+* When symlinks are not available, extract symbolic links as hard links.
+* Diagnose extraction of contiguous files as regular files.
+* New --backup, --suffix and --version-control options.
+
+Various changes
+* Better support of huge archives with --tape-length and --totals.
+* Rename option --read-full-blocks (-B) to --read-full-records (-B).
+* Rename option --block-size (-b) to --blocking-factor (-b).
+* Rename option --record-number (-R) to --block-number (-R).
+* With --block-number (-R), report null blocks and end of file.
+* Implement --record-size for introducing a size in bytes.
+* Delete --block-compress option and rather decide it automatically.
+* Rename option --modification-time to --touch.
+
+Many bugs are squashed, while others still run free.
+
+Version 1.11.8 - François Pinard, 1995-06.
+
+* Messages available in French, German, Portuguese and Swedish.
+* The distribution provides a rudimentary Texinfo manual.
+* The device defaults to stdin/stdout, unless overridden by the installer.
+* Option --sparse (-S) should work on more systems.
+* Option --rsh-command may select an alternative remote shell program.
+
+Most changes are internal, and should yield better portability.
+
+Version 1.11.2 - Michael Bushnell, 1993-03.
+
+* Changes in backup scripts: cleaned up considerably; notices error
+conditions better over rsh; DUMP_REMIND_SCRIPT is now an option in
+backup-specs; new file dump-remind is an example of a
+DUMP_REMIND_SCRIPT.
+
+* Superfluous "Reading dirname" was a bug; fixed.
+
+* Incompatibility problems with a bug on Solaris are fixed.
+
+* New option --gzip (aliases are --ungzip and -z); calls gzip instead
+of compress. Also, --use-compress-program lets you specify any
+compress program. --compress-block is renamed --block-compress and
+now requires one of the three compression options to be specified.
+
+* Several error messages are cleaned up.
+
+* Directory owners are now set properly when running as root.
+
+* Provide DUMP_REMIND_SCRIPT in backup-specs as a possible option
+for --info-script.
+
+* Behave better with broken rmt servers.
+
+* Dump scripts no longer use --atime-preserve; this causes a nasty probem.
+
+* Several Makefile cleanups.
+
+Version 1.11.1 - Michael Bushnell, 1992-09.
+
+* Many bug fixes.
+
+Version 1.11 - Michael Bushnell, 1992-09.
+Version 1.10.16 - 1992-07.
+Version 1.10.15 - 1992-06.
+Version 1.10.14 - 1992-05.
+Version 1.10.13 - 1992-01.
+
+* Many bug fixes.
+
+* Now uses GNU standard configure, generated by Autoconf.
+
+* Long options now use `--'; use of `+' is deprecated and support
+for it will eventually be removed.
+
+* New option --null causes filenames read by -T to be
+null-terminated, and causes -C to be ignored.
+
+* New option --remove-files deletes files (but not directories)
+after they are added to the archive.
+
+* New option --ignore-failed-read prevents read-errors from affecting
+the exit status.
+
+* New option --checkpoint prints occasional messages as the tape
+is being read or written.
+
+* New option --show-omitted-dirs prints the names of directories
+omitted from the archive.
+
+* Some tape drives which use a non-standard method of indicating
+end-of-tape now work correctly with multi-tape archives.
+
+* --volno-file: Read the volume number used in prompting the user
+(but not in recording volume ID's on the archive) from a file.
+
+* When using --multi-volume, you can now give multiple -f arguments;
+the various tape drives will get used in sequence and then wrap
+around to the beginning.
+
+* Remote archive names no longer have to be in /dev: any file with a
+`:' is interpreted as remote. If new option --force-local is given,
+then even archive files with a `:' are considered local.
+
+* New option --atime-preserve restores (if possible) atimes to
+their original values after dumping the file.
+
+* No longer does tar confusingly dump "." when you don't tell it
+what to dump.
+
+* When extracting directories, tar now correctly restores their
+modification and access times.
+
+* Longnames support is redone differently--long name info directly
+precedes the long-named file or link in the archive, so you no
+longer have to wait for the extract to hit the end of the tape for
+long names to work.
+
+Version 1.10 - Michael Bushnell, 1991-07.
+
+* Filename to -G is optional. -C works right. Names +newer and
++newer-mtime work right.
+
+* -g is now +incremental, -G is now +listed-incremental.
+
+* Sparse files now work correctly.
+
+* +volume is now called +label.
+
+* +exclude now takes a filename argument, and +exclude-from does
+what +exclude used to do.
+
+* Exit status is now correct.
+
+* +totals keeps track of total I/O and prints it when tar exits.
+
+* When using +label with +extract, the label is now a regexp.
+
+* New option +tape-length (-L) does multi-volume handling like BSD
+dump: you tell tar how big the tape is and it will prompt at that
+point instead of waiting for a write error.
+
+* New backup scripts level-0 and level-1 which might be useful
+to people. They use a file "backup-specs" for information, and
+shouldn't need local modification. These are what we use to do
+all our backups at the FSF.
+
+Version 1.09 - Jay Fenlason, 1990-10.
+Version 1.08 - Jay Fenlason, 1990-01.
+Versions 1.07 back to 1.00 by Jay Fenlason.
+
+* See ChangeLog for more details.
+
+
+
+Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003,
+2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+This file is part of GNU tar.
+
+GNU tar is free software; you can 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.
+
+GNU tar is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with tar; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.
+
+Local variables:
+mode: outline
+paragraph-separate: "[ ]*$"
+eval: (add-hook 'write-file-hooks 'time-stamp)
+time-stamp-start: "changes. "
+time-stamp-format: "%:y-%02m-%02d"
+time-stamp-end: "\n"
+end:
diff --git a/PORTS b/PORTS
new file mode 100644
index 0000000..fe41efd
--- /dev/null
+++ b/PORTS
@@ -0,0 +1,173 @@
+Ports of GNU tar and other tars
+See the end of file for copying conditions.
+
+* Introduction
+
+ Most entries in this file are out of date, unfortunately. Such
+ entries are marked with an `X'. Run grep '^\*\*[^X]' PORTS to
+ extract valid entries.
+
+ Please write bug-tar@gnu.org if you are aware of various ports of GNU tar
+ to non-GNU and non-Unix systems not listed here, or for corrections.
+ Please provide the goal system, a complete and stable URL, the maintainer
+ name and address, the tar version used as a base, and your comments.
+
+* GNU/Linux and Unix
+
+** Star is a tape archiver similar to tar.
+ <http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/star.html>
+
+* Amiga
+
+**X ftp://ftp.wustl.edu/systems/amiga/aminet/util/arc/GNUtar-1.11.8.lha
+ maintained by Enrico Forestieri <enrico@com.unipr.it>
+ Based on tar 1.11.8.
+
+**X ftp://ftp.ninemoons.com/pub/ade/current/amiga-bin/tar-1.11.8-bin.lha
+ maintained by the ADE group <fnf@fishpond.ninemoons.com>
+ Based on tar 1.11.8, needs ixemul.library.
+
+**X ftp://ftp.wustl.edu/systems/amiga/aminet/util/arc/gnutar.lha
+ maintained by <mscheler@wuarchive.wustl.edu>
+
+* DEC alpha (NT)
+
+**X ftp://ftp.cdrom.com/.20/windows/archiver/tar.zip
+ maintained by Drew Bliss & Geoff Voelker
+
+* DEC VAX (VMS)
+
+**X http://www.lp.se/free/vmstar/
+ maintained by Richard Levitte <levitte@lp.se>
+ This is not GNU tar, but a separate implementation.
+
+** maintained by William Bader <william@nscs.fast.net>
+ For V4.7. Based on an old PDtar. Requires compatible shared libraries
+ to run V5 or V6 executables.
+
+* IBM/PC (DV/X)
+
+**X ftp://qdeck.com/ (?)
+ maintained by David Ronis <ronis@gibbs.chem.mcgill.ca>
+ For Desqview/X. Everything works besides compression. Copy of hacked
+ sources available, some of DV/X's programmer's library also needed.
+
+* IBM/PC (MSDOS)
+
+**X http://www.simtel.net/simtel.net/
+ http://www.leo.org/pub/comp/platforms/pc/gnuish (Germany)
+ ftp://ftp.simtel.net/simtelnet/gnu
+ ftp://ftp.leo.org/pub/comp/platforms/pc/gnuish
+ maintained by Darrel Hankerson <hankedr@mail.auburn.edu>
+ You get many GNU tools, not only `tar'. The GNUish project is described
+ in `gnuish_t.htm'.
+
+** The DJGPP development tools also include some `tar' utilities.
+
+**X ftp://ftp.mcs.com/mcsnet.users/les/dos-gnutar/
+ maintained by Leslie Mikesell <les@mcs.net>
+ Based on tar 1.11.2. Support for SCSI (via ASPI) and network (rsh over
+ packet driver). No support for win95 long file names.
+
+**X ftp://ftp.wu-wien.ac.at/pub/src/PCmisc/aspi-tar/*
+ maintained by Christoph Splittgerber <chris@orion.sdata.de>
+ Based on tar 1.10. Support for SCSI (via ASPI).
+
+**X ftp://wuarchive (?)
+ Several DOS version based on PDtar. John Gilmore <gnu@toad.com> says
+ he has copies of several vintages saved.
+
+**X ftp://ftp.cdrom.com/.14/languages/ada/toolkit/msdos/gtar/gtar.exe
+ ftp://ftp.cdrom.com/.14/languages/ada/toolkit/msdos/gtar/gtar.taz
+ ftp://ftp.cdrom.com/.14/languages/ada/toolkit/msdos/gtar/gtar.zip
+
+**X ftp://ftp.cdrom.com/.4/os2/archiver/tar.zip
+ Based on PDtar.
+
+**X ftp://ftp.cdrom.com/.20/windows/archiver/tar.zip
+ maintained by Drew Bliss & Geoff Voelker
+ GNU tar for NT (intel and Alpha platforms).
+
+** ftp://garbo.uwasa.fi/pc/unix/untgz095.zip
+ maintained by Tillmann Steinbrecher <tst@darmstadt.netsurf.de>
+ The `untgz' program is a fast .tar or .tar.gz (.tgz) extractor.
+
+**X http://people.darmstadt.netsurf.de/tst/tar.htm
+ maintained by Tillmann Steinbrecher <tst@darmstadt.netsurf.de>
+ This is not a `tar' port, but an index of them.
+
+* IBM/PC (OS/2)
+
+**X http://www.leo.org/pub/comp/os/os2/leo/gnu/archiver/gtar254.zip
+ http://www.leo.org/pub/comp/os/os2/leo/gnu/archiver/gtak254.zip
+ maintained by Andreas Kaiser <Andreas.Kaiser@stuttgart.netsurf.de>
+ Version 2.54. Based on tar 1.10. The second archive contains SCSI
+ drivers (DAT streamers notably) and rmt-type programs.
+
+* IBM/PC (Win32: Windows 95, NT 3.5 or NT 4.0)
+
+**X ftp://ftp.cygnus.com:~ftp/pub/sac/win32/usersrc/*
+ maintained by Cygnus
+ GNU-Win32 B17.1 distribution. Download all files, `cat' them together,
+ and `untar' the result. You get many GNU tools, not only `tar'.
+ Based on tar 1.11.2.
+
+**X ftp://ftp.cdrom.com/.20/windows/archiver/tar.zip
+ maintained by Drew Bliss & Geoff Voelker
+ GNU tar for NT (intel and Alpha platforms).
+
+** ftp://garbo.uwasa.fi/pc/unix/untgz095.zip
+ maintained by Tillmann Steinbrecher <tst@darmstadt.netsurf.de>
+ The `untgz' program is a fast .tar or .tar.gz (.tgz) extractor.
+
+* IBM/PC (Windows 3.1)
+
+**X ftp://ftp.mcs.com/mcsnet.users/les/win-gnutar/
+ maintained by Leslie Mikesell <les@mcs.net>
+ Support for network (rsh over winsock). No support for win95 long
+ file names.
+
+**X ftp://ftp.gamesdomain.ru/.1/os/windows/programr/tar.zip
+ Based on GNU tar 1.11.2.
+
+* Macintosh
+
+** Paulo Abreu (paulotex at yahoo dot com) did a
+ limited port of GNU tar to Darwin, with support for resource forks
+ and finder info, but this no longer seems to be available.
+
+** There is a tar in Stuffit Expander which is available many places and
+ comes with MacOS. It creates some spurious files but works on average.
+
+** There is an excellent GNU tar bundled in Tenon MachTen, but it does not
+ seem to be available separately.
+
+
+* Copyright notice
+
+ Copyright (C) 1999, 2001, 2003, 2004 Free Software Foundation, Inc.
+
+ This file is part of GNU tar.
+
+ GNU tar is free software; you can 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.
+
+ GNU tar is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU tar; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+
+Local Variables:
+mode: outline
+paragraph-separate: "[ ]*$"
+version-control: never
+End:
+ \ No newline at end of file
diff --git a/README b/README
new file mode 100644
index 0000000..0f1ad25
--- /dev/null
+++ b/README
@@ -0,0 +1,251 @@
+README for GNU tar
+See the end of file for copying conditions.
+
+* Introduction
+
+Please glance through *all* sections of this
+`README' file before starting configuration. Also make sure you read files
+`ABOUT-NLS' and `INSTALL' if you are not familiar with them already.
+
+If you got the `tar' distribution in `shar' format, time stamps ought to be
+properly restored; do not ignore such complaints at `unshar' time.
+
+GNU `tar' saves many files together into a single tape or disk
+archive, and can restore individual files from the archive. It includes
+multivolume support, the ability to archive sparse files, automatic archive
+compression/decompression, remote archives and special features that allow
+`tar' to be used for incremental and full backups. This distribution
+also includes `rmt', the remote tape server. The `mt' tape drive control
+program is in the GNU `cpio' distribution.
+
+GNU `tar' is derived from John Gilmore's public domain `tar'.
+
+See file `ABOUT-NLS' for how to customize this program to your language.
+See file `COPYING' for copying conditions.
+See file `INSTALL' for compilation and installation instructions.
+See file `PORTS' for various ports of GNU tar to non-Unix systems.
+See file `NEWS' for a list of major changes in the current release.
+See file `THANKS' for a list of contributors.
+
+Besides those configure options documented in files `INSTALL' and
+`ABOUT-NLS', an extra option may be accepted after `./configure':
+
+* Install
+
+** Selecting the default archive format.
+
+The default archive format is GNU, this can be overridden by
+presetting DEFAULT_ARCHIVE_FORMAT while configuring. The allowed
+values are GNU, V7, OLDGNU, USTAR and POSIX.
+
+** Selecting the default archive device
+
+The default archive device is now `stdin' on read and `stdout' on write.
+The installer can still override this by presetting `DEFAULT_ARCHIVE'
+in the environment before configuring (the behavior of `-[0-7]' or
+`-[0-7]lmh' options in `tar' are then derived automatically). Similarly,
+`DEFAULT_BLOCKING' can be preset to something else than 20.
+
+** Selecting full pathname of the "rmt" binary.
+
+Previous versions of tar always looked for "rmt" binary in the
+directory "/etc/rmt". However, the "rmt" program included
+in the distribution was installed under "$prefix/libexec/rmt".
+To fix this discrepancy, tar now looks for "$prefix/libexec/rmt".
+If you do not want this behavior, specify full path name of
+"rmt" binary using DEFAULT_RMT_DIR variable, e.g.:
+
+./configure DEFAULT_RMT_DIR=/etc
+
+If you already have a copy of "rmt" installed and wish to use it
+instead of the version supplied with the distribution, use --with-rmt
+option:
+
+./configure --with-rmt=/etc/rmt
+
+This will also disable building the included version of rmt.
+
+** Installing backup scripts.
+
+This version of tar is shipped with the shell scripts for producing
+incremental backups (dumps) and restoring filesystems from them.
+The name of the backup script is "backup". The name of the
+restore script is "restore". They are installed in "$prefix/sbin"
+directory.
+
+Use option --enable-backup-scripts to compile and install these
+scripts.
+
+** `--disable-largefile' omits support for large files, even if the
+operating system supports large files. Typically, large files are
+those larger than 2 GB on a 32-bit host.
+
+* Installation hints
+
+Here are a few hints which might help installing `tar' on some systems.
+
+** gzip and bzip2.
+
+GNU tar uses the gzip and bzip2 programs to read and write compressed
+archives. If you don't have these programs already, you need to
+install them. Their sources can be found at:
+
+ftp://ftp.gnu.org/gnu/gzip/
+http://sourceware.cygnus.com/bzip2/
+
+If you see the following symptoms:
+
+ $ tar -xzf file.tar.gz
+ gzip: stdin: decompression OK, trailing garbage ignored
+ tar: Child returned status 2
+
+then you have encountered a gzip incompatibility that should be fixed
+in gzip test version 1.3, which as of this writing is available at
+<ftp://alpha.gnu.org/gnu/gzip/>. You can work around the
+incompatibility by using a shell command like
+ `gzip -d <file.tar.gz | tar -xzf -'.
+
+** Solaris issues.
+
+GNU tar exercises many features that can cause problems with older GCC
+versions. In particular, GCC 2.8.1 (sparc, -O1 or -O2) is known to
+miscompile GNU tar. No compiler-related problems have been reported
+when using GCC 2.95.2 or later.
+
+Recent versions of Solaris tar sport a new -E option to generate
+extended headers in an undocumented format. GNU tar does not
+understand these headers.
+
+** Static linking.
+
+Some platform will, by default, prepare a smaller `tar' executable
+which depends on shared libraries. Since GNU `tar' may be used for
+system-level backups and disaster recovery, installers might prefer to
+force static linking, making a bigger `tar' executable maybe, but able to
+work standalone, in situations where shared libraries are not available.
+The way to achieve static linking varies between systems. Set LDFLAGS
+to a value from the table below, before configuration (see `INSTALL').
+
+ Platform Compiler LDFLAGS
+
+ (any) Gnu C -static
+ AIX (vendor) -bnso -bI:/lib/syscalls.exp
+ HPUX (vendor) -Wl,-a,archive
+ IRIX (vendor) -non_shared
+ OSF (vendor) -non_shared
+ SCO 3.2v5 (vendor) -dn
+ Solaris (vendor) -Bstatic
+ SunOS (vendor) -Bstatic
+
+** Failed tests `ignfail.sh' or `incremen.sh'.
+
+In an NFS environment, lack of synchronization between machine clocks
+might create difficulties to any tool comparing dates and file time stamps,
+like `tar' in incremental dumps. This has been a recurrent problem with
+GNU Make for the last few years. We would like a general solution.
+
+** BSD compatibility matters.
+
+Set LIBS to `-lbsd' before configuration (see `INSTALL') if the linker
+complains about `bsd_ioctl' (Slackware). Also set CPPFLAGS to
+`-I/usr/include/bsd' if <sgtty.h> is not found (Slackware).
+
+** OPENStep 4.2 swap files
+
+Tar cannot read the file /private/vm/swapfile.front (even as root).
+This file is not a real file, but some kind of uncompressed view of
+the real compressed swap file; there is no reason to back it up, so
+the simplest workaround is to avoid tarring this file.
+
+* Special topics
+
+Here are a few special matters about GNU `tar', not related to build
+matters. See previous section for such.
+
+** File attributes.
+
+About *security*, it is probable that future releases of `tar' will have
+some behavior changed. There are many pending suggestions to choose from.
+Today, extracting an archive not being `root', `tar' will restore suid/sgid
+bits on files but owned by the extracting user. `root' automatically gets
+a lot of special privileges, `-p' might later become required to get them.
+
+GNU `tar' does not properly restore symlink attributes. Various systems
+implement flavors of symbolic links showing different behavior and
+properties. We did not successfully sorted all these out yet. Currently,
+the `lchown' call will be used if available, but that's all.
+
+** POSIX compliance.
+
+GNU `tar' is able to create archive in the following formats:
+
+ *** The format of UNIX version 7
+ *** POSIX.1-1988 format, also known as "ustar format"
+ *** POSIX.1-2001 format, also known as "pax format"
+ *** Old GNU format (described below)
+
+In addition to those, GNU `tar' is also able to read archives
+produced by `star' archiver.
+
+A so called `Old GNU' format is based on an early draft of the
+POSIX 1003.1 `ustar' standard which is different from the final
+standard. It defines its extensions (such as incremental backups
+and handling of the long file names) in a way incompatible with
+any existing tar archive format, therefore the use of old GNU
+format is strongly discouraged.
+
+Please read the file NEWS for more information about POSIX compliance
+and new `tar' features.
+
+* What's next?
+
+GNU tar will be merged into GNU paxutils: a project containing
+several utilities related to creating and handling archives in
+various formats. The project will include tar, cpio and pax
+utilities.
+
+* Bug reporting.
+
+Send bug reports to <bug-tar@gnu.org>. A bug report should contain
+an adequate description of the problem, your input, what you expected,
+what you got, and why this is wrong. Diffs are welcome, but they only
+describe a solution, from which the problem might be uneasy to infer.
+If needed, submit actual data files with your report. Small data files
+are preferred. Big files may sometimes be necessary, but do not send them
+to the report address; rather take special arrangement with the maintainer.
+
+Your feedback will help us to make a better and more portable package.
+Consider documentation errors as bugs, and report them as such. If you
+develop anything pertaining to `tar' or have suggestions, let us know
+and share your findings by writing to <bug-tar@gnu.org>.
+
+
+* Copying
+
+ Copyright (C) 1990, 1991, 1992, 1994, 1997, 1998, 1999, 2000,
+ 2001, 2003, 2004 Free Software Foundation, Inc.
+
+ This file is part of GNU tar.
+
+ GNU tar is free software; you can 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.
+
+ GNU tar is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with tar; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+
+Local Variables:
+mode: outline
+paragraph-separate: "[ ]*$"
+version-control: never
+End:
+
diff --git a/THANKS b/THANKS
new file mode 100644
index 0000000..9ad74eb
--- /dev/null
+++ b/THANKS
@@ -0,0 +1,526 @@
+GNU tar THANKS file
+
+Public domain tar was written by John Gilmore, with contributions
+from Henry Spencer, Fred Fish, Ian Darwin, Geoff Collyer, Stan Barber,
+Guy Harris, Dave Brower, Richard Todd, Michael Rendell, Stu Heiss and
+Rich $alz. The FSF version, named GNU tar, was derived from PDTAR by
+Jay Fenlason and Joy Kendall, and was maintained in turn by François
+Pinard, Paul Eggert and Sergey Poznyakoff.
+
+Many people further contributed to GNU tar by reporting problems,
+suggesting various improvements or submitting actual code. Here is a
+list of these people. Help me keep it complete and exempt of errors.
+See various ChangeLogs for a detailed description of contributions.
+
+Aage Robeck aagero@ifi.uio.no
+Adye, TJ (Tim) T.J.Adye@rl.ac.uk
+Akiko Matsushita matusita@sra.co.jp
+Alan Bawden Alan@lcs.mit.edu
+Alan Cox alan@cymru.net
+Alan Modra alan@spri.levels.unisa.edu.au
+Albert W. Dorrington awdorrin@ictest.delcoelect.com
+Alex Schmidt root@lacesm.ufsm.br
+Alexander Dupuy dupuy@smarts.com
+Alexander Lehmann alex@hal.rhein-main.de
+Alexander V. Lukyanov lav@long.yar.ru
+Alois Steindl Alois.Steindl+Mechanik@tuwien.ac.at
+Amos Yahil ayahil@sbast4.ess.sunysb.edu
+Anders Andersson andersa@docs.uu.se
+Anders Liljeborg anders@fysik4.kth.se
+Andre Novaes Cunha Andre.Cunha@br.global-one.net
+Andreas Degert ad@papyrus.hamburg.com
+Andreas Haumer andreas@vlsivie.tuwien.ac.at
+Andreas Jaeger aj@arthur.pfalz.de
+Andreas Koppenhoefer koppenh@trick.informatik.uni-stuttgart.de
+Andreas Reuter ar205@bonzo.geowiss.nat.tu-bs.de
+Andreas Schuldei andreas@schuldei.org
+Andreas Schwab schwab@issan.informatik.uni-dortmund.de
+Andrew A. Ivanov ivanov@mics.msu.su
+Andrew J. Schorr schorr@ead.dsa.com
+Andrew Torda torda@igc.chem.ethz.ch
+Andrey A. Chernov ache@astral.msk.su
+Andy Gay andy@rdl.co.uk
+Antonio Jose Coutinho ajc@di.uminho.pt
+Ariel Faigon ariel@engr.sgi.com
+Arne Wichmann aw@math.uni-sb.de
+Arnold Robbins arnold@gnu.org
+Art Isbell aisbell@cubicsol.com
+Axel Boldt boldt@math.ucsb.edu
+Axel Habermann kiwi@belly.in-berlin.de
+Bdale Garbee bdale@gag.com
+Becki Kain beckers@josephus.furph.com
+Bela Lubkin filbo@armory.com
+Ben A. Mesander ben@piglet.cr.usgs.gov
+Benedikt Stockebrand benedikt@devnull.ruhr.de
+Bennett Todd bet@mordor.com
+Benno Schulenberg benno@nietvergeten.nl
+Benny Holmgren benny@hgs.se
+Bernard Chen bern@cs.ucla.edu
+Bernard Derval derval@iro.umontreal.ca
+Bernhard Rosenkraenzer bero@redhat.de
+Bo Nygaard Bai bai@iesd.auc.dk
+Bob Kaehms kaehms@was.archive.org
+Bob Mende Pie mende@piecomputer.rutgers.edu
+Bradley A. Smith basmith@prometheus.chem.umn.edu
+Brendan Kehoe brendan@cygnus.com
+Brett Gaines gaines@saifr00.ateng.az.honeywell.com
+Brian Perkins bperkins@netspace.org
+Brian R. Smith brian@cygnus.com
+Bruce Evans bde@runx.oz.au
+Bruce Jerrick bruce@cse.ogi.edu
+Bruno Haible haible@ilog.fr
+Bryan Ford baford@mit.edu
+Bryant Fujimoto fujimoto@denali.chem.washington.edu
+Burkhard Plache plache@krusty.optimax.ns.ca
+Calvin Cliff cliff@trifid.astro.ucla.edu
+Cameron Elliott cam@mvbms.mvbms.com
+Carl Streeter streeter@cae.wisc.edu
+Carsten Heyl heyl@nads.de
+Catrin Urbanneck cur@gppc.de
+Cesar Romani romani@ifm.uni-hamburg.de
+Chad Hurwitz churritz@cts.com
+Chance Reschke creschke@usra.edu
+Charles Fu ccwf@klab.caltech.edu
+Charles Lopes Charles.Lopes@infm.ulst.ac.uk
+Charles M. Hannum mycroft@gnu.org
+Chip Salzenberg tct!chip
+Chris Arthur csa@gnu.org
+Chris F.M. Verberne verberne@prl.philips.nl
+Chris G. Demetriou cgd@sun-lamp.cs.berkeley.edu
+Chris Hopps sycom.mi.org!ro-chp!chopps
+Chris Metcalf metcalf@catfish.lcs.mit.edu
+Chris Ransom chris@quests.com
+Christian Callsen Christian.Callsen@eng.sun.com
+Christian Kirsch ck@held.mind.de
+Christian Laubscher christian.laubscher@tiscalinet.ch
+Christian T. Dum ctd@mpe-garching.mpg.de
+Christian von Roques roques@pond.sub.org
+Christoph Litauer litauer@mailhost.uni-koblenz.de
+Christophe Colle colle@krtkg1.rug.ac.be
+Christophe Kalt Christophe.Kalt@kbcfp.com
+Christopher T. Johnson cjohnson@camelot.com
+Christopher Vickery vickery@ipc1.cs.qc.edu
+Claude Scarpelli claude@genethon.fr
+Claus Heine Claus_Heine@ac2.maus.de
+Cliff Krumvieda cliff@cs.cornell.edu
+Clinton Carr clint@netcom.com
+Conrad Hughes chughes@maths.tcd.ie
+Constantin Belous const@cris.net
+Coranth Gryphon gryphon@bur.visidyne.com
+Dale R. Worley worley@world.std.com
+Dale Wiles wiles@geordi.calspan.com
+Dan Bloch dan@transarc.com
+Dan Reish dreish@izzy.net
+Daniel Hagerty hag@gnu.org
+Daniel Quinlan quinlan@pathname.com
+Daniel R. Guilderson d.guilderson@ma30.bull.com
+Daniel S. Barclay daniel@compass-da.com
+Daniel Trinkle trinkle@cs.purdue.edu
+Danny R. Johnston danny@cs.weber.edu
+Dave Barr barr@math.psu.edu
+Dave Gentzel gentzel@nova.enet.dec.com
+Dave Gregorich dtg@ipac.caltech.edu
+David Brown davidb@davidb.org
+David J. MacKenzie djm@uunet.uu.net
+David Johnson David.W.Johnson@colorado.edu
+David K. Drum ccdavid@mizzou1.missouri.edu
+David Lawyer david.lawyer@patchbay.com
+David Lemson lemson@uiuc.edu
+David Mansfield david@cobite.com
+David Martin dmartin@lerc.nasa.gov
+David N. Brown dbrown@lorien.physics.louisville.edu
+David Nugent davidn@blaze.net.au
+David Shaw david.shaw@alcatel.com.au
+David Steiner dsteiner@ispa.uni-osnabrueck.de
+David Taylor taylor@think.com
+Dean Gaudet dgaudet@watdragon.uwaterloo.ca
+Demizu Noritoshi nori-d@is.aist-nara.ac.jp
+Denis Fortin fortin@acm.org
+Dennis Pixton dennis@math.binghamton.edu
+Dick Streefland dicks@tasking.nl
+Dietmar Braun dietmar@highway.bertelsmann.de
+Dimitri Bougoulias opus@hol.gr
+Dimitris Fousekis dfousek@leon.nrcps.ariadne-t.gr
+Dirk Herr-Hoyman hoymand@gate.net
+Don Bennett dpb@netcom.com
+Donald B Gordon dbgordon@gnu.org
+Donald H. Locker dhl@spuf1d83.lcp.chrysler.com
+Douglas Scott doug@foxtrot.ccmrc.ucsb.edu
+Drew Sullivan drew@sni.ca
+Drew Trieger trieger@woodstock.abbott.com
+Dunstan Vavasour dev@cegelecproj.co.uk
+Ed Childs echilds@bgs.com
+Edgar Taube et@immd8.informatik.uni-erlangen.de
+Eduardo Kortright eduardo@cs.ua.edu
+Eduardo V. de Rivas eddie@asterion.com
+Edward Welbourne eddy@gen.cam.ac.uk
+Elmar Heeb heeb@itp.ethz.ch
+Elmer Fittery elmerf@ptw.com
+Eric Backus ericb@lsid.hp.com
+Eric Benson eb@amazon.com
+Eric Blake ebb9@byu.net
+Eric M. Boehm Eric.M.Boehm@optimumtech.com
+Eric Norum eric@ee.ualberta.ca
+Erich Stefan Boleyn erich@uruk.org
+Erick Branderhorst branderh@debian.iaehv.nl
+Erik D. Frederick edf@deckard.mc.duke.edu
+Esa Karell karell@cs.helsinki.fi
+Ezra Peisach epeisach@mit.edu
+Fabio d'Alessi cars@civ.bio.unipd.it
+Frank Heckenbach frank@g-n-u.de
+Frank Koenen koenfr@lidp.com
+Franz-Werner Gergen gergen@edvulx.mpi-stuttgart.mpg.de
+François Pinard pinard@iro.umontreal.ca
+Fritz Elfert fritz@fsun.triltsch.de
+George Chyu gschyu@ccgate.dp.beckman.com
+Gerben Wierda gerben@rna.indiv.nluug.nl
+Gerd Knorr kraxel@cs.tu-berlin.de
+Gerhard Poul gpoul@gnu.org
+Giorgio Signorini signo@chim.unifi.it
+Graham Whitted gbw@sgrail.com
+Grant McDorman grant@isgtec.com
+Greg Black gjb@gba.oz.au
+Greg Chung gchung@caip.rutgers.edu
+Greg Hudson ghudson@mit.edu
+Greg Maples greg@clari.net
+Greg McGary gkm@cstone.net
+Greg Schafer gschafer@zip.com.au
+Göran Uddeborg gvran@uddeborg.pp.se
+Gürkan Karaman karaman@dssgmbh.de
+Hans Guerth 100664.3101@compuserve.com
+Hansjörg Lipp hjlipp@web.de
+Harald König koenig@tat.physik.uni-tuebingen.de
+Harald Milz hm@seneca.ix.de
+Heiko Schinke mdqac@biochemtech.uni-halle.de
+Heiko Schlichting heiko@fu-berlin.de
+Helmut Waitzmann Helmut.Waitzmann@web.de
+Henrik Bakman hb@csd.uu.se
+Hernan Prieto Schmidt hernan@pea.usp.br
+Hiroyuki Bessho bsh@grotto.iijnet.or.jp
+Holger Teutsch holger@hotbso.rhein-main.de
+Hugh Secker-Walker hugh@ear.mit.edu
+Hunyue Yau hunyue.yau@picksys.com
+Ian Jackson ijackson@gnu.org
+Ian Lance Taylor ian@cygnus.com
+Ian T. Zimmerman itz@crl.com
+Ian Turner ian@zmanda.com
+Indra Singhal indra@synoptics.com
+J. Dean Brock brock@cs.unca.edu
+J.J. Bailey jjb@jagware.bcc.com
+J.T. Conklin jtc@cygnus.com
+James Crawford Ralston qralston+@pitt.edu
+James E. Carpenter jimc@zach1.tiac.net
+James H Caldwell Jr caldwell@cs.fsu.edu
+James Stevens James.Stevens@jrcs.co.uk
+James V. DI Toro III karrde@gats.hampton.va.us
+James W. McKelvey mckelvey@fafnir.com
+Jamie Zawinski jwz@lucid.com
+Jan Carlson janc@sni.ca
+Jan Djarv jan.djarv@mbox200.swipnet.se
+Janice Burton r06a165@bcc25.kodak.com
+Janne Snabb snabb@niksula.hut.fi
+Jason R. Mastaler jason@webmaster.net
+Jason Armistead Jason.Armistead@otis.com
+Jay Fenlason hack@gnu.org
+Jean-Michel Soenen soenen@lectra.fr
+Jean-Ph. Martin-Flatin syj@ecmwf.int
+Jean-loup Gailly jloup@chorus.fr
+Jeff Moskow jeff@rtr.com
+Jeff Prothero jsp@betz.biostr.washington.edu
+Jeff Siegel js@hornet.att.com
+Jeff Sorensen sorenj@alumni.rpi.edu
+Jeffrey Goldberg J.Goldberg@cranfield.ac.uk
+Jeffrey Mark Siskind Qobi@emba.uvm.edu
+Jeffrey W. Parker jwpkr@mcs.com
+Jens Henrik Jensen recjhl@mediator.uni-c.dk
+Jim Blandy jimb@totoro.cs.oberlin.edu
+Jim Clausing jac@postbox.acs.ohio-state.edu
+Jim Farrell jwf@platinum.com
+Jim Meyering meyering@na-net.ornl.gov
+Jim Murray jjm@jjm.com
+Joachim Holzfuss Joachim.Holzfuss@iap.physik.th-darmstadt.de
+Joachim Seelig joachim@kruemel.han.de
+Joe DeBattista joed@itsa.ucsf.edu
+Johan Vromans jvromans@squirrel.nl
+Johannes Helander jvh@cs.hut.fi
+John Clark jclark@gray.cscwc.pima.edu
+John D. Sybalsky John_D._Sybalsky.MV@envos.xerox.com
+John David Anglin dave@hiauly1.hia.nrc.ca
+John Gilmore gnu@toad.com
+John J. Szetela johns@angelo.amd.com
+John L. Chmielewski jlc@attmail.com
+John L. Males jlmales@yahoo.com
+John Oleynick juo@klinzhai.rutgers.edu
+John R. Vanderpool fish@daacdev1.stx.com
+John Rouillard rouilj@cs.umb.edu
+John Thomas McDole john.thomas.mcdole@nagra.com
+Jon Lewis jlewis@inorganic5.fdt.net
+Jonathan I. Kamens jik@cam.ov.com
+Jonathan N. Sherman sysjns@etacrs1.safb.af.mil
+Jonathan Thornburg thornbur@theory.physics.ubc.ca
+Josef Bauer Josef.Bauer@mchp.siemens.de
+Joseph E. Sacco jsacco@ssl.com
+Joshua R. Poulson jrp@plaza.ds.adp.com
+Joutsiniemi Tommi Il tj75064@cs.tut.fi
+Joy Kendall jak8@world.std.com
+Judy Ricker jricker@gdstech.grumman.com
+Juha Sarlin juha@tds.kth.se
+Jurgen Botz jbotz@orixa.mtholyoke.edu
+Jyh-Shyang Wang erik@vsp.ee.nctu.edu.tw
+Jörg Schilling schilling@fokus.fraunhofer.de
+Jörg Weule weule@cs.uni-duesseldorf.de
+Jörg Weilbier gnu@weilbier.net
+Jörgen Hågg Jorgen.Hagg@axis.se
+Jörgen Weigert jw@suse.de
+Jürgen Lüters jlueters@t-online.de
+Jürgen Reiss reiss@psychologie.uni-wuerzburg.de
+Kai Petzke wpp@marie.physik.tu-berlin.de
+Kai Schlichting kai@computel.com
+Karl Berry karl@cs.umb.edu
+Karl Heuer kwzh@gnu.org
+Karl Vogel vogelke@c-17igp.wpafb.af.mil
+Karlos Z. Smith kazen@viptx.net
+Karsten Thygesen karthy@kom.auc.dk
+Kaveh R. Ghazi ghazi@caip.rutgers.edu
+Keith Young youngk@astro.ocis.temple.edu
+Kelly Stephens kstephen@holli.com
+Ken Raeburn raeburn@cygnus.com
+Ken Steube steube@sdsc.edu
+Kevin D Quitt drs@netcom.com
+Kevin Dalley kevin@aimnet.com
+Kimball Collins kpc@ptolemy.arc.nasa.gov
+Kimmy Posey kimmyd@bnr.ca
+Koji Kishi kis@rqa.sony.co.jp
+Konno Hiroharu konno@pac.co.jp
+Kurt Jaeger pi@lf.net
+Larry Creech lcreech@lonestar.rcclub.org
+Larry Schwimmer rosebud@cyclone.stanford.edu
+Laurent Caillat-Vallet caillat@noe.lyon.cemagref.fr
+Laurent Sainte-Marthe smarthe@genethon.fr
+Leland Lucius llucius@tiny.net
+Les Mikesell les@mcs.com
+Loren J. Rittle rittle@comm.mot.com
+Loïc Prylli Loic.Prylli@lip.ens-lyon.fr
+Luke Mewburn lukem@connect.com.au
+Machael Stone mstone@cs.loyola.edu
+Mads Martin Joergensen mmj@suse.de
+Manfred Weichel Manfred.Weichel@mch.sni.de
+Manuel Munier Manuel.Munier@loria.fr
+Marc Boucher marc@cam.org
+Marc Ewing marc@redhat.com
+Marcin Matuszewski marcin@frodo.nask.org.pl
+Marcus Daniels marcus@sysc.pdx.edu
+Mark Bynum bynum@cennas.nhmfl.gov
+Mark Clements mpc@mbsmm.com
+Mark Frost mfrost@ncd.com
+Mark Kollert Mark.Kollert@oi42.kwu.siemens.de
+Mark W. Eichin eichin@cygnus.com
+Markus Kuhn mskuhn@cip.informatik.uni-erlangen.de
+Martin Bellenberg sunsoft@ifm.uni-hamburg.de
+Martin Goik goik@HDM-Stuttgart.de
+Martin Mares mj@k332.feld.cvut.cz
+Martin Simmons ZYHYLCRMZPRP@spammotel.com
+Marty Leisner leisner@eso.mc.xerox.com
+Massimo Dal Zotto dz@cs.unitn.it
+Mats Lofkvist d87-mal@nada.kth.se
+Matt Power mhpower@mit.edu
+Matthew J. D'Errico doc@deathstar.lis.cch.com
+Matti Aarnio mea@utu.fi
+Max Hailperin max@nic.gac.edu
+Maxime Taksar mmt@redbrick.com
+Melissa O'Neill oneill@cs.sfu.ca
+Melissa Weisshaus melissa@gnu.org
+Michael Dietrich mdt@is.in-berlin.de
+Michael Ellis bosun@aquarius.seaoar.uvic.ca
+Michael Giddings giddings@whitewater.chem.wisc.edu
+Michael Hayes michaelh@poroporo.chch.cri.nz
+Michael Helm mike@fionn.lbl.gov
+Michael Holmes mholmes@lccinc.com
+Michael Kaufman mkaufman@netgsi.com
+Michael Kubik mkubik@qitgsdv1.telecom.com.au
+Michael Lin mlin@lynx.com
+Michael Maass michael.maass@bk.bosch.de
+Michael Meissner meissner@cygnus.com
+Michael P Urban urban@cobra.jpl.nasa.gov
+Michael Schmidt michael@muc.de
+Michael Schwingen m.schwingen@stochastik.rwth-aachen.de
+Michael Smolsky fnsiguc@astro.weizmann.ac.il
+Mike Muuss mike@brl.mil
+Mike Nolan nolan@lpl.arizona.edu
+Mike Rogers mike@demon.net
+Mike Silano silano@newton.cs.jhu.edu
+Mike Walker M.D.Walker@larc.nasa.gov
+Milan Hodoscek milan@kihp6.ki.si
+Minh Tran-Le tranle@intellicorp.com
+Mitsuaki Masuhara masuhara@mcprv.mec.mei.co.jp
+Nate Eldredge nate@cs.hmc.edu
+Neil Faulks neil@dcs.kcl.ac.uk
+Neil Jerram nj104@cus.cam.ac.uk
+Nelson H.F. Beebe beebe@math.utah.edu
+Nick Barron nikb@cix.compulink.co.uk
+Noah Friedman friedman@gnu.org
+Noel Cragg noel@red-bean.com
+Norbert Kiesel norbert@rwthi3.informatik.rwth-aachen.de
+Olaf Schlueter olaf@toppoint.de
+Olaf Wucknitz owucknitz@hs.uni-hamburg.de
+Oliver Trepte oliver@fysik4.kth.se
+Olivier Roussel roussel@lifl.fr
+Oswald P. Backus IV backus@lks.csi.com
+Pascal Meheut pascal@cnam.cnam.fr
+Patrick Fulconis fulco@sig.uvsq.fr
+Patrick Timmons timmons@electech.polymtl.ca
+Paul Eggert eggert@twinsun.com
+Paul Kanz paul@icx.com
+Paul Mitchell P.Mitchell@surrey.ac.uk
+Paul Nevai pali+@osu.edu
+Paul Nordstrom 100067.3532@compuserve.com
+Paul O'Connor oconnorp@ul.ie
+Paul Siddall pauls@postman.essex.ac.uk
+Peder Chr. Norgaard pcn@tbit.dk
+Pekka Janhunen Pekka.Janhunen@fmi.fi
+Per Bojsen pb@delta.dk
+Per Foreby perf@efd.lth.se
+Pete Geenhuizen peteg@beno.css.gov
+Peter Carah pete@looneytunes.com
+Peter Fox fox@gec-mi-at.co.uk
+Peter Kutschera peter@zditr1.arcs.ac.at
+Peter Seebach seebs@taniemarie.solon.com
+Phil Hands phil@hands.com
+Philippe Defert defert@cern.ch
+Piercarlo Grandi piercarl@sabi.demon.co.uk
+Pierce Cantrell cantrell@ee.tamu.edu
+R. Kent Dybvig dyb@cadence.bloomington.in.us
+R. Scott Butler butler@prism.es.dupont.com
+Rainer Orth ro@TechFak.Uni-Bielefeld.DE
+Ralf Wildenhues Ralf.Wildenhues@gmx.de
+Ralf S. Engelschall rse@engelschall.com
+Ralf Suckow suckow@contrib.de
+Ralph Corderoy ralph@inputplus.co.uk
+Ralph Schleicher rs@purple.ul.bawue.de
+Randy Bias randyb@edge.edge.net
+Ray Dassen jdassen@wi.leidenuniv.nl
+Reuben J. Ravago reuben@asti.dost.gov.ph
+Reuben Sumner rasumner@undergrad.math.uwaterloo.ca
+Ricardo Marek ricky@ornet.co.il
+Richard Deal deal@xi.cs.fsu.edu
+Richard J. Kettlewell rjk@greenend.org.uk
+Richard Lloyd R.K.Lloyd@csc.liv.ac.uk
+Richard O'Neill richard@nexus.vnus.bc.ca
+Richard Sims rbs@acs.bu.edu
+Richard Stallman rms@gnu.org
+Richard Westerik richardw@bssi.nl
+Rick Emerson rick@ssg.com
+Rob Parry rparry@hydrolab.arsusda.gov
+Robert Anthony Nader naderr@usa.net
+Robert Bernstein rocky@panix.com
+Robert E. Brown brown@bibliotech.com
+Robert Frey bobf@unix.advansys.com
+Robert Leslie rob@mars.org
+Robert Lipe robertl@arnet.com
+Robert McGraw mcgraw@sunspot.noao.edu
+Robert W. Kim robertwk@aixpdslib.seas.ucla.edu
+Robert Weiner robert@progplus.com
+Robert Weissenfels robert@hop.ping.de
+Rocky Giannini rocky@nova.umd.edu
+Rod Buchanan rod.buchanan@kratos.co.uk
+Rod Thompson rodt@synopsys.com
+Roderich Schupp roderich@syntec.m.eunet.de
+Rodney Brown RBrown@cocam.com.au
+Roland McGrath roland@gnu.org
+Roland Schemers III schemers@vela.acs.oakland.edu
+Rolf Niepraschk niepraschk@chbrb.berlin.ptb.de
+Roman Czyborra czyborra@cs.tu-berlin.de
+Roman Gollent roman@portal.stwing.upenn.edu
+Ron Guilmette rfg@netcom.com
+Roy Marantz marantz@nbcs.rutgers.edu
+Russ Evans e_gs18@ub.nmh.ac.uk
+Russell Cattelan cattelan@thebarn.com
+Ryutaro Susukita susukita@pn.scphys.kyoto-u.ac.jp
+Sakai Kiyotaka ksakai@netwk.ntt-at.co.jp
+Sam Richards sam@blueskyprod.com
+Santiago Vila Doncel sanvila@unex.es
+Sarah Quady squady@warp10.keck.hawaii.edu
+Saul Lubkin lubkin@cs.rochester.edu
+Scott Grosch garath@engin.umich.edu
+Scott Hunziker ksh@eskimo.com
+Scott J. Kramer sjk@graham.com
+Scott L. Burson gyro@zeta-soft.com
+Scott S. Bertilson scott@geom.umn.edu
+Serge Granik serge@euler.berkeley.edu
+Seth Robertson seth@ctr.columbia.edu
+Sherwood Botsford sherwood@space.ualberta.ca
+Simon Wright simon.j.wright@gecm.com
+Simon Wright simon@pogner.demon.co.uk
+Sisira Jayasinghe sisira.jayasinghe@sdrc.com
+Skip Montanaro skip@mojam.com http://www.musi-cal.com/~skip/
+Solar Designer solar@openwall.com
+Stefan Skoglund sp2stes1@ida.his.se
+Steffen Stempel stempel@ira.uka.de
+Stephen Gildea gildea@intouchsys.com
+Stephen J Bevan stephenb@harlequin.co.uk
+Stephen Saroff saroff@msc.edu
+Stuart Kemp skemp@bmc.com
+Stuart Poulin stuart@indsys.com
+Sven Verdoolaege skimo@breughel.ufsia.ac.be
+Sylvain Rougier un@grolier.fr
+Tarang Kumar Patel mombasa@ptolemy.arc.nasa.gov
+Ted Rule Ted_Rule@flextech.co.uk
+The King elvis@gnu.org
+Thomas metaf4@users.askja.de
+Thomas Bushnell n/BSG thomas@gnu.org
+Thomas Krebs krebs@faps.uni-erlangen.de
+Thomas König Thomas.Koenig@ciw.uni-karlsruhe.de
+Thomas M. Browder Jr. browder@use1.eglin.af.mil
+Thomas Priesner priesner@flo.sh.bosch.de
+Thomas Waas waas@echild.aiss.de
+Thorbjxrn Willoch willoch@oslo.sgp.slb.com
+Tilman Schmidt ts@gb1.sema.de
+Tim Bradshaw tfb@aiai.ed.ac.uk
+Tim Lashua tim@winternet.com
+Tim Magill tim@tct.com
+Tim P. Starrin noid@cyborg.larc.nasa.gov
+Tim Ramsey tar@ksu.ksu.edu
+Tim Rylance tkr@puffball.demon.co.uk
+Tim Towers tzt@uniplex.co.uk
+Timothy Fossum fossum@cs.uwp.edu
+Timothy J. Lee timlee@netcom.com
+Tito Flagella tito@di.unipi.it
+Todd Vierling tv@duh.org
+Tom Popovitch tpop@informix.com
+Tom Quinn trq@astro.washington.edu
+Tom Tromey tromey@drip.colorado.edu
+Tor Lillqvist tml@hemuli.tte.vtt.fi
+Torbjorn Granlund tege@sics.se
+Torkel Hasle torkel@bibsyst.no
+Toshiaki Nishi toshi@sss.osa.sharp.co.jp
+Travis L. Priest T.L.Priest@larc.nasa.gov
+Troy Rudolph rudtr01@cai.com
+Tsutomu Yamada tsutomu@sra.co.jp
+Ulrich Drepper drepper@gnu.org
+Van Snyder vsnyder@math.jpl.nasa.gov
+Vic Abell abe@cc.purdue.edu
+Victor J. Griswold vgris@aironet.com
+Ville Herva v@iki.fi
+Vince Del Vecchio vdelvecc@inmet.com
+W. Phillip Moore wpm@morgan.com
+Warner Losh imp@boulder.parcplace.com
+Warren Dodge warrend@sptekwv3.wv.tek.com
+Wayne Christopher wayne@icemcfd.com
+Werner Almesberger werner.almesberger@lrc.di.epfl.ch
+William Bader william@nscs.fast.net
+William J. Eaton wje@hoffman.rstnu.bcm.tmc.edu
+William Kucharski kucharsk@netcom.com
+Wojciech Polak polak@gnu.org
+Wolfgang Rupprecht wolfgang@wsrcc.com
+Wolfram Gloger Wolfram.Gloger@dent.med.uni-muenchen.de
+Wolfram Kleff bugreport@wkleff.intergenia.de
+Wolfram Wagner ww@mpi-sb.mpg.de
+WÅ‚odzimierz Jan Martin wjm@pg.gda.pl
+Yasushi Suzudo SGR00413@niftyserve.or.jp
+Yu-Min Liang min@taz.ho.att.com
+
+
+;;;; Local Variables:
+;;;; mode: Fundamental
+;;;; coding: utf-8
+;;;; End:
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..f325d17
--- /dev/null
+++ b/TODO
@@ -0,0 +1,71 @@
+Suggestions for improving GNU tar.
+
+* <45BEC0DB.8040903@unix-beratung.de>
+
+* Incorporate fixes from major distributions, e.g., Debian GNU/Linux.
+
+* Add support for restoring file time stamps to sub-second resolution,
+ if the file system supports this.
+
+* Add support for restoring the attributes of symbolic links, for
+ OSes like FreeBSD that have the lutimes and lchmod functions.
+
+* --append should bail out if the two archives are of different types.
+
+* Add support for a 'pax' command that conforms to POSIX 1003.1-2001.
+ This would unify paxutils with tar.
+
+* Interoperate better with Joerg Schilling's star implementation.
+
+* Add an option to remove files that compare successfully.
+
+ From: Roesinger Eric <ROESINGE@tce.com>
+ Date: Sat, 28 Jul 2001 18:43:43 -0500
+
+ It would be useful to be able to use '--remove-files' with '--diff',
+ to remove all files that compare successfully, when verifying a backup.
+
+* Add tests for the new functonality.
+
+* Consider this:
+
+ From: Dennis Pund
+ Subject: TAR suggestion...
+ Date: Wed, 1 May 2002 18:26:36 -0500 (EST)
+
+ What I would like to do is:
+
+ foo my.tar.gz | tar -xzOf - | tar -cMf - -L 650000 - | bar
+
+ where 'foo' is a program that retrieves the archive and streams it
+ to stdout and bar is a program that streams the stdin to CDR.
+
+ (http://mail.gnu.org/archive/html/bug-gnu-utils/2002-05/msg00022.html)
+
+
+* Copyright notice
+
+ Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+ This file is part of GNU tar.
+
+ GNU tar is free software; you can 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.
+
+ GNU tar is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with tar; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+
+Local variables:
+mode: outline
+paragraph-separate: "[ ]*$"
+end:
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..125c94e
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1100 @@
+# generated automatically by aclocal 1.10a -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006 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_if(m4_PACKAGE_VERSION, [2.60],,
+[m4_fatal([this file was generated for autoconf 2.60.
+You have another version of autoconf. If you want to use that,
+you should regenerate the build system entirely.], [63])])
+
+# isc-posix.m4 serial 2 (gettext-0.11.2)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# This file is not needed with autoconf-2.53 and newer. Remove it in 2005.
+
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it. Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+ [
+ dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+ AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+ ]
+)
+
+# ulonglong.m4 serial 6
+dnl Copyright (C) 1999-2006 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_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.60, but can be removed once we
+# assume 2.61 everywhere.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for unsigned long long int],
+ [ac_cv_type_unsigned_long_long_int],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[unsigned long long int ull = 18446744073709551615ULL;
+ typedef int a[(18446744073709551615ULL <= (unsigned long long int) -1
+ ? 1 : -1)];
+ int i = 63;]],
+ [[unsigned long long int ullmax = 18446744073709551615ull;
+ return (ull << 63 | ull >> 63 | ull << i | ull >> i
+ | ullmax / ull | ullmax % ull);]])],
+ [ac_cv_type_unsigned_long_long_int=yes],
+ [ac_cv_type_unsigned_long_long_int=no])])
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], 1,
+ [Define to 1 if the system has the type `unsigned long long int'.])
+ fi
+])
+
+# This macro is obsolescent and should go away soon.
+AC_DEFUN([gl_AC_TYPE_UNSIGNED_LONG_LONG],
+[
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+ ac_cv_type_unsigned_long_long=$ac_cv_type_unsigned_long_long_int
+ if test $ac_cv_type_unsigned_long_long = yes; then
+ AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
+ [Define if you have the 'unsigned long long' type.])
+ fi
+])
+
+# Copyright (C) 2002, 2003, 2005, 2006 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.10a'
+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.10a], [],
+ [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 AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.10a])dnl
+_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 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],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
+# 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 8
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])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, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# 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", "GCJ", or "OBJC".
+# 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
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], UPC, [depcc="$UPC" am_compiler_list=],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+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'.
+ 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
+ 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 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} 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 sub/conftest.${OBJEXT-o} 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,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# 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.
+
+# 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.60])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],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+ [m4_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)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. 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)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES(OBJC)],
+ [define([AC_PROG_OBJC],
+ defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+])
+
+
+# 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_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 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
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[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, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_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 supports --run.
+# If it does, 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
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006 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_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+ [[\\/$]]* | ?:[[\\/]]*) ;;
+ */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_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],
+[AC_FOREACH([_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) 2001, 2003, 2005 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, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ 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)])
+
+# Copyright (C) 2001, 2003, 2005 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 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])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# 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.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # 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])
+ 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/absolute-header.m4])
+m4_include([m4/alloca.m4])
+m4_include([m4/allocsa.m4])
+m4_include([m4/argmatch.m4])
+m4_include([m4/argp.m4])
+m4_include([m4/backupfile.m4])
+m4_include([m4/bison.m4])
+m4_include([m4/canonicalize-lgpl.m4])
+m4_include([m4/chdir-long.m4])
+m4_include([m4/chown.m4])
+m4_include([m4/clock_time.m4])
+m4_include([m4/close-stream.m4])
+m4_include([m4/closeout.m4])
+m4_include([m4/codeset.m4])
+m4_include([m4/d-ino.m4])
+m4_include([m4/dirfd.m4])
+m4_include([m4/dirname.m4])
+m4_include([m4/dos.m4])
+m4_include([m4/double-slash-root.m4])
+m4_include([m4/dup2.m4])
+m4_include([m4/eealloc.m4])
+m4_include([m4/eoverflow.m4])
+m4_include([m4/error.m4])
+m4_include([m4/exclude.m4])
+m4_include([m4/exitfail.m4])
+m4_include([m4/extensions.m4])
+m4_include([m4/fchdir.m4])
+m4_include([m4/fcntl-safer.m4])
+m4_include([m4/fcntl_h.m4])
+m4_include([m4/fileblocks.m4])
+m4_include([m4/float_h.m4])
+m4_include([m4/fnmatch.m4])
+m4_include([m4/fpending.m4])
+m4_include([m4/ftruncate.m4])
+m4_include([m4/getcwd-abort-bug.m4])
+m4_include([m4/getcwd-path-max.m4])
+m4_include([m4/getcwd.m4])
+m4_include([m4/getdate.m4])
+m4_include([m4/getdelim.m4])
+m4_include([m4/getline.m4])
+m4_include([m4/getopt.m4])
+m4_include([m4/getpagesize.m4])
+m4_include([m4/gettext.m4])
+m4_include([m4/gettime.m4])
+m4_include([m4/gettimeofday.m4])
+m4_include([m4/glibc21.m4])
+m4_include([m4/gnulib-common.m4])
+m4_include([m4/gnulib-comp.m4])
+m4_include([m4/hash.m4])
+m4_include([m4/human.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/inline.m4])
+m4_include([m4/intmax_t.m4])
+m4_include([m4/inttostr.m4])
+m4_include([m4/inttypes-pri.m4])
+m4_include([m4/inttypes.m4])
+m4_include([m4/inttypes_h.m4])
+m4_include([m4/lchown.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/localcharset.m4])
+m4_include([m4/longlong.m4])
+m4_include([m4/lstat.m4])
+m4_include([m4/mbchar.m4])
+m4_include([m4/mbiter.m4])
+m4_include([m4/mbrtowc.m4])
+m4_include([m4/mbscasecmp.m4])
+m4_include([m4/mbstate_t.m4])
+m4_include([m4/memchr.m4])
+m4_include([m4/mempcpy.m4])
+m4_include([m4/memrchr.m4])
+m4_include([m4/memset.m4])
+m4_include([m4/mkdtemp.m4])
+m4_include([m4/mktime.m4])
+m4_include([m4/modechange.m4])
+m4_include([m4/nls.m4])
+m4_include([m4/openat.m4])
+m4_include([m4/pathmax.m4])
+m4_include([m4/paxutils.m4])
+m4_include([m4/po.m4])
+m4_include([m4/progtest.m4])
+m4_include([m4/quote.m4])
+m4_include([m4/quotearg.m4])
+m4_include([m4/readlink.m4])
+m4_include([m4/regex.m4])
+m4_include([m4/rmdir.m4])
+m4_include([m4/rmt.m4])
+m4_include([m4/rpmatch.m4])
+m4_include([m4/rtapelib.m4])
+m4_include([m4/safe-read.m4])
+m4_include([m4/safe-write.m4])
+m4_include([m4/save-cwd.m4])
+m4_include([m4/savedir.m4])
+m4_include([m4/setenv.m4])
+m4_include([m4/sleep.m4])
+m4_include([m4/ssize_t.m4])
+m4_include([m4/stat-time.m4])
+m4_include([m4/stdarg.m4])
+m4_include([m4/stdbool.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/string_h.m4])
+m4_include([m4/strndup.m4])
+m4_include([m4/strnlen.m4])
+m4_include([m4/strtoimax.m4])
+m4_include([m4/strtol.m4])
+m4_include([m4/strtoll.m4])
+m4_include([m4/strtoul.m4])
+m4_include([m4/strtoull.m4])
+m4_include([m4/strtoumax.m4])
+m4_include([m4/sys_stat_h.m4])
+m4_include([m4/sys_time_h.m4])
+m4_include([m4/sysexits.m4])
+m4_include([m4/system.m4])
+m4_include([m4/tempname.m4])
+m4_include([m4/time_h.m4])
+m4_include([m4/time_r.m4])
+m4_include([m4/timespec.m4])
+m4_include([m4/tm_gmtoff.m4])
+m4_include([m4/unistd-safer.m4])
+m4_include([m4/unistd_h.m4])
+m4_include([m4/unlinkdir.m4])
+m4_include([m4/unlocked-io.m4])
+m4_include([m4/utimbuf.m4])
+m4_include([m4/utime.m4])
+m4_include([m4/utimens.m4])
+m4_include([m4/utimes-null.m4])
+m4_include([m4/utimes.m4])
+m4_include([m4/vasnprintf.m4])
+m4_include([m4/vsnprintf.m4])
+m4_include([m4/wchar.m4])
+m4_include([m4/wchar_t.m4])
+m4_include([m4/wctype.m4])
+m4_include([m4/wcwidth.m4])
+m4_include([m4/wint_t.m4])
+m4_include([m4/xalloc.m4])
+m4_include([m4/xgetcwd.m4])
+m4_include([m4/xstrndup.m4])
+m4_include([m4/xstrtol.m4])
diff --git a/build-aux/config.guess b/build-aux/config.guess
new file mode 100755
index 0000000..951383e
--- /dev/null
+++ b/build-aux/config.guess
@@ -0,0 +1,1516 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2007-05-17'
+
+# 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# 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 Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# 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 tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ 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:SunOS:5.*:* | ix86xen:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <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 [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <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:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <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 [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <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 [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:[3456]*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ EM64T | authenticamd)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${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-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ xtensa:Linux:*:*)
+ echo xtensa-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^LIBC/{
+ s: ::g
+ p
+ }'`"
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </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 i386.
+ echo i386-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; } ;;
+ 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.0*:*)
+ 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 [ -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 ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ 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 ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/build-aux/config.rpath b/build-aux/config.rpath
new file mode 100755
index 0000000..c492a93
--- /dev/null
+++ b/build-aux/config.rpath
@@ -0,0 +1,614 @@
+#! /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-2006 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 AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ darwin*)
+ case $cc_basename in
+ xlc*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ mingw* | pw32* | os2*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ newsos6)
+ ;;
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ wl='-Wl,'
+ ;;
+ pgcc | pgf77 | pgf90)
+ wl='-Wl,'
+ ;;
+ ccc*)
+ wl='-Wl,'
+ ;;
+ como)
+ wl='-lopt='
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ sco3.2v5*)
+ ;;
+ solaris*)
+ wl='-Wl,'
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ unicos*)
+ wl='-Wl,'
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32*)
+ # 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
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we cannot use
+ # them.
+ ld_shlibs=no
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32*)
+ # 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
+ ;;
+ interix3*)
+ hardcode_direct=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ linux*)
+ 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
+ ;;
+ aix4* | aix5*)
+ 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].*|aix5*)
+ 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
+ hardcode_direct=yes
+ 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*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32*)
+ # 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 test "$GCC" = yes ; then
+ :
+ else
+ case $cc_basename in
+ xlc*)
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+ freebsd2.2*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ freebsd2*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd* | kfreebsd*-gnu | 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=:
+ ;;
+ openbsd*)
+ 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
+ ;;
+ 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*)
+ ;;
+ 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 AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ ;;
+ aix4* | aix5*)
+ ;;
+ amigaos*)
+ ;;
+ beos*)
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32*)
+ shrext=.dll
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ ;;
+ dgux*)
+ ;;
+ freebsd1*)
+ ;;
+ kfreebsd*-gnu)
+ ;;
+ freebsd* | dragonfly*)
+ ;;
+ gnu*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $host_cpu in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ ;;
+ interix3*)
+ ;;
+ irix5* | irix6* | nonstopux*)
+ 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*)
+ ;;
+ knetbsd*-gnu)
+ ;;
+ netbsd*)
+ ;;
+ newsos6)
+ ;;
+ nto-qnx*)
+ ;;
+ openbsd*)
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ ;;
+ osf3* | osf4* | osf5*)
+ ;;
+ solaris*)
+ ;;
+ sunos4*)
+ ;;
+ sysv4 | sysv4.3*)
+ ;;
+ sysv4*MP*)
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ ;;
+ uts4*)
+ ;;
+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_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"
+
+# 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..c060f44
--- /dev/null
+++ b/build-aux/config.sub
@@ -0,0 +1,1626 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2007-04-29'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# 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.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# 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.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fido | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | mcore | mep \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # 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
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/build-aux/depcomp b/build-aux/depcomp
new file mode 100755
index 0000000..e5f9736
--- /dev/null
+++ b/build-aux/depcomp
@@ -0,0 +1,589 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2007-03-29.01
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
+# Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# 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 outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+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"
+
+# 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
+
+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 -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## 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).
+## - 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 -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## 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.
+ tr ' ' '
+' < "$tmpdepfile" |
+## 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.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -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 -eq 0; then :
+ else
+ 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 ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+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.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ 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 -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ 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.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ 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 -eq 0; then :
+ else
+ 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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add `dependent.h:' lines.
+ sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
+ else
+ echo "#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.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mechanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # 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.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#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 $1 != '--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:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ 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 $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ 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.
+ -*|$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"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ 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 $1 != '--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, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/build-aux/install-sh b/build-aux/install-sh
new file mode 100755
index 0000000..a5897de
--- /dev/null
+++ b/build-aux/install-sh
@@ -0,0 +1,519 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2006-12-25.00
+
+# 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.
+
+nl='
+'
+IFS=" "" $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+ doit_exec=exec
+else
+ doit_exec=$doit
+fi
+
+# 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_glob='?'
+initialize_posix_glob='
+ test "$posix_glob" != "?" || {
+ if (set -f) 2>/dev/null; then
+ posix_glob=
+ else
+ posix_glob=:
+ fi
+ }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve the last data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -s $stripprog installed files.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *' '* | *'
+'* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -s) stripcmd=$stripprog;;
+
+ -t) dst_arg=$2
+ shift;;
+
+ -T) no_target_directory=true;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+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
+ 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
+ trap '(exit $?); exit' 1 2 13 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 starting with `-'.
+ case $src in
+ -*) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dst_arg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dst=$dstdir/`basename "$src"`
+ dstdir_status=0
+ else
+ # Prefer dirname, but fall back on a substitute if dirname fails.
+ dstdir=`
+ (dirname "$dst") 2>/dev/null ||
+ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$dst" : 'X\(//\)[^/]' \| \
+ X"$dst" : 'X\(//\)$' \| \
+ X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+ echo X"$dst" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'
+ `
+
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writeable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ -*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ eval "$initialize_posix_glob"
+
+ oIFS=$IFS
+ IFS=/
+ $posix_glob set -f
+ set fnord $dstdir
+ shift
+ $posix_glob set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test -z "$d" && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+ eval "$initialize_posix_glob" &&
+ $posix_glob set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ $posix_glob set +f &&
+
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/build-aux/mdate-sh b/build-aux/mdate-sh
new file mode 100755
index 0000000..83d2700
--- /dev/null
+++ b/build-aux/mdate-sh
@@ -0,0 +1,205 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+
+scriptversion=2007-03-30.02
+
+# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005, 2007 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, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# 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>.
+
+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 time of FILE.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "mdate-sh $scriptversion"
+ exit $?
+ ;;
+esac
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+# GNU ls changes its time format in response to the TIME_STYLE
+# variable. Since we cannot assume `unset' works, revert this
+# variable to its documented default.
+if test "${TIME_STYLE+set}" = set; then
+ TIME_STYLE=posix-long-iso
+ export TIME_STYLE
+fi
+
+save_arg1=$1
+
+# Find out how to get the extended ls output of a file or directory.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+ ls_command='ls -L -l -d'
+else
+ ls_command='ls -l -d'
+fi
+# Avoid user/group names that might have spaces, when possible.
+if ls -n /dev/null 1>/dev/null 2>&1; then
+ ls_command="$ls_command -n"
+fi
+
+# A `ls -l' line looks as follows on OS/2.
+# drwxrwx--- 0 Aug 11 2001 foo
+# This differs from Unix, which adds ownership information.
+# drwxrwx--- 2 root root 4096 Aug 11 2001 foo
+#
+# To find the date, we split the line on spaces and iterate on words
+# until we find a month. This cannot work with files whose owner is a
+# user named `Jan', or `Feb', etc. However, it's unlikely that `/'
+# will be owned by a user whose name is a month. So we first look at
+# the extended ls output of the root directory to decide how many
+# words should be skipped to get the date.
+
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+set x`$ls_command /`
+
+# Find which argument is the month.
+month=
+command=
+until test $month
+do
+ 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
+
+# Get the extended ls output of the file or directory.
+set dummy x`eval "$ls_command \"\$save_arg1\""`
+
+# Remove all preceding arguments
+eval $command
+
+# Because of the dummy argument above, month is in $2.
+#
+# On a POSIX system, we should have
+#
+# $# = 5
+# $1 = file size
+# $2 = month
+# $3 = day
+# $4 = year or time
+# $5 = filename
+#
+# On Darwin 7.7.0 and 7.6.0, we have
+#
+# $# = 4
+# $1 = day
+# $2 = month
+# $3 = year or time
+# $4 = filename
+
+# Get the month.
+case $2 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+esac
+
+case $3 in
+ ???*) day=$1;;
+ *) day=$3; shift;;
+esac
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+ *:*) set `date`; eval year=\$$#
+ case $2 in
+ Jan) nummonthtod=1;;
+ Feb) nummonthtod=2;;
+ Mar) nummonthtod=3;;
+ Apr) nummonthtod=4;;
+ May) nummonthtod=5;;
+ Jun) nummonthtod=6;;
+ Jul) nummonthtod=7;;
+ Aug) nummonthtod=8;;
+ Sep) nummonthtod=9;;
+ Oct) nummonthtod=10;;
+ Nov) nummonthtod=11;;
+ Dec) nummonthtod=12;;
+ esac
+ # For the first six month of the year the time notation can also
+ # be used for files modified in the last year.
+ if (expr $nummonth \> $nummonthtod) > /dev/null;
+ then
+ year=`expr $year - 1`
+ fi;;
+ *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/build-aux/missing b/build-aux/missing
new file mode 100755
index 0000000..1c8ff70
--- /dev/null
+++ b/build-aux/missing
@@ -0,0 +1,367 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2006-05-10.23
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+# Originally 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# 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
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ autom4te touch the output file, or create a stub one
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+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
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case $1 in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $1 in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case $f in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if test $# -ne 1; then
+ eval LASTARG="\${$#}"
+ case $LASTARG in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if test ! -f y.tab.h; then
+ echo >y.tab.h
+ fi
+ if test ! -f y.tab.c; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if test $# -ne 1; then
+ eval LASTARG="\${$#}"
+ case $LASTARG in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if test ! -f lex.yy.c; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ # The file to touch is that specified with -o ...
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -z "$file"; then
+ # ... or it is the one specified with @setfilename ...
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '
+ /^@setfilename/{
+ s/.* \([^ ]*\) *$/\1/
+ p
+ q
+ }' $infile`
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+ fi
+ # If the file does not exist, the user really needs makeinfo;
+ # let's fail without touching anything.
+ test -f $file || exit 1
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case $firstarg in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case $firstarg in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/build-aux/mkinstalldirs b/build-aux/mkinstalldirs
new file mode 100755
index 0000000..ef7e16f
--- /dev/null
+++ b/build-aux/mkinstalldirs
@@ -0,0 +1,161 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2006-05-11.19
+
+# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+IFS=" "" $nl"
+errstatus=0
+dirmode=
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake@gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage"
+ exit $?
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --version)
+ echo "$0 $scriptversion"
+ exit $?
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error. This is a problem when calling mkinstalldirs
+# from a parallel make. We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+ '')
+ if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ test -d ./-p && rmdir ./-p
+ test -d ./--version && rmdir ./--version
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+ test ! -d ./--version; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ else
+ # Clean up after NextStep and OpenStep mkdir.
+ for d in ./-m ./-p ./--version "./$dirmode";
+ do
+ test -d $d && rmdir $d
+ done
+ fi
+ ;;
+esac
+
+for file
+do
+ case $file in
+ /*) pathcomp=/ ;;
+ *) pathcomp= ;;
+ esac
+ oIFS=$IFS
+ IFS=/
+ set fnord $file
+ shift
+ IFS=$oIFS
+
+ for d
+ do
+ test "x$d" = x && continue
+
+ pathcomp=$pathcomp$d
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp=$pathcomp/
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/build-aux/texinfo.tex b/build-aux/texinfo.tex
new file mode 100644
index 0000000..0f3c750
--- /dev/null
+++ b/build-aux/texinfo.tex
@@ -0,0 +1,8641 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2007-05-04.09}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+% 2007 Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation; either version 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this texinfo.tex file; see the file COPYING. If not, write
+% to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+% Boston, MA 02110-1301, USA.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
+
+% sometimes characters are active, so we need control sequences.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dashChar = `\-
+\chardef\dotChar = `\.
+\chardef\exclamChar= `\!
+\chardef\lquoteChar= `\`
+\chardef\questChar = `\?
+\chardef\rquoteChar= `\'
+\chardef\semiChar = `\;
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+ ap-pen-dix bit-map bit-maps
+ data-base data-bases eshell fall-ing half-way long-est man-u-script
+ man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+ par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+ spell-ing spell-ings
+ stand-alone strong-est time-stamp time-stamps which-ever white-space
+ wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ % We don't want .vr (or whatever) entries like this:
+ % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
+ % "\acronym" won't work when it's read back in;
+ % it needs to be
+ % {\code {{\tt \backslashcurfont }acronym}
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingyyy.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 24pt
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \indexdummies
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+ \def\argtorun{#2}%
+ \begingroup
+ \obeylines
+ \spaceisspace
+ #1%
+ \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ \argremovecomment #1\comment\ArgTerm%
+ }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+% @end itemize @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+ \def\temp{#3}%
+ \ifx\temp\empty
+ % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+ \let\temp\finishparsearg
+ \else
+ \let\temp\argcheckspaces
+ \fi
+ % Put the space token in:
+ \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick. --kasal, 16nov03
+
+\def\parseargdef#1{%
+ \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+ \def#2{\parsearg#1}%
+ \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+ \obeyspaces
+ \gdef\obeyedspace{ }
+
+ % Make each space character in the input produce a normal interword
+ % space in the output. Don't allow a line break at this space, as this
+ % is used only in environments like @example, where each line of input
+ % should produce a line of output anyway.
+ %
+ \gdef\sepspaces{\obeyspaces\let =\tie}
+
+ % If an index command is used in an @example environment, any spaces
+ % therein should become regular spaces in the raw index file, not the
+ % expansion of \tie (\leavevmode \penalty \@M \ ).
+ \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex. It's used like this:
+%
+% \envdef\foo{...}
+% \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo. \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches. The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+ \def\temp{#1}%
+ \ifx\thisenv\temp
+ \else
+ \badenverr
+ \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ out of any environment%
+ \else
+ in environment \expandafter\string#1%
+ \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+ \if 1\csname iscond.#1\endcsname
+ \else
+ % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux/toc files.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence. (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo. Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+ L\kern-.36em
+ {\setbox0=\hbox{T}%
+ \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+ \kern-.15em
+ \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+ \def\temp{#1}%
+ \ifx\temp\onword \plainfrenchspacing
+ \else\ifx\temp\offword \plainnonfrenchspacing
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+ \fi\fi
+}
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+ \ifnum\catcode`\^^M=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \startsavinginserts
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it. Thus, space below is not quite equal to space
+% above. But it's pretty close.
+\def\Egroup{%
+ % To get correct interline space between the last line of the group
+ % and the first line afterwards, we have to propagate \prevdepth.
+ \endgraf % Not \par, as it may have been set to \lisppar.
+ \global\dimen1 = \prevdepth
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+ \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable
+ \def\temp{\input #1 }%
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+ \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+ \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+ \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+ the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+ \ifhmode
+ \let\next\centerH
+ \else
+ \let\next\centerV
+ \fi
+ \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+ {%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+ }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent{%
+ \restorefirstparagraphindent
+ \indent
+ }%
+ \gdef\noindent{%
+ \restorefirstparagraphindent
+ \noindent
+ }%
+ \global\everypar = {%
+ \kern -\parindent
+ \restorefirstparagraphindent
+ }%
+}
+
+\gdef\restorefirstparagraphindent{%
+ \global \let \indent = \ptexindent
+ \global \let \noindent = \ptexnoindent
+ \global \everypar = {}%
+}
+
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+ \catcode`\_ = \active
+ \gdef\mathunderscore{%
+ \catcode`\_=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+ }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ $\finishmath
+}
+\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em. So do
+% whichever is larger.
+%
+\def\dots{%
+ \leavevmode
+ \setbox0=\hbox{...}% get width of three periods
+ \ifdim\wd0 > 1.5em
+ \dimen0 = \wd0
+ \else
+ \dimen0 = 1.5em
+ \fi
+ \hbox to \dimen0{%
+ \hskip 0pt plus.25fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \dots
+ \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ \openin 1 texinfo.cnf
+ \ifeof 1 \else \input texinfo.cnf \fi
+ \closein 1
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set). So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+ \ifx\pdfoutput\relax
+ \else
+ \ifcase\pdfoutput
+ \else
+ \pdftrue
+ \fi
+ \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places. Thus, we have to
+% double any backslashes. Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e. Not good.
+% 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).
+
+% double active backslashes.
+%
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslashdouble{%
+ @catcode`@\=@active
+ @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters. hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens, with minor
+% changes for Texinfo. It is included here under the GPL by permission
+% from the author, Heiko Oberdiek.
+%
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+%
+\def\HyPsdSubst#1#2#3{%
+ \def\HyPsdReplace##1#1##2\END{%
+ ##1%
+ \ifx\\##2\\%
+ \else
+ #2%
+ \HyReturnAfterFi{%
+ \HyPsdReplace##2\END
+ }%
+ \fi
+ }%
+ \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+ \xdef#1{#1}% redefine it as its expansion; the definition is simply
+ % \lastnode when called from \setref -> \pdfmkdest.
+ \HyPsdSubst{(}{\realbackslash(}{#1}%
+ \HyPsdSubst{)}{\realbackslash)}{#1}%
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found. (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+ \input pdfcolor
+ \pdfcatalog{/PageMode /UseOutlines}
+ %
+ % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+ \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+ %
+ % pdftex (and the PDF format) support .png, .jpg, .pdf (among
+ % others). Let's try in that order.
+ \let\pdfimgext=\empty
+ \begingroup
+ \openin 1 #1.png \ifeof 1
+ \openin 1 #1.jpg \ifeof 1
+ \openin 1 #1.jpeg \ifeof 1
+ \openin 1 #1.JPG \ifeof 1
+ \openin 1 #1.pdf \ifeof 1
+ \errhelp = \nopdfimagehelp
+ \errmessage{Could not find image file #1 for pdf}%
+ \else \gdef\pdfimgext{pdf}%
+ \fi
+ \else \gdef\pdfimgext{JPG}%
+ \fi
+ \else \gdef\pdfimgext{jpeg}%
+ \fi
+ \else \gdef\pdfimgext{jpg}%
+ \fi
+ \else \gdef\pdfimgext{png}%
+ \fi
+ \closein 1
+ \endgroup
+ %
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifdim \wd0 >0pt width \imagewidth \fi
+ \ifdim \wd2 >0pt height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.\pdfimgext
+ \else
+ {#1.\pdfimgext}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ %
+ \def\pdfmkdest#1{{%
+ % We have to set dummies so commands such as @code, and characters
+ % such as \, aren't expanded when present in a section title.
+ \indexnofonts
+ \turnoffactive
+ \activebackslashdouble
+ \makevalueexpandable
+ \def\pdfdestname{#1}%
+ \backslashparens\pdfdestname
+ \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+ }}
+ %
+ % used to mark target names; must be expandable.
+ \def\pdfmkpgn#1{#1}
+ %
+ % by default, use a color that is dark enough to print on paper as
+ % nearly black, but still distinguishable for online viewing.
+ % (Defined in pdfcolor.tex.)
+ \let\urlcolor = \BrickRed
+ \let\linkcolor = \BrickRed
+ \def\endlink{\Black\pdfendlink}
+ %
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text, which is what will be displayed in the
+ % outline by the pdf viewer. #2 is the pdf expression for the number
+ % of subentries (or empty, for subsubsections). #3 is the node text,
+ % which might be empty if this toc entry had no corresponding node.
+ % #4 is the page number
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ % Generate a link to the node text if that exists; else, use the
+ % page number. We could generate a destination for the section
+ % text in the case where a section has no node, but it doesn't
+ % seem worth the trouble, since most documents are normally structured.
+ \def\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty
+ \def\pdfoutlinedest{#4}%
+ \else
+ % Doubled backslashes in the name.
+ {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+ \backslashparens\pdfoutlinedest}%
+ \fi
+ %
+ % Also double the backslashes in the display string.
+ {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+ \backslashparens\pdfoutlinetext}%
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\numchapentry##1##2##3##4{%
+ \def\thischapnum{##2}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsecentry##1##2##3##4{%
+ \advancenumber{chap\thischapnum}%
+ \def\thissecnum{##2}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsubsecentry##1##2##3##4{%
+ \advancenumber{sec\thissecnum}%
+ \def\thissubsecnum{##2}%
+ }%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \advancenumber{subsec\thissubsecnum}%
+ }%
+ \def\thischapnum{0}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \readdatafile{toc}%
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % PDF outlines are displayed using system fonts, instead of
+ % document fonts. Therefore we cannot use special characters,
+ % since the encoding is unknown. For example, the eogonek from
+ % Latin 2 (0xea) gets translated to a | character. Info from
+ % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+ %
+ % xx to do this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Right
+ % now, I guess we'll just let the pdf reader have its way.
+ \indexnofonts
+ \setupdatafile
+ \catcode`\\=\active \otherbackslash
+ \input \tocreadfilename
+ \endgroup
+ }
+ %
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ % make a live url in pdf output.
+ \def\pdfurl#1{%
+ \begingroup
+ % it seems we really need yet another set of dummies; have not
+ % tried to figure out what each command should do in the context
+ % of @url. for now, just make @/ a no-op, that's the only one
+ % people have actually reported a problem with.
+ %
+ \normalturnoffactive
+ \def\@{@}%
+ \let\/=\empty
+ \makevalueexpandable
+ \leavevmode\urlcolor
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+ \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+ \csname ten#1\endcsname % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+%
+% PDF CMaps. See also LaTeX's t1.cmap.
+%
+% \cmapOT1
+\ifpdf
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1IT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1TT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+\else
+ \expandafter\let\csname cmapOT1\endcsname\gobble
+ \expandafter\let\csname cmapOT1IT\endcsname\gobble
+ \expandafter\let\csname cmapOT1TT\endcsname\gobble
+\fi
+
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
+% empty to omit).
+\def\setfont#1#2#3#4#5{%
+ \font#1=\fontprefix#2#3 scaled #4
+ \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt. This is the default in
+% Texinfo.
+%
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 11pt text font size definitions
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit. This is for the GNU
+% Press printing of the Emacs 22 manual. Maybe other manuals in the
+% future. Used with @smallbook, which sets the leading to 12pt.
+%
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12
+\font\secsy=cmsy10 scaled \magstep1
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+
+% Reduced fonts for @acro in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+
+% reduce space between paragraphs
+\divide\parskip by 2
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 10pt text font size definitions
+
+
+% We provide the user-level command
+% @fonttextsize 10
+% (or 11) to redefine the text font size. pt is assumed.
+%
+\def\xword{10}
+\def\xiword{11}
+%
+\parseargdef\fonttextsize{%
+ \def\textsizearg{#1}%
+ \wlog{doing @fonttextsize \textsizearg}%
+ %
+ % Set \globaldefs so that documents can use this inside @tex, since
+ % makeinfo 4.8 does not support it, but we need it nonetheless.
+ %
+ \begingroup \globaldefs=1
+ \ifx\textsizearg\xword \definetextfontsizex
+ \else \ifx\textsizearg\xiword \definetextfontsizexi
+ \else
+ \errhelp=\EMsimple
+ \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+ \fi\fi
+ \endgroup
+}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this because \STYLE needs to also set the
+% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \let\tenttsl=\textttsl
+ \def\curfontsize{text}%
+ \def\lsize{reduced}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \def\curfontsize{title}%
+ \def\lsize{chap}\def\lllsize{subsec}%
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \let\tenttsl=\chapttsl
+ \def\curfontsize{chap}%
+ \def\lsize{sec}\def\lllsize{text}%
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \let\tenttsl=\secttsl
+ \def\curfontsize{sec}%
+ \def\lsize{subsec}\def\lllsize{reduced}%
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \let\tenttsl=\ssecttsl
+ \def\curfontsize{ssec}%
+ \def\lsize{text}\def\lllsize{small}%
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+ \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+ \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+ \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+ \let\tenttsl=\reducedttsl
+ \def\curfontsize{reduced}%
+ \def\lsize{small}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \def\curfontsize{small}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \def\curfontsize{smaller}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+ \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% @b, explicit bold.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\plainfrenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ \def\endofsentencespacefactor{1000}% for @. and friends
+ }
+ \def\plainnonfrenchspacing{%
+ \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+ \def\endofsentencespacefactor{3000}% for @. and friends
+ }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+\def\t#1{%
+ {\tt \rawbackslash \plainfrenchspacing #1}%
+ \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}{OT1}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+\def\key #1{{\nohyphenation \uppercase{#1}}\null}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \plainfrenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active \catcode`\_=\active
+ \catcode`\'=\active \catcode`\`=\active
+ %
+ \global\def\code{\begingroup
+ \catcode\rquoteChar=\active \catcode\lquoteChar=\active
+ \let'\codequoteright \let`\codequoteleft
+ %
+ \catcode\dashChar=\active \catcode\underChar=\active
+ \ifallowcodebreaks
+ \let-\codedash
+ \let_\codeunder
+ \else
+ \let-\realdash
+ \let_\realunder
+ \fi
+ \codex
+ }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__. This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general. @allowcodebreaks provides a way to control this.
+%
+\newif\ifallowcodebreaks \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\keywordtrue
+ \allowcodebreakstrue
+ \else\ifx\txiarg\keywordfalse
+ \allowcodebreaksfalse
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
+ \fi\fi
+}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\txiarg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\txiarg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+ {\selectfonts\lsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+ {\plainfrenchspacing #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from 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
+}
+
+% @registeredsymbol - R in a circle. The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+ \hfil\crcr\Orb}}%
+ }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+ % Open one extra group, as we want to close it in the middle of \Etitlepage.
+ \begingroup
+ \parindent=0pt \textfonts
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \let\page = \oldpage
+ \page
+ \null
+ }%
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \leftline{\titlefonts\rm #1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+ \checkenv\titlepage
+ {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+ \def\temp{\quotation}%
+ \ifx\thisenv\temp
+ \def\quotationauthor{#1}% printed in \Equotation.
+ \else
+ \checkenv\titlepage
+ \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+ {\authorfont \leftline{#1}}%
+ \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -12pt
+ \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemindicate{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. However, if
+ % what follows is an environment such as @example, there will be no
+ % \parskip glue; then the negative vskip we just inserted would
+ % cause the example and the item to crash together. So we use this
+ % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+ % \parskip glue after all. Section titles are handled this way also.
+ %
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+ \let\itemindex\gobble
+ \tablecheck{table}%
+}
+\envdef\ftable{%
+ \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+ \tablecheck{ftable}%
+}
+\envdef\vtable{%
+ \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+ \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+ \ifnum \the\catcode`\^^M=\active
+ \endgroup
+ \errmessage{This command won't work in this context; perhaps the problem is
+ that we are \inenvironment\thisenv}%
+ \def\next{\doignore{#1}}%
+ \else
+ \let\next\tablex
+ \fi
+ \next
+}
+\def\tablex#1{%
+ \def\itemindicate{#1}%
+ \parsearg\tabley
+}
+\def\tabley#1{%
+ {%
+ \makevalueexpandable
+ \edef\temp{\noexpand\tablez #1\space\space\space}%
+ \expandafter
+ }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+ \aboveenvbreak
+ \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+ \ifnum 0#2>0 \tableindent=#2\mil \fi
+ \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+ \itemmax=\tableindent
+ \advance \itemmax by -\itemmargin
+ \advance \leftskip by \tableindent
+ \exdentamount=\tableindent
+ \parindent = 0pt
+ \parskip = \smallskipamount
+ \ifdim \parskip=0pt \parskip=2pt \fi
+ \let\item = \internalBitem
+ \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ \def\itemcontents{#1}%
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+ \advance\itemno by 1 % for enumerations
+ {\let\par=\endgraf \smallbreak}% reasonable place to break
+ {%
+ % If the document has an @itemize directly after a section title, a
+ % \nobreak will be last on the list, and \sectionheading will have
+ % done a \vskip-\parskip. In that case, we don't want to zero
+ % parskip, or the item text will crash with the heading. On the
+ % other hand, when there is normal text preceding the item (as there
+ % usually is), we do want to zero parskip, or there would be too much
+ % space. In that case, we won't have a \nobreak before. At least
+ % that's the theory.
+ \ifnum\lastpenalty<10000 \parskip=0in \fi
+ \noindent
+ \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+ \vadjust{\penalty 1200}}% not good to break after first line of item.
+ \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1. We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry. Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp. But then the space in a template
+% line is not enough. That is bad. So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab % insert after every tab.
+%
+\envdef\multitable{%
+ \vskip\parskip
+ \startsavinginserts
+ %
+ % @item within a multitable starts a normal row.
+ % We use \def instead of \let so that if one of the multitable entries
+ % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+ % \endtemplate) expanding \doitemize.
+ \def\item{\crcr}%
+ %
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ %
+ \everycr = {%
+ \noalign{%
+ \global\everytab={}%
+ \global\colcount=0 % Reset the column counter.
+ % Check for saved footnotes, etc.
+ \checkinserts
+ % Keeps underfull box messages off when table breaks over pages.
+ %\filbreak
+ % Maybe so, but it also creates really weird page breaks when the
+ % table breaks over pages. Wouldn't \vfil be better? Wait until the
+ % problem manifests itself, so it can be fixed for real --karl.
+ }%
+ }%
+ %
+ \parsearg\domultitable
+}
+\def\domultitable#1{%
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup &%
+ \global\advance\colcount by 1
+ \multistrut
+ \vtop{%
+ % Use the current \colcount to find the correct column width:
+ \hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively
+ % marking characters.
+ \noindent\ignorespaces##\unskip\multistrut
+ }\cr
+}
+\def\Emultitable{%
+ \crcr
+ \egroup % end the \halign
+ \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+ \def\multistrut{\strut}% just use the standard line spacing
+ %
+ % Compute \multitablelinespace (if not defined by user) for use in
+ % \multitableparskip calculation. We used define \multistrut based on
+ % this, but (ironically) that caused the spacing to be off.
+ % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed. They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested. But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+ \expandafter\let\csname #1\endcsname = \relax
+ \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Scan in ``verbatim'' mode:
+ \obeylines
+ \catcode`\@ = \other
+ \catcode`\{ = \other
+ \catcode`\} = \other
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \spaceisspace
+ %
+ % Count number of #1's that we've seen.
+ \doignorecount = 0
+ %
+ % Swallow text until we reach the matching `@end #1'.
+ \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+ \obeylines %
+ %
+ \gdef\dodoignore#1{%
+ % #1 contains the command name as a string, e.g., `ifinfo'.
+ %
+ % Define a command to find the next `@end #1'.
+ \long\def\doignoretext##1^^M@end #1{%
+ \doignoretextyyy##1^^M@#1\_STOP_}%
+ %
+ % And this command to find another #1 command, at the beginning of a
+ % line. (Otherwise, we would consider a line `@c @ifset', for
+ % example, to count as an @ifset for nesting.)
+ \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+ %
+ % And now expand that command.
+ \doignoretext ^^M%
+ }%
+}
+
+\def\doignoreyyy#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty % Nothing found.
+ \let\next\doignoretextzzz
+ \else % Found a nested condition, ...
+ \advance\doignorecount by 1
+ \let\next\doignoretextyyy % ..., look for another.
+ % If we're here, #1 ends with ^^M\ifinfo (for example).
+ \fi
+ \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+ \ifnum\doignorecount = 0 % We have just found the outermost @end.
+ \let\next\enddoignore
+ \else % Still inside a nested condition.
+ \advance\doignorecount by -1
+ \let\next\doignoretext % Look for the next @end.
+ \fi
+ \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+ % Ignore anything after the last `@end #1'; this matters in verbatim
+ % environments, where otherwise the newline after an ignored conditional
+ % would result in a blank line in the output.
+ \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ {%
+ \makevalueexpandable
+ \def\temp{#2}%
+ \edef\next{\gdef\makecsname{SET#1}}%
+ \ifx\temp\empty
+ \next{}%
+ \else
+ \setzzz#2\endsetzzz
+ \fi
+ }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+ {%
+ \makevalueexpandable
+ \global\expandafter\let\csname SET#1\endcsname=\relax
+ }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+ \catcode`\- = \active \catcode`\_ = \active
+ %
+ \gdef\makevalueexpandable{%
+ \let\value = \expandablevalue
+ % We don't want these characters active, ...
+ \catcode`\-=\other \catcode`\_=\other
+ % ..., but we might end up with active ones in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}, though.
+ % So \let them to their normal equivalents.
+ \let-\realdash \let_\normalunderscore
+ }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file. This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+ {%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname SET#2\endcsname\relax
+ #1% If not set, redefine \next.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \escapechar = `\\ % use backslash in output files.
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ %
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % I don't entirely understand this, but when an index entry is
+ % generated from a macro call, the \endinput which \scanmacro inserts
+ % causes processing to be prematurely terminated. This is,
+ % apparently, because \indexsorttmp is fully expanded, and \endinput
+ % is an expandable command. The redefinition below makes \endinput
+ % disappear altogether for that purpose -- although logging shows that
+ % processing continues to some further point. On the other hand, it
+ % seems \endinput does not hurt in the printed index arg, since that
+ % is still getting written without apparent harm.
+ %
+ % Sample source (mac-idx3.tex, reported by Graham Percival to
+ % help-texinfo, 22may06):
+ % @macro funindex {WORD}
+ % @findex xyz
+ % @end macro
+ % ...
+ % @funindex commtest
+ %
+ % The above is not enough to reproduce the bug, but it gives the flavor.
+ %
+ % Sample whatsit resulting:
+ % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
+ %
+ % So:
+ \let\endinput = \empty
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux and toc files, @ is the escape character. So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files). When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % Do the redefinitions.
+ \commondummies
+ \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+ %
+ % \definedummyword defines \#1 as \string\#1\space, thus effectively
+ % preventing its expansion. This is used only for control% words,
+ % not control letters, because the \space would be incorrect for
+ % control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword ##1{\def##1{\string##1\space}}%
+ \def\definedummyletter##1{\def##1{\string##1}}%
+ \let\definedummyaccent\definedummyletter
+ %
+ \commondummiesnofonts
+ %
+ \definedummyletter\_%
+ %
+ % Non-English letters.
+ \definedummyword\AA
+ \definedummyword\AE
+ \definedummyword\L
+ \definedummyword\OE
+ \definedummyword\O
+ \definedummyword\aa
+ \definedummyword\ae
+ \definedummyword\l
+ \definedummyword\oe
+ \definedummyword\o
+ \definedummyword\ss
+ \definedummyword\exclamdown
+ \definedummyword\questiondown
+ \definedummyword\ordf
+ \definedummyword\ordm
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword\bf
+ \definedummyword\gtr
+ \definedummyword\hat
+ \definedummyword\less
+ \definedummyword\sf
+ \definedummyword\sl
+ \definedummyword\tclose
+ \definedummyword\tt
+ %
+ \definedummyword\LaTeX
+ \definedummyword\TeX
+ %
+ % Assorted special characters.
+ \definedummyword\bullet
+ \definedummyword\comma
+ \definedummyword\copyright
+ \definedummyword\registeredsymbol
+ \definedummyword\dots
+ \definedummyword\enddots
+ \definedummyword\equiv
+ \definedummyword\error
+ \definedummyword\euro
+ \definedummyword\expansion
+ \definedummyword\minus
+ \definedummyword\pounds
+ \definedummyword\point
+ \definedummyword\print
+ \definedummyword\result
+ \definedummyword\textdegree
+ %
+ % We want to disable all macros so that they are not expanded by \write.
+ \macrolist
+ %
+ \normalturnoffactive
+ %
+ % Handle some cases of @value -- where it does not contain any
+ % (non-fully-expandable) commands.
+ \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+\def\commondummiesnofonts{%
+ % Control letters and accents.
+ \definedummyletter\!%
+ \definedummyaccent\"%
+ \definedummyaccent\'%
+ \definedummyletter\*%
+ \definedummyaccent\,%
+ \definedummyletter\.%
+ \definedummyletter\/%
+ \definedummyletter\:%
+ \definedummyaccent\=%
+ \definedummyletter\?%
+ \definedummyaccent\^%
+ \definedummyaccent\`%
+ \definedummyaccent\~%
+ \definedummyword\u
+ \definedummyword\v
+ \definedummyword\H
+ \definedummyword\dotaccent
+ \definedummyword\ringaccent
+ \definedummyword\tieaccent
+ \definedummyword\ubaraccent
+ \definedummyword\udotaccent
+ \definedummyword\dotless
+ %
+ % Texinfo font commands.
+ \definedummyword\b
+ \definedummyword\i
+ \definedummyword\r
+ \definedummyword\sc
+ \definedummyword\t
+ %
+ % Commands that take arguments.
+ \definedummyword\acronym
+ \definedummyword\cite
+ \definedummyword\code
+ \definedummyword\command
+ \definedummyword\dfn
+ \definedummyword\emph
+ \definedummyword\env
+ \definedummyword\file
+ \definedummyword\kbd
+ \definedummyword\key
+ \definedummyword\math
+ \definedummyword\option
+ \definedummyword\pxref
+ \definedummyword\ref
+ \definedummyword\samp
+ \definedummyword\strong
+ \definedummyword\tie
+ \definedummyword\uref
+ \definedummyword\url
+ \definedummyword\var
+ \definedummyword\verb
+ \definedummyword\w
+ \definedummyword\xref
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+ % Accent commands should become @asis.
+ \def\definedummyaccent##1{\let##1\asis}%
+ % We can just ignore other control letters.
+ \def\definedummyletter##1{\let##1\empty}%
+ % Hopefully, all control words can become @asis.
+ \let\definedummyword\definedummyaccent
+ %
+ \commondummiesnofonts
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters.
+ % (The following {} will end up in the sort string, but that's ok.)
+ \def\bullet{bullet}%
+ \def\comma{,}%
+ \def\copyright{copyright}%
+ \def\registeredsymbol{R}%
+ \def\dots{...}%
+ \def\enddots{...}%
+ \def\equiv{==}%
+ \def\error{error}%
+ \def\euro{euro}%
+ \def\expansion{==>}%
+ \def\minus{-}%
+ \def\pounds{pounds}%
+ \def\point{.}%
+ \def\print{-|}%
+ \def\result{=>}%
+ \def\textdegree{degrees}%
+ %
+ % We need to get rid of all macros, leaving only the arguments (if present).
+ % Of course this is not nearly correct, but it is the best we can do for now.
+ % makeinfo does not expand macros in the argument to @deffn, which ends up
+ % writing an index entry, and texindex isn't prepared for an index sort entry
+ % that starts with \.
+ %
+ % Since macro invocations are followed by braces, we can just redefine them
+ % to take a single TeX argument. The case of a macro invocation that
+ % goes to end-of-line is not handled.
+ %
+ \macrolist
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with a space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \safewhatsit\dosubindwrite
+ }%
+ \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again. Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero. The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode. We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip. \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip. The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{%
+\ifhmode
+ #1%
+\else
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \whatsitskip = \lastskip
+ \edef\lastskipmacro{\the\lastskip}%
+ \whatsitpenalty = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\skip0 glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifx\lastskipmacro\zeroskipmacro
+ \else
+ \vskip-\whatsitskip
+ \fi
+ %
+ #1%
+ %
+ \ifx\lastskipmacro\zeroskipmacro
+ % If \lastskip was zero, perhaps the last item was a penalty, and
+ % perhaps it was >=10000, e.g., a \nobreak. In that case, we want
+ % to re-insert the same penalty (values >10000 are used for various
+ % signals); since we just inserted a non-discardable item, any
+ % following glue (such as a \parskip) would be a breakpoint. For example:
+ %
+ % @deffn deffn-whatever
+ % @vindex index-whatever
+ % Description.
+ % would allow a break between the index-whatever whatsit
+ % and the "Description." paragraph.
+ \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+ \else
+ % On the other hand, if we had a nonzero \lastskip,
+ % this make-up glue would be preceded by a non-discardable item
+ % (the whatsit from the \write), so we must insert a \nobreak.
+ \nobreak\vskip\whatsitskip
+ \fi
+\fi
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \plainfrenchspacing
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\backslashcurfont}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \nobreak
+ \vskip 0pt plus 3\baselineskip
+ \penalty 0
+ \vskip 0pt plus -3\baselineskip
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ % Do our best not to break after the initial.
+ \nobreak
+ \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin. It is used for index
+% and table of contents entries. The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+% \def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active. This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+% --kasal, 21nov03
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing
+ % columns.
+ \vskip 0pt plus1pt
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\doentry{%
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+ % #1 is the page number.
+ %
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \setbox\boxA = \hbox{#1}%
+ \ifdim\wd\boxA = 0pt
+ \ %
+ \else
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#1.%
+ \ \the\toksA
+ \else
+ \ #1%
+ \fi
+ \fi
+ \par
+ \endgroup
+}
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ % The following penalty ensures that the page builder is exercised
+ % _before_ we change the output routine. This is necessary in the
+ % following situation:
+ %
+ % The last section of the index consists only of a single entry.
+ % Before this section, \pagetotal is less than \pagegoal, so no
+ % break occurs before the last section starts. However, the last
+ % section, consisting of \initial and the single \entry, does not
+ % fit on the page and has to be broken off. Without the following
+ % penalty the page builder will not be exercised until \eject
+ % below, and by that time we'll already have changed the output
+ % routine to the \balancecolumns version, so the next-to-last
+ % double-column page will be processed with \balancecolumns, which
+ % is wrong: The two columns will go to the main vertical list, with
+ % the broken-off section in the recent contributions. As soon as
+ % the output routine finishes, TeX starts reconsidering the page
+ % break. The two columns and the broken-off section both fit on the
+ % page, because the two columns now take up only half of the page
+ % goal. When TeX sees \eject from below which follows the final
+ % section, it invokes the new output routine that we've set after
+ % \balancecolumns below; \onepageout will try to fit the two columns
+ % and the final section into the vbox of \pageheight (see
+ % \pagebody), causing an overfull box.
+ %
+ % Note that glue won't work here, because glue does not exercise the
+ % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+ \penalty0
+ %
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+ % Compute the abs. sec. level:
+ \absseclevel=#2
+ \advance\absseclevel by \secbase
+ % Make sure \absseclevel doesn't fall outside the range:
+ \ifnum \absseclevel < 0
+ \absseclevel = 0
+ \else
+ \ifnum \absseclevel > 3
+ \absseclevel = 3
+ \fi
+ \fi
+ % The heading type:
+ \def\headtype{#1}%
+ \if \headtype U%
+ \ifnum \absseclevel < \unmlevel
+ \chardef\unmlevel = \absseclevel
+ \fi
+ \else
+ % Check for appendix sections:
+ \ifnum \absseclevel = 0
+ \edef\chapheadtype{\headtype}%
+ \else
+ \if \headtype A\if \chapheadtype N%
+ \errmessage{@appendix... within a non-appendix chapter}%
+ \fi\fi
+ \fi
+ % Check for numbered within unnumbered:
+ \ifnum \absseclevel > \unmlevel
+ \def\headtype{U}%
+ \else
+ \chardef\unmlevel = 3
+ \fi
+ \fi
+ % Now print the heading:
+ \if \headtype U%
+ \ifcase\absseclevel
+ \unnumberedzzz{#3}%
+ \or \unnumberedseczzz{#3}%
+ \or \unnumberedsubseczzz{#3}%
+ \or \unnumberedsubsubseczzz{#3}%
+ \fi
+ \else
+ \if \headtype A%
+ \ifcase\absseclevel
+ \appendixzzz{#3}%
+ \or \appendixsectionzzz{#3}%
+ \or \appendixsubseczzz{#3}%
+ \or \appendixsubsubseczzz{#3}%
+ \fi
+ \else
+ \ifcase\absseclevel
+ \chapterzzz{#3}%
+ \or \seczzz{#3}%
+ \or \numberedsubseczzz{#3}%
+ \or \numberedsubsubseczzz{#3}%
+ \fi
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v. By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ % section resetting is \global in case the chapter is in a group, such
+ % as an @include file.
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\chapno by 1
+ %
+ % Used for \float.
+ \gdef\chaplevelprefix{\the\chapno.}%
+ \resetallfloatnos
+ %
+ \message{\putwordChapter\space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ \def\appendixnum{\putwordAppendix\space \appendixletter}%
+ \message{\appendixnum}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\unnumberedno by 1
+ %
+ % Since an unnumbered has no number, no prefix for figures.
+ \global\let\chaplevelprefix = \empty
+ \resetallfloatnos
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}%
+ \message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+ % Well, we could do the following in a group, but that would break
+ % an assumption that \chapmacro is called at the outermost level.
+ % Thus we are safer this way: --kasal, 24feb04
+ \let\centerparametersmaybe = \centerparameters
+ \unnmhead0{#1}%
+ \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+ \bigskip \par\penalty 200\relax
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ %
+ % Have to define \thissection before calling \donoderef, because the
+ % xref code eventually uses it. On the other hand, it has to be called
+ % after \pchapsepmacro, or the headline will change too soon.
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \gdef\thischapternum{}%
+ \gdef\thischapter{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \gdef\thischapternum{}%
+ \gdef\thischapter{}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ \xdef\thischapternum{\appendixletter}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now. And we don't
+ % use \thissection because that changes with each section.
+ %
+ \xdef\thischapter{\putwordAppendix{} \appendixletter:
+ \noexpand\thischaptername}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \xdef\thischapternum{\the\chapno}%
+ \xdef\thischapter{\putwordChapter{} \the\chapno:
+ \noexpand\thischaptername}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+ \global\let\chapmacro=\chfopen
+ \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rm
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Only insert the space after the number if we have a section number.
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\thissection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \thissection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\thissection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\thissection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chapmacro.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chapmacro.
+ \donoderef{#3}%
+ %
+ % Interline glue will be inserted when the vbox is completed.
+ % That glue will be a valid breakpoint for the page, since it'll be
+ % preceded by a whatsit (usually from the \donoderef, or from the
+ % \writetocentry if there was no node). We don't want to allow that
+ % break, since then the whatsits could end up on page n while the
+ % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000.
+ \nobreak
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.)
+ \vskip-\parskip
+ %
+ % This is purely so the last item on the list is a known \penalty >
+ % 10000. This is so \startdefun can avoid allowing breakpoints after
+ % section headings. Otherwise, it would insert a valid breakpoint between:
+ %
+ % @section sec-whatever
+ % @deffn def-whatever
+ \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ {\atdummies
+ \edef\temp{%
+ \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+ \temp
+ }%
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care. This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+ \catcode`\"=\active
+ \catcode`\$=\active
+ \catcode`\<=\active
+ \catcode`\>=\active
+ \catcode`\\=\active
+ \catcode`\^=\active
+ \catcode`\_=\active
+ \catcode`\|=\active
+ \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+ \setupdatafile
+ \activecatcodes
+ \input \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.
+ \def\thischapter{}%
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% 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\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, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{%
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\*=\ptexstar
+ \let\t=\ptext
+ \let\frenchspacing=\plainfrenchspacing
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz and
+ % \sectionheading, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty<10000 \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+ \ifhmode\par\fi % can't be in the midst of a paragraph.
+ \startsavinginserts
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt % we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+ % each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing = t%
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \kern3pt
+ \hsize=\cartinner
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+ \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+ \ifhmode\par\fi
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+ \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+% @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+ \ifx\SETdispenvsize\smallword
+ % end paragraph for sake of leading, in case document has no blank
+ % line. This is redundant with what happens in \aboveenvbreak, but
+ % we need to do it before changing the fonts, and it's inconvenient
+ % to change the fonts afterward.
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+\def\setsmalldispenv{%
+ \ifx\SETdispenvsize\nosmallword
+ \else
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+ \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+ \expandafter\let\csname E#1\endcsname \afterenvbreak
+ \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+ \makedispenv{#1}{#3}
+ \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+ \nonfillstart
+ \tt\quoteexpand
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins. We keep \parskip nonzero in general, since
+% we're doing normal filling. So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+ \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+ \par
+ \ifx\quotationauthor\undefined\else
+ % indent a bit.
+ \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+ \fi
+ {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty \else
+ {\bf #1: }%
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+
+% Allow an option to not replace quotes with a regular directed right
+% quote/apostrophe (char 0x27), but instead use the undirected quote
+% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it
+% the default, but it works for pasting with more pdf viewers (at least
+% evince), the lilypond developers report. xpdf does work with the
+% regular 0x27.
+%
+\def\codequoteright{%
+ \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+ '%
+ \else
+ \char'15
+ \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+%
+\def\codequoteleft{%
+ \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+ `%
+ \else
+ \char'22
+ \fi
+}
+%
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+ \catcode`\'=\active
+ \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}%
+ %
+ \catcode`\`=\active
+ \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}%
+ %
+ \gdef\quoteexpand{\rquoteexpand \lquoteexpand}%
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ \quoteexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+ % We really want {...\end verbatim} in the body of the macro, but
+ % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+ \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+ {%
+ \makevalueexpandable
+ \setupverbatim
+ \input #1
+ \afterenvbreak
+ }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+ \begingroup
+ \parindent = 0pt % paragraph indentation looks wrong on title page
+ \scanexp\copyingtext
+ \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+ \ifnum\lastpenalty<10000
+ \medbreak
+ \defunpenalty=10003 % Will keep this @deffn together with the
+ % following @def command, see below.
+ \else
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we need to allow a
+ % break somewhere. Check specifically for penalty 10002, inserted
+ % by \printdefunline, instead of 10000, since the sectioning
+ % commands also insert a nobreak penalty, and we don't want to allow
+ % a break between a section heading and a defun.
+ %
+ % As a minor refinement, we avoid "club" headers by signalling
+ % with penalty of 10003 after the very first @deffn in the
+ % sequence (see above), and penalty of 10002 after any following
+ % @def command.
+ \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+ %
+ % Similarly, after a section heading, do not allow a break.
+ % But do insert the glue.
+ \medskip % preceded by discardable penalty, so not a breakpoint
+ \fi
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+ % First, check whether we are in the right environment:
+ \checkenv#1%
+ %
+ % As above, allow line break if we have multiple x headers in a row.
+ % It's not a great place, though.
+ \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+ %
+ % And now, it's time to reuse the body of the original defun:
+ \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+ \begingroup
+ % call \deffnheader:
+ #1#2 \endheader
+ % common ending:
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty\defunpenalty % signal to \startdefun and \dodefunx
+ % Some of the @defun-type tags do not enable magic parentheses,
+ % rendering the following check redundant. But we don't optimize.
+ \checkparencounts
+ \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+ \expandafter\let\csname E#1\endcsname = \Edefun
+ \edef\temp{\noexpand\domakedefun
+ \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+ \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+ % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+ \dosubind{fn}{\code{#3}}{#1}%
+ \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{fn}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{vr}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+ \doind{tp}{\code{#2}}%
+ \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % How we'll format the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \def\temp{#1}%
+ \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+ %
+ % Figure out line sizes for the paragraph shape.
+ % The first line needs space for \box0; but if \rightskip is nonzero,
+ % we need only space for the part of \box0 which exceeds it:
+ \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ % (plain.tex says that \dimen1 should be used only as global.)
+ \parshape 2 0in \dimen0 \defargsindent \dimen2
+ %
+ % Put the type name to the right margin.
+ \noindent
+ \hbox to 0pt{%
+ \hfil\box0 \kern-\hsize
+ % \hsize has to be shortened this way:
+ \kern\leftskip
+ % Intentionally do not respect \rightskip, since we need the space.
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \exdentamount=\defbodyindent
+ {%
+ % defun fonts. We use typewriter by default (used to be bold) because:
+ % . we're printing identifiers, they should be in tt in principle.
+ % . in languages with many accents, such as Czech or French, it's
+ % common to leave accents off identifiers. The result looks ok in
+ % tt, but exceedingly strange in rm.
+ % . we don't want -- and --- to be treated as ligatures.
+ % . this still does not fix the ?` and !` ligatures, but so far no
+ % one has made identifiers using them :).
+ \df \tt
+ \def\temp{#2}% return value type
+ \ifx\temp\empty\else \tclose{\temp} \fi
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \tenrm
+ %
+ \boldbrax
+ % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name. This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable. Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+ % use sl by default (not ttsl),
+ % tt for the names.
+ \df \sl \hyphenchar\font=0
+ %
+ % On the other hand, if an argument has two dashes (for instance), we
+ % want a way to get ttsl. Let's try @var for that.
+ \let\var=\ttslanted
+ #1%
+ \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\[=\active \catcode`\]=\active
+ \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+ \activeparens
+ \global\let(=\lparen \global\let)=\rparen
+ \global\let[=\lbrack \global\let]=\rbrack
+ \global\let& = \&
+
+ \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+ \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+ \ifampseen
+ % At the first level, print parens in roman,
+ % otherwise use the default font.
+ \ifnum \parencount=1 \rm \fi
+ \else
+ % The \sf parens (in \boldbrax) actually are a little bolder than
+ % the contained text. This is especially needed for [ and ] .
+ \sf
+ \fi
+}
+\def\infirstlevel#1{%
+ \ifampseen
+ \ifnum\parencount=1
+ #1%
+ \fi
+ \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+ \global\advance\parencount by 1
+ {\parenfont(}%
+ \infirstlevel \bfafterword
+}
+\def\clnr{%
+ {\parenfont)}%
+ \infirstlevel \sl
+ \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+ \global\advance\brackcount by 1
+ {\bf[}%
+}
+\def\rbrb{%
+ {\bf]}%
+ \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+ \ifnum\parencount=0 \else \badparencount \fi
+ \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+ \errmessage{Unbalanced parentheses in @def}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \errmessage{Unbalanced square braces in @def}%
+ \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+\def\scanmacro#1{%
+ \begingroup
+ \newlinechar`\^^M
+ \let\xeatspaces\eatspaces
+ % Undo catcode changes of \startcontents and \doprintindex
+ % When called from @insertcopying or (short)caption, we need active
+ % backslash to get it printed correctly. Previously, we had
+ % \catcode`\\=\other instead. We'll see whether a problem appears
+ % with macro expansion. --kasal, 19aug04
+ \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+ % ... and \example
+ \spaceisspace
+ %
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ % I've verified that it is necessary both for e-TeX and for ordinary TeX
+ % --kasal, 29nov03
+ \scantokens{#1\endinput}%
+ \endgroup
+}
+
+\def\scanexp#1{%
+ \edef\temp{\noexpand\scanmacro{#1}}%
+ \temp
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+
+% List of all defined macros in the form
+% \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+ \toks0 = \expandafter{\macrolist\definedummyword#1}%
+ \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+% \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+ \expandafter\let
+ \csname#1\expandafter\endcsname
+ \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+ \catcode`\"=\other
+ \catcode`\+=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\@=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\~=\other
+}
+
+\def\scanargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+ \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+ \scanctxt
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\^^M=\other
+ \usembodybackslash
+}
+
+\def\macroargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ \addtomacrolist{\the\macname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\parseargdef\unmacro{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\definedummyword\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx #1\relax
+ % remove this
+ \else
+ \noexpand\definedummyword \noexpand#1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+ {%
+ \expandafter\let\obeyedspace=\empty
+ \addtomacrolist{#1}%
+ \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+ }%
+ \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references. The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross, , , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+% or the anchor name.
+% 2) NAME-snt - section number and type, passed as the SNT arg, or
+% empty for anchors.
+% 3) NAME-pg - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat. In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+ \pdfmkdest{#1}%
+ \iflinks
+ {%
+ \atdummies % preserve commands, but don't expand them
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\thissection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout
+ }%
+ \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual\unskip}%
+ \setbox0=\hbox{\printedrefname\unskip}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printedrefname{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % Make link in pdf output.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\indexnofonts
+ \turnoffactive
+ % See comments at \activebackslashdouble.
+ {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+ \backslashparens\pdfxrefdest}%
+ %
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{\pdfxrefdest}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{\pdfmkpgn{\pdfxrefdest}}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". We distinguish them by the
+ % LABEL-title being set to a magic string.
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd0 = 0pt
+ \refx{#1-snt}{}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % if the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd1 > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via a macro so it can be overridden.
+ \xrefprintnodename\printedrefname
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname XR#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file. Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions). But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ {% The node name might contain 8-bit characters, which in our current
+ % implementation are changed to commands like @'e. Don't let these
+ % mess up the control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safexrefname{#1}%
+ }%
+ %
+ \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
+ %
+ % Was that xref control sequence that we just defined for a float?
+ \expandafter\iffloat\csname XR\safexrefname\endcsname
+ % it was a float, and we have the (safe) float type in \iffloattype.
+ \expandafter\let\expandafter\floatlist
+ \csname floatlist\iffloattype\endcsname
+ %
+ % Is this the first time we've seen this float type?
+ \expandafter\ifx\floatlist\relax
+ \toks0 = {\do}% yes, so just \do
+ \else
+ % had it before, so preserve previous elements in list.
+ \toks0 = \expandafter{\floatlist\do}%
+ \fi
+ %
+ % Remember this xref in the control sequence \floatlistFLOATTYPE,
+ % for later use in \listoffloats.
+ \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+ {\safexrefname}}%
+ \fi
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+%
+\def\tryauxfile{%
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \readdatafile{aux}%
+ \global\havexrefstrue
+ \fi
+ \closein 1
+}
+
+\def\setupdatafile{%
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % This is to support \ in node names and titles, since the \
+ % characters end up in a \csname. It's easier than
+ % leaving it active and making its active definition an actual \
+ % character. What I don't understand is why it works in the *value*
+ % of the xrdef. Seems like it should be a catcode12 \, and that
+ % should not typeset properly. But it works, so I'm moving on for
+ % now. --karl, 15jan04.
+ \catcode`\\=\other
+ %
+ % Make the characters 128-255 be printing characters.
+ {%
+ \count1=128
+ \def\loop{%
+ \catcode\count1=\other
+ \advance\count1 by 1
+ \ifnum \count1<256 \loop \fi
+ }%
+ }%
+ %
+ % @ is our escape character in .aux files, and we need braces.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+ \setupdatafile
+ \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\gdef\dofootnote{%
+ \insert\footins\bgroup
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished. Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes. --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+ \ifx \insert\ptexinsert
+ \let\insert\saveinsert
+ \else
+ \let\checkinserts\relax
+ \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+ \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+ \afterassignment\next
+ % swallow the left brace
+ \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+ \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+ {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+ \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
+ \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+ \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+ \next
+}
+\def\newsaveinsX #1{%
+ \csname newbox\endcsname #1%
+ \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+ \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc. We don't actually implement floating yet, we always include the
+% float "here". But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label. Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored. It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+ \let\thiscaption=\empty
+ \let\thisshortcaption=\empty
+ %
+ % don't lose footnotes inside @float.
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \startsavinginserts
+ %
+ % We can't be used inside a paragraph.
+ \par
+ %
+ \vtop\bgroup
+ \def\floattype{#1}%
+ \def\floatlabel{#2}%
+ \def\floatloc{#3}% we do nothing with this yet.
+ %
+ \ifx\floattype\empty
+ \let\safefloattype=\empty
+ \else
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ \fi
+ %
+ % If label is given but no type, we handle that as the empty type.
+ \ifx\floatlabel\empty \else
+ % We want each FLOATTYPE to be numbered separately (Figure 1,
+ % Table 1, Figure 2, ...). (And if no label, no number.)
+ %
+ \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+ \global\advance\floatno by 1
+ %
+ {%
+ % This magic value for \thissection is output by \setref as the
+ % XREFLABEL-title value. \xrefX uses it to distinguish float
+ % labels (which have a completely different output format) from
+ % node and anchor labels. And \xrdef uses it to construct the
+ % lists of floats.
+ %
+ \edef\thissection{\floatmagic=\safefloattype}%
+ \setref{\floatlabel}{Yfloat}%
+ }%
+ \fi
+ %
+ % start with \parskip glue, I guess.
+ \vskip\parskip
+ %
+ % Don't suppress indentation if a float happens to start a section.
+ \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption: Foo 1.1
+% @float Foo & @caption{Cap}: Foo: Cap
+% @float Foo & no caption: Foo
+% @float ,lbl & Caption{Cap}: 1.1: Cap
+% @float ,lbl & no caption: 1.1
+% @float & @caption{Cap}: Cap
+% @float & no caption:
+%
+\def\Efloat{%
+ \let\floatident = \empty
+ %
+ % In all cases, if we have a float type, it comes first.
+ \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+ %
+ % If we have an xref label, the number comes next.
+ \ifx\floatlabel\empty \else
+ \ifx\floattype\empty \else % if also had float type, need tie first.
+ \appendtomacro\floatident{\tie}%
+ \fi
+ % the number.
+ \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+ \fi
+ %
+ % Start the printed caption with what we've constructed in
+ % \floatident, but keep it separate; we need \floatident again.
+ \let\captionline = \floatident
+ %
+ \ifx\thiscaption\empty \else
+ \ifx\floatident\empty \else
+ \appendtomacro\captionline{: }% had ident, so need a colon between
+ \fi
+ %
+ % caption text.
+ \appendtomacro\captionline{\scanexp\thiscaption}%
+ \fi
+ %
+ % If we have anything to print, print it, with space before.
+ % Eventually this needs to become an \insert.
+ \ifx\captionline\empty \else
+ \vskip.5\parskip
+ \captionline
+ %
+ % Space below caption.
+ \vskip\parskip
+ \fi
+ %
+ % If have an xref label, write the list of floats info. Do this
+ % after the caption, to avoid chance of it being a breakpoint.
+ \ifx\floatlabel\empty \else
+ % Write the text that goes in the lof to the aux file as
+ % \floatlabel-lof. Besides \floatident, we include the short
+ % caption if specified, else the full caption if specified, else nothing.
+ {%
+ \atdummies
+ %
+ % since we read the caption text in the macro world, where ^^M
+ % is turned into a normal character, we have to scan it back, so
+ % we don't write the literal three characters "^^M" into the aux file.
+ \scanexp{%
+ \xdef\noexpand\gtemp{%
+ \ifx\thisshortcaption\empty
+ \thiscaption
+ \else
+ \thisshortcaption
+ \fi
+ }%
+ }%
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+ \ifx\gtemp\empty \else : \gtemp \fi}}%
+ }%
+ \fi
+ \egroup % end of \vtop
+ %
+ % place the captured inserts
+ %
+ % BEWARE: when the floats start floating, we have to issue warning
+ % whenever an insert appears inside a float which could possibly
+ % float. --kasal, 26may04
+ %
+ \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use. Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+ \ifx#1\relax
+ % Haven't seen this figure type before.
+ \csname newcount\endcsname #1%
+ %
+ % Remember to reset this floatno at the next chap.
+ \expandafter\gdef\expandafter\resetallfloatnos
+ \expandafter{\resetallfloatnos #1=0 }%
+ \fi
+ \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value. We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref. That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string. If so, #2 will be the
+% (safe) float type for this float. We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+ \def\temp{#1}%
+ \def\iffloattype{#2}%
+ \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+ \def\floattype{#1}% floattype
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ %
+ % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+ \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+ \ifhavexrefs
+ % if the user said @listoffloats foo but never @float foo.
+ \message{\linenumber No `\safefloattype' floats to list.}%
+ \fi
+ \else
+ \begingroup
+ \leftskip=\tocindent % indent these entries like a toc
+ \let\do=\listoffloatsdo
+ \csname floatlist\safefloattype\endcsname
+ \endgroup
+ \fi
+}
+
+% This is called on each entry in a list of floats. We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file. We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+ % Can't fully expand XR#1-lof because it can contain anything. Just
+ % pass the control sequence. On the other hand, XR#1-pg is just the
+ % page number, and we want to fully expand that so we can get a link
+ % in pdf output.
+ \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+ %
+ % use the same \entry macro we use to generate the TOC and index.
+ \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+ \writeentry
+}}
+
+
+\message{localization,}
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\parseargdef\documentlanguage{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+ \count255=128
+ \loop\ifnum\count255<256
+ \global\catcode\count255=#1
+ \advance\count255 by 1
+ \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\parseargdef\documentencoding{%
+ % Encoding being declared for the document.
+ \def\declaredencoding{\csname #1.enc\endcsname}%
+ %
+ % Supported encodings: names converted to tokens in order to be able
+ % to compare them with \ifx.
+ \def\ascii{\csname US-ASCII.enc\endcsname}%
+ \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+ \def\latone{\csname ISO-8859-1.enc\endcsname}%
+ \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+ \def\utfeight{\csname UTF-8.enc\endcsname}%
+ %
+ \ifx \declaredencoding \ascii
+ \asciichardefs
+ %
+ \else \ifx \declaredencoding \lattwo
+ \setnonasciicharscatcode\active
+ \lattwochardefs
+ %
+ \else \ifx \declaredencoding \latone
+ \setnonasciicharscatcode\active
+ \latonechardefs
+ %
+ \else \ifx \declaredencoding \latnine
+ \setnonasciicharscatcode\active
+ \latninechardefs
+ %
+ \else \ifx \declaredencoding \utfeight
+ \setnonasciicharscatcode\active
+ \utfeightchardefs
+ %
+ \else
+ \message{Unknown document encoding #1, ignoring.}%
+ %
+ \fi % utfeight
+ \fi % latnine
+ \fi % latone
+ \fi % lattwo
+ \fi % ascii
+}
+
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+ \gdef^^a0{~}
+ \gdef^^a1{\exclamdown}
+ \gdef^^a2{\missingcharmsg{CENT SIGN}}
+ \gdef^^a3{{\pounds}}
+ \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdef^^a5{\missingcharmsg{YEN SIGN}}
+ \gdef^^a6{\missingcharmsg{BROKEN BAR}}
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\copyright}
+ \gdef^^aa{\ordf}
+ \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}}
+ \gdef^^ac{$\lnot$}
+ \gdef^^ad{\-}
+ \gdef^^ae{\registeredsymbol}
+ \gdef^^af{\={}}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{$\pm$}
+ \gdef^^b2{$^2$}
+ \gdef^^b3{$^3$}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{$\mu$}
+ \gdef^^b6{\P}
+ %
+ \gdef^^b7{$^.$}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{$^1$}
+ \gdef^^ba{\ordm}
+ %
+ \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}}
+ \gdef^^bc{$1\over4$}
+ \gdef^^bd{$1\over2$}
+ \gdef^^be{$3\over4$}
+ \gdef^^bf{\questiondown}
+ %
+ \gdef^^c0{\`A}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\~A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\ringaccent A}
+ \gdef^^c6{\AE}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\`E}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\^E}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\`I}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\"I}
+ %
+ \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}}
+ \gdef^^d1{\~N}
+ \gdef^^d2{\`O}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\~O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\O}
+ \gdef^^d9{\`U}
+ \gdef^^da{\'U}
+ \gdef^^db{\^U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\`a}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\~a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\ringaccent a}
+ \gdef^^e6{\ae}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\`e}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\^e}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\`{\dotless i}}
+ \gdef^^ed{\'{\dotless i}}
+ \gdef^^ee{\^{\dotless i}}
+ \gdef^^ef{\"{\dotless i}}
+ %
+ \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}}
+ \gdef^^f1{\~n}
+ \gdef^^f2{\`o}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\~o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\o}
+ \gdef^^f9{\`u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\^u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}}
+ \gdef^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+ % Encoding is almost identical to Latin1.
+ \latonechardefs
+ %
+ \gdef^^a4{\euro}
+ \gdef^^a6{\v S}
+ \gdef^^a8{\v s}
+ \gdef^^b4{\v Z}
+ \gdef^^b8{\v z}
+ \gdef^^bc{\OE}
+ \gdef^^bd{\oe}
+ \gdef^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+ \gdef^^a0{~}
+ \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}}
+ \gdef^^a2{\u{}}
+ \gdef^^a3{\L}
+ \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdef^^a5{\v L}
+ \gdef^^a6{\'S}
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\v S}
+ \gdef^^aa{\cedilla S}
+ \gdef^^ab{\v T}
+ \gdef^^ac{\'Z}
+ \gdef^^ad{\-}
+ \gdef^^ae{\v Z}
+ \gdef^^af{\dotaccent Z}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}}
+ \gdef^^b2{\missingcharmsg{OGONEK}}
+ \gdef^^b3{\l}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{\v l}
+ \gdef^^b6{\'s}
+ \gdef^^b7{\v{}}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{\v s}
+ \gdef^^ba{\cedilla s}
+ \gdef^^bb{\v t}
+ \gdef^^bc{\'z}
+ \gdef^^bd{\H{}}
+ \gdef^^be{\v z}
+ \gdef^^bf{\dotaccent z}
+ %
+ \gdef^^c0{\'R}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\u A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\'L}
+ \gdef^^c6{\'C}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\v C}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\v E}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\v D}
+ %
+ \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}}
+ \gdef^^d1{\'N}
+ \gdef^^d2{\v N}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\H O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\v R}
+ \gdef^^d9{\ringaccent U}
+ \gdef^^da{\'U}
+ \gdef^^db{\H U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\cedilla T}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\'r}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\u a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\'l}
+ \gdef^^e6{\'c}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\v c}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\v e}
+ \gdef^^ed{\'\i}
+ \gdef^^ee{\^\i}
+ \gdef^^ef{\v d}
+ %
+ \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}}
+ \gdef^^f1{\'n}
+ \gdef^^f2{\v n}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\H o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\v r}
+ \gdef^^f9{\ringaccent u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\H u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\cedilla t}
+ \gdef^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+%
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions. It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+%
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+ \ifx #1\relax
+ \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+ \else
+ \expandafter #1%
+ \fi
+}
+
+\begingroup
+ \catcode`\~13
+ \catcode`\"12
+
+ \def\UTFviiiLoop{%
+ \global\catcode\countUTFx\active
+ \uccode`\~\countUTFx
+ \uppercase\expandafter{\UTFviiiTmp}%
+ \advance\countUTFx by 1
+ \ifnum\countUTFx < \countUTFy
+ \expandafter\UTFviiiLoop
+ \fi}
+
+ \countUTFx = "C2
+ \countUTFy = "E0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "E0
+ \countUTFy = "F0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "F0
+ \countUTFy = "F4
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiFourOctets\string~}}
+ \UTFviiiLoop
+\endgroup
+
+\begingroup
+ \catcode`\"=12
+ \catcode`\<=12
+ \catcode`\.=12
+ \catcode`\,=12
+ \catcode`\;=12
+ \catcode`\!=12
+ \catcode`\~=13
+
+ \gdef\DeclareUnicodeCharacter#1#2{%
+ \countUTFz = "#1\relax
+ \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
+ \begingroup
+ \parseXMLCharref
+ \def\UTFviiiTwoOctets##1##2{%
+ \csname u8:##1\string ##2\endcsname}%
+ \def\UTFviiiThreeOctets##1##2##3{%
+ \csname u8:##1\string ##2\string ##3\endcsname}%
+ \def\UTFviiiFourOctets##1##2##3##4{%
+ \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter
+ \gdef\UTFviiiTmp{#2}%
+ \endgroup}
+
+ \gdef\parseXMLCharref{%
+ \ifnum\countUTFz < "A0\relax
+ \errhelp = \EMsimple
+ \errmessage{Cannot define Unicode char value < 00A0}%
+ \else\ifnum\countUTFz < "800\relax
+ \parseUTFviiiA,%
+ \parseUTFviiiB C\UTFviiiTwoOctets.,%
+ \else\ifnum\countUTFz < "10000\relax
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
+ \else
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiA!%
+ \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
+ \fi\fi\fi
+ }
+
+ \gdef\parseUTFviiiA#1{%
+ \countUTFx = \countUTFz
+ \divide\countUTFz by 64
+ \countUTFy = \countUTFz
+ \multiply\countUTFz by 64
+ \advance\countUTFx by -\countUTFz
+ \advance\countUTFx by 128
+ \uccode `#1\countUTFx
+ \countUTFz = \countUTFy}
+
+ \gdef\parseUTFviiiB#1#2#3#4{%
+ \advance\countUTFz by "#10\relax
+ \uccode `#3\countUTFz
+ \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+\def\utfeightchardefs{%
+ \DeclareUnicodeCharacter{00A0}{\tie}
+ \DeclareUnicodeCharacter{00A1}{\exclamdown}
+ \DeclareUnicodeCharacter{00A3}{\pounds}
+ \DeclareUnicodeCharacter{00A8}{\"{ }}
+ \DeclareUnicodeCharacter{00A9}{\copyright}
+ \DeclareUnicodeCharacter{00AA}{\ordf}
+ \DeclareUnicodeCharacter{00AD}{\-}
+ \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
+ \DeclareUnicodeCharacter{00AF}{\={ }}
+
+ \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
+ \DeclareUnicodeCharacter{00B4}{\'{ }}
+ \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
+ \DeclareUnicodeCharacter{00BA}{\ordm}
+ \DeclareUnicodeCharacter{00BF}{\questiondown}
+
+ \DeclareUnicodeCharacter{00C0}{\`A}
+ \DeclareUnicodeCharacter{00C1}{\'A}
+ \DeclareUnicodeCharacter{00C2}{\^A}
+ \DeclareUnicodeCharacter{00C3}{\~A}
+ \DeclareUnicodeCharacter{00C4}{\"A}
+ \DeclareUnicodeCharacter{00C5}{\AA}
+ \DeclareUnicodeCharacter{00C6}{\AE}
+ \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
+ \DeclareUnicodeCharacter{00C8}{\`E}
+ \DeclareUnicodeCharacter{00C9}{\'E}
+ \DeclareUnicodeCharacter{00CA}{\^E}
+ \DeclareUnicodeCharacter{00CB}{\"E}
+ \DeclareUnicodeCharacter{00CC}{\`I}
+ \DeclareUnicodeCharacter{00CD}{\'I}
+ \DeclareUnicodeCharacter{00CE}{\^I}
+ \DeclareUnicodeCharacter{00CF}{\"I}
+
+ \DeclareUnicodeCharacter{00D1}{\~N}
+ \DeclareUnicodeCharacter{00D2}{\`O}
+ \DeclareUnicodeCharacter{00D3}{\'O}
+ \DeclareUnicodeCharacter{00D4}{\^O}
+ \DeclareUnicodeCharacter{00D5}{\~O}
+ \DeclareUnicodeCharacter{00D6}{\"O}
+ \DeclareUnicodeCharacter{00D8}{\O}
+ \DeclareUnicodeCharacter{00D9}{\`U}
+ \DeclareUnicodeCharacter{00DA}{\'U}
+ \DeclareUnicodeCharacter{00DB}{\^U}
+ \DeclareUnicodeCharacter{00DC}{\"U}
+ \DeclareUnicodeCharacter{00DD}{\'Y}
+ \DeclareUnicodeCharacter{00DF}{\ss}
+
+ \DeclareUnicodeCharacter{00E0}{\`a}
+ \DeclareUnicodeCharacter{00E1}{\'a}
+ \DeclareUnicodeCharacter{00E2}{\^a}
+ \DeclareUnicodeCharacter{00E3}{\~a}
+ \DeclareUnicodeCharacter{00E4}{\"a}
+ \DeclareUnicodeCharacter{00E5}{\aa}
+ \DeclareUnicodeCharacter{00E6}{\ae}
+ \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
+ \DeclareUnicodeCharacter{00E8}{\`e}
+ \DeclareUnicodeCharacter{00E9}{\'e}
+ \DeclareUnicodeCharacter{00EA}{\^e}
+ \DeclareUnicodeCharacter{00EB}{\"e}
+ \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
+ \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
+
+ \DeclareUnicodeCharacter{00F1}{\~n}
+ \DeclareUnicodeCharacter{00F2}{\`o}
+ \DeclareUnicodeCharacter{00F3}{\'o}
+ \DeclareUnicodeCharacter{00F4}{\^o}
+ \DeclareUnicodeCharacter{00F5}{\~o}
+ \DeclareUnicodeCharacter{00F6}{\"o}
+ \DeclareUnicodeCharacter{00F8}{\o}
+ \DeclareUnicodeCharacter{00F9}{\`u}
+ \DeclareUnicodeCharacter{00FA}{\'u}
+ \DeclareUnicodeCharacter{00FB}{\^u}
+ \DeclareUnicodeCharacter{00FC}{\"u}
+ \DeclareUnicodeCharacter{00FD}{\'y}
+ \DeclareUnicodeCharacter{00FF}{\"y}
+
+ \DeclareUnicodeCharacter{0100}{\=A}
+ \DeclareUnicodeCharacter{0101}{\=a}
+ \DeclareUnicodeCharacter{0102}{\u{A}}
+ \DeclareUnicodeCharacter{0103}{\u{a}}
+ \DeclareUnicodeCharacter{0106}{\'C}
+ \DeclareUnicodeCharacter{0107}{\'c}
+ \DeclareUnicodeCharacter{0108}{\^C}
+ \DeclareUnicodeCharacter{0109}{\^c}
+ \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
+ \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
+ \DeclareUnicodeCharacter{010C}{\v{C}}
+ \DeclareUnicodeCharacter{010D}{\v{c}}
+ \DeclareUnicodeCharacter{010E}{\v{D}}
+
+ \DeclareUnicodeCharacter{0112}{\=E}
+ \DeclareUnicodeCharacter{0113}{\=e}
+ \DeclareUnicodeCharacter{0114}{\u{E}}
+ \DeclareUnicodeCharacter{0115}{\u{e}}
+ \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
+ \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
+ \DeclareUnicodeCharacter{011A}{\v{E}}
+ \DeclareUnicodeCharacter{011B}{\v{e}}
+ \DeclareUnicodeCharacter{011C}{\^G}
+ \DeclareUnicodeCharacter{011D}{\^g}
+ \DeclareUnicodeCharacter{011E}{\u{G}}
+ \DeclareUnicodeCharacter{011F}{\u{g}}
+
+ \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
+ \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
+ \DeclareUnicodeCharacter{0124}{\^H}
+ \DeclareUnicodeCharacter{0125}{\^h}
+ \DeclareUnicodeCharacter{0128}{\~I}
+ \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
+ \DeclareUnicodeCharacter{012A}{\=I}
+ \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
+ \DeclareUnicodeCharacter{012C}{\u{I}}
+ \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
+
+ \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
+ \DeclareUnicodeCharacter{0131}{\dotless{i}}
+ \DeclareUnicodeCharacter{0132}{IJ}
+ \DeclareUnicodeCharacter{0133}{ij}
+ \DeclareUnicodeCharacter{0134}{\^J}
+ \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
+ \DeclareUnicodeCharacter{0139}{\'L}
+ \DeclareUnicodeCharacter{013A}{\'l}
+
+ \DeclareUnicodeCharacter{0141}{\L}
+ \DeclareUnicodeCharacter{0142}{\l}
+ \DeclareUnicodeCharacter{0143}{\'N}
+ \DeclareUnicodeCharacter{0144}{\'n}
+ \DeclareUnicodeCharacter{0147}{\v{N}}
+ \DeclareUnicodeCharacter{0148}{\v{n}}
+ \DeclareUnicodeCharacter{014C}{\=O}
+ \DeclareUnicodeCharacter{014D}{\=o}
+ \DeclareUnicodeCharacter{014E}{\u{O}}
+ \DeclareUnicodeCharacter{014F}{\u{o}}
+
+ \DeclareUnicodeCharacter{0150}{\H{O}}
+ \DeclareUnicodeCharacter{0151}{\H{o}}
+ \DeclareUnicodeCharacter{0152}{\OE}
+ \DeclareUnicodeCharacter{0153}{\oe}
+ \DeclareUnicodeCharacter{0154}{\'R}
+ \DeclareUnicodeCharacter{0155}{\'r}
+ \DeclareUnicodeCharacter{0158}{\v{R}}
+ \DeclareUnicodeCharacter{0159}{\v{r}}
+ \DeclareUnicodeCharacter{015A}{\'S}
+ \DeclareUnicodeCharacter{015B}{\'s}
+ \DeclareUnicodeCharacter{015C}{\^S}
+ \DeclareUnicodeCharacter{015D}{\^s}
+ \DeclareUnicodeCharacter{015E}{\cedilla{S}}
+ \DeclareUnicodeCharacter{015F}{\cedilla{s}}
+
+ \DeclareUnicodeCharacter{0160}{\v{S}}
+ \DeclareUnicodeCharacter{0161}{\v{s}}
+ \DeclareUnicodeCharacter{0162}{\cedilla{t}}
+ \DeclareUnicodeCharacter{0163}{\cedilla{T}}
+ \DeclareUnicodeCharacter{0164}{\v{T}}
+
+ \DeclareUnicodeCharacter{0168}{\~U}
+ \DeclareUnicodeCharacter{0169}{\~u}
+ \DeclareUnicodeCharacter{016A}{\=U}
+ \DeclareUnicodeCharacter{016B}{\=u}
+ \DeclareUnicodeCharacter{016C}{\u{U}}
+ \DeclareUnicodeCharacter{016D}{\u{u}}
+ \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
+ \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
+
+ \DeclareUnicodeCharacter{0170}{\H{U}}
+ \DeclareUnicodeCharacter{0171}{\H{u}}
+ \DeclareUnicodeCharacter{0174}{\^W}
+ \DeclareUnicodeCharacter{0175}{\^w}
+ \DeclareUnicodeCharacter{0176}{\^Y}
+ \DeclareUnicodeCharacter{0177}{\^y}
+ \DeclareUnicodeCharacter{0178}{\"Y}
+ \DeclareUnicodeCharacter{0179}{\'Z}
+ \DeclareUnicodeCharacter{017A}{\'z}
+ \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
+ \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
+ \DeclareUnicodeCharacter{017D}{\v{Z}}
+ \DeclareUnicodeCharacter{017E}{\v{z}}
+
+ \DeclareUnicodeCharacter{01C4}{D\v{Z}}
+ \DeclareUnicodeCharacter{01C5}{D\v{z}}
+ \DeclareUnicodeCharacter{01C6}{d\v{z}}
+ \DeclareUnicodeCharacter{01C7}{LJ}
+ \DeclareUnicodeCharacter{01C8}{Lj}
+ \DeclareUnicodeCharacter{01C9}{lj}
+ \DeclareUnicodeCharacter{01CA}{NJ}
+ \DeclareUnicodeCharacter{01CB}{Nj}
+ \DeclareUnicodeCharacter{01CC}{nj}
+ \DeclareUnicodeCharacter{01CD}{\v{A}}
+ \DeclareUnicodeCharacter{01CE}{\v{a}}
+ \DeclareUnicodeCharacter{01CF}{\v{I}}
+
+ \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
+ \DeclareUnicodeCharacter{01D1}{\v{O}}
+ \DeclareUnicodeCharacter{01D2}{\v{o}}
+ \DeclareUnicodeCharacter{01D3}{\v{U}}
+ \DeclareUnicodeCharacter{01D4}{\v{u}}
+
+ \DeclareUnicodeCharacter{01E2}{\={\AE}}
+ \DeclareUnicodeCharacter{01E3}{\={\ae}}
+ \DeclareUnicodeCharacter{01E6}{\v{G}}
+ \DeclareUnicodeCharacter{01E7}{\v{g}}
+ \DeclareUnicodeCharacter{01E8}{\v{K}}
+ \DeclareUnicodeCharacter{01E9}{\v{k}}
+
+ \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
+ \DeclareUnicodeCharacter{01F1}{DZ}
+ \DeclareUnicodeCharacter{01F2}{Dz}
+ \DeclareUnicodeCharacter{01F3}{dz}
+ \DeclareUnicodeCharacter{01F4}{\'G}
+ \DeclareUnicodeCharacter{01F5}{\'g}
+ \DeclareUnicodeCharacter{01F8}{\`N}
+ \DeclareUnicodeCharacter{01F9}{\`n}
+ \DeclareUnicodeCharacter{01FC}{\'{\AE}}
+ \DeclareUnicodeCharacter{01FD}{\'{\ae}}
+ \DeclareUnicodeCharacter{01FE}{\'{\O}}
+ \DeclareUnicodeCharacter{01FF}{\'{\o}}
+
+ \DeclareUnicodeCharacter{021E}{\v{H}}
+ \DeclareUnicodeCharacter{021F}{\v{h}}
+
+ \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
+ \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
+ \DeclareUnicodeCharacter{0228}{\cedilla{E}}
+ \DeclareUnicodeCharacter{0229}{\cedilla{e}}
+ \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
+ \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
+
+ \DeclareUnicodeCharacter{0232}{\=Y}
+ \DeclareUnicodeCharacter{0233}{\=y}
+ \DeclareUnicodeCharacter{0237}{\dotless{j}}
+
+ \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
+ \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
+ \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
+ \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
+ \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
+ \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
+ \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
+ \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
+ \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
+ \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
+ \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
+ \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
+
+ \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
+ \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
+
+ \DeclareUnicodeCharacter{1E20}{\=G}
+ \DeclareUnicodeCharacter{1E21}{\=g}
+ \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
+ \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
+ \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
+ \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
+ \DeclareUnicodeCharacter{1E26}{\"H}
+ \DeclareUnicodeCharacter{1E27}{\"h}
+
+ \DeclareUnicodeCharacter{1E30}{\'K}
+ \DeclareUnicodeCharacter{1E31}{\'k}
+ \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
+ \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
+ \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
+ \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
+ \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
+ \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
+ \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
+ \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
+ \DeclareUnicodeCharacter{1E3E}{\'M}
+ \DeclareUnicodeCharacter{1E3F}{\'m}
+
+ \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
+ \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
+ \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
+ \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
+ \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
+ \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
+ \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
+ \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
+ \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
+ \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
+
+ \DeclareUnicodeCharacter{1E54}{\'P}
+ \DeclareUnicodeCharacter{1E55}{\'p}
+ \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
+ \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
+ \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
+ \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
+ \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
+ \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
+ \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
+ \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
+
+ \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
+ \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
+ \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
+ \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
+ \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
+ \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
+ \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
+ \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
+ \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
+ \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
+
+ \DeclareUnicodeCharacter{1E7C}{\~V}
+ \DeclareUnicodeCharacter{1E7D}{\~v}
+ \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
+ \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
+
+ \DeclareUnicodeCharacter{1E80}{\`W}
+ \DeclareUnicodeCharacter{1E81}{\`w}
+ \DeclareUnicodeCharacter{1E82}{\'W}
+ \DeclareUnicodeCharacter{1E83}{\'w}
+ \DeclareUnicodeCharacter{1E84}{\"W}
+ \DeclareUnicodeCharacter{1E85}{\"w}
+ \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
+ \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
+ \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
+ \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
+ \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
+ \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
+ \DeclareUnicodeCharacter{1E8C}{\"X}
+ \DeclareUnicodeCharacter{1E8D}{\"x}
+ \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
+ \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
+
+ \DeclareUnicodeCharacter{1E90}{\^Z}
+ \DeclareUnicodeCharacter{1E91}{\^z}
+ \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
+ \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
+ \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
+ \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
+ \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
+ \DeclareUnicodeCharacter{1E97}{\"t}
+ \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
+ \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
+
+ \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
+ \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
+
+ \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
+ \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
+ \DeclareUnicodeCharacter{1EBC}{\~E}
+ \DeclareUnicodeCharacter{1EBD}{\~e}
+
+ \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
+ \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
+ \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
+ \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
+
+ \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
+ \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
+
+ \DeclareUnicodeCharacter{1EF2}{\`Y}
+ \DeclareUnicodeCharacter{1EF3}{\`y}
+ \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
+
+ \DeclareUnicodeCharacter{1EF8}{\~Y}
+ \DeclareUnicodeCharacter{1EF9}{\~y}
+
+ \DeclareUnicodeCharacter{2013}{--}
+ \DeclareUnicodeCharacter{2014}{---}
+ \DeclareUnicodeCharacter{2022}{\bullet}
+ \DeclareUnicodeCharacter{2026}{\dots}
+ \DeclareUnicodeCharacter{20AC}{\euro}
+
+ \DeclareUnicodeCharacter{2192}{\expansion}
+ \DeclareUnicodeCharacter{21D2}{\result}
+
+ \DeclareUnicodeCharacter{2212}{\minus}
+ \DeclareUnicodeCharacter{2217}{\point}
+ \DeclareUnicodeCharacter{2261}{\equiv}
+}% end of \utfeightchardefs
+
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+ \relax
+}
+
+% Make non-ASCII characters printable again for compatibility with
+% existing Texinfo documents that may use them, even without declaring a
+% document encoding.
+%
+\setnonasciicharscatcode \other
+
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {-.2in}{0in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+ \parskip = 1.5pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.4in}{4.8in}%
+ {-.2in}{-.4in}%
+ {0pt}{14pt}%
+ {9in}{6in}%
+ %
+ \lispnarrowing = 0.25in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{51\baselineskip}{160mm}
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+ \normalturnoffactive
+ \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active
+@def@normalbackslash{{@tt@backslashcurfont}}
+% On startup, @fixbackslash assigns:
+% @let \ = @normalbackslash
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+%
+@def@normalturnoffactive{%
+ @let\=@normalbackslash
+ @let"=@normaldoublequote
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+ @unsepspaces
+}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\' in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also turn back on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+ arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/build-aux/ylwrap b/build-aux/ylwrap
new file mode 100755
index 0000000..102bd89
--- /dev/null
+++ b/build-aux/ylwrap
@@ -0,0 +1,223 @@
+#! /bin/sh
+# ylwrap - wrapper for lex/yacc invocations.
+
+scriptversion=2005-05-14.22
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# 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>.
+
+case "$1" in
+ '')
+ echo "$0: No files given. Try \`$0 --help' for more information." 1>&2
+ exit 1
+ ;;
+ --basedir)
+ basedir=$2
+ shift 2
+ ;;
+ -h|--h*)
+ cat <<\EOF
+Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
+
+Wrapper for lex/yacc invocations, renaming files as desired.
+
+ INPUT is the input file
+ OUTPUT is one file PROG generates
+ DESIRED is the file we actually want instead of OUTPUT
+ PROGRAM is program to run
+ ARGS are passed to PROG
+
+Any number of OUTPUT,DESIRED pairs may be used.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v|--v*)
+ echo "ylwrap $scriptversion"
+ exit $?
+ ;;
+esac
+
+
+# The input.
+input="$1"
+shift
+case "$input" in
+ [\\/]* | ?:[\\/]*)
+ # Absolute path; do nothing.
+ ;;
+ *)
+ # Relative path. Make it absolute.
+ input="`pwd`/$input"
+ ;;
+esac
+
+pairlist=
+while test "$#" -ne 0; do
+ if test "$1" = "--"; then
+ shift
+ break
+ fi
+ pairlist="$pairlist $1"
+ shift
+done
+
+# The program to run.
+prog="$1"
+shift
+# Make any relative path in $prog absolute.
+case "$prog" in
+ [\\/]* | ?:[\\/]*) ;;
+ *[\\/]*) prog="`pwd`/$prog" ;;
+esac
+
+# FIXME: add hostname here for parallel makes that run commands on
+# other machines. But that might take us over the 14-char limit.
+dirname=ylwrap$$
+trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
+mkdir $dirname || exit 1
+
+cd $dirname
+
+case $# in
+ 0) $prog "$input" ;;
+ *) $prog "$@" "$input" ;;
+esac
+ret=$?
+
+if test $ret -eq 0; then
+ set X $pairlist
+ shift
+ first=yes
+ # Since DOS filename conventions don't allow two dots,
+ # the DOS version of Bison writes out y_tab.c instead of y.tab.c
+ # and y_tab.h instead of y.tab.h. Test to see if this is the case.
+ y_tab_nodot="no"
+ if test -f y_tab.c || test -f y_tab.h; then
+ y_tab_nodot="yes"
+ fi
+
+ # The directory holding the input.
+ input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
+ # Quote $INPUT_DIR so we can use it in a regexp.
+ # FIXME: really we should care about more than `.' and `\'.
+ input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`
+
+ while test "$#" -ne 0; do
+ from="$1"
+ # Handle y_tab.c and y_tab.h output by DOS
+ if test $y_tab_nodot = "yes"; then
+ if test $from = "y.tab.c"; then
+ from="y_tab.c"
+ else
+ if test $from = "y.tab.h"; then
+ from="y_tab.h"
+ fi
+ fi
+ fi
+ if test -f "$from"; then
+ # If $2 is an absolute path name, then just use that,
+ # otherwise prepend `../'.
+ case "$2" in
+ [\\/]* | ?:[\\/]*) target="$2";;
+ *) target="../$2";;
+ esac
+
+ # We do not want to overwrite a header file if it hasn't
+ # changed. This avoid useless recompilations. However the
+ # parser itself (the first file) should always be updated,
+ # because it is the destination of the .y.c rule in the
+ # Makefile. Divert the output of all other files to a temporary
+ # file so we can compare them to existing versions.
+ if test $first = no; then
+ realtarget="$target"
+ target="tmp-`echo $target | sed s/.*[\\/]//g`"
+ fi
+ # Edit out `#line' or `#' directives.
+ #
+ # We don't want the resulting debug information to point at
+ # an absolute srcdir; it is better for it to just mention the
+ # .y file with no path.
+ #
+ # We want to use the real output file name, not yy.lex.c for
+ # instance.
+ #
+ # We want the include guards to be adjusted too.
+ FROM=`echo "$from" | sed \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
+ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
+ TARGET=`echo "$2" | sed \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
+ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
+
+ sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \
+ -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$?
+
+ # Check whether header files must be updated.
+ if test $first = no; then
+ if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
+ echo "$2" is unchanged
+ rm -f "$target"
+ else
+ echo updating "$2"
+ mv -f "$target" "$realtarget"
+ fi
+ fi
+ else
+ # A missing file is only an error for the first file. This
+ # is a blatant hack to let us support using "yacc -d". If -d
+ # is not specified, we don't want an error when the header
+ # file is "missing".
+ if test $first = yes; then
+ ret=1
+ fi
+ fi
+ shift
+ shift
+ first=no
+ done
+else
+ ret=$?
+fi
+
+# Remove the directory.
+cd ..
+rm -rf $dirname
+
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/config.hin b/config.hin
new file mode 100644
index 0000000..06353a8
--- /dev/null
+++ b/config.hin
@@ -0,0 +1,1204 @@
+/* config.hin. Generated from configure.ac by autoheader. */
+
+/* Define this to an absolute name of <dirent.h>. */
+#undef ABSOLUTE_DIRENT_H
+
+/* Define this to an absolute name of <fcntl.h>. */
+#undef ABSOLUTE_FCNTL_H
+
+/* Define this to an absolute name of <float.h>. */
+#undef ABSOLUTE_FLOAT_H
+
+/* Define this to an absolute name of <inttypes.h>. */
+#undef ABSOLUTE_INTTYPES_H
+
+/* Define this to an absolute name of <stdint.h>. */
+#undef ABSOLUTE_STDINT_H
+
+/* Define this to an absolute name of <stdio.h>. */
+#undef ABSOLUTE_STDIO_H
+
+/* Define this to an absolute name of <stdlib.h>. */
+#undef ABSOLUTE_STDLIB_H
+
+/* Define this to an absolute name of <string.h>. */
+#undef ABSOLUTE_STRING_H
+
+/* Define this to an absolute name of <sysexits.h>. */
+#undef ABSOLUTE_SYSEXITS_H
+
+/* Define this to an absolute name of <sys/stat.h>. */
+#undef ABSOLUTE_SYS_STAT_H
+
+/* Define this to an absolute name of <sys/time.h>. */
+#undef ABSOLUTE_SYS_TIME_H
+
+/* Define this to an absolute name of <time.h>. */
+#undef ABSOLUTE_TIME_H
+
+/* Define this to an absolute name of <unistd.h>. */
+#undef ABSOLUTE_UNISTD_H
+
+/* Define this to an absolute name of <wchar.h>. */
+#undef ABSOLUTE_WCHAR_H
+
+/* Define this to an absolute name of <wctype.h>. */
+#undef ABSOLUTE_WCTYPE_H
+
+/* 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 if chown is not POSIX compliant regarding IDs of -1. */
+#undef CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE
+
+/* Define if chown modifies symlinks. */
+#undef CHOWN_MODIFIES_SYMLINK
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+ systems. This function is required for `alloca.c' support on those systems.
+ */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* Define to a string giving the full name of the default archive file. */
+#undef DEFAULT_ARCHIVE
+
+/* By default produce archives of this format */
+#undef DEFAULT_ARCHIVE_FORMAT
+
+/* Define to a number giving the default blocking size for archives. */
+#undef DEFAULT_BLOCKING
+
+/* Define to a default quoting style (see lib/quoteargs.c for the list) */
+#undef DEFAULT_QUOTING_STYLE
+
+/* Define full file name of rmt program. */
+#undef DEFAULT_RMT_COMMAND
+
+/* Define to 1 if density may be indicated by [lmh] at end of device. */
+#undef DENSITY_LETTER
+
+/* Define to a string giving the prefix of the default device, without the
+ part specifying the unit and density. */
+#undef DEVICE_PREFIX
+
+/* 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 to 1 if translation of program messages to the user's native
+ language is requested. */
+#undef ENABLE_NLS
+
+/* Define as good substitute value for EOVERFLOW. */
+#undef EOVERFLOW
+
+/* Define if gnulib's fchdir() replacement is used. */
+#undef FCHDIR_REPLACEMENT
+
+/* Define on systems for which file names may have a so-called `drive letter'
+ prefix, define this to compute the length of that prefix, including the
+ colon. */
+#undef FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
+
+/* Define if the backslash character may also serve as a file name component
+ separator. */
+#undef FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
+
+/* Define if a drive letter prefix denotes a relative path if it is not
+ followed by a file name component separator. */
+#undef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+
+/* Define if gettimeofday clobbers the localtime buffer. */
+#undef GETTIMEOFDAY_CLOBBERS_LOCALTIME
+
+/* Define to 1 when using the gnulib module close-stream. */
+#undef GNULIB_CLOSE_STREAM
+
+/* Define to 1 when using the gnulib module fcntl-safer. */
+#undef GNULIB_FCNTL_SAFER
+
+/* Define to 1 to add extern declaration of program_invocation_name to argp.h
+ */
+#undef GNULIB_PROGRAM_INVOCATION_NAME
+
+/* Define to 1 to add extern declaration of program_invocation_short_name to
+ argp.h */
+#undef GNULIB_PROGRAM_INVOCATION_SHORT_NAME
+
+/* Define to 1 if you have the `alarm' function. */
+#undef HAVE_ALARM
+
+/* Define to 1 if you have 'alloca' after including <alloca.h>, a header that
+ may be supplied by this distribution. */
+#undef HAVE_ALLOCA
+
+/* Define HAVE_ALLOCA_H for backward compatibility with older code that
+ includes <alloca.h> only if HAVE_ALLOCA_H is defined. */
+#undef HAVE_ALLOCA_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 you have the `canonicalize_file_name' function. */
+#undef HAVE_CANONICALIZE_FILE_NAME
+
+/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
+ CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYCURRENT
+
+/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
+ the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define to 1 if your system has a working `chown' function. */
+#undef HAVE_CHOWN
+
+/* Define to 1 if you have the `chsize' function. */
+#undef HAVE_CHSIZE
+
+/* 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 if you have compound literals. */
+#undef HAVE_COMPOUND_LITERALS
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+ */
+#undef HAVE_DCGETTEXT
+
+/* Define to 1 if you have the declaration of `canonicalize_file_name', and to
+ 0 if you don't. */
+#undef HAVE_DECL_CANONICALIZE_FILE_NAME
+
+/* 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 `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 `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 `fwrite_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FWRITE_UNLOCKED
+
+/* 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 `getenv', and to 0 if you don't.
+ */
+#undef HAVE_DECL_GETENV
+
+/* Define to 1 if you have the declaration of `getgrgid', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETGRGID
+
+/* 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 `getpwuid', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETPWUID
+
+/* Define to 1 if you have the declaration of `imaxabs', and to 0 if you
+ don't. */
+#undef HAVE_DECL_IMAXABS
+
+/* Define to 1 if you have the declaration of `imaxdiv', and to 0 if you
+ don't. */
+#undef HAVE_DECL_IMAXDIV
+
+/* 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 `lchown', and to 0 if you don't.
+ */
+#undef HAVE_DECL_LCHOWN
+
+/* 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 `mkdir', and to 0 if you don't.
+ */
+#undef HAVE_DECL_MKDIR
+
+/* Define if program_invocation_name is declared */
+#undef HAVE_DECL_PROGRAM_INVOCATION_NAME
+
+/* Define if program_invocation_short_name is declared */
+#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 `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 `strtoimax', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRTOIMAX
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRTOLL
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRTOULL
+
+/* Define to 1 if you have the declaration of `strtoumax', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRTOUMAX
+
+/* Define to 1 if you have the declaration of `time', and to 0 if you don't.
+ */
+#undef HAVE_DECL_TIME
+
+/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't.
+ */
+#undef HAVE_DECL_TZNAME
+
+/* 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 `wcwidth', and to 0 if you
+ don't. */
+#undef HAVE_DECL_WCWIDTH
+
+/* Define to 1 if you have the declaration of `__fpending', and to 0 if you
+ don't. */
+#undef HAVE_DECL___FPENDING
+
+/* 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 `dup2' function. */
+#undef HAVE_DUP2
+
+/* Define if you have the declaration of environ. */
+#undef HAVE_ENVIRON_DECL
+
+/* Define to 1 if you have the `fchdir' function. */
+#undef HAVE_FCHDIR
+
+/* Define to 1 if you have the `fchmodat' function. */
+#undef HAVE_FCHMODAT
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* 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 <float.h> header file. */
+#undef HAVE_FLOAT_H
+
+/* Define to 1 if you have the `flockfile' function. */
+#undef HAVE_FLOCKFILE
+
+/* Define to 1 if you have the `fsync' function. */
+#undef HAVE_FSYNC
+
+/* Define to 1 if you have the `ftruncate' function. */
+#undef HAVE_FTRUNCATE
+
+/* Define to 1 if you have the `funlockfile' function. */
+#undef HAVE_FUNLOCKFILE
+
+/* 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 you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* 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 <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 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 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 the compiler supports one of the keywords 'inline',
+ '__inline__', '__inline' and effectively inlines functions marked as such.
+ */
+#undef HAVE_INLINE
+
+/* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
+#undef HAVE_INTMAX_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 <io.h> header file. */
+#undef HAVE_IO_H
+
+/* 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 `lchmod' function. */
+#undef HAVE_LCHMOD
+
+/* Define to 1 if you have the `lchown' function. */
+#undef HAVE_LCHOWN
+
+/* Define to 1 if you have the <linewrap.h> header file. */
+#undef HAVE_LINEWRAP_H
+
+/* Define to 1 if you have the <linux/fd.h> header file. */
+#undef HAVE_LINUX_FD_H
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define to 1 if you support file names longer than 14 characters. */
+#undef HAVE_LONG_FILE_NAMES
+
+/* Define if you have the 'long long' type. */
+#undef HAVE_LONG_LONG
+
+/* 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 your system has a GNU libc compatible `malloc' function, and
+ to 0 otherwise. */
+#undef HAVE_MALLOC
+
+/* 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 `memchr' function. */
+#undef HAVE_MEMCHR
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* 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 to 1 if you have the `memset' function. */
+#undef HAVE_MEMSET
+
+/* Define to 1 if you have the `mkdirat' function. */
+#undef HAVE_MKDIRAT
+
+/* Define to 1 if you have the `mkdtemp' function. */
+#undef HAVE_MKDTEMP
+
+/* Define to 1 if you have the `mkfifo' function. */
+#undef HAVE_MKFIFO
+
+/* Define to 1 if you have the `nanotime' function. */
+#undef HAVE_NANOTIME
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <net/errno.h> header file. */
+#undef HAVE_NET_ERRNO_H
+
+/* Define to 1 if libc includes obstacks. */
+#undef HAVE_OBSTACK
+
+/* Define to 1 if you have the `openat' function. */
+#undef HAVE_OPENAT
+
+/* Define to 1 if you have the <OS.h> header file. */
+#undef HAVE_OS_H
+
+/* Define to 1 if getcwd works, except it sometimes fails when it shouldn't,
+ setting errno to ERANGE, ENAMETOOLONG, or ENOENT. If __GETCWD_PREFIX is not
+ defined, it doesn't matter whether HAVE_PARTLY_WORKING_GETCWD is defined.
+ */
+#undef HAVE_PARTLY_WORKING_GETCWD
+
+/* Define to 1 if you have the `pathconf' function. */
+#undef HAVE_PATHCONF
+
+/* Define to 1 if you have the `pipe' function. */
+#undef HAVE_PIPE
+
+/* Define to 1 if you have the <priv.h> header file. */
+#undef HAVE_PRIV_H
+
+/* Define if program_invocation_name is defined */
+#undef HAVE_PROGRAM_INVOCATION_NAME
+
+/* Define if program_invocation_short_name is defined */
+#undef HAVE_PROGRAM_INVOCATION_SHORT_NAME
+
+/* Define to 1 if the system has the type `ptrdiff_t'. */
+#undef HAVE_PTRDIFF_T
+
+/* Define to 1 if you have the `readlink' function. */
+#undef HAVE_READLINK
+
+/* Define to 1 if you have the `rmdir' function. */
+#undef HAVE_RMDIR
+
+/* Define to 1 if you have the `rpmatch' function. */
+#undef HAVE_RPMATCH
+
+/* Define to 1 if you have the <search.h> header file. */
+#undef HAVE_SEARCH_H
+
+/* Define to 1 if you have the `setenv' function. */
+#undef HAVE_SETENV
+
+/* Define to 1 if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define to 1 if you have the <sgtty.h> header file. */
+#undef HAVE_SGTTY_H
+
+/* 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 `sleep' function. */
+#undef HAVE_SLEEP
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* 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' function. */
+#undef HAVE_STRERROR
+
+/* 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 `strncasecmp' function. */
+#undef HAVE_STRNCASECMP
+
+/* Define if you have the strndup() function and it works. */
+#undef HAVE_STRNDUP
+
+/* Define to 1 if you have the <stropts.h> header file. */
+#undef HAVE_STROPTS_H
+
+/* Define to 1 if you have the `strtoimax' function. */
+#undef HAVE_STRTOIMAX
+
+/* 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 you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define to 1 if you have the `strtoull' function. */
+#undef HAVE_STRTOULL
+
+/* Define to 1 if you have the `strtoumax' function. */
+#undef HAVE_STRTOUMAX
+
+/* Define to 1 if `st_atimensec' is member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_ATIMENSEC
+
+/* Define to 1 if `st_atimespec.tv_nsec' is member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC
+
+/* Define to 1 if `st_atim.st__tim.tv_nsec' is member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC
+
+/* Define to 1 if `st_atim.tv_nsec' is member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
+
+/* Define to 1 if `st_birthtimensec' is member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
+
+/* Define to 1 if `st_birthtimespec.tv_nsec' is member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
+
+/* Define to 1 if `st_birthtim.tv_nsec' is member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC
+
+/* Define to 1 if `st_blksize' is member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BLKSIZE
+
+/* Define to 1 if `st_blocks' is member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BLOCKS
+
+/* Define to 1 if `tm_zone' is member of `struct tm'. */
+#undef HAVE_STRUCT_TM_TM_ZONE
+
+/* Define if struct utimbuf is declared -- usually in <utime.h>. Some systems
+ have utime.h but don't declare the struct anywhere. */
+#undef HAVE_STRUCT_UTIMBUF
+
+/* Define to 1 if your `struct stat' has `st_blksize'. Deprecated, use
+ `HAVE_STRUCT_STAT_ST_BLKSIZE' instead. */
+#undef HAVE_ST_BLKSIZE
+
+/* Define to 1 if your `struct stat' has `st_blocks'. Deprecated, use
+ `HAVE_STRUCT_STAT_ST_BLOCKS' instead. */
+#undef HAVE_ST_BLOCKS
+
+/* Define if struct stat has a char st_fstype[] member. */
+#undef HAVE_ST_FSTYPE_STRING
+
+/* Define to 1 if you have the `symlink' function. */
+#undef HAVE_SYMLINK
+
+/* Define to 1 if you have the <sysexits.h> header file. */
+#undef HAVE_SYSEXITS_H
+
+/* 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/buf.h> header file. */
+#undef HAVE_SYS_BUF_H
+
+/* Define to 1 if you have the <sys/device.h> header file. */
+#undef HAVE_SYS_DEVICE_H
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/filio.h> header file. */
+#undef HAVE_SYS_FILIO_H
+
+/* Define to 1 if you have the <sys/gentape.h> header file. */
+#undef HAVE_SYS_GENTAPE_H
+
+/* Define to 1 if you have the <sys/inet.h> header file. */
+#undef HAVE_SYS_INET_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/io/trioctl.h> header file. */
+#undef HAVE_SYS_IO_TRIOCTL_H
+
+/* Define to 1 if you have the <sys/mtio.h> header file. */
+#undef HAVE_SYS_MTIO_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_NDIR_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/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/tape.h> header file. */
+#undef HAVE_SYS_TAPE_H
+
+/* Define to 1 if you have the <sys/timeb.h> header file. */
+#undef HAVE_SYS_TIMEB_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/tprintf.h> header file. */
+#undef HAVE_SYS_TPRINTF_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/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <time.h> header file. */
+#undef HAVE_TIME_H
+
+/* Define if struct tm has the tm_gmtoff member. */
+#undef HAVE_TM_GMTOFF
+
+/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
+ `HAVE_STRUCT_TM_TM_ZONE' instead. */
+#undef HAVE_TM_ZONE
+
+/* Define to 1 if you have the `tsearch' function. */
+#undef HAVE_TSEARCH
+
+/* Define to 1 if you don't have `tm_zone' but do have the external array
+ `tzname'. */
+#undef HAVE_TZNAME
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `unsetenv' function. */
+#undef HAVE_UNSETENV
+
+/* 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 `utimes' function. */
+#undef HAVE_UTIMES
+
+/* Define if utimes accepts a null argument */
+#undef HAVE_UTIMES_NULL
+
+/* Define to 1 if you have the <utime.h> header file. */
+#undef HAVE_UTIME_H
+
+/* Define to 1 if `utime(file, NULL)' sets file's timestamp to the present. */
+#undef HAVE_UTIME_NULL
+
+/* Define to 1 if you have the `vasnprintf' function. */
+#undef HAVE_VASNPRINTF
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
+/* 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 `wcscoll' function. */
+#undef HAVE_WCSCOLL
+
+/* Define to 1 if you have the `wcslen' function. */
+#undef HAVE_WCSLEN
+
+/* 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 if you have the 'wint_t' type. */
+#undef HAVE_WINT_T
+
+/* Define to 1 if you have the `wmemchr' function. */
+#undef HAVE_WMEMCHR
+
+/* Define to 1 if you have the `wmemcpy' function. */
+#undef HAVE_WMEMCPY
+
+/* Define to 1 if you have the `wmempcpy' function. */
+#undef HAVE_WMEMPCPY
+
+/* 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 the system has the type `_Bool'. */
+#undef HAVE__BOOL
+
+/* Define to 1 if you have the `_ftime' function. */
+#undef HAVE__FTIME
+
+/* Define to 1 if you have the `__fpending' function. */
+#undef HAVE___FPENDING
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+#if FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#else
+# define ISSLASH(C) ((C) == '/')
+#endif
+
+/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
+ slash. */
+#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
+
+/* Define to 1 if `major', `minor', and `makedev' are declared in <mkdev.h>.
+ */
+#undef MAJOR_IN_MKDEV
+
+/* Define to 1 if `major', `minor', and `makedev' are declared in
+ <sysmacros.h>. */
+#undef MAJOR_IN_SYSMACROS
+
+/* If malloc(0) is != NULL, define this to 1. Otherwise define this to 0. */
+#undef MALLOC_0_IS_NONNULL
+
+/* Define to mt_model (v.g., for DG/UX), else to mt_type. */
+#undef MTIO_CHECK_FIELD
+
+/* 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 version of this package. */
+#undef PACKAGE_VERSION
+
+/* the number of pending output bytes on stream `fp' */
+#undef PENDING_OUTPUT_N_BYTES
+
+/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
+#undef PRI_MACROS_BROKEN
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'ptrdiff_t'. */
+#undef PTRDIFF_T_SUFFIX
+
+/* Define to the full path of your rsh, if any. */
+#undef REMOTE_SHELL
+
+/* Define if vasnprintf exists but is overridden by gnulib. */
+#undef REPLACE_VASNPRINTF
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'sig_atomic_t'. */
+#undef SIG_ATOMIC_T_SUFFIX
+
+/* 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 you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if strerror_r returns char *. */
+#undef STRERROR_R_CHAR_P
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+#undef TM_IN_SYS_TIME
+
+/* 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 (dir) cannot possibly succeed. */
+#undef UNLINK_CANNOT_UNLINK_DIR
+
+/* 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
+
+/* Version number of package */
+#undef VERSION
+
+/* Define if unsetenv() returns void, not int. */
+#undef VOID_UNSETENV
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'wchar_t'. */
+#undef WCHAR_T_SUFFIX
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'wint_t'. */
+#undef WINT_T_SUFFIX
+
+/* Define to 1 if on AIX 3.
+ System headers sometimes define this.
+ We just want to avoid a redefinition error message. */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to 1 if on MINIX. */
+#undef _MINIX
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+ this defined. */
+#undef _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#undef _POSIX_SOURCE
+
+/* Define if you want regoff_t to be at least as wide POSIX requires. */
+#undef _REGEX_LARGE_OFFSETS
+
+/* Enable extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+
+/* Define to rpl_ if the getopt replacement functions and variables should be
+ used. */
+#undef __GETOPT_PREFIX
+
+/* Define to rpl_ if the openat replacement function should be used. */
+#undef __OPENAT_PREFIX
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+#undef dev_t
+
+/* Define to rpl_fchownat if the replacement function should be used. */
+#undef fchownat
+
+/* Define to a replacement function name for fnmatch(). */
+#undef fnmatch
+
+/* Define to a replacement function name for getline(). */
+#undef getline
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef gid_t
+
+/* A replacement for va_copy, if needed. */
+#define gl_va_copy(a,b) ((a) = (b))
+
+/* Define to rpl_gmtime if the replacement function should be used. */
+#undef gmtime
+
+/* Conversion descriptor type */
+#undef iconv_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 `unsigned' if <sys/types.h> does not define. */
+#undef ino_t
+
+/* Define to long or long long if <stdint.h> and <inttypes.h> don't define. */
+#undef intmax_t
+
+/* Define to rpl_localtime if the replacement function should be used. */
+#undef localtime
+
+/* Type of major device numbers. */
+#undef major_t
+
+/* Define to rpl_malloc if the replacement function should be used. */
+#undef malloc
+
+/* Define to a type if <wchar.h> does not define. */
+#undef mbstate_t
+
+/* Type of minor device numbers. */
+#undef minor_t
+
+/* Define to rpl_mktime if the replacement function should be used. */
+#undef mktime
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef mode_t
+
+/* Define to `long int' if <sys/types.h> does not define. */
+#undef off_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_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 a replacement function name for realpath(). */
+#undef realpath
+
+/* 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 equivalent of C99 restrict keyword, or to nothing if this is not
+ supported. Do not define if restrict is supported directly. */
+#undef restrict
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define as a signed type of the same size as size_t. */
+#undef ssize_t
+
+/* Define to rpl_strnlen if the replacement function should be used. */
+#undef strnlen
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef uid_t
+
+/* Define to rpl_utime if the replacement function should be used. */
+#undef utime
+
+/* Define as a macro for copying va_list variables. */
+#undef va_copy
diff --git a/configure b/configure
new file mode 100755
index 0000000..88bd09c
--- /dev/null
+++ b/configure
@@ -0,0 +1,39558 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.60 for GNU tar 1.17.
+#
+# Report bugs to <bug-tar@gnu.org>.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 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 Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+
+# PATH needs CR
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+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
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+ if (eval ":") 2>/dev/null; then
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+
+ if test $as_have_required = yes && (eval ":
+(as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=\$LINENO
+ as_lineno_2=\$LINENO
+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+ :
+else
+ as_candidate_shells=
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /usr/bin/posix$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ case $as_dir in
+ /*)
+ for as_base in sh bash ksh sh5; do
+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+ done;;
+ esac
+done
+IFS=$as_save_IFS
+
+
+ for as_shell in $as_candidate_shells $SHELL; do
+ # Try only shells that exist, to save several forks.
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { ("$as_shell") 2> /dev/null <<\_ASEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+:
+_ASEOF
+}; then
+ CONFIG_SHELL=$as_shell
+ as_have_required=yes
+ if { "$as_shell" 2> /dev/null <<\_ASEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+:
+(as_func_return () {
+ (exit $1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+ break
+fi
+
+fi
+
+ done
+
+ if test "x$CONFIG_SHELL" != x; then
+ for as_var in BASH_ENV ENV
+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ done
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+ if test $as_have_required = no; then
+ echo This script requires a shell more modern than all the
+ echo shells that I found on your system. Please install a
+ echo modern shell, or manually run the script under such a
+ echo shell if you do have one.
+ { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+ echo No shell found that supports shell functions.
+ echo Please tell autoconf@gnu.org about your system,
+ echo including any error possibly output before this
+ echo message
+}
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. 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" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # 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
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+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
+fi
+echo >conf$$.file
+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 -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+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=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+# Find out whether ``test -x'' works. Don't use a zero-byte file, as
+# systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ as_executable_p="test -x"
+else
+ as_executable_p=:
+fi
+rm -f conf$$.file
+
+# 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 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, 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=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='GNU tar'
+PACKAGE_TARNAME='tar'
+PACKAGE_VERSION='1.17'
+PACKAGE_STRING='GNU tar 1.17'
+PACKAGE_BUGREPORT='bug-tar@gnu.org'
+
+ac_unique_file="src/tar.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_list=
+ac_func_list=
+gt_needs=
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+am__isrc
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+RANLIB
+YACC
+YFLAGS
+CPP
+GREP
+EGREP
+STDBOOL_H
+HAVE__BOOL
+GL_COND_LIBTOOL_TRUE
+GL_COND_LIBTOOL_FALSE
+ALLOCA
+ALLOCA_H
+GETOPT_H
+GNULIB_CHOWN
+GNULIB_DUP2
+GNULIB_FCHDIR
+GNULIB_FTRUNCATE
+GNULIB_GETCWD
+GNULIB_GETLOGIN_R
+GNULIB_LSEEK
+GNULIB_READLINK
+GNULIB_SLEEP
+HAVE_DUP2
+HAVE_FTRUNCATE
+HAVE_READLINK
+HAVE_SLEEP
+HAVE_DECL_GETLOGIN_R
+REPLACE_CHOWN
+REPLACE_FCHDIR
+REPLACE_GETCWD
+REPLACE_LSEEK
+LIB_CLOCK_GETTIME
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+ABSOLUTE_DIRENT_H
+DIRENT_H
+ABSOLUTE_FCNTL_H
+FCNTL_H
+ABSOLUTE_FLOAT_H
+FLOAT_H
+FNMATCH_H
+LIBINTL
+LTLIBINTL
+ABSOLUTE_SYS_TIME_H
+HAVE_SYS_TIME_H
+HAVE_STRUCT_TIMEVAL
+REPLACE_GETTIMEOFDAY
+SYS_TIME_H
+HAVE_LONG_LONG_INT
+HAVE_UNSIGNED_LONG_LONG_INT
+HAVE_INTTYPES_H
+HAVE_SYS_TYPES_H
+ABSOLUTE_STDINT_H
+HAVE_STDINT_H
+HAVE_SYS_INTTYPES_H
+HAVE_SYS_BITYPES_H
+BITSIZEOF_PTRDIFF_T
+BITSIZEOF_SIG_ATOMIC_T
+BITSIZEOF_SIZE_T
+BITSIZEOF_WCHAR_T
+BITSIZEOF_WINT_T
+HAVE_SIGNED_SIG_ATOMIC_T
+HAVE_SIGNED_WCHAR_T
+HAVE_SIGNED_WINT_T
+PTRDIFF_T_SUFFIX
+SIG_ATOMIC_T_SUFFIX
+SIZE_T_SUFFIX
+WCHAR_T_SUFFIX
+WINT_T_SUFFIX
+STDINT_H
+PRI_MACROS_BROKEN
+GNULIB_IMAXABS
+GNULIB_IMAXDIV
+GNULIB_STRTOIMAX
+GNULIB_STRTOUMAX
+HAVE_DECL_IMAXABS
+HAVE_DECL_IMAXDIV
+HAVE_DECL_STRTOIMAX
+HAVE_DECL_STRTOUMAX
+ABSOLUTE_INTTYPES_H
+PRIPTR_PREFIX
+INTTYPES_H
+GLIBC21
+GNULIB_MEMMEM
+GNULIB_MEMPCPY
+GNULIB_MEMRCHR
+GNULIB_STPCPY
+GNULIB_STPNCPY
+GNULIB_STRCHRNUL
+GNULIB_STRDUP
+GNULIB_STRNDUP
+GNULIB_STRNLEN
+GNULIB_STRPBRK
+GNULIB_STRSEP
+GNULIB_STRCASESTR
+GNULIB_STRTOK_R
+GNULIB_MBSLEN
+GNULIB_MBSCHR
+GNULIB_MBSRCHR
+GNULIB_MBSSTR
+GNULIB_MBSCASECMP
+GNULIB_MBSNCASECMP
+GNULIB_MBSPCASECMP
+GNULIB_MBSCASESTR
+GNULIB_MBSCSPN
+GNULIB_MBSPBRK
+GNULIB_MBSSPN
+GNULIB_MBSSEP
+GNULIB_MBSTOK_R
+HAVE_DECL_MEMMEM
+HAVE_MEMPCPY
+HAVE_DECL_MEMRCHR
+HAVE_STPCPY
+HAVE_STPNCPY
+HAVE_STRCASECMP
+HAVE_DECL_STRNCASECMP
+HAVE_STRCHRNUL
+HAVE_DECL_STRDUP
+HAVE_STRNDUP
+HAVE_DECL_STRNDUP
+HAVE_DECL_STRNLEN
+HAVE_STRPBRK
+HAVE_STRSEP
+HAVE_STRCASESTR
+HAVE_DECL_STRTOK_R
+GNULIB_GETSUBOPT
+GNULIB_MKDTEMP
+GNULIB_MKSTEMP
+HAVE_GETSUBOPT
+HAVE_MKDTEMP
+REPLACE_MKSTEMP
+GNULIB_FPRINTF_POSIX
+GNULIB_PRINTF_POSIX
+GNULIB_SNPRINTF
+GNULIB_SPRINTF_POSIX
+GNULIB_VFPRINTF_POSIX
+GNULIB_VPRINTF_POSIX
+GNULIB_VSNPRINTF
+GNULIB_VSPRINTF_POSIX
+GNULIB_VASPRINTF
+GNULIB_FSEEK
+GNULIB_FSEEKO
+GNULIB_FTELL
+GNULIB_FTELLO
+GNULIB_FFLUSH
+REPLACE_FPRINTF
+REPLACE_VFPRINTF
+REPLACE_PRINTF
+REPLACE_VPRINTF
+REPLACE_SNPRINTF
+HAVE_DECL_SNPRINTF
+REPLACE_VSNPRINTF
+HAVE_DECL_VSNPRINTF
+REPLACE_SPRINTF
+REPLACE_VSPRINTF
+HAVE_VASPRINTF
+REPLACE_VASPRINTF
+HAVE_FSEEKO
+REPLACE_FSEEKO
+REPLACE_FSEEK
+HAVE_FTELLO
+REPLACE_FTELLO
+REPLACE_FTELL
+REPLACE_FFLUSH
+ABSOLUTE_STDIO_H
+ABSOLUTE_STDLIB_H
+ABSOLUTE_STRING_H
+HAVE_LSTAT
+HAVE_DECL_MKDIR
+HAVE_IO_H
+ABSOLUTE_SYS_STAT_H
+SYS_STAT_H
+HAVE_SYSEXITS_H
+ABSOLUTE_SYSEXITS_H
+SYSEXITS_H
+REPLACE_LOCALTIME_R
+REPLACE_NANOSLEEP
+REPLACE_STRPTIME
+REPLACE_TIMEGM
+ABSOLUTE_TIME_H
+TIME_H_DEFINES_STRUCT_TIMESPEC
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC
+HAVE_UNISTD_H
+ABSOLUTE_UNISTD_H
+EOVERFLOW
+ABSOLUTE_WCHAR_H
+WCHAR_H
+HAVE_ISWCNTRL
+HAVE_WINT_T
+ABSOLUTE_WCTYPE_H
+HAVE_WCTYPE_H
+WCTYPE_H
+LIBTAR_LIBDEPS
+LIBTAR_LTLIBDEPS
+LIB_SETSOCKOPT
+PU_RMT_PROG
+DEFAULT_RMT_DIR
+DEFAULT_RMT_COMMAND
+LIBOBJS
+DEFAULT_ARCHIVE_FORMAT
+DEFAULT_ARCHIVE
+DEFAULT_BLOCKING
+DEFAULT_QUOTING_STYLE
+LIBICONV
+LTLIBICONV
+USE_NLS
+MSGFMT
+GMSGFMT
+MSGFMT_015
+GMSGFMT_015
+XGETTEXT
+XGETTEXT_015
+MSGMERGE
+INTL_MACOSX_LIBS
+INTLLIBS
+POSUB
+AUTOM4TE
+BACKUP_LIBEXEC_SCRIPTS
+BACKUP_SBIN_SCRIPTS
+BACKUP_SED_COND
+LTLIBOBJS
+gl_LIBOBJS
+gl_LTLIBOBJS'
+ac_subst_files=''
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+YACC
+YFLAGS
+CPP
+DEFAULT_RMT_DIR
+DEFAULT_ARCHIVE_FORMAT
+DEFAULT_ARCHIVE
+DEFAULT_BLOCKING
+DEFAULT_QUOTING_STYLE'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval enable_$ac_feature=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval with_$ac_package=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval with_$ac_package=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 ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; }
+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
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ 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 .` ||
+ { echo "$as_me: error: Working directory cannot be determined" >&2
+ { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ { echo "$as_me: error: pwd does not report name of working directory" >&2
+ { (exit 1); exit 1; }; }
+
+
+# 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 -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+ 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 .."
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+ { (exit 1); exit 1; }; }
+ 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 GNU tar 1.17 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/tar]
+ --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 GNU tar 1.17:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --disable-largefile omit support for large files
+ --disable-rpath do not hardcode runtime library paths
+ --disable-nls do not use Native Language Support
+ --enable-backup-scripts Create and install backup and restore scripts
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --without-included-regex
+ don't compile regex; this is the default on 32-bit
+ systems with recent-enough versions of the GNU C
+ Library (use with caution on other systems). On
+ systems with 64-bit ptrdiff_t and 32-bit int,
+ --with-included-regex is the default, in case regex
+ functions operate on very long strings (>2GB)
+ --with-rmt=FILE Use FILE as the default `rmt' program. Do not build
+ included copy of `rmt'.
+ --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
+
+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>
+ CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ YACC The `Yet Another C Compiler' implementation to use. Defaults to
+ the first program found out of: `bison -y', `byacc', `yacc'.
+ YFLAGS The list of arguments that will be passed by default to $YACC.
+ This script will default YFLAGS to the empty string to avoid a
+ default value of `-d' given by some make applications.
+ CPP C preprocessor
+ DEFAULT_RMT_DIR
+ Define full file name of the directory where to install `rmt'.
+ (default: $(libexecdir))
+ DEFAULT_ARCHIVE_FORMAT
+ Set the default archive format. Allowed values are: V7, OLDGNU,
+ USTAR, POSIX, GNU. Default is GNU
+ DEFAULT_ARCHIVE
+ Set the name of the default archive (default: -)
+ DEFAULT_BLOCKING
+ Define default blocking factor (default: 20)
+ DEFAULT_QUOTING_STYLE
+ Set the default quoting style. Allowed values are: literal,
+ shell, shell-always, c, escape, locale, clocale . Default is
+ "escape".
+
+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-tar@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" || continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+GNU tar configure 1.17
+generated by GNU Autoconf 2.60
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 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
+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 GNU tar $as_me 1.17, which was
+generated by GNU Autoconf 2.60. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$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
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_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
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); 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
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+ set x "$ac_default_prefix/share/config.site" \
+ "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ 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.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+ac_header_list="$ac_header_list fcntl.h"
+ac_header_list="$ac_header_list linux/fd.h"
+ac_header_list="$ac_header_list memory.h"
+ac_header_list="$ac_header_list net/errno.h"
+ac_header_list="$ac_header_list sgtty.h"
+ac_header_list="$ac_header_list string.h"
+ac_header_list="$ac_header_list stropts.h"
+ac_header_list="$ac_header_list sys/param.h"
+ac_header_list="$ac_header_list sys/device.h"
+ac_header_list="$ac_header_list sys/filio.h"
+ac_header_list="$ac_header_list sys/gentape.h"
+ac_header_list="$ac_header_list sys/inet.h"
+ac_header_list="$ac_header_list sys/io/trioctl.h"
+ac_header_list="$ac_header_list sys/mtio.h"
+ac_header_list="$ac_header_list sys/time.h"
+ac_header_list="$ac_header_list sys/tprintf.h"
+ac_header_list="$ac_header_list sys/tape.h"
+ac_header_list="$ac_header_list unistd.h"
+ac_header_list="$ac_header_list locale.h"
+ac_func_list="$ac_func_list flockfile"
+ac_func_list="$ac_func_list funlockfile"
+ac_header_list="$ac_header_list features.h"
+ac_header_list="$ac_header_list linewrap.h"
+ac_func_list="$ac_func_list pathconf"
+ac_func_list="$ac_func_list canonicalize_file_name"
+ac_func_list="$ac_func_list getcwd"
+ac_func_list="$ac_func_list readlink"
+ac_func_list="$ac_func_list dup2"
+ac_func_list="$ac_func_list fchdir"
+ac_header_list="$ac_header_list dirent.h"
+ac_header_list="$ac_header_list float.h"
+ac_func_list="$ac_func_list btowc"
+ac_func_list="$ac_func_list iswctype"
+ac_func_list="$ac_func_list mbsrtowcs"
+ac_func_list="$ac_func_list mempcpy"
+ac_func_list="$ac_func_list wmemchr"
+ac_func_list="$ac_func_list wmemcpy"
+ac_func_list="$ac_func_list wmempcpy"
+ac_header_list="$ac_header_list wctype.h"
+ac_header_list="$ac_header_list stdio_ext.h"
+ac_func_list="$ac_func_list ftruncate"
+ac_func_list="$ac_func_list gettimeofday"
+ac_func_list="$ac_func_list nanotime"
+ac_header_list="$ac_header_list stdint.h"
+ac_header_list="$ac_header_list inttypes.h"
+ac_func_list="$ac_func_list alarm"
+ac_func_list="$ac_func_list lchmod"
+ac_func_list="$ac_func_list fdopendir"
+ac_func_list="$ac_func_list mbsinit"
+ac_func_list="$ac_func_list mbrtowc"
+ac_func_list="$ac_func_list wcrtomb"
+ac_func_list="$ac_func_list wcscoll"
+ac_func_list="$ac_func_list setenv"
+ac_func_list="$ac_func_list sleep"
+ac_header_list="$ac_header_list stdio.h"
+ac_header_list="$ac_header_list stdlib.h"
+ac_func_list="$ac_func_list strerror"
+ac_func_list="$ac_func_list lstat"
+ac_header_list="$ac_header_list sys/stat.h"
+ac_header_list="$ac_header_list sysexits.h"
+ac_header_list="$ac_header_list time.h"
+ac_func_list="$ac_func_list pipe"
+ac_header_list="$ac_header_list priv.h"
+ac_header_list="$ac_header_list utime.h"
+ac_func_list="$ac_func_list futimes"
+ac_func_list="$ac_func_list futimesat"
+ac_func_list="$ac_func_list vasnprintf"
+ac_header_list="$ac_header_list wchar.h"
+ac_func_list="$ac_func_list iswcntrl"
+ac_func_list="$ac_func_list wcwidth"
+ac_header_list="$ac_header_list netdb.h"
+ac_header_list="$ac_header_list sys/wait.h"
+ac_func_list="$ac_func_list mkfifo"
+ac_func_list="$ac_func_list setlocale"
+gt_needs="$gt_needs need-formatstring-macros"
+# 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,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+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_aux_dir=
+for ac_dir in build-aux "$srcdir"/build-aux; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in build-aux \"$srcdir\"/build-aux" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in build-aux \"$srcdir\"/build-aux" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+ac_config_headers="$ac_config_headers config.h:config.hin"
+
+
+am__api_version='1.10a'
+
+# 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.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_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
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$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'
+
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+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 $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm -f conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+if test -z "$MKDIR_P"; then
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+done
+IFS=$as_save_IFS
+
+fi
+
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ test -d ./--version && rmdir ./--version
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+echo "${ECHO_T}$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+ [\\/$]* | ?:[\\/]*) ;;
+ */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+ SET_MAKE=
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+
+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
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+ 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='tar'
+ VERSION='1.17'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+
+# 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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&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"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+
+{ echo "$as_me:$LINENO: checking how to create a ustar tar archive" >&5
+echo $ECHO_N "checking how to create a ustar tar archive... $ECHO_C" >&6; }
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar plaintar pax cpio none'
+_am_tools=${am_cv_prog_tar_ustar-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ { echo "$as_me:$LINENO: $_am_tar --version" >&5
+ ($_am_tar --version) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && break
+ done
+ am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x ustar -w "$$tardir"'
+ am__tar_='pax -L -x ustar -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H ustar -L'
+ am__tar_='find "$tardir" -print | cpio -o -H ustar -L'
+ am__untar='cpio -i -H ustar -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_ustar}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
+ (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ { echo "$as_me:$LINENO: $am__untar <conftest.tar" >&5
+ ($am__untar <conftest.tar) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+if test "${am_cv_prog_tar_ustar+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ am_cv_prog_tar_ustar=$_am_tool
+fi
+
+{ echo "$as_me:$LINENO: result: $am_cv_prog_tar_ustar" >&5
+echo "${ECHO_T}$am_cv_prog_tar_ustar" >&6; }
+
+
+
+
+
+
+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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler --version >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler -v >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler -V >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out 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.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort. b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions. Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ CFLAGS=""
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_c89=$ac_arg
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+ xno)
+ { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC" am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ 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
+ 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 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} 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 sub/conftest.${OBJEXT-o} 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
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$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
+
+
+
+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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+for ac_prog in 'bison -y' byacc
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_YACC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$YACC"; then
+ ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_YACC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+YACC=$ac_cv_prog_YACC
+if test -n "$YACC"; then
+ { echo "$as_me:$LINENO: result: $YACC" >&5
+echo "${ECHO_T}$YACC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _GNU_SOURCE 1
+_ACEOF
+
+
+
+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
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&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+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f 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
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+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
+
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ { test -f "$ac_path_GREP" && $as_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
+ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ echo 'GREP' >> "conftest.nl"
+ "$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
+ ac_count=`expr $ac_count + 1`
+ 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
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ { test -f "$ac_path_EGREP" && $as_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
+ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ ac_count=`expr $ac_count + 1`
+ 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
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+
+{ echo "$as_me:$LINENO: checking for AIX" >&5
+echo $ECHO_N "checking for AIX... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef _AIX
+ yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+cat >>confdefs.h <<\_ACEOF
+#define _ALL_SOURCE 1
+_ACEOF
+
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+rm -f conftest*
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+ { echo "$as_me:$LINENO: checking for minix/config.h" >&5
+echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
+echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking minix/config.h usability" >&5
+echo $ECHO_N "checking minix/config.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <minix/config.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking minix/config.h presence" >&5
+echo $ECHO_N "checking minix/config.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <minix/config.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for minix/config.h" >&5
+echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_minix_config_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
+echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6; }
+
+fi
+if test $ac_cv_header_minix_config_h = yes; then
+ MINIX=yes
+else
+ MINIX=
+fi
+
+
+if test "$MINIX" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define _POSIX_SOURCE 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _POSIX_1_SOURCE 2
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _MINIX 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5
+echo $ECHO_N "checking whether it is safe to define __EXTENSIONS__... $ECHO_C" >&6; }
+if test "${ac_cv_safe_to_define___extensions__+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+# define __EXTENSIONS__ 1
+ $ac_includes_default
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_safe_to_define___extensions__=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_safe_to_define___extensions__=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5
+echo "${ECHO_T}$ac_cv_safe_to_define___extensions__" >&6; }
+ test $ac_cv_safe_to_define___extensions__ = yes &&
+ cat >>confdefs.h <<\_ACEOF
+#define __EXTENSIONS__ 1
+_ACEOF
+
+ cat >>confdefs.h <<\_ACEOF
+#define _POSIX_PTHREAD_SEMANTICS 1
+_ACEOF
+
+ cat >>confdefs.h <<\_ACEOF
+#define _TANDEM_SOURCE 1
+_ACEOF
+
+
+
+ case $ac_cv_prog_cc_stdc in
+ no) ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;;
+ *) { echo "$as_me:$LINENO: checking for $CC option to accept ISO C99" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C99... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c99+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+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 work.
+static void
+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;
+ float fnumber;
+
+ 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 = (float) va_arg(args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end(args_copy);
+ va_end(args);
+}
+
+int
+main ()
+{
+
+ // Check bool and long long datatypes.
+ _Bool success = false;
+ long long int bignum = -1234567890LL;
+ unsigned long long int ubignum = 1234567890uLL;
+
+ // Check restrict.
+ if (test_restrict("String literal") != 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ test_varargs("s, d' f .", "string", 65, 34.234);
+
+ // Check incomplete arrays work.
+ 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] = (double) i * 1.234;
+
+ // Check named initialisers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[43] = 543;
+
+ // work around unused variable warnings
+ return bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x';
+
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -c99 -qlanglvl=extc99
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_c99=$ac_arg
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+ x)
+ { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+ xno)
+ { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c99"
+ { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c99" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+else
+ { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_c89=$ac_arg
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+ xno)
+ { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+else
+ ac_cv_prog_cc_stdc=no
+fi
+
+
+fi
+
+ ;;
+esac
+ { echo "$as_me:$LINENO: checking for $CC option to accept ISO Standard C" >&5
+echo $ECHO_N "checking for $CC option to accept ISO Standard C... $ECHO_C" >&6; }
+ if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+
+ case $ac_cv_prog_cc_stdc in
+ no) { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+ '') { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+ *) { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5
+echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_largefile_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ CC="$CC -n32"
+ rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sys_largefile_CC=' -n32'; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_file_offset_bits+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ while :; do
+ ac_cv_sys_file_offset_bits=no
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sys_file_offset_bits=64; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ break
+done
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5
+echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6; }
+if test "$ac_cv_sys_file_offset_bits" != no; then
+
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+
+fi
+rm -f conftest*
+ { echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5
+echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_large_files+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ while :; do
+ ac_cv_sys_large_files=no
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sys_large_files=1; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ break
+done
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5
+echo "${ECHO_T}$ac_cv_sys_large_files" >&6; }
+if test "$ac_cv_sys_large_files" != no; then
+
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+
+fi
+rm -f conftest*
+fi
+
+
+ { echo "$as_me:$LINENO: checking for strerror in -lcposix" >&5
+echo $ECHO_N "checking for strerror in -lcposix... $ECHO_C" >&6; }
+if test "${ac_cv_lib_cposix_strerror+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcposix $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strerror ();
+int
+main ()
+{
+return strerror ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_cposix_strerror=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_cposix_strerror=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_cposix_strerror" >&5
+echo "${ECHO_T}$ac_cv_lib_cposix_strerror" >&6; }
+if test $ac_cv_lib_cposix_strerror = yes; then
+ LIBS="$LIBS -lcposix"
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6; }
+if test "${ac_cv_c_inline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_inline=$ac_kw
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$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
+
+
+
+
+
+
+for ac_header in $ac_header_list
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_header in sys/buf.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+{ echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_wait_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+
+int
+main ()
+{
+ int s;
+ wait (&s);
+ s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_sys_wait_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_sys_wait_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6; }
+if test $ac_cv_header_sys_wait_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_SYS_WAIT_H 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5
+echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdbool_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ #include <stdbool.h>
+ #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
+ #ifndef __bool_true_false_are_defined
+ "error: __bool_true_false_are_defined is not defined"
+ #endif
+
+ struct s { _Bool s: 1; _Bool t; } 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];
+ bool e = &s;
+ 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 };
+ _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];
+ #if defined __xlc__ || defined __GNUC__
+ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
+ reported by James Lemley on 2005-10-05; see
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
+ This test is not quite right, since xlc is allowed to
+ reject this program, as the initializer for xlcbug is
+ not one of the forms that C requires support for.
+ However, doing the test right would require a run-time
+ test, and that would make cross-compilation harder.
+ Let us hope that IBM fixes the xlc bug, and also adds
+ support for this kind of constant expression. In the
+ meantime, this test will reject xlc, which is OK, since
+ our stdbool.h substitute should suffice. We also test
+ this with GCC, where it should work, to detect more
+ quickly whether someone messes up the test in the
+ future. */
+ char digs[] = "0123456789";
+ int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
+ #endif
+ /* Catch a bug in an HP-UX C compiler. See
+ http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+ */
+ _Bool q = true;
+ _Bool *pq = &q;
+
+int
+main ()
+{
+
+ *pq |= q;
+ *pq |= ! 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);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdbool_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_stdbool_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5
+echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6; }
+ { echo "$as_me:$LINENO: checking for _Bool" >&5
+echo $ECHO_N "checking for _Bool... $ECHO_C" >&6; }
+if test "${ac_cv_type__Bool+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef _Bool ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type__Bool=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type__Bool=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5
+echo "${ECHO_T}$ac_cv_type__Bool" >&6; }
+if test $ac_cv_type__Bool = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE__BOOL 1
+_ACEOF
+
+
+fi
+
+ if test $ac_cv_header_stdbool_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STDBOOL_H 1
+_ACEOF
+
+ fi
+
+
+
+ # Define two additional variables used in the Makefile substitution.
+
+ if test "$ac_cv_header_stdbool_h" = yes; then
+ STDBOOL_H=''
+ else
+ STDBOOL_H='stdbool.h'
+ fi
+
+
+ if test "$ac_cv_type__Bool" = yes; then
+ HAVE__BOOL=1
+ else
+ HAVE__BOOL=0
+ fi
+
+
+
+
+
+
+
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5
+echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ { echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; }
+if test "${ac_cv_search_opendir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_opendir=$ac_res
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if test "${ac_cv_search_opendir+set}" = set; then
+ break
+fi
+done
+if test "${ac_cv_search_opendir+set}" = set; then
+ :
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+ { echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; }
+if test "${ac_cv_search_opendir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_opendir=$ac_res
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if test "${ac_cv_search_opendir+set}" = set; then
+ break
+fi
+done
+if test "${ac_cv_search_opendir+set}" = set; then
+ :
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+{ echo "$as_me:$LINENO: checking whether sys/types.h defines makedev" >&5
+echo $ECHO_N "checking whether sys/types.h defines makedev... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_types_h_makedev+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+int
+main ()
+{
+return makedev(0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_sys_types_h_makedev=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_sys_types_h_makedev=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_types_h_makedev" >&5
+echo "${ECHO_T}$ac_cv_header_sys_types_h_makedev" >&6; }
+
+if test $ac_cv_header_sys_types_h_makedev = no; then
+if test "${ac_cv_header_sys_mkdev_h+set}" = set; then
+ { echo "$as_me:$LINENO: checking for sys/mkdev.h" >&5
+echo $ECHO_N "checking for sys/mkdev.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_mkdev_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_mkdev_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_mkdev_h" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking sys/mkdev.h usability" >&5
+echo $ECHO_N "checking sys/mkdev.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <sys/mkdev.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking sys/mkdev.h presence" >&5
+echo $ECHO_N "checking sys/mkdev.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/mkdev.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: sys/mkdev.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sys/mkdev.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: sys/mkdev.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sys/mkdev.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sys/mkdev.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sys/mkdev.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: sys/mkdev.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/mkdev.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sys/mkdev.h: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for sys/mkdev.h" >&5
+echo $ECHO_N "checking for sys/mkdev.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_mkdev_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_sys_mkdev_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_mkdev_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_mkdev_h" >&6; }
+
+fi
+if test $ac_cv_header_sys_mkdev_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define MAJOR_IN_MKDEV 1
+_ACEOF
+
+fi
+
+
+
+ if test $ac_cv_header_sys_mkdev_h = no; then
+ if test "${ac_cv_header_sys_sysmacros_h+set}" = set; then
+ { echo "$as_me:$LINENO: checking for sys/sysmacros.h" >&5
+echo $ECHO_N "checking for sys/sysmacros.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_sysmacros_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_sysmacros_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_sysmacros_h" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking sys/sysmacros.h usability" >&5
+echo $ECHO_N "checking sys/sysmacros.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <sys/sysmacros.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking sys/sysmacros.h presence" >&5
+echo $ECHO_N "checking sys/sysmacros.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/sysmacros.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/sysmacros.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sys/sysmacros.h: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for sys/sysmacros.h" >&5
+echo $ECHO_N "checking for sys/sysmacros.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_sysmacros_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_sys_sysmacros_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_sysmacros_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_sysmacros_h" >&6; }
+
+fi
+if test $ac_cv_header_sys_sysmacros_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define MAJOR_IN_SYSMACROS 1
+_ACEOF
+
+fi
+
+
+ fi
+fi
+
+{ echo "$as_me:$LINENO: checking whether stat file-mode macros are broken" >&5
+echo $ECHO_N "checking whether stat file-mode macros are broken... $ECHO_C" >&6; }
+if test "${ac_cv_header_stat_broken+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined S_ISBLK && defined S_IFDIR
+# if S_ISBLK (S_IFDIR)
+You lose.
+# endif
+#endif
+
+#if defined S_ISBLK && defined S_IFCHR
+# if S_ISBLK (S_IFCHR)
+You lose.
+# endif
+#endif
+
+#if defined S_ISLNK && defined S_IFREG
+# if S_ISLNK (S_IFREG)
+You lose.
+# endif
+#endif
+
+#if defined S_ISSOCK && defined S_IFREG
+# if S_ISSOCK (S_IFREG)
+You lose.
+# endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "You lose" >/dev/null 2>&1; then
+ ac_cv_header_stat_broken=yes
+else
+ ac_cv_header_stat_broken=no
+fi
+rm -f conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stat_broken" >&5
+echo "${ECHO_T}$ac_cv_header_stat_broken" >&6; }
+if test $ac_cv_header_stat_broken = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STAT_MACROS_BROKEN 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking for st_fstype string in struct stat" >&5
+echo $ECHO_N "checking for st_fstype string in struct stat... $ECHO_C" >&6; }
+if test "${diff_cv_st_fstype_string+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/stat.h>
+int
+main ()
+{
+struct stat s; s.st_fstype[0] = 'x';
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ diff_cv_st_fstype_string=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ diff_cv_st_fstype_string=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+{ echo "$as_me:$LINENO: result: $diff_cv_st_fstype_string" >&5
+echo "${ECHO_T}$diff_cv_st_fstype_string" >&6; }
+if test $diff_cv_st_fstype_string = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ST_FSTYPE_STRING 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking return type of signal handlers" >&5
+echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6; }
+if test "${ac_cv_type_signal+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+return *(signal (0, 0)) (0) == 1;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_signal=int
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_signal=void
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5
+echo "${ECHO_T}$ac_cv_type_signal" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for mode_t" >&5
+echo $ECHO_N "checking for mode_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_mode_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef mode_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_mode_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_mode_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_mode_t" >&5
+echo "${ECHO_T}$ac_cv_type_mode_t" >&6; }
+if test $ac_cv_type_mode_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define mode_t int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for pid_t" >&5
+echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_pid_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef pid_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_pid_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_pid_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5
+echo "${ECHO_T}$ac_cv_type_pid_t" >&6; }
+if test $ac_cv_type_pid_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_off_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef off_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_off_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_off_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6; }
+if test $ac_cv_type_off_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef size_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_size_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6; }
+if test $ac_cv_type_size_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for uid_t in sys/types.h" >&5
+echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6; }
+if test "${ac_cv_type_uid_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+ ac_cv_type_uid_t=no
+fi
+rm -f conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uid_t" >&5
+echo "${ECHO_T}$ac_cv_type_uid_t" >&6; }
+if test $ac_cv_type_uid_t = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define uid_t int
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define gid_t int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for major_t" >&5
+echo $ECHO_N "checking for major_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_major_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef major_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_major_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_major_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_major_t" >&5
+echo "${ECHO_T}$ac_cv_type_major_t" >&6; }
+if test $ac_cv_type_major_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define major_t int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for minor_t" >&5
+echo $ECHO_N "checking for minor_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_minor_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef minor_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_minor_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_minor_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_minor_t" >&5
+echo "${ECHO_T}$ac_cv_type_minor_t" >&6; }
+if test $ac_cv_type_minor_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define minor_t int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for dev_t" >&5
+echo $ECHO_N "checking for dev_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_dev_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef dev_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_dev_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_dev_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_dev_t" >&5
+echo "${ECHO_T}$ac_cv_type_dev_t" >&6; }
+if test $ac_cv_type_dev_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define dev_t unsigned
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for ino_t" >&5
+echo $ECHO_N "checking for ino_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_ino_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef ino_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_ino_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_ino_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_ino_t" >&5
+echo "${ECHO_T}$ac_cv_type_ino_t" >&6; }
+if test $ac_cv_type_ino_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define ino_t unsigned
+_ACEOF
+
+fi
+
+
+
+ { echo "$as_me:$LINENO: checking for ssize_t" >&5
+echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6; }
+if test "${gt_cv_ssize_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+int
+main ()
+{
+int x = sizeof (ssize_t *) + sizeof (ssize_t);
+ return !x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_ssize_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_ssize_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_ssize_t" >&5
+echo "${ECHO_T}$gt_cv_ssize_t" >&6; }
+ if test $gt_cv_ssize_t = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ssize_t int
+_ACEOF
+
+ fi
+
+
+# gnulib modules
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+{ echo "$as_me:$LINENO: checking for working alloca.h" >&5
+echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; }
+if test "${ac_cv_working_alloca_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <alloca.h>
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+ if (p) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_working_alloca_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_working_alloca_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5
+echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA_H 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for alloca" >&5
+echo $ECHO_N "checking for alloca... $ECHO_C" >&6; }
+if test "${ac_cv_func_alloca_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int
+main ()
+{
+char *p = (char *) alloca (1);
+ if (p) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_alloca_works=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_func_alloca_works=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5
+echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; }
+
+if test $ac_cv_func_alloca_works = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA 1
+_ACEOF
+
+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
+
+cat >>confdefs.h <<\_ACEOF
+#define C_ALLOCA 1
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5
+echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; }
+if test "${ac_cv_os_cray+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if defined CRAY && ! defined CRAY2
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "webecray" >/dev/null 2>&1; then
+ ac_cv_os_cray=yes
+else
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5
+echo "${ECHO_T}$ac_cv_os_cray" >&6; }
+if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+ as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define CRAY_STACKSEG_END $ac_func
+_ACEOF
+
+ break
+fi
+
+ done
+fi
+
+{ echo "$as_me:$LINENO: checking stack direction for C alloca" >&5
+echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; }
+if test "${ac_cv_c_stack_direction+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+find_stack_direction ()
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+
+int
+main ()
+{
+ return find_stack_direction () < 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_stack_direction=1
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_stack_direction=-1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5
+echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+_ACEOF
+
+
+fi
+
+
+
+for ac_header in stdlib.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5
+echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6; }
+if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_malloc_0_nonnull=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if STDC_HEADERS || HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+char *malloc ();
+#endif
+
+int
+main ()
+{
+return ! malloc (0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_malloc_0_nonnull=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+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.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5
+echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6; }
+if test $ac_cv_func_malloc_0_nonnull = yes; then
+ gl_cv_func_malloc_0_nonnull=1
+else
+ gl_cv_func_malloc_0_nonnull=0
+fi
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define MALLOC_0_IS_NONNULL $gl_cv_func_malloc_0_nonnull
+_ACEOF
+
+
+
+ { echo "$as_me:$LINENO: checking for long long int" >&5
+echo $ECHO_N "checking for long long int... $ECHO_C" >&6; }
+if test "${ac_cv_type_long_long_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+long long int ll = 9223372036854775807ll;
+ long long int nll = -9223372036854775807LL;
+ typedef int a[((-9223372036854775807LL < 0
+ && 0 < 9223372036854775807ll)
+ ? 1 : -1)];
+ int i = 63;
+int
+main ()
+{
+long long int llmax = 9223372036854775807ll;
+ return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+ | (llmax / ll) | (llmax % ll));
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ if test "$cross_compiling" = yes; then
+ ac_cv_type_long_long_int=yes
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <limits.h>
+ #ifndef LLONG_MAX
+ # define HALF \
+ (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+ # define LLONG_MAX (HALF - 1 + HALF)
+ #endif
+int
+main ()
+{
+long long int n = 1;
+ int i;
+ for (i = 0; ; i++)
+ {
+ long long int m = n << i;
+ if (m >> i != n)
+ return 1;
+ if (LLONG_MAX / 2 < m)
+ break;
+ }
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long_long_int=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_type_long_long_int=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_long_long_int=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long_long_int" >&5
+echo "${ECHO_T}$ac_cv_type_long_long_int" >&6; }
+ if test $ac_cv_type_long_long_int = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LONG_LONG_INT 1
+_ACEOF
+
+ fi
+
+{ echo "$as_me:$LINENO: checking for C/C++ restrict keyword" >&5
+echo $ECHO_N "checking for C/C++ restrict keyword... $ECHO_C" >&6; }
+if test "${ac_cv_c_restrict+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_restrict=no
+ # Try the official restrict keyword, then gcc's __restrict, and
+ # the less common variants.
+ for ac_kw in restrict __restrict __restrict__ _Restrict; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+typedef int * int_ptr;
+ int foo (int_ptr $ac_kw ip) {
+ return ip[0];
+ }
+int
+main ()
+{
+int s[1];
+ int * $ac_kw t = s;
+ t[0] = 0;
+ return foo(t)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_restrict=$ac_kw
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test "$ac_cv_c_restrict" != no && break
+ done
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_restrict" >&5
+echo "${ECHO_T}$ac_cv_c_restrict" >&6; }
+ case $ac_cv_c_restrict in
+ restrict) ;;
+ no)
+cat >>confdefs.h <<\_ACEOF
+#define restrict
+_ACEOF
+ ;;
+ *) cat >>confdefs.h <<_ACEOF
+#define restrict $ac_cv_c_restrict
+_ACEOF
+ ;;
+ esac
+
+{ echo "$as_me:$LINENO: checking whether getenv is declared" >&5
+echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getenv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef getenv
+ char *p = (char *) getenv;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getenv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_getenv=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6; }
+if test $ac_cv_have_decl_getenv = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether clearerr_unlocked is declared" >&5
+echo $ECHO_N "checking whether clearerr_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_clearerr_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef clearerr_unlocked
+ char *p = (char *) clearerr_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_clearerr_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_clearerr_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_clearerr_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_clearerr_unlocked" >&6; }
+if test $ac_cv_have_decl_clearerr_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_CLEARERR_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_CLEARERR_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether feof_unlocked is declared" >&5
+echo $ECHO_N "checking whether feof_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_feof_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef feof_unlocked
+ char *p = (char *) feof_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_feof_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_feof_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_feof_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_feof_unlocked" >&6; }
+if test $ac_cv_have_decl_feof_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FEOF_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FEOF_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether ferror_unlocked is declared" >&5
+echo $ECHO_N "checking whether ferror_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_ferror_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef ferror_unlocked
+ char *p = (char *) ferror_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_ferror_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_ferror_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ferror_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ferror_unlocked" >&6; }
+if test $ac_cv_have_decl_ferror_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FERROR_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FERROR_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether fflush_unlocked is declared" >&5
+echo $ECHO_N "checking whether fflush_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fflush_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef fflush_unlocked
+ char *p = (char *) fflush_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fflush_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_fflush_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fflush_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fflush_unlocked" >&6; }
+if test $ac_cv_have_decl_fflush_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FFLUSH_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FFLUSH_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether fgets_unlocked is declared" >&5
+echo $ECHO_N "checking whether fgets_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fgets_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef fgets_unlocked
+ char *p = (char *) fgets_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fgets_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_fgets_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fgets_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fgets_unlocked" >&6; }
+if test $ac_cv_have_decl_fgets_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FGETS_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FGETS_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether fputc_unlocked is declared" >&5
+echo $ECHO_N "checking whether fputc_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fputc_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef fputc_unlocked
+ char *p = (char *) fputc_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fputc_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_fputc_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputc_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fputc_unlocked" >&6; }
+if test $ac_cv_have_decl_fputc_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FPUTC_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FPUTC_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether fputs_unlocked is declared" >&5
+echo $ECHO_N "checking whether fputs_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fputs_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef fputs_unlocked
+ char *p = (char *) fputs_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fputs_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_fputs_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputs_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fputs_unlocked" >&6; }
+if test $ac_cv_have_decl_fputs_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FPUTS_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FPUTS_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether fread_unlocked is declared" >&5
+echo $ECHO_N "checking whether fread_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fread_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef fread_unlocked
+ char *p = (char *) fread_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fread_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_fread_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fread_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fread_unlocked" >&6; }
+if test $ac_cv_have_decl_fread_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FREAD_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FREAD_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether fwrite_unlocked is declared" >&5
+echo $ECHO_N "checking whether fwrite_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fwrite_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef fwrite_unlocked
+ char *p = (char *) fwrite_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fwrite_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_fwrite_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fwrite_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fwrite_unlocked" >&6; }
+if test $ac_cv_have_decl_fwrite_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FWRITE_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FWRITE_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether getc_unlocked is declared" >&5
+echo $ECHO_N "checking whether getc_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getc_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef getc_unlocked
+ char *p = (char *) getc_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getc_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_getc_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getc_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getc_unlocked" >&6; }
+if test $ac_cv_have_decl_getc_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETC_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETC_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether getchar_unlocked is declared" >&5
+echo $ECHO_N "checking whether getchar_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getchar_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef getchar_unlocked
+ char *p = (char *) getchar_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getchar_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_getchar_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getchar_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getchar_unlocked" >&6; }
+if test $ac_cv_have_decl_getchar_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETCHAR_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETCHAR_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether putc_unlocked is declared" >&5
+echo $ECHO_N "checking whether putc_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_putc_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef putc_unlocked
+ char *p = (char *) putc_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_putc_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_putc_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_putc_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_putc_unlocked" >&6; }
+if test $ac_cv_have_decl_putc_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PUTC_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PUTC_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether putchar_unlocked is declared" >&5
+echo $ECHO_N "checking whether putchar_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_putchar_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef putchar_unlocked
+ char *p = (char *) putchar_unlocked;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_putchar_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_putchar_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_putchar_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_putchar_unlocked" >&6; }
+if test $ac_cv_have_decl_putchar_unlocked = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PUTCHAR_UNLOCKED 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PUTCHAR_UNLOCKED 0
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+for ac_func in $ac_func_list
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking for d_ino member in directory struct" >&5
+echo $ECHO_N "checking for d_ino member in directory struct... $ECHO_C" >&6; }
+if test "${gl_cv_struct_dirent_d_ino+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ gl_cv_struct_dirent_d_ino=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+ #include <dirent.h>
+
+int
+main ()
+{
+DIR *dp = opendir (".");
+ struct dirent *e;
+ struct stat st;
+ if (! dp)
+ return 1;
+ e = readdir (dp);
+ return ! (e
+ && stat (e->d_name, &st) == 0
+ && e->d_ino == st.st_ino);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_struct_dirent_d_ino=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+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.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_struct_dirent_d_ino" >&5
+echo "${ECHO_T}$gl_cv_struct_dirent_d_ino" >&6; }
+ if test $gl_cv_struct_dirent_d_ino = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define D_INO_IN_DIRENT 1
+_ACEOF
+
+ fi
+
+
+
+ { echo "$as_me:$LINENO: checking whether system is Windows or MSDOS" >&5
+echo $ECHO_N "checking whether system is Windows or MSDOS... $ECHO_C" >&6; }
+if test "${ac_cv_win_or_dos+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__
+neither MSDOS nor Windows
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_win_or_dos=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_win_or_dos=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_win_or_dos" >&5
+echo "${ECHO_T}$ac_cv_win_or_dos" >&6; }
+
+ if test x"$ac_cv_win_or_dos" = xyes; then
+ ac_fs_accepts_drive_letter_prefix=1
+ ac_fs_backslash_is_file_name_separator=1
+ { echo "$as_me:$LINENO: checking whether drive letter can start relative path" >&5
+echo $ECHO_N "checking whether drive letter can start relative path... $ECHO_C" >&6; }
+if test "${ac_cv_drive_letter_can_be_relative+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#if defined __CYGWIN__
+drive letters are always absolute
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_drive_letter_can_be_relative=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_drive_letter_can_be_relative=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_drive_letter_can_be_relative" >&5
+echo "${ECHO_T}$ac_cv_drive_letter_can_be_relative" >&6; }
+ if test x"$ac_cv_drive_letter_can_be_relative" = xyes; then
+ ac_fs_drive_letter_can_be_relative=1
+ else
+ ac_fs_drive_letter_can_be_relative=0
+ fi
+ else
+ ac_fs_accepts_drive_letter_prefix=0
+ ac_fs_backslash_is_file_name_separator=0
+ ac_fs_drive_letter_can_be_relative=0
+ fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX $ac_fs_accepts_drive_letter_prefix
+_ACEOF
+
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR $ac_fs_backslash_is_file_name_separator
+_ACEOF
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE $ac_fs_drive_letter_can_be_relative
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for long file names" >&5
+echo $ECHO_N "checking for long file names... $ECHO_C" >&6; }
+if test "${ac_cv_sys_long_file_names+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_sys_long_file_names=yes
+# Test for long file names in all the places we know might matter:
+# . the current directory, where building will happen
+# $prefix/lib where we will be installing things
+# $exec_prefix/lib likewise
+# $TMPDIR if set, where it might want to write temporary files
+# /tmp where it might want to write temporary files
+# /var/tmp likewise
+# /usr/tmp likewise
+for ac_dir in . "$TMPDIR" /tmp /var/tmp /usr/tmp "$prefix/lib" "$exec_prefix/lib"; do
+ # Skip $TMPDIR if it is empty or bogus, and skip $exec_prefix/lib
+ # in the usual case where exec_prefix is '${prefix}'.
+ case $ac_dir in #(
+ . | /* | ?:[\\/]*) ;; #(
+ *) continue;;
+ esac
+ test -w "$ac_dir/." || continue # It is less confusing to not echo anything here.
+ ac_xdir=$ac_dir/cf$$
+ (umask 077 && mkdir "$ac_xdir" 2>/dev/null) || continue
+ ac_tf1=$ac_xdir/conftest9012345
+ ac_tf2=$ac_xdir/conftest9012346
+ touch "$ac_tf1" 2>/dev/null && test -f "$ac_tf1" && test ! -f "$ac_tf2" ||
+ ac_cv_sys_long_file_names=no
+ rm -f -r "$ac_xdir" 2>/dev/null
+ test $ac_cv_sys_long_file_names = no && break
+done
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_long_file_names" >&5
+echo "${ECHO_T}$ac_cv_sys_long_file_names" >&6; }
+if test $ac_cv_sys_long_file_names = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LONG_FILE_NAMES 1
+_ACEOF
+
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking whether canonicalize_file_name is declared" >&5
+echo $ECHO_N "checking whether canonicalize_file_name is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_canonicalize_file_name+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef canonicalize_file_name
+ char *p = (char *) canonicalize_file_name;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_canonicalize_file_name=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_canonicalize_file_name=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_canonicalize_file_name" >&5
+echo "${ECHO_T}$ac_cv_have_decl_canonicalize_file_name" >&6; }
+if test $ac_cv_have_decl_canonicalize_file_name = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_CANONICALIZE_FILE_NAME 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_CANONICALIZE_FILE_NAME 0
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+
+
+
+ GNULIB_CHOWN=0;
+ GNULIB_DUP2=0;
+ GNULIB_FCHDIR=0;
+ GNULIB_FTRUNCATE=0;
+ GNULIB_GETCWD=0;
+ GNULIB_GETLOGIN_R=0;
+ GNULIB_LSEEK=0;
+ GNULIB_READLINK=0;
+ GNULIB_SLEEP=0;
+ HAVE_DUP2=1;
+ HAVE_FTRUNCATE=1;
+ HAVE_READLINK=1;
+ HAVE_SLEEP=1;
+ HAVE_DECL_GETLOGIN_R=1;
+ REPLACE_CHOWN=0;
+ REPLACE_FCHDIR=0;
+ REPLACE_GETCWD=0;
+ REPLACE_LSEEK=0;
+
+
+for ac_header in unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ echo "$as_me:$LINENO: checking for working chown" >&5
+echo $ECHO_N "checking for working chown... $ECHO_C" >&6; }
+if test "${ac_cv_func_chown_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_chown_works=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <fcntl.h>
+
+int
+main ()
+{
+ char *f = "conftest.chown";
+ struct stat before, after;
+
+ if (creat (f, 0600) < 0)
+ return 1;
+ if (stat (f, &before) < 0)
+ return 1;
+ if (chown (f, (uid_t) -1, (gid_t) -1) == -1)
+ return 1;
+ if (stat (f, &after) < 0)
+ return 1;
+ return ! (before.st_uid == after.st_uid && before.st_gid == after.st_gid);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_chown_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_chown_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+rm -f conftest.chown
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_chown_works" >&5
+echo "${ECHO_T}$ac_cv_func_chown_works" >&6; }
+if test $ac_cv_func_chown_works = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_CHOWN 1
+_ACEOF
+
+fi
+
+
+ { echo "$as_me:$LINENO: checking whether chown(2) dereferences symlinks" >&5
+echo $ECHO_N "checking whether chown(2) dereferences symlinks... $ECHO_C" >&6; }
+if test "${gl_cv_func_chown_follows_symlink+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ if test "$cross_compiling" = yes; then
+ gl_cv_func_chown_follows_symlink=yes
+
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+ int
+ main ()
+ {
+ char const *dangling_symlink = "conftest.dangle";
+
+ unlink (dangling_symlink);
+ if (symlink ("conftest.no-such", dangling_symlink))
+ abort ();
+
+ /* Exit successfully on a conforming system,
+ i.e., where chown must fail with ENOENT. */
+ exit ( ! (chown (dangling_symlink, getuid (), getgid ()) != 0
+ && errno == ENOENT));
+ }
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_chown_follows_symlink=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gl_cv_func_chown_follows_symlink=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_chown_follows_symlink" >&5
+echo "${ECHO_T}$gl_cv_func_chown_follows_symlink" >&6; }
+
+ if test $gl_cv_func_chown_follows_symlink = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CHOWN_MODIFIES_SYMLINK 1
+_ACEOF
+
+ fi
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+ { (exit 1); exit 1; }; };;
+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
+
+
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+ { (exit 1); exit 1; }; };;
+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
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether // is distinct from /" >&5
+echo $ECHO_N "checking whether // is distinct from /... $ECHO_C" >&6; }
+if test "${gl_cv_double_slash_root+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ 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 / //`
+ 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
+{ echo "$as_me:$LINENO: result: $gl_cv_double_slash_root" >&5
+echo "${ECHO_T}$gl_cv_double_slash_root" >&6; }
+ if test "$gl_cv_double_slash_root" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1
+_ACEOF
+
+ fi
+
+
+
+{ echo "$as_me:$LINENO: checking whether strerror_r is declared" >&5
+echo $ECHO_N "checking whether strerror_r is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strerror_r+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strerror_r
+ char *p = (char *) strerror_r;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strerror_r=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_strerror_r=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror_r" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strerror_r" >&6; }
+if test $ac_cv_have_decl_strerror_r = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRERROR_R 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRERROR_R 0
+_ACEOF
+
+
+fi
+
+
+
+for ac_func in strerror_r
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+{ echo "$as_me:$LINENO: checking whether strerror_r returns char *" >&5
+echo $ECHO_N "checking whether strerror_r returns char *... $ECHO_C" >&6; }
+if test "${ac_cv_func_strerror_r_char_p+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ ac_cv_func_strerror_r_char_p=no
+ if test $ac_cv_have_decl_strerror_r = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ 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
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_strerror_r_char_p=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ else
+ # strerror_r is not declared. Choose between
+ # systems that have relatively inaccessible declarations for the
+ # function. BeOS and DEC UNIX 4.0 fall in this category, but the
+ # former has a strerror_r that returns char*, while the latter
+ # has a strerror_r that returns `int'.
+ # This test should segfault on the DEC system.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ extern char *strerror_r ();
+int
+main ()
+{
+char buf[100];
+ char x = *strerror_r (0, buf, sizeof buf);
+ return ! isalpha (x);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_strerror_r_char_p=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_strerror_r_char_p" >&5
+echo "${ECHO_T}$ac_cv_func_strerror_r_char_p" >&6; }
+if test $ac_cv_func_strerror_r_char_p = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STRERROR_R_CHAR_P 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking for mbstate_t" >&5
+echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_mbstate_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+# include <wchar.h>
+int
+main ()
+{
+mbstate_t x; return sizeof x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_mbstate_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_mbstate_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_mbstate_t" >&5
+echo "${ECHO_T}$ac_cv_type_mbstate_t" >&6; }
+ if test $ac_cv_type_mbstate_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MBSTATE_T 1
+_ACEOF
+
+ else
+
+cat >>confdefs.h <<\_ACEOF
+#define mbstate_t int
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether getcwd (NULL, 0) allocates memory for result" >&5
+echo $ECHO_N "checking whether getcwd (NULL, 0) allocates memory for result... $ECHO_C" >&6; }
+if test "${gl_cv_func_getcwd_null+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ gl_cv_func_getcwd_null=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+# include <stdlib.h>
+# include <unistd.h>
+# ifndef getcwd
+ char *getcwd ();
+# endif
+ int
+ main ()
+ {
+ if (chdir ("/") != 0)
+ exit (1);
+ else
+ {
+ char *f = getcwd (NULL, 0);
+ exit (! (f && f[0] == '/' && !f[1]));
+ }
+ }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_getcwd_null=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gl_cv_func_getcwd_null=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_getcwd_null" >&5
+echo "${ECHO_T}$gl_cv_func_getcwd_null" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether getcwd is declared" >&5
+echo $ECHO_N "checking whether getcwd is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getcwd+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef getcwd
+ char *p = (char *) getcwd;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getcwd=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_getcwd=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getcwd" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getcwd" >&6; }
+if test $ac_cv_have_decl_getcwd = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETCWD 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETCWD 0
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+ # getdate.y works with bison only.
+ : ${YACC='bison -y'}
+
+
+ { echo "$as_me:$LINENO: checking for compound literals" >&5
+echo $ECHO_N "checking for compound literals... $ECHO_C" >&6; }
+if test "${gl_cv_compound_literals+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+struct s { int i, j; }; struct s s = (struct s) { 1, 2 };
+int
+main ()
+{
+struct s t = (struct s) { 3, 4 };
+ if (t.i != 0) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_compound_literals=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_compound_literals=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_compound_literals" >&5
+echo "${ECHO_T}$gl_cv_compound_literals" >&6; }
+ if test $gl_cv_compound_literals = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_COMPOUND_LITERALS 1
+_ACEOF
+
+ fi
+
+{ echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5
+echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6; }
+if test "${ac_cv_struct_tm+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <time.h>
+
+int
+main ()
+{
+struct tm *tp; tp->tm_sec;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_struct_tm=time.h
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_struct_tm=sys/time.h
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5
+echo "${ECHO_T}$ac_cv_struct_tm" >&6; }
+if test $ac_cv_struct_tm = sys/time.h; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TM_IN_SYS_TIME 1
+_ACEOF
+
+fi
+
+
+ { echo "$as_me:$LINENO: checking for struct tm.tm_gmtoff" >&5
+echo $ECHO_N "checking for struct tm.tm_gmtoff... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_tm_tm_gmtoff+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <time.h>
+
+int
+main ()
+{
+static struct tm ac_aggr;
+if (ac_aggr.tm_gmtoff)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_tm_tm_gmtoff=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <time.h>
+
+int
+main ()
+{
+static struct tm ac_aggr;
+if (sizeof ac_aggr.tm_gmtoff)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_tm_tm_gmtoff=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_tm_tm_gmtoff=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_tm_tm_gmtoff" >&5
+echo "${ECHO_T}$ac_cv_member_struct_tm_tm_gmtoff" >&6; }
+if test $ac_cv_member_struct_tm_tm_gmtoff = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TM_GMTOFF 1
+_ACEOF
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether getdelim is declared" >&5
+echo $ECHO_N "checking whether getdelim is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getdelim+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef getdelim
+ char *p = (char *) getdelim;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getdelim=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_getdelim=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getdelim" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getdelim" >&6; }
+if test $ac_cv_have_decl_getdelim = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETDELIM 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETDELIM 0
+_ACEOF
+
+
+fi
+
+
+
+ if test -z "$GETOPT_H"; then
+
+for ac_header in getopt.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ GETOPT_H=getopt.h
+fi
+
+done
+
+ fi
+
+ if test -z "$GETOPT_H"; then
+
+for ac_func in getopt_long_only
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ GETOPT_H=getopt.h
+fi
+done
+
+ fi
+
+ if test -z "$GETOPT_H"; then
+ { echo "$as_me:$LINENO: checking whether optreset is declared" >&5
+echo $ECHO_N "checking whether optreset is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_optreset+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <getopt.h>
+
+int
+main ()
+{
+#ifndef optreset
+ char *p = (char *) optreset;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_optreset=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_optreset=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_optreset" >&5
+echo "${ECHO_T}$ac_cv_have_decl_optreset" >&6; }
+if test $ac_cv_have_decl_optreset = yes; then
+ GETOPT_H=getopt.h
+fi
+
+ fi
+
+ if test -z "$GETOPT_H"; then
+ { echo "$as_me:$LINENO: checking for working GNU getopt function" >&5
+echo $ECHO_N "checking for working GNU getopt function... $ECHO_C" >&6; }
+if test "${gl_cv_func_gnu_getopt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: checking whether getopt_clip is declared" >&5
+echo $ECHO_N "checking whether getopt_clip is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getopt_clip+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <getopt.h>
+
+int
+main ()
+{
+#ifndef getopt_clip
+ char *p = (char *) getopt_clip;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getopt_clip=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_getopt_clip=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getopt_clip" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getopt_clip" >&6; }
+if test $ac_cv_have_decl_getopt_clip = yes; then
+ gl_cv_func_gnu_getopt=no
+else
+ gl_cv_func_gnu_getopt=yes
+fi
+
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <getopt.h>
+int
+main ()
+{
+
+ char *myargv[3];
+ myargv[0] = "conftest";
+ myargv[1] = "-+";
+ myargv[2] = 0;
+ return getopt (2, myargv, "+a") != '?';
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_gnu_getopt=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gl_cv_func_gnu_getopt=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_gnu_getopt" >&5
+echo "${ECHO_T}$gl_cv_func_gnu_getopt" >&6; }
+ if test "$gl_cv_func_gnu_getopt" = "no"; then
+ GETOPT_H=getopt.h
+ fi
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_header_sys_time_h = yes; then
+ { echo "$as_me:$LINENO: checking absolute name of <sys/time.h>" >&5
+echo $ECHO_N "checking absolute name of <sys/time.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_sys_time_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_sys_time_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/time.h>
+_ACEOF
+ gl_cv_absolute_sys_time_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/sys/time.h#{s#.*"\(.*/sys/time.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_sys_time_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_sys_time_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_SYS_TIME_H "$gl_cv_absolute_sys_time_h"
+_ACEOF
+
+
+ ABSOLUTE_SYS_TIME_H=\"$gl_cv_absolute_sys_time_h\"
+ HAVE_SYS_TIME_H=1
+ else
+ ABSOLUTE_SYS_TIME_H=\"no/such/file/sys/time.h\"
+ HAVE_SYS_TIME_H=0
+ fi
+
+
+
+ { echo "$as_me:$LINENO: checking for struct timeval" >&5
+echo $ECHO_N "checking for struct timeval... $ECHO_C" >&6; }
+if test "${gl_cv_sys_struct_timeval+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+
+int
+main ()
+{
+static struct timeval x; x.tv_sec = x.tv_usec;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_sys_struct_timeval=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_sys_struct_timeval=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_sys_struct_timeval" >&5
+echo "${ECHO_T}$gl_cv_sys_struct_timeval" >&6; }
+ if test $gl_cv_sys_struct_timeval = yes; then
+ HAVE_STRUCT_TIMEVAL=1
+ else
+ HAVE_STRUCT_TIMEVAL=0
+ fi
+
+
+ REPLACE_GETTIMEOFDAY=0
+
+ if test $HAVE_SYS_TIME_H = 0 || test $HAVE_STRUCT_TIMEVAL = 0; then
+ SYS_TIME_H=sys/time.h
+ else
+ SYS_TIME_H=
+ fi
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for unsigned long long int" >&5
+echo $ECHO_N "checking for unsigned long long int... $ECHO_C" >&6; }
+if test "${ac_cv_type_unsigned_long_long_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+unsigned long long int ull = 18446744073709551615ULL;
+ typedef int a[(18446744073709551615ULL <= (unsigned long long int) -1
+ ? 1 : -1)];
+ int i = 63;
+int
+main ()
+{
+unsigned long long int ullmax = 18446744073709551615ull;
+ return (ull << 63 | ull >> 63 | ull << i | ull >> i
+ | ullmax / ull | ullmax % ull);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_unsigned_long_long_int=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_unsigned_long_long_int=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long_int" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long_long_int" >&6; }
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_UNSIGNED_LONG_LONG_INT 1
+_ACEOF
+
+ fi
+
+
+
+
+
+
+ if test $ac_cv_type_long_long_int = yes; then
+ HAVE_LONG_LONG_INT=1
+ else
+ HAVE_LONG_LONG_INT=0
+ fi
+
+
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ HAVE_UNSIGNED_LONG_LONG_INT=1
+ else
+ HAVE_UNSIGNED_LONG_LONG_INT=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 $ac_cv_header_stdint_h = yes; then
+ { echo "$as_me:$LINENO: checking absolute name of <stdint.h>" >&5
+echo $ECHO_N "checking absolute name of <stdint.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_stdint_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_stdint_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdint.h>
+_ACEOF
+ gl_cv_absolute_stdint_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/stdint.h#{s#.*"\(.*/stdint.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_stdint_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_stdint_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_STDINT_H "$gl_cv_absolute_stdint_h"
+_ACEOF
+
+
+ ABSOLUTE_STDINT_H=\"$gl_cv_absolute_stdint_h\"
+ HAVE_STDINT_H=1
+ else
+ ABSOLUTE_STDINT_H=\"no/such/file/stdint.h\"
+ HAVE_STDINT_H=0
+ fi
+
+
+
+ if test $ac_cv_header_stdint_h = yes; then
+ { echo "$as_me:$LINENO: checking whether stdint.h conforms to C99" >&5
+echo $ECHO_N "checking whether stdint.h conforms to C99... $ECHO_C" >&6; }
+if test "${gl_cv_header_working_stdint_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gl_cv_header_working_stdint_h=no
+ cat >conftest.$ac_ext <<_ACEOF
+
+ /* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
+#include ABSOLUTE_STDINT_H
+#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;
+struct s {
+ int check_PTRDIFF: PTRDIFF_MIN < (ptrdiff_t) 0 && (ptrdiff_t) 0 < PTRDIFF_MAX ? 1 : -1;
+ int check_SIG_ATOMIC: SIG_ATOMIC_MIN <= (sig_atomic_t) 0 && (sig_atomic_t) 0 < SIG_ATOMIC_MAX ? 1 : -1;
+ int check_SIZE: (size_t) 0 < SIZE_MAX ? 1 : -1;
+ int check_WCHAR: WCHAR_MIN <= (wchar_t) 0 && (wchar_t) 0 < WCHAR_MAX ? 1 : -1;
+ int check_WINT: WINT_MIN <= (wint_t) 0 && (wint_t) 0 < WINT_MAX
+ && (WINT_MIN < (wint_t) 0 || (wint_t) -1 == (wint_t) WINT_MAX)
+ ? 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 ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_header_working_stdint_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_header_working_stdint_h" >&5
+echo "${ECHO_T}$gl_cv_header_working_stdint_h" >&6; }
+ fi
+ if test "$gl_cv_header_working_stdint_h" = yes; then
+ STDINT_H=
+ else
+
+
+for ac_header in sys/inttypes.h sys/bitypes.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ if test $ac_cv_header_sys_inttypes_h = yes; then
+ HAVE_SYS_INTTYPES_H=1
+ else
+ HAVE_SYS_INTTYPES_H=0
+ fi
+
+ if test $ac_cv_header_sys_bitypes_h = yes; then
+ HAVE_SYS_BITYPES_H=1
+ else
+ HAVE_SYS_BITYPES_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+ for gltype in ptrdiff_t sig_atomic_t size_t wchar_t wint_t ; do
+ { echo "$as_me:$LINENO: checking for bit size of $gltype" >&5
+echo $ECHO_N "checking for bit size of $gltype... $ECHO_C" >&6; }
+if { as_var=gl_cv_bitsizeof_${gltype}; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) result=$ac_lo;;
+'') result=unknown ;;
+esac
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+static long int longval () { return sizeof ($gltype) * CHAR_BIT; }
+static unsigned long int ulongval () { return sizeof ($gltype) * CHAR_BIT; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if ((sizeof ($gltype) * CHAR_BIT) < 0)
+ {
+ long int i = longval ();
+ if (i != (sizeof ($gltype) * CHAR_BIT))
+ return 1;
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != (sizeof ($gltype) * CHAR_BIT))
+ return 1;
+ fprintf (f, "%lu\n", i);
+ }
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ result=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+result=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+ eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+ac_res=`eval echo '${'gl_cv_bitsizeof_${gltype}'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+ eval result=\$gl_cv_bitsizeof_${gltype}
+ if test $result = unknown; then
+ result=0
+ fi
+ GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ cat >>confdefs.h <<_ACEOF
+#define BITSIZEOF_${GLTYPE} $result
+_ACEOF
+
+ eval BITSIZEOF_${GLTYPE}=\$result
+ done
+
+
+
+
+
+
+
+ for gltype in sig_atomic_t wchar_t wint_t ; do
+ { echo "$as_me:$LINENO: checking whether $gltype is signed" >&5
+echo $ECHO_N "checking whether $gltype is signed... $ECHO_C" >&6; }
+if { as_var=gl_cv_type_${gltype}_signed; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ result=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ result=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ eval gl_cv_type_${gltype}_signed=\$result
+
+fi
+ac_res=`eval echo '${'gl_cv_type_${gltype}_signed'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+ eval result=\$gl_cv_type_${gltype}_signed
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ if test "$result" = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SIGNED_${GLTYPE} 1
+_ACEOF
+
+ 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
+
+
+
+
+
+
+
+ for gltype in ptrdiff_t sig_atomic_t size_t wchar_t wint_t ; do
+ { echo "$as_me:$LINENO: checking for $gltype integer literal suffix" >&5
+echo $ECHO_N "checking for $gltype integer literal suffix... $ECHO_C" >&6; }
+if { as_var=gl_cv_type_${gltype}_suffix; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+ extern $gltype foo;
+ extern $gltype1 foo;
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval gl_cv_type_${gltype}_suffix=\$glsuf
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" != no && break
+ done
+fi
+ac_res=`eval echo '${'gl_cv_type_${gltype}_suffix'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" = no && result=
+ eval ${GLTYPE}_SUFFIX=\$result
+ cat >>confdefs.h <<_ACEOF
+#define ${GLTYPE}_SUFFIX $result
+_ACEOF
+
+ done
+
+
+
+ STDINT_H=stdint.h
+ fi
+
+
+
+
+for ac_header in inttypes.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ if test $ac_cv_header_inttypes_h = yes; then
+ { echo "$as_me:$LINENO: checking whether the inttypes.h PRIxNN macros are broken" >&5
+echo $ECHO_N "checking whether the inttypes.h PRIxNN macros are broken... $ECHO_C" >&6; }
+if test "${gt_cv_inttypes_pri_broken+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_inttypes_pri_broken=no
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_inttypes_pri_broken=yes
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_inttypes_pri_broken" >&5
+echo "${ECHO_T}$gt_cv_inttypes_pri_broken" >&6; }
+ fi
+ if test "$gt_cv_inttypes_pri_broken" = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define PRI_MACROS_BROKEN 1
+_ACEOF
+
+ PRI_MACROS_BROKEN=1
+ else
+ PRI_MACROS_BROKEN=0
+ fi
+
+
+{ echo "$as_me:$LINENO: checking whether imaxabs is declared" >&5
+echo $ECHO_N "checking whether imaxabs is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_imaxabs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef imaxabs
+ char *p = (char *) imaxabs;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_imaxabs=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_imaxabs=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_imaxabs" >&5
+echo "${ECHO_T}$ac_cv_have_decl_imaxabs" >&6; }
+if test $ac_cv_have_decl_imaxabs = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_IMAXABS 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_IMAXABS 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether imaxdiv is declared" >&5
+echo $ECHO_N "checking whether imaxdiv is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_imaxdiv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef imaxdiv
+ char *p = (char *) imaxdiv;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_imaxdiv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_imaxdiv=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_imaxdiv" >&5
+echo "${ECHO_T}$ac_cv_have_decl_imaxdiv" >&6; }
+if test $ac_cv_have_decl_imaxdiv = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_IMAXDIV 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_IMAXDIV 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether strtoimax is declared" >&5
+echo $ECHO_N "checking whether strtoimax is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strtoimax+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strtoimax
+ char *p = (char *) strtoimax;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strtoimax=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_strtoimax=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoimax" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoimax" >&6; }
+if test $ac_cv_have_decl_strtoimax = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOIMAX 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOIMAX 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether strtoumax is declared" >&5
+echo $ECHO_N "checking whether strtoumax is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strtoumax+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strtoumax
+ char *p = (char *) strtoumax;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strtoumax=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_strtoumax=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoumax" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoumax" >&6; }
+if test $ac_cv_have_decl_strtoumax = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOUMAX 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOUMAX 0
+_ACEOF
+
+
+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;
+
+
+
+{ echo "$as_me:$LINENO: checking whether lchown is declared" >&5
+echo $ECHO_N "checking whether lchown is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_lchown+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef lchown
+ char *p = (char *) lchown;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_lchown=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_lchown=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_lchown" >&5
+echo "${ECHO_T}$ac_cv_have_decl_lchown" >&6; }
+if test $ac_cv_have_decl_lchown = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_LCHOWN 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_LCHOWN 0
+_ACEOF
+
+
+fi
+
+
+
+ { echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5
+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6; }
+if test "${am_cv_langinfo_codeset+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <langinfo.h>
+int
+main ()
+{
+char* cs = nl_langinfo(CODESET); return !cs;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_langinfo_codeset=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ am_cv_langinfo_codeset=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_langinfo_codeset" >&5
+echo "${ECHO_T}$am_cv_langinfo_codeset" >&6; }
+ if test $am_cv_langinfo_codeset = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LANGINFO_CODESET 1
+_ACEOF
+
+ fi
+
+
+ { echo "$as_me:$LINENO: checking whether we are using the GNU C Library 2.1 or newer" >&5
+echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6; }
+if test "${ac_cv_gnu_library_2_1+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky GNU user" >/dev/null 2>&1; then
+ ac_cv_gnu_library_2_1=yes
+else
+ ac_cv_gnu_library_2_1=no
+fi
+rm -f conftest*
+
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_gnu_library_2_1" >&5
+echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6; }
+
+ GLIBC21="$ac_cv_gnu_library_2_1"
+
+
+
+ { echo "$as_me:$LINENO: checking whether mbrtowc and mbstate_t are properly declared" >&5
+echo $ECHO_N "checking whether mbrtowc and mbstate_t are properly declared... $ECHO_C" >&6; }
+if test "${gl_cv_func_mbrtowc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <wchar.h>
+int
+main ()
+{
+wchar_t wc;
+ char const s[] = "";
+ size_t n = 1;
+ mbstate_t state;
+ return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_mbrtowc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_func_mbrtowc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_mbrtowc" >&5
+echo "${ECHO_T}$gl_cv_func_mbrtowc" >&6; }
+ if test $gl_cv_func_mbrtowc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MBRTOWC 1
+_ACEOF
+
+ fi
+
+
+ GNULIB_MEMMEM=0;
+ GNULIB_MEMPCPY=0;
+ GNULIB_MEMRCHR=0;
+ GNULIB_STPCPY=0;
+ GNULIB_STPNCPY=0;
+ GNULIB_STRCHRNUL=0;
+ GNULIB_STRDUP=0;
+ GNULIB_STRNDUP=0;
+ GNULIB_STRNLEN=0;
+ GNULIB_STRPBRK=0;
+ GNULIB_STRSEP=0;
+ GNULIB_STRCASESTR=0;
+ GNULIB_STRTOK_R=0;
+ GNULIB_MBSLEN=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;
+ HAVE_DECL_MEMMEM=1;
+ HAVE_MEMPCPY=1;
+ HAVE_DECL_MEMRCHR=1;
+ HAVE_STPCPY=1;
+ HAVE_STPNCPY=1;
+ HAVE_STRCASECMP=1;
+ HAVE_DECL_STRNCASECMP=1;
+ HAVE_STRCHRNUL=1;
+ HAVE_DECL_STRDUP=1;
+ HAVE_STRNDUP=1;
+ HAVE_DECL_STRNDUP=1;
+ HAVE_DECL_STRNLEN=1;
+ HAVE_STRPBRK=1;
+ HAVE_STRSEP=1;
+ HAVE_STRCASESTR=1;
+ HAVE_DECL_STRTOK_R=1;
+
+{ echo "$as_me:$LINENO: checking whether memrchr is declared" >&5
+echo $ECHO_N "checking whether memrchr is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_memrchr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef memrchr
+ char *p = (char *) memrchr;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_memrchr=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_memrchr=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_memrchr" >&5
+echo "${ECHO_T}$ac_cv_have_decl_memrchr" >&6; }
+if test $ac_cv_have_decl_memrchr = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MEMRCHR 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MEMRCHR 0
+_ACEOF
+
+
+fi
+
+
+
+ GNULIB_GETSUBOPT=0;
+ GNULIB_MKDTEMP=0;
+ GNULIB_MKSTEMP=0;
+ HAVE_GETSUBOPT=1;
+ HAVE_MKDTEMP=1;
+ REPLACE_MKSTEMP=0;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GNULIB_FPRINTF_POSIX=0;
+ GNULIB_PRINTF_POSIX=0;
+ GNULIB_SNPRINTF=0;
+ GNULIB_SPRINTF_POSIX=0;
+ GNULIB_VFPRINTF_POSIX=0;
+ GNULIB_VPRINTF_POSIX=0;
+ GNULIB_VSNPRINTF=0;
+ GNULIB_VSPRINTF_POSIX=0;
+ GNULIB_VASPRINTF=0;
+ GNULIB_FSEEK=0;
+ GNULIB_FSEEKO=0;
+ GNULIB_FTELL=0;
+ GNULIB_FTELLO=0;
+ GNULIB_FFLUSH=0;
+ REPLACE_FPRINTF=0;
+ REPLACE_VFPRINTF=0;
+ REPLACE_PRINTF=0;
+ REPLACE_VPRINTF=0;
+ REPLACE_SNPRINTF=0;
+ HAVE_DECL_SNPRINTF=1;
+ REPLACE_VSNPRINTF=0;
+ HAVE_DECL_VSNPRINTF=1;
+ REPLACE_SPRINTF=0;
+ REPLACE_VSPRINTF=0;
+ HAVE_VASPRINTF=1;
+ REPLACE_VASPRINTF=0;
+ HAVE_FSEEKO=1;
+ REPLACE_FSEEKO=0;
+ REPLACE_FSEEK=0;
+ HAVE_FTELLO=1;
+ REPLACE_FTELLO=0;
+ REPLACE_FTELL=0;
+ REPLACE_FFLUSH=0;
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether strdup is declared" >&5
+echo $ECHO_N "checking whether strdup is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strdup+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strdup
+ char *p = (char *) strdup;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strdup=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_strdup=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strdup" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strdup" >&6; }
+if test $ac_cv_have_decl_strdup = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRDUP 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRDUP 0
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking absolute name of <string.h>" >&5
+echo $ECHO_N "checking absolute name of <string.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_string_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_string_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+_ACEOF
+ gl_cv_absolute_string_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/string.h#{s#.*"\(.*/string.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_string_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_string_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_STRING_H "$gl_cv_absolute_string_h"
+_ACEOF
+
+
+ ABSOLUTE_STRING_H=\"$gl_cv_absolute_string_h\"
+
+
+{ echo "$as_me:$LINENO: checking whether strndup is declared" >&5
+echo $ECHO_N "checking whether strndup is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strndup+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strndup
+ char *p = (char *) strndup;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strndup=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_strndup=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strndup" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strndup" >&6; }
+if test $ac_cv_have_decl_strndup = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRNDUP 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRNDUP 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether strnlen is declared" >&5
+echo $ECHO_N "checking whether strnlen is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strnlen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strnlen
+ char *p = (char *) strnlen;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strnlen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_strnlen=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strnlen" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strnlen" >&6; }
+if test $ac_cv_have_decl_strnlen = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRNLEN 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRNLEN 0
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+
+
+
+ REPLACE_LOCALTIME_R=GNULIB_PORTCHECK;
+ REPLACE_NANOSLEEP=GNULIB_PORTCHECK;
+ REPLACE_STRPTIME=GNULIB_PORTCHECK;
+ REPLACE_TIMEGM=GNULIB_PORTCHECK;
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for struct timespec in <time.h>" >&5
+echo $ECHO_N "checking for struct timespec in <time.h>... $ECHO_C" >&6; }
+if test "${gl_cv_sys_struct_timespec_in_time_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <time.h>
+
+int
+main ()
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_sys_struct_timespec_in_time_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_sys_struct_timespec_in_time_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_sys_struct_timespec_in_time_h" >&5
+echo "${ECHO_T}$gl_cv_sys_struct_timespec_in_time_h" >&6; }
+
+ TIME_H_DEFINES_STRUCT_TIMESPEC=0
+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0
+ if test $gl_cv_sys_struct_timespec_in_time_h = yes; then
+ TIME_H_DEFINES_STRUCT_TIMESPEC=1
+ else
+ { echo "$as_me:$LINENO: checking for struct timespec in <sys/time.h>" >&5
+echo $ECHO_N "checking for struct timespec in <sys/time.h>... $ECHO_C" >&6; }
+if test "${gl_cv_sys_struct_timespec_in_sys_time_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/time.h>
+
+int
+main ()
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_sys_struct_timespec_in_sys_time_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_sys_struct_timespec_in_sys_time_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_sys_struct_timespec_in_sys_time_h" >&5
+echo "${ECHO_T}$gl_cv_sys_struct_timespec_in_sys_time_h" >&6; }
+ if test $gl_cv_sys_struct_timespec_in_time_h = yes; then
+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1
+ fi
+ fi
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking absolute name of <time.h>" >&5
+echo $ECHO_N "checking absolute name of <time.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_time_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_time_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <time.h>
+_ACEOF
+ gl_cv_absolute_time_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/time.h#{s#.*"\(.*/time.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_time_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_time_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_TIME_H "$gl_cv_absolute_time_h"
+_ACEOF
+
+
+ ABSOLUTE_TIME_H=\"$gl_cv_absolute_time_h\"
+
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether utime accepts a null argument" >&5
+echo $ECHO_N "checking whether utime accepts a null argument... $ECHO_C" >&6; }
+if test "${ac_cv_func_utime_null+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ rm -f conftest.data; >conftest.data
+# Sequent interprets utime(file, 0) to mean use start of epoch. Wrong.
+if test "$cross_compiling" = yes; then
+ ac_cv_func_utime_null=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+struct stat s, t;
+ return ! (stat ("conftest.data", &s) == 0
+ && utime ("conftest.data", 0) == 0
+ && stat ("conftest.data", &t) == 0
+ && t.st_mtime >= s.st_mtime
+ && t.st_mtime - s.st_mtime < 120);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_utime_null=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_utime_null=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_utime_null" >&5
+echo "${ECHO_T}$ac_cv_func_utime_null" >&6; }
+if test $ac_cv_func_utime_null = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_UTIME_NULL 1
+_ACEOF
+
+fi
+rm -f conftest.data
+
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for struct utimbuf" >&5
+echo $ECHO_N "checking for struct utimbuf... $ECHO_C" >&6; }
+if test "${gl_cv_sys_struct_utimbuf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #ifdef HAVE_UTIME_H
+ #include <utime.h>
+ #endif
+
+int
+main ()
+{
+static struct utimbuf x; x.actime = x.modtime;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_sys_struct_utimbuf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_sys_struct_utimbuf=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_sys_struct_utimbuf" >&5
+echo "${ECHO_T}$gl_cv_sys_struct_utimbuf" >&6; }
+
+ if test $gl_cv_sys_struct_utimbuf = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRUCT_UTIMBUF 1
+_ACEOF
+
+ fi
+
+
+ { echo "$as_me:$LINENO: checking determine whether the utimes function works" >&5
+echo $ECHO_N "checking determine whether the utimes function works... $ECHO_C" >&6; }
+if test "${gl_cv_func_working_utimes+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ if test "$cross_compiling" = yes; then
+ gl_cv_func_working_utimes=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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>
+
+int
+main ()
+{
+ static struct timeval timeval[2] = {{9, 10}, {999999, 999999}};
+ struct stat sbuf;
+ char const *file = "conftest.utimes";
+ FILE *f;
+ time_t now;
+ int fd;
+
+ int ok = ((f = fopen (file, "w"))
+ && fclose (f) == 0
+ && utimes (file, timeval) == 0
+ && lstat (file, &sbuf) == 0
+ && sbuf.st_atime == timeval[0].tv_sec
+ && sbuf.st_mtime == timeval[1].tv_sec);
+ unlink (file);
+ if (!ok)
+ exit (1);
+
+ ok =
+ ((f = fopen (file, "w"))
+ && fclose (f) == 0
+ && time (&now) != (time_t)-1
+ && utimes (file, NULL) == 0
+ && lstat (file, &sbuf) == 0
+ && now - sbuf.st_atime <= 2
+ && now - sbuf.st_mtime <= 2);
+ unlink (file);
+ if (!ok)
+ exit (1);
+
+ ok = (0 <= (fd = open (file, O_WRONLY|O_CREAT, 0444))
+ && close (fd) == 0
+ && utimes (file, NULL) == 0);
+ unlink (file);
+
+ exit (!ok);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_working_utimes=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gl_cv_func_working_utimes=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_working_utimes" >&5
+echo "${ECHO_T}$gl_cv_func_working_utimes" >&6; }
+
+ if test $gl_cv_func_working_utimes = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WORKING_UTIMES 1
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for EOVERFLOW" >&5
+echo $ECHO_N "checking for EOVERFLOW... $ECHO_C" >&6; }
+if test "${ac_cv_decl_EOVERFLOW+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+ have_eoverflow=1
+fi
+rm -f conftest*
+
+ if test -n "$have_eoverflow"; then
+ ac_cv_decl_EOVERFLOW=yes
+ else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+ have_eoverflow=1
+fi
+rm -f conftest*
+
+ if test -n "$have_eoverflow"; then
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#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>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !((EOVERFLOW) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#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>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !((EOVERFLOW) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#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>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !((EOVERFLOW) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#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>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !((EOVERFLOW) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#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>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !((EOVERFLOW) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_decl_EOVERFLOW=$ac_lo;;
+'') ;;
+esac
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#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>
+
+static long int longval () { return EOVERFLOW; }
+static unsigned long int ulongval () { return EOVERFLOW; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if ((EOVERFLOW) < 0)
+ {
+ long int i = longval ();
+ if (i != (EOVERFLOW))
+ return 1;
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != (EOVERFLOW))
+ return 1;
+ fprintf (f, "%lu\n", i);
+ }
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_decl_EOVERFLOW=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+ else
+ ac_cv_decl_EOVERFLOW=E2BIG
+ fi
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_decl_EOVERFLOW" >&5
+echo "${ECHO_T}$ac_cv_decl_EOVERFLOW" >&6; }
+ if test "$ac_cv_decl_EOVERFLOW" != yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define EOVERFLOW $ac_cv_decl_EOVERFLOW
+_ACEOF
+
+ EOVERFLOW="$ac_cv_decl_EOVERFLOW"
+
+ fi
+
+
+
+
+ { echo "$as_me:$LINENO: checking for wchar_t" >&5
+echo $ECHO_N "checking for wchar_t... $ECHO_C" >&6; }
+if test "${gt_cv_c_wchar_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_c_wchar_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_c_wchar_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_c_wchar_t" >&5
+echo "${ECHO_T}$gt_cv_c_wchar_t" >&6; }
+ if test $gt_cv_c_wchar_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCHAR_T 1
+_ACEOF
+
+ fi
+
+
+ { echo "$as_me:$LINENO: checking for wint_t" >&5
+echo $ECHO_N "checking for wint_t... $ECHO_C" >&6; }
+if test "${gt_cv_c_wint_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_c_wint_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_c_wint_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_c_wint_t" >&5
+echo "${ECHO_T}$gt_cv_c_wint_t" >&6; }
+ if test $gt_cv_c_wint_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WINT_T 1
+_ACEOF
+
+ fi
+
+
+ { echo "$as_me:$LINENO: checking for inttypes.h" >&5
+echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6; }
+if test "${gl_cv_header_inttypes_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <inttypes.h>
+int
+main ()
+{
+uintmax_t i = (uintmax_t) -1; return !i;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_header_inttypes_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_header_inttypes_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_header_inttypes_h" >&5
+echo "${ECHO_T}$gl_cv_header_inttypes_h" >&6; }
+ if test $gl_cv_header_inttypes_h = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INTTYPES_H_WITH_UINTMAX 1
+_ACEOF
+
+ fi
+
+
+ { echo "$as_me:$LINENO: checking for stdint.h" >&5
+echo $ECHO_N "checking for stdint.h... $ECHO_C" >&6; }
+if test "${gl_cv_header_stdint_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <stdint.h>
+int
+main ()
+{
+uintmax_t i = (uintmax_t) -1; return !i;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_header_stdint_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_header_stdint_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_header_stdint_h" >&5
+echo "${ECHO_T}$gl_cv_header_stdint_h" >&6; }
+ if test $gl_cv_header_stdint_h = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STDINT_H_WITH_UINTMAX 1
+_ACEOF
+
+ fi
+
+
+
+ ac_cv_type_long_long=$ac_cv_type_long_long_int
+ if test $ac_cv_type_long_long = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LONG_LONG 1
+_ACEOF
+
+ fi
+
+
+
+
+ { echo "$as_me:$LINENO: checking for intmax_t" >&5
+echo $ECHO_N "checking for intmax_t... $ECHO_C" >&6; }
+if test "${gt_cv_c_intmax_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 ()
+{
+intmax_t x = -1; return !x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_c_intmax_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_c_intmax_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_c_intmax_t" >&5
+echo "${ECHO_T}$gt_cv_c_intmax_t" >&6; }
+ if test $gt_cv_c_intmax_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_INTMAX_T 1
+_ACEOF
+
+ else
+
+ test $ac_cv_type_long_long = yes \
+ && ac_type='long long' \
+ || ac_type='long'
+
+cat >>confdefs.h <<_ACEOF
+#define intmax_t $ac_type
+_ACEOF
+
+ fi
+
+{ echo "$as_me:$LINENO: checking whether vsnprintf is declared" >&5
+echo $ECHO_N "checking whether vsnprintf is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_vsnprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef vsnprintf
+ char *p = (char *) vsnprintf;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_vsnprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_vsnprintf=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_vsnprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_vsnprintf" >&6; }
+if test $ac_cv_have_decl_vsnprintf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_VSNPRINTF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_VSNPRINTF 0
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ 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_source_base='.#bootmp/lib'
+
+
+
+
+
+ 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
+ { echo "$as_me:$LINENO: checking for alloca as a compiler built-in" >&5
+echo $ECHO_N "checking for alloca as a compiler built-in... $ECHO_C" >&6; }
+if test "${gl_cv_rpl_alloca+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+ gl_cv_rpl_alloca=no
+fi
+rm -f conftest*
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_rpl_alloca" >&5
+echo "${ECHO_T}$gl_cv_rpl_alloca" >&6; }
+ if test $gl_cv_rpl_alloca = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA 1
+_ACEOF
+
+ ALLOCA_H=alloca.h
+ else
+ ALLOCA_H=
+ fi
+ else
+ ALLOCA_H=alloca.h
+ fi
+
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA_H 1
+_ACEOF
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS argmatch.$ac_objext"
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getopt.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS getopt1.$ac_objext"
+
+ GETOPT_H=getopt.h
+
+cat >>confdefs.h <<\_ACEOF
+#define __GETOPT_PREFIX rpl_
+_ACEOF
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether program_invocation_name is declared" >&5
+echo $ECHO_N "checking whether program_invocation_name is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_program_invocation_name+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <errno.h>
+
+int
+main ()
+{
+#ifndef program_invocation_name
+ char *p = (char *) program_invocation_name;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_program_invocation_name=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_program_invocation_name=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_program_invocation_name" >&5
+echo "${ECHO_T}$ac_cv_have_decl_program_invocation_name" >&6; }
+if test $ac_cv_have_decl_program_invocation_name = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DECL_PROGRAM_INVOCATION_NAME 1
+_ACEOF
+
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define GNULIB_PROGRAM_INVOCATION_NAME 1
+_ACEOF
+
+fi
+
+ { echo "$as_me:$LINENO: checking whether program_invocation_short_name is declared" >&5
+echo $ECHO_N "checking whether program_invocation_short_name is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_program_invocation_short_name+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <errno.h>
+
+int
+main ()
+{
+#ifndef program_invocation_short_name
+ char *p = (char *) program_invocation_short_name;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_program_invocation_short_name=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_program_invocation_short_name=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_program_invocation_short_name" >&5
+echo "${ECHO_T}$ac_cv_have_decl_program_invocation_short_name" >&6; }
+if test $ac_cv_have_decl_program_invocation_short_name = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1
+_ACEOF
+
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define GNULIB_PROGRAM_INVOCATION_SHORT_NAME 1
+_ACEOF
+
+fi
+
+
+ # Check if program_invocation_name and program_invocation_short_name
+ # are defined elsewhere. It is improbable that only one of them will
+ # be defined and other not, I prefer to stay on the safe side and to
+ # test each one separately.
+ { echo "$as_me:$LINENO: checking whether program_invocation_name is defined" >&5
+echo $ECHO_N "checking whether program_invocation_name is defined... $ECHO_C" >&6; }
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <argp.h>
+int
+main ()
+{
+ program_invocation_name = "test";
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_PROGRAM_INVOCATION_NAME 1
+_ACEOF
+
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+ { echo "$as_me:$LINENO: checking whether program_invocation_short_name is defined" >&5
+echo $ECHO_N "checking whether program_invocation_short_name is defined... $ECHO_C" >&6; }
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <argp.h>
+int
+main ()
+{
+ program_invocation_short_name = "test";
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_PROGRAM_INVOCATION_SHORT_NAME 1
+_ACEOF
+
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS backupfile.$ac_objext"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_canonicalize_file_name = no; then
+ gl_LIBOBJS="$gl_LIBOBJS canonicalize-lgpl.$ac_objext"
+
+cat >>confdefs.h <<\_ACEOF
+#define realpath rpl_realpath
+_ACEOF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fi
+
+
+ { echo "$as_me:$LINENO: checking whether this system has an arbitrary file name length limit" >&5
+echo $ECHO_N "checking whether this system has an arbitrary file name length limit... $ECHO_C" >&6; }
+if test "${gl_cv_have_arbitrary_file_name_length_limit+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <unistd.h>
+#include <limits.h>
+#if defined PATH_MAX || defined MAXPATHLEN
+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_arbitrary_file_name_length_limit=yes
+else
+ gl_cv_have_arbitrary_file_name_length_limit=no
+fi
+rm -f conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_have_arbitrary_file_name_length_limit" >&5
+echo "${ECHO_T}$gl_cv_have_arbitrary_file_name_length_limit" >&6; }
+
+ if test $gl_cv_have_arbitrary_file_name_length_limit = yes; then
+ gl_LIBOBJS="$gl_LIBOBJS chdir-long.$ac_objext"
+
+ :
+
+ fi
+
+
+
+
+
+
+
+ if test $ac_cv_func_chown_works = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE 1
+_ACEOF
+
+ fi
+
+ # If chown has either of the above problems, then we need the wrapper.
+ if test $ac_cv_func_chown_works$gl_cv_func_chown_follows_symlink = yesyes; then
+ : # no wrapper needed
+ else
+ REPLACE_CHOWN=1
+ gl_LIBOBJS="$gl_LIBOBJS chown.$ac_objext"
+
+ { echo "$as_me:$LINENO: checking for fchown" >&5
+echo $ECHO_N "checking for fchown... $ECHO_C" >&6; }
+if test "${ac_cv_func_fchown+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define fchown to an innocuous variant, in case <limits.h> declares fchown.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define fchown innocuous_fchown
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char fchown (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef fchown
+
+/* 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 fchown ();
+/* 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_fchown || defined __stub___fchown
+choke me
+#endif
+
+int
+main ()
+{
+return fchown ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_fchown=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_func_fchown=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_fchown" >&5
+echo "${ECHO_T}$ac_cv_func_fchown" >&6; }
+if test $ac_cv_func_fchown = yes; then
+ :
+else
+ gl_LIBOBJS="$gl_LIBOBJS fchown-stub.$ac_objext"
+fi
+
+
+ fi
+
+
+
+ GNULIB_CHOWN=1
+
+
+
+
+ # 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.
+ gl_saved_libs=$LIBS
+ { echo "$as_me:$LINENO: checking for library containing clock_gettime" >&5
+echo $ECHO_N "checking for library containing clock_gettime... $ECHO_C" >&6; }
+if test "${ac_cv_search_clock_gettime+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char clock_gettime ();
+int
+main ()
+{
+return clock_gettime ();
+ ;
+ return 0;
+}
+_ACEOF
+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
+ rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_clock_gettime=$ac_res
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if test "${ac_cv_search_clock_gettime+set}" = set; then
+ break
+fi
+done
+if test "${ac_cv_search_clock_gettime+set}" = set; then
+ :
+else
+ ac_cv_search_clock_gettime=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_clock_gettime" >&5
+echo "${ECHO_T}$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
+
+
+
+
+for ac_func in clock_gettime clock_settime
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+ LIBS=$gl_saved_libs
+
+
+ gl_LIBOBJS="$gl_LIBOBJS close-stream.$ac_objext"
+
+ :
+
+
+
+cat >>confdefs.h <<\_ACEOF
+#define GNULIB_CLOSE_STREAM 1
+_ACEOF
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS closeout.$ac_objext"
+
+ :
+
+ { echo "$as_me:$LINENO: checking for d_ino member in directory struct" >&5
+echo $ECHO_N "checking for d_ino member in directory struct... $ECHO_C" >&6; }
+if test "${gl_cv_struct_dirent_d_ino+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ gl_cv_struct_dirent_d_ino=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+ #include <dirent.h>
+
+int
+main ()
+{
+DIR *dp = opendir (".");
+ struct dirent *e;
+ struct stat st;
+ if (! dp)
+ return 1;
+ e = readdir (dp);
+ return ! (e
+ && stat (e->d_name, &st) == 0
+ && e->d_ino == st.st_ino);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_struct_dirent_d_ino=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+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.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_struct_dirent_d_ino" >&5
+echo "${ECHO_T}$gl_cv_struct_dirent_d_ino" >&6; }
+ if test $gl_cv_struct_dirent_d_ino = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define D_INO_IN_DIRENT 1
+_ACEOF
+
+ fi
+
+
+
+
+
+
+for ac_func in dirfd
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+ { echo "$as_me:$LINENO: checking whether dirfd is declared" >&5
+echo $ECHO_N "checking whether dirfd is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_dirfd+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <dirent.h>
+
+int
+main ()
+{
+#ifndef dirfd
+ char *p = (char *) dirfd;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_dirfd=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_dirfd=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_dirfd" >&5
+echo "${ECHO_T}$ac_cv_have_decl_dirfd" >&6; }
+if test $ac_cv_have_decl_dirfd = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_DIRFD 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_DIRFD 0
+_ACEOF
+
+
+fi
+
+
+
+ { echo "$as_me:$LINENO: checking whether dirfd is a macro" >&5
+echo $ECHO_N "checking whether dirfd is a macro... $ECHO_C" >&6; }
+if test "${gl_cv_func_dirfd_macro+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+ gl_cv_func_dirfd_macro=no
+fi
+rm -f conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_dirfd_macro" >&5
+echo "${ECHO_T}$gl_cv_func_dirfd_macro" >&6; }
+
+ # Use the replacement only if we have no function, macro,
+ # or declaration with that name.
+ if test $ac_cv_func_dirfd,$ac_cv_have_decl_dirfd,$gl_cv_func_dirfd_macro \
+ = no,no,no; then
+
+for ac_func in dirfd
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ { echo "$as_me:$LINENO: checking how to get the file descriptor associated with an open DIR*" >&5
+echo $ECHO_N "checking how to get the file descriptor associated with an open DIR*... $ECHO_C" >&6; }
+if test "${gl_cv_sys_dir_fd_member_name+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ dirfd_save_CFLAGS=$CFLAGS
+ for ac_expr in d_fd dd_fd; do
+
+ CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <dirent.h>
+int
+main ()
+{
+DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ dir_fd_found=yes
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext 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
+{ echo "$as_me:$LINENO: result: $gl_cv_sys_dir_fd_member_name" >&5
+echo "${ECHO_T}$gl_cv_sys_dir_fd_member_name" >&6; }
+ if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
+
+cat >>confdefs.h <<_ACEOF
+#define DIR_FD_MEMBER_NAME $gl_cv_sys_dir_fd_member_name
+_ACEOF
+
+ fi
+
+
+ fi
+
+
+ gl_LIBOBJS="$gl_LIBOBJS basename.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS dirname.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS stripslash.$ac_objext"
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether // is distinct from /" >&5
+echo $ECHO_N "checking whether // is distinct from /... $ECHO_C" >&6; }
+if test "${gl_cv_double_slash_root+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ 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 / //`
+ 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
+{ echo "$as_me:$LINENO: result: $gl_cv_double_slash_root" >&5
+echo "${ECHO_T}$gl_cv_double_slash_root" >&6; }
+ if test "$gl_cv_double_slash_root" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_dup2 = no; then
+ HAVE_DUP2=0
+ gl_LIBOBJS="$gl_LIBOBJS dup2.$ac_objext"
+ fi
+
+
+
+ GNULIB_DUP2=1
+
+
+ { echo "$as_me:$LINENO: checking for error_at_line" >&5
+echo $ECHO_N "checking for error_at_line... $ECHO_C" >&6; }
+if test "${ac_cv_lib_error_at_line+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+error_at_line (0, 0, "", 0, "");
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_error_at_line=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_error_at_line=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_error_at_line" >&5
+echo "${ECHO_T}$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
+
+
+
+ :
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS exclude.$ac_objext"
+
+
+ gl_LIBOBJS="$gl_LIBOBJS exitfail.$ac_objext"
+
+ :
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_fchdir = no; then
+ REPLACE_FCHDIR=1
+ gl_LIBOBJS="$gl_LIBOBJS fchdir.$ac_objext"
+ :
+
+cat >>confdefs.h <<\_ACEOF
+#define FCHDIR_REPLACEMENT 1
+_ACEOF
+
+ { echo "$as_me:$LINENO: checking absolute name of <dirent.h>" >&5
+echo $ECHO_N "checking absolute name of <dirent.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_dirent_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_dirent_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <dirent.h>
+_ACEOF
+ gl_cv_absolute_dirent_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/dirent.h#{s#.*"\(.*/dirent.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_dirent_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_dirent_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_DIRENT_H "$gl_cv_absolute_dirent_h"
+_ACEOF
+
+
+ ABSOLUTE_DIRENT_H=\"$gl_cv_absolute_dirent_h\"
+ DIRENT_H='dirent.h'
+ else
+ DIRENT_H=
+ fi
+
+
+
+
+
+ GNULIB_FCHDIR=1
+
+
+ { echo "$as_me:$LINENO: checking for working fcntl.h" >&5
+echo $ECHO_N "checking for working fcntl.h... $ECHO_C" >&6; }
+if test "${gl_cv_header_working_fcntl_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ gl_cv_header_working_fcntl_h=cross-compiling
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
+ #include <fcntl.h>
+ #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 ()
+{
+
+ int status = !constants;
+ {
+ static char const sym[] = "conftest.sym";
+ if (symlink (".", sym) != 0
+ || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0)
+ status |= 32;
+ }
+ {
+ static char const file[] = "confdefs.h";
+ int fd = open (file, O_RDONLY | O_NOATIME);
+ char c;
+ struct stat st0, st1;
+ if (fd < 0
+ || fstat (fd, &st0) != 0
+ || sleep (1) != 0
+ || read (fd, &c, 1) != 1
+ || close (fd) != 0
+ || stat (file, &st1) != 0
+ || st0.st_atime != st1.st_atime)
+ status |= 64;
+ }
+ return status;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_header_working_fcntl_h=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+case $? in #(
+ 32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+ 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+ 96) 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.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_header_working_fcntl_h" >&5
+echo "${ECHO_T}$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
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_WORKING_O_NOATIME $ac_val
+_ACEOF
+
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_WORKING_O_NOFOLLOW $ac_val
+_ACEOF
+
+
+ { echo "$as_me:$LINENO: checking absolute name of <fcntl.h>" >&5
+echo $ECHO_N "checking absolute name of <fcntl.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_fcntl_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_fcntl_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <fcntl.h>
+_ACEOF
+ gl_cv_absolute_fcntl_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/fcntl.h#{s#.*"\(.*/fcntl.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_fcntl_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_fcntl_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_FCNTL_H "$gl_cv_absolute_fcntl_h"
+_ACEOF
+
+
+ ABSOLUTE_FCNTL_H=\"$gl_cv_absolute_fcntl_h\"
+
+ FCNTL_H='fcntl.h'
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS open-safer.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS creat-safer.$ac_objext"
+
+
+
+cat >>confdefs.h <<\_ACEOF
+#define GNULIB_FCNTL_SAFER 1
+_ACEOF
+
+
+
+ { echo "$as_me:$LINENO: checking for struct stat.st_blocks" >&5
+echo $ECHO_N "checking for struct stat.st_blocks... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_blocks+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_blocks)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_blocks=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_blocks)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_blocks=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_blocks=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_blocks" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_blocks" >&6; }
+if test $ac_cv_member_struct_stat_st_blocks = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BLOCKS 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ST_BLOCKS 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS fileblocks.$ac_objext"
+fi
+
+
+ if test $ac_cv_member_struct_stat_st_blocks = no; then
+
+
+
+
+
+
+
+ :
+
+ fi
+
+
+
+
+ FLOAT_H=
+ case "$host_os" in
+ beos*)
+ FLOAT_H=float.h
+ { echo "$as_me:$LINENO: checking absolute name of <float.h>" >&5
+echo $ECHO_N "checking absolute name of <float.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_float_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_float_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <float.h>
+_ACEOF
+ gl_cv_absolute_float_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/float.h#{s#.*"\(.*/float.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_float_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_float_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_FLOAT_H "$gl_cv_absolute_float_h"
+_ACEOF
+
+
+ ABSOLUTE_FLOAT_H=\"$gl_cv_absolute_float_h\"
+
+ ;;
+ esac
+
+
+ # No macro. You should also use one of fnmatch-posix or fnmatch-gnu.
+
+
+
+ FNMATCH_H=
+ { echo "$as_me:$LINENO: checking for working GNU fnmatch" >&5
+echo $ECHO_N "checking for working GNU fnmatch... $ECHO_C" >&6; }
+if test "${ac_cv_func_fnmatch_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_fnmatch_gnu=cross
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 ()
+{
+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 };
+ return
+ !(n ("a*", "", 0)
+ && y ("a*", "abc", 0)
+ && n ("d*/*1", "d/s/1", FNM_PATHNAME)
+ && y ("a\\\\bc", "abc", 0)
+ && n ("a\\\\bc", "abc", FNM_NOESCAPE)
+ && y ("*x", ".x", 0)
+ && n ("*x", ".x", FNM_PERIOD)
+ && y (Apat, "\\\\", 0) && y (Apat, "A", 0)
+ && y (apat, "\\\\", 0) && y (apat, "a", 0)
+ && n (Apat, A_1, 0) == ('A' < '\\\\')
+ && n (apat, a_1, 0) == ('a' < '\\\\')
+ && y (Apat, A01, 0) == ('A' < '\\\\')
+ && y (apat, a01, 0) == ('a' < '\\\\')
+ && y (Apat, bs_1, 0) == ('A' < '\\\\')
+ && y (apat, bs_1, 0) == ('a' < '\\\\')
+ && n (Apat, bs01, 0) == ('A' < '\\\\')
+ && n (apat, bs01, 0) == ('a' < '\\\\')
+ && y ("xxXX", "xXxX", FNM_CASEFOLD)
+ && y ("a++(x|yy)b", "a+xyyyyxb", FNM_EXTMATCH)
+ && n ("d*/*1", "d/s/1", FNM_FILE_NAME)
+ && y ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR)
+ && y ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR)
+ && y ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR));
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_fnmatch_gnu=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_fnmatch_gnu=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_fnmatch_gnu" >&5
+echo "${ECHO_T}$ac_cv_func_fnmatch_gnu" >&6; }
+if test $ac_cv_func_fnmatch_gnu = yes; then
+ rm -f lib/fnmatch.h
+else
+ { echo "$as_me:$LINENO: checking whether isblank is declared" >&5
+echo $ECHO_N "checking whether isblank is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_isblank+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+
+int
+main ()
+{
+#ifndef isblank
+ char *p = (char *) isblank;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_isblank=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_isblank=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_isblank" >&5
+echo "${ECHO_T}$ac_cv_have_decl_isblank" >&6; }
+if test $ac_cv_have_decl_isblank = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISBLANK 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISBLANK 0
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+gl_LIBOBJS="$gl_LIBOBJS fnmatch.$ac_objext"
+FNMATCH_H=fnmatch.h
+
+fi
+
+
+ if test $ac_cv_func_fnmatch_gnu != yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define fnmatch gnu_fnmatch
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+
+
+
+for ac_func in __fpending
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ fp_headers='
+# include <stdio.h>
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+'
+ { echo "$as_me:$LINENO: checking whether __fpending is declared" >&5
+echo $ECHO_N "checking whether __fpending is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl___fpending+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$fp_headers
+
+int
+main ()
+{
+#ifndef __fpending
+ char *p = (char *) __fpending;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl___fpending=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl___fpending=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl___fpending" >&5
+echo "${ECHO_T}$ac_cv_have_decl___fpending" >&6; }
+if test $ac_cv_have_decl___fpending = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL___FPENDING 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL___FPENDING 0
+_ACEOF
+
+
+fi
+
+
+ if test $ac_cv_func___fpending = no; then
+ { echo "$as_me:$LINENO: checking how to determine the number of pending output bytes on a stream" >&5
+echo $ECHO_N "checking how to determine the number of pending output bytes on a stream... $ECHO_C" >&6; }
+if test "${ac_cv_sys_pending_output_n_bytes+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ for ac_expr in \
+ \
+ '# glibc2' \
+ 'fp->_IO_write_ptr - fp->_IO_write_base' \
+ \
+ '# traditional Unix' \
+ 'fp->_ptr - fp->_base' \
+ \
+ '# BSD' \
+ 'fp->_p - fp->_bf._base' \
+ \
+ '# SCO, Unixware' \
+ '(fp->__ptr ? fp->__ptr - fp->__base : 0)' \
+ \
+ '# old glibc?' \
+ 'fp->__bufp - fp->__buffer' \
+ \
+ '# old glibc iostream?' \
+ 'fp->_pptr - fp->_pbase' \
+ \
+ '# VMS' \
+ '(*fp)->_ptr - (*fp)->_base' \
+ \
+ '# e.g., DGUX R4.11; the info is not available' \
+ 1 \
+ ; do
+
+ # Skip each embedded comment.
+ case "$ac_expr" in '#'*) continue;; esac
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+
+int
+main ()
+{
+FILE *fp = stdin; (void) ($ac_expr);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fp_done=yes
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test "$fp_done" = yes && break
+ done
+
+ ac_cv_sys_pending_output_n_bytes=$ac_expr
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_pending_output_n_bytes" >&5
+echo "${ECHO_T}$ac_cv_sys_pending_output_n_bytes" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define PENDING_OUTPUT_N_BYTES $ac_cv_sys_pending_output_n_bytes
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_ftruncate = no; then
+ HAVE_FTRUNCATE=0
+ gl_LIBOBJS="$gl_LIBOBJS ftruncate.$ac_objext"
+
+
+for ac_func in chsize
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+ case "$host_os" in
+ mingw*)
+ # Yes, we know mingw lacks ftruncate.
+ ;;
+ *)
+ # If someone lacks ftruncate, make configure fail, and request
+ # a bug report to inform us about it.
+ if test x"$SKIP_FTRUNCATE_CHECK" != xyes; then
+ { { echo "$as_me:$LINENO: error: Your system lacks the ftruncate function.
+ Please report this, along with the output of \"uname -a\", to the
+ bug-coreutils@gnu.org mailing list. To continue past this point,
+ rerun configure with SKIP_FTRUNCATE_CHECK=yes.
+ E.g., ./configure SKIP_FTRUNCATE_CHECK=yes
+See \`config.log' for more details." >&5
+echo "$as_me: error: Your system lacks the ftruncate function.
+ Please report this, along with the output of \"uname -a\", to the
+ bug-coreutils@gnu.org mailing list. To continue past this point,
+ rerun configure with SKIP_FTRUNCATE_CHECK=yes.
+ E.g., ./configure SKIP_FTRUNCATE_CHECK=yes
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ esac
+ fi
+
+
+
+ GNULIB_FTRUNCATE=1
+
+
+
+
+
+ gl_abort_bug=no
+ case $gl_cv_func_getcwd_null in
+ yes)
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether getcwd handles long file names properly" >&5
+echo $ECHO_N "checking whether getcwd handles long file names properly... $ECHO_C" >&6; }
+if test "${gl_cv_func_getcwd_path_max+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Arrange for deletion of the temporary directory this test creates.
+ ac_clean_files="$ac_clean_files confdir3"
+ if test "$cross_compiling" = yes; then
+ gl_cv_func_getcwd_path_max=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#ifndef AT_FDCWD
+# define AT_FDCWD 0
+#endif
+#ifdef ENAMETOOLONG
+# define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
+#else
+# define is_ENAMETOOLONG(x) 0
+#endif
+
+/* Don't get link errors because mkdir is redefined to rpl_mkdir. */
+#undef mkdir
+
+#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 (1);
+
+ 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. 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)))
+ fail = 2;
+ break;
+ }
+
+ if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE)
+ {
+ c = getcwd (buf, PATH_MAX);
+ if (!c && errno == ENOENT)
+ {
+ fail = 1;
+ break;
+ }
+ if (c || ! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+ {
+ fail = 2;
+ 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 = 2;
+ break;
+ }
+ if (AT_FDCWD || errno == ERANGE || errno == ENOENT)
+ {
+ fail = 1;
+ break;
+ }
+ }
+ }
+
+ if (c && strlen (c) != cwd_len)
+ {
+ fail = 2;
+ 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
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_getcwd_path_max=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+case $? in
+ 1) gl_cv_func_getcwd_path_max='no, but it is partly working';;
+ *) 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.$ac_ext
+fi
+
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_getcwd_path_max" >&5
+echo "${ECHO_T}$gl_cv_func_getcwd_path_max" >&6; }
+ case $gl_cv_func_getcwd_path_max in
+ no,*)
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_PARTLY_WORKING_GETCWD 1
+_ACEOF
+;;
+ esac
+
+
+
+
+
+
+
+for ac_func in getpagesize
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+ { echo "$as_me:$LINENO: checking whether getcwd aborts when 4k < cwd_length < 16k" >&5
+echo $ECHO_N "checking whether getcwd aborts when 4k < cwd_length < 16k... $ECHO_C" >&6; }
+if test "${gl_cv_func_getcwd_abort_bug+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # 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
+ gl_cv_func_getcwd_abort_bug=yes
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <limits.h>
+#include <string.h>
+#include <sys/stat.h>
+
+/* Don't get link errors because mkdir is redefined to rpl_mkdir. */
+#undef mkdir
+
+#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 const *dir_name = "confdir-14B---";
+ char *cwd;
+ size_t initial_cwd_len;
+ int fail = 0;
+ size_t desired_depth;
+ size_t d;
+
+ /* The bug is triggered when PATH_MAX < getpagesize (), so skip
+ this relative expensive and invasive test if that's not true. */
+ if (getpagesize () <= PATH_MAX)
+ return 0;
+
+ cwd = getcwd (NULL, 0);
+ if (cwd == NULL)
+ return 0;
+
+ initial_cwd_len = strlen (cwd);
+ free (cwd);
+ desired_depth = ((TARGET_LEN - 1 - initial_cwd_len)
+ / (1 + strlen (dir_name)));
+ for (d = 0; d < desired_depth; d++)
+ {
+ if (mkdir (dir_name, S_IRWXU) < 0 || chdir (dir_name) < 0)
+ {
+ 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 failed. This is ok, and expected. */
+ free (cwd);
+
+ /* Call rmdir first, in case the above chdir failed. */
+ rmdir (dir_name);
+ while (0 < d--)
+ {
+ if (chdir ("..") < 0)
+ break;
+ rmdir (dir_name);
+ }
+
+ return 0;
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_getcwd_abort_bug=no
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gl_cv_func_getcwd_abort_bug=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_getcwd_abort_bug" >&5
+echo "${ECHO_T}$gl_cv_func_getcwd_abort_bug" >&6; }
+ if test $gl_cv_func_getcwd_abort_bug = yes; then
+ gl_abort_bug=yes
+fi
+
+;;
+ esac
+
+ case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_path_max,$gl_abort_bug in
+ yes,yes,no) ;;
+ *)
+ REPLACE_GETCWD=1
+ gl_LIBOBJS="$gl_LIBOBJS getcwd.$ac_objext"
+
+
+
+ :
+;;
+ esac
+
+
+
+ GNULIB_GETCWD=1
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for struct tm.tm_zone" >&5
+echo $ECHO_N "checking for struct tm.tm_zone... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_tm_tm_zone+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_cv_struct_tm>
+
+
+int
+main ()
+{
+static struct tm ac_aggr;
+if (ac_aggr.tm_zone)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_tm_tm_zone=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_cv_struct_tm>
+
+
+int
+main ()
+{
+static struct tm ac_aggr;
+if (sizeof ac_aggr.tm_zone)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_tm_tm_zone=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_tm_tm_zone=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_tm_tm_zone" >&5
+echo "${ECHO_T}$ac_cv_member_struct_tm_tm_zone" >&6; }
+if test $ac_cv_member_struct_tm_tm_zone = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_TM_TM_ZONE 1
+_ACEOF
+
+
+fi
+
+if test "$ac_cv_member_struct_tm_tm_zone" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TM_ZONE 1
+_ACEOF
+
+else
+ { echo "$as_me:$LINENO: checking whether tzname is declared" >&5
+echo $ECHO_N "checking whether tzname is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_tzname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <time.h>
+
+int
+main ()
+{
+#ifndef tzname
+ char *p = (char *) tzname;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_tzname=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_tzname=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_tzname" >&5
+echo "${ECHO_T}$ac_cv_have_decl_tzname" >&6; }
+if test $ac_cv_have_decl_tzname = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_TZNAME 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_TZNAME 0
+_ACEOF
+
+
+fi
+
+
+ { echo "$as_me:$LINENO: checking for tzname" >&5
+echo $ECHO_N "checking for tzname... $ECHO_C" >&6; }
+if test "${ac_cv_var_tzname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <time.h>
+#if !HAVE_DECL_TZNAME
+extern char *tzname[];
+#endif
+
+int
+main ()
+{
+return tzname[0][0];
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_var_tzname=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_var_tzname=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_var_tzname" >&5
+echo "${ECHO_T}$ac_cv_var_tzname" >&6; }
+ if test $ac_cv_var_tzname = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TZNAME 1
+_ACEOF
+
+ fi
+fi
+
+
+
+
+
+
+
+
+
+for ac_func in getdelim
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+
+
+
+
+
+ if test $ac_cv_func_getdelim = no; then
+
+
+
+for ac_func in flockfile funlockfile
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+ fi
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether getline is declared" >&5
+echo $ECHO_N "checking whether getline is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef getline
+ char *p = (char *) getline;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getline=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_getline=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getline" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getline" >&6; }
+if test $ac_cv_have_decl_getline = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETLINE 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETLINE 0
+_ACEOF
+
+
+fi
+
+
+
+ gl_getline_needs_run_time_check=no
+ { echo "$as_me:$LINENO: checking for getline" >&5
+echo $ECHO_N "checking for getline... $ECHO_C" >&6; }
+if test "${ac_cv_func_getline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define getline to an innocuous variant, in case <limits.h> declares getline.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define getline innocuous_getline
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char getline (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef getline
+
+/* 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 getline ();
+/* 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_getline || defined __stub___getline
+choke me
+#endif
+
+int
+main ()
+{
+return getline ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_getline=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_func_getline=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_getline" >&5
+echo "${ECHO_T}$ac_cv_func_getline" >&6; }
+if test $ac_cv_func_getline = yes; then
+ gl_getline_needs_run_time_check=yes
+else
+ am_cv_func_working_getline=no
+fi
+
+ if test $gl_getline_needs_run_time_check = yes; then
+ { echo "$as_me:$LINENO: checking for working getline function" >&5
+echo $ECHO_N "checking for working getline function... $ECHO_C" >&6; }
+if test "${am_cv_func_working_getline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ echo fooN |tr -d '\012'|tr N '\012' > conftest.data
+ if test "$cross_compiling" = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2)
+ Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky GNU user" >/dev/null 2>&1; then
+ am_cv_func_working_getline=yes
+else
+ am_cv_func_working_getline=no
+fi
+rm -f conftest*
+
+
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+ int main ()
+ { /* Based on a test program from Karl Heuer. */
+ char *line = NULL;
+ size_t siz = 0;
+ int len;
+ FILE *in = fopen ("./conftest.data", "r");
+ if (!in)
+ return 1;
+ len = getline (&line, &siz, in);
+ exit ((len == 4 && line && strcmp (line, "foo\n") == 0) ? 0 : 1);
+ }
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_func_working_getline=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+am_cv_func_working_getline=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_func_working_getline" >&5
+echo "${ECHO_T}$am_cv_func_working_getline" >&6; }
+ fi
+
+ if test $am_cv_func_working_getline = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define getline gnu_getline
+_ACEOF
+
+ gl_LIBOBJS="$gl_LIBOBJS getline.$ac_objext"
+
+
+
+
+
+
+
+for ac_func in getdelim
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+
+
+
+
+
+ if test $ac_cv_func_getdelim = no; then
+
+
+
+for ac_func in flockfile funlockfile
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+ fi
+
+
+ fi
+
+
+
+ if test -n "$GETOPT_H"; then
+
+ gl_LIBOBJS="$gl_LIBOBJS getopt.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS getopt1.$ac_objext"
+
+ GETOPT_H=getopt.h
+
+cat >>confdefs.h <<\_ACEOF
+#define __GETOPT_PREFIX rpl_
+_ACEOF
+
+
+
+
+
+
+
+
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+for ac_header in OS.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_func in getpagesize
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS gettime.$ac_objext"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for gettimeofday with POSIX signature" >&5
+echo $ECHO_N "checking for gettimeofday with POSIX signature... $ECHO_C" >&6; }
+if test "${gl_cv_func_gettimeofday_posix_signature+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/time.h>
+ struct timeval c;
+
+int
+main ()
+{
+
+ int (*f) (struct timeval *restrict, void *restrict) = gettimeofday;
+ int x = f (&c, 0);
+ return !(x | c.tv_sec | c.tv_usec);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_gettimeofday_posix_signature=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_func_gettimeofday_posix_signature=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_gettimeofday_posix_signature" >&5
+echo "${ECHO_T}$gl_cv_func_gettimeofday_posix_signature" >&6; }
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether gettimeofday clobbers localtime buffer" >&5
+echo $ECHO_N "checking whether gettimeofday clobbers localtime buffer... $ECHO_C" >&6; }
+if test "${gl_cv_func_gettimeofday_clobber+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ gl_cv_func_gettimeofday_clobber=yes
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+ #include <sys/time.h>
+ #include <time.h>
+ #include <stdlib.h>
+
+int
+main ()
+{
+
+ time_t t = 0;
+ struct tm *lt;
+ struct tm saved_lt;
+ struct timeval tv;
+ lt = localtime (&t);
+ saved_lt = *lt;
+ gettimeofday (&tv, NULL);
+ return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_gettimeofday_clobber=no
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gl_cv_func_gettimeofday_clobber=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_gettimeofday_clobber" >&5
+echo "${ECHO_T}$gl_cv_func_gettimeofday_clobber" >&6; }
+
+ if test $gl_cv_func_gettimeofday_clobber = yes; then
+ REPLACE_GETTIMEOFDAY=1
+ SYS_TIME_H=sys/time.h
+
+ gl_LIBOBJS="$gl_LIBOBJS gettimeofday.$ac_objext"
+
+
+for ac_header in sys/timeb.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_func in _ftime
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+cat >>confdefs.h <<\_ACEOF
+#define gmtime rpl_gmtime
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define localtime rpl_localtime
+_ACEOF
+
+
+
+cat >>confdefs.h <<\_ACEOF
+#define GETTIMEOFDAY_CLOBBERS_LOCALTIME 1
+_ACEOF
+
+ fi
+
+
+ if test $gl_cv_func_gettimeofday_posix_signature != yes; then
+ REPLACE_GETTIMEOFDAY=1
+ SYS_TIME_H=sys/time.h
+ if test $gl_cv_func_gettimeofday_clobber != yes; then
+ gl_LIBOBJS="$gl_LIBOBJS gettimeofday.$ac_objext"
+
+
+for ac_header in sys/timeb.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_func in _ftime
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+ fi
+ fi
+
+
+ gl_LIBOBJS="$gl_LIBOBJS hash.$ac_objext"
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS human.$ac_objext"
+
+ :
+
+
+
+ { echo "$as_me:$LINENO: checking whether the compiler generally respects inline" >&5
+echo $ECHO_N "checking whether the compiler generally respects inline... $ECHO_C" >&6; }
+if test "${gl_cv_c_inline_effective+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test $ac_cv_c_inline = no; then
+ gl_cv_c_inline_effective=no
+ else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifdef __NO_INLINE__
+ #error "inline is not effective"
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_c_inline_effective=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_c_inline_effective=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_c_inline_effective" >&5
+echo "${ECHO_T}$gl_cv_c_inline_effective" >&6; }
+ if test $gl_cv_c_inline_effective = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_INLINE 1
+_ACEOF
+
+ fi
+
+
+ gl_LIBOBJS="$gl_LIBOBJS imaxtostr.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS offtostr.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS umaxtostr.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS uinttostr.$ac_objext"
+
+
+
+ :
+
+ :
+ :
+ :
+ :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether inttypes.h conforms to C99" >&5
+echo $ECHO_N "checking whether inttypes.h conforms to C99... $ECHO_C" >&6; }
+if test "${gl_cv_header_working_inttypes_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gl_cv_header_working_inttypes_h=no
+ if test "$gl_cv_header_working_stdint_h" = yes \
+ && test $ac_cv_header_inttypes_h = yes \
+ && test "$ac_cv_have_decl_imaxabs" = yes \
+ && test "$ac_cv_have_decl_imaxdiv" = yes \
+ && test "$ac_cv_have_decl_strtoimax" = yes \
+ && test "$ac_cv_have_decl_strtoumax" = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+
+ /* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stddef.h>
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_FORMAT_MACROS 1 /* to make it work also in C++ mode */
+#include ABSOLUTE_INTTYPES_H
+
+/* No need to duplicate the tests of stdint.m4; they are subsumed by
+ $gl_cv_header_working_stdint_h = yes. */
+
+/* Tests for macros supposed to be defined in inttypes.h. */
+
+const char *k = /* implicit string concatenation */
+#ifdef INT8_MAX
+ PRId8 PRIi8
+#endif
+#ifdef UINT8_MAX
+ PRIo8 PRIu8 PRIx8 PRIX8
+#endif
+#ifdef INT16_MAX
+ PRId16 PRIi16
+#endif
+#ifdef UINT16_MAX
+ PRIo16 PRIu16 PRIx16 PRIX16
+#endif
+#ifdef INT32_MAX
+ PRId32 PRIi32
+#endif
+#ifdef UINT32_MAX
+ PRIo32 PRIu32 PRIx32 PRIX32
+#endif
+#ifdef INT64_MAX
+ PRId64 PRIi64
+#endif
+#ifdef UINT64_MAX
+ PRIo64 PRIu64 PRIx64 PRIX64
+#endif
+ PRIdLEAST8 PRIiLEAST8 PRIoLEAST8 PRIuLEAST8 PRIxLEAST8 PRIXLEAST8
+ PRIdLEAST16 PRIiLEAST16 PRIoLEAST16 PRIuLEAST16 PRIxLEAST16 PRIXLEAST16
+ PRIdLEAST32 PRIiLEAST32 PRIoLEAST32 PRIuLEAST32 PRIxLEAST32 PRIXLEAST32
+ PRIdLEAST64 PRIiLEAST64
+ PRIoLEAST64 PRIuLEAST64 PRIxLEAST64 PRIXLEAST64
+ PRIdFAST8 PRIiFAST8 PRIoFAST8 PRIuFAST8 PRIxFAST8 PRIXFAST8
+ PRIdFAST16 PRIiFAST16 PRIoFAST16 PRIuFAST16 PRIxFAST16 PRIXFAST16
+ PRIdFAST32 PRIiFAST32 PRIoFAST32 PRIuFAST32 PRIxFAST32 PRIXFAST32
+ PRIdFAST64 PRIiFAST64
+ PRIoFAST64 PRIuFAST64 PRIxFAST64 PRIXFAST64
+ PRIdMAX PRIiMAX PRIoMAX PRIuMAX PRIxMAX PRIXMAX
+#ifdef INTPTR_MAX
+ PRIdPTR PRIiPTR
+#endif
+#ifdef UINTPTR_MAX
+ PRIoPTR PRIuPTR PRIxPTR PRIXPTR
+#endif
+ ;
+const char *l = /* implicit string concatenation */
+#ifdef INT8_MAX
+ SCNd8 SCNi8
+#endif
+#ifdef UINT8_MAX
+ SCNo8 SCNu8 SCNx8
+#endif
+#ifdef INT16_MAX
+ SCNd16 SCNi16
+#endif
+#ifdef UINT16_MAX
+ SCNo16 SCNu16 SCNx16
+#endif
+#ifdef INT32_MAX
+ SCNd32 SCNi32
+#endif
+#ifdef UINT32_MAX
+ SCNo32 SCNu32 SCNx32
+#endif
+#ifdef INT64_MAX
+ SCNd64 SCNi64
+#endif
+#ifdef UINT64_MAX
+ SCNo64 SCNu64 SCNx64
+#endif
+ SCNdLEAST8 SCNiLEAST8 SCNoLEAST8 SCNuLEAST8 SCNxLEAST8
+ SCNdLEAST16 SCNiLEAST16 SCNoLEAST16 SCNuLEAST16 SCNxLEAST16
+ SCNdLEAST32 SCNiLEAST32 SCNoLEAST32 SCNuLEAST32 SCNxLEAST32
+ SCNdLEAST64 SCNiLEAST64
+ SCNoLEAST64 SCNuLEAST64 SCNxLEAST64
+ SCNdFAST8 SCNiFAST8 SCNoFAST8 SCNuFAST8 SCNxFAST8
+ SCNdFAST16 SCNiFAST16 SCNoFAST16 SCNuFAST16 SCNxFAST16
+ SCNdFAST32 SCNiFAST32 SCNoFAST32 SCNuFAST32 SCNxFAST32
+ SCNdFAST64 SCNiFAST64
+ SCNoFAST64 SCNuFAST64 SCNxFAST64
+ SCNdMAX SCNiMAX SCNoMAX SCNuMAX SCNxMAX
+#ifdef INTPTR_MAX
+ SCNdPTR SCNiPTR
+#endif
+#ifdef UINTPTR_MAX
+ SCNoPTR SCNuPTR SCNxPTR
+#endif
+ ;
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_header_working_inttypes_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_header_working_inttypes_h" >&5
+echo "${ECHO_T}$gl_cv_header_working_inttypes_h" >&6; }
+
+ if false && test $gl_cv_header_working_inttypes_h = yes; then
+ INTTYPES_H=''
+ else
+
+
+ if test $ac_cv_header_inttypes_h = yes; then
+ { echo "$as_me:$LINENO: checking absolute name of <inttypes.h>" >&5
+echo $ECHO_N "checking absolute name of <inttypes.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_inttypes_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_inttypes_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <inttypes.h>
+_ACEOF
+ gl_cv_absolute_inttypes_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/inttypes.h#{s#.*"\(.*/inttypes.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_inttypes_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_inttypes_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_INTTYPES_H "$gl_cv_absolute_inttypes_h"
+_ACEOF
+
+
+ ABSOLUTE_INTTYPES_H=\"$gl_cv_absolute_inttypes_h\"
+ else
+ ABSOLUTE_INTTYPES_H=\"no/such/file/inttypes.h\"
+ fi
+
+
+ PRIPTR_PREFIX=
+ if test -n "$STDINT_H"; then
+ PRIPTR_PREFIX='"l"'
+ 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdint.h>
+ extern intptr_t foo;
+ extern $gltype1 foo;
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ PRIPTR_PREFIX='"'$glpfx'"'
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test -n "$PRIPTR_PREFIX" && break
+ done
+ fi
+
+
+ if test "$ac_cv_have_decl_imaxabs" = yes; then
+ HAVE_DECL_IMAXABS=1
+ else
+ HAVE_DECL_IMAXABS=0
+ fi
+
+ if test "$ac_cv_have_decl_imaxdiv" = yes; then
+ HAVE_DECL_IMAXDIV=1
+ else
+ HAVE_DECL_IMAXDIV=0
+ fi
+
+ if test "$ac_cv_have_decl_strtoimax" = yes; then
+ HAVE_DECL_STRTOIMAX=1
+ else
+ HAVE_DECL_STRTOIMAX=0
+ fi
+
+ if test "$ac_cv_have_decl_strtoumax" = yes; then
+ HAVE_DECL_STRTOUMAX=1
+ else
+ HAVE_DECL_STRTOUMAX=0
+ fi
+
+ INTTYPES_H='inttypes.h'
+ fi
+
+
+
+
+
+
+
+
+
+
+for ac_func in lchown
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether lstat dereferences a symlink specified with a trailing slash" >&5
+echo $ECHO_N "checking whether lstat dereferences a symlink specified with a trailing slash... $ECHO_C" >&6; }
+if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ rm -f conftest.sym conftest.file
+echo >conftest.file
+if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_lstat_dereferences_slashed_symlink=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+struct stat sbuf;
+ /* Linux will dereference the symlink and fail.
+ 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
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_lstat_dereferences_slashed_symlink=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_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.$ac_ext
+fi
+
+
+else
+ # If the `ln -s' command failed, then we probably don't even
+ # have an lstat function.
+ ac_cv_func_lstat_dereferences_slashed_symlink=no
+fi
+rm -f conftest.sym conftest.file
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5
+echo "${ECHO_T}$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; }
+
+test $ac_cv_func_lstat_dereferences_slashed_symlink = yes &&
+
+cat >>confdefs.h <<_ACEOF
+#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
+_ACEOF
+
+
+if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then
+ gl_LIBOBJS="$gl_LIBOBJS lstat.$ac_objext"
+fi
+
+ :
+
+
+for ac_header in stdlib.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5
+echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6; }
+if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_malloc_0_nonnull=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if STDC_HEADERS || HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+char *malloc ();
+#endif
+
+int
+main ()
+{
+return ! malloc (0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_malloc_0_nonnull=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+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.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5
+echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6; }
+if test $ac_cv_func_malloc_0_nonnull = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MALLOC 1
+_ACEOF
+
+else
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_MALLOC 0
+_ACEOF
+
+ gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"
+
+cat >>confdefs.h <<\_ACEOF
+#define malloc rpl_malloc
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+
+
+ :
+
+
+
+
+ GNULIB_MBSCASECMP=1
+
+
+
+
+ :
+
+
+
+for ac_func in memchr
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_memchr = no; then
+
+
+for ac_header in bp-sym.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+ fi
+
+
+
+
+
+
+
+
+for ac_func in mempcpy
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_mempcpy = no; then
+ HAVE_MEMPCPY=0
+
+ :
+
+ fi
+
+
+
+ GNULIB_MEMPCPY=1
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_memrchr = no; then
+ HAVE_DECL_MEMRCHR=0
+ fi
+
+
+for ac_func in memrchr
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_memrchr = no; then
+ :
+ fi
+
+
+
+ GNULIB_MEMRCHR=1
+
+
+
+for ac_func in memset
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_memset = no; then
+
+ :
+
+ fi
+
+
+
+
+for ac_func in mkdtemp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_mkdtemp = no; then
+ HAVE_MKDTEMP=0
+ :
+
+ fi
+
+
+
+ GNULIB_MKDTEMP=1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking for working mktime" >&5
+echo $ECHO_N "checking for working mktime... $ECHO_C" >&6; }
+if test "${ac_cv_func_working_mktime+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_working_mktime=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+
+#ifndef HAVE_ALARM
+# define alarm(X) /* empty */
+#endif
+
+/* Work around redefinition to rpl_putenv by other config tests. */
+#undef putenv
+
+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 (now)
+ time_t now;
+{
+ struct tm *lt;
+ return ! (lt = localtime (&now)) || mktime (lt) == now;
+}
+
+static int
+mktime_test (now)
+ 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 (j)
+ 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 ()
+{
+ time_t t, delta;
+ int i, j;
+
+ /* This test makes some buggy mktime implementations loop.
+ Give up after 60 seconds; a mktime slower than that
+ isn't worth using anyway. */
+ alarm (60);
+
+ for (;;)
+ {
+ t = (time_t_max << 1) + 1;
+ if (t <= time_t_max)
+ break;
+ time_t_max = t;
+ }
+ time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - 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; t += delta)
+ if (! mktime_test (t))
+ return 1;
+ if (! (mktime_test ((time_t) 1)
+ && mktime_test ((time_t) (60 * 60))
+ && mktime_test ((time_t) (60 * 60 * 24))))
+ return 1;
+
+ for (j = 1; ; j <<= 1)
+ if (! bigtime_test (j))
+ return 1;
+ else if (INT_MAX / 2 < j)
+ break;
+ if (! bigtime_test (INT_MAX))
+ return 1;
+ }
+ return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ());
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_working_mktime=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_working_mktime=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_working_mktime" >&5
+echo "${ECHO_T}$ac_cv_func_working_mktime" >&6; }
+if test $ac_cv_func_working_mktime = no; then
+ gl_LIBOBJS="$gl_LIBOBJS mktime.$ac_objext"
+fi
+
+ if test $ac_cv_func_working_mktime = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define mktime rpl_mktime
+_ACEOF
+
+
+
+
+ fi
+
+
+ gl_LIBOBJS="$gl_LIBOBJS modechange.$ac_objext"
+
+ { echo "$as_me:$LINENO: checking for obstacks" >&5
+echo $ECHO_N "checking for obstacks... $ECHO_C" >&6; }
+if test "${ac_cv_func_obstack+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include "obstack.h"
+int
+main ()
+{
+struct obstack *mem; obstack_free(mem,(char *) 0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_obstack=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_func_obstack=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_obstack" >&5
+echo "${ECHO_T}$ac_cv_func_obstack" >&6; }
+if test $ac_cv_func_obstack = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_OBSTACK 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS obstack.$ac_objext"
+fi
+
+
+ gl_LIBOBJS="$gl_LIBOBJS openat-proc.$ac_objext"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_func in fchmodat mkdirat openat
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ case $ac_cv_func_openat+$ac_cv_func_lstat_dereferences_slashed_symlink in
+ yes+yes) ;;
+ yes+*) gl_LIBOBJS="$gl_LIBOBJS fstatat.$ac_objext";;
+ *)
+
+cat >>confdefs.h <<\_ACEOF
+#define __OPENAT_PREFIX rpl_
+_ACEOF
+
+
+ :
+;;
+ esac
+
+ # Assume we'll use the replacement function.
+ # The only case in which we won't is when we have fchownat, and it works.
+ use_replacement_fchownat=yes
+
+ { echo "$as_me:$LINENO: checking for fchownat" >&5
+echo $ECHO_N "checking for fchownat... $ECHO_C" >&6; }
+if test "${ac_cv_func_fchownat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define fchownat to an innocuous variant, in case <limits.h> declares fchownat.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define fchownat innocuous_fchownat
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char fchownat (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef fchownat
+
+/* 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 fchownat ();
+/* 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_fchownat || defined __stub___fchownat
+choke me
+#endif
+
+int
+main ()
+{
+return fchownat ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_fchownat=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_func_fchownat=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_fchownat" >&5
+echo "${ECHO_T}$ac_cv_func_fchownat" >&6; }
+if test $ac_cv_func_fchownat = yes; then
+ have_fchownat=yes
+else
+ have_fchownat=no
+fi
+
+ if test $have_fchownat = yes; then
+
+ { echo "$as_me:$LINENO: checking whether fchownat works with AT_SYMLINK_NOFOLLOW" >&5
+echo $ECHO_N "checking whether fchownat works with AT_SYMLINK_NOFOLLOW... $ECHO_C" >&6; }
+if test "${gl_cv_func_fchownat_nofollow_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ gl_dangle=conftest.dangle
+ # Remove any remnants of a previous test.
+ rm -f $gl_dangle
+ # Arrange for deletion of the temporary file this test creates.
+ ac_clean_files="$ac_clean_files $gl_dangle"
+ ln -s conftest.no-such $gl_dangle
+ if test "$cross_compiling" = yes; then
+ gl_cv_func_fchownat_nofollow_works=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+int
+main ()
+{
+ return (fchownat (AT_FDCWD, "$gl_dangle", -1, getgid (),
+ AT_SYMLINK_NOFOLLOW) != 0
+ && errno == ENOENT);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_fchownat_nofollow_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gl_cv_func_fchownat_nofollow_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_fchownat_nofollow_works" >&5
+echo "${ECHO_T}$gl_cv_func_fchownat_nofollow_works" >&6; }
+ if test $gl_cv_func_fchownat_nofollow_works = no; then
+ :
+else
+ use_replacement_fchownat=no
+fi
+
+
+ fi
+
+ if test $use_replacement_fchownat = yes; then
+ gl_LIBOBJS="$gl_LIBOBJS fchownat.$ac_objext"
+
+cat >>confdefs.h <<\_ACEOF
+#define fchownat rpl_fchownat
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS quote.$ac_objext"
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS quotearg.$ac_objext"
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for mbstate_t" >&5
+echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_mbstate_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+# include <wchar.h>
+int
+main ()
+{
+mbstate_t x; return sizeof x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_mbstate_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_mbstate_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_mbstate_t" >&5
+echo "${ECHO_T}$ac_cv_type_mbstate_t" >&6; }
+ if test $ac_cv_type_mbstate_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MBSTATE_T 1
+_ACEOF
+
+ else
+
+cat >>confdefs.h <<\_ACEOF
+#define mbstate_t int
+_ACEOF
+
+ fi
+
+ { echo "$as_me:$LINENO: checking whether mbrtowc and mbstate_t are properly declared" >&5
+echo $ECHO_N "checking whether mbrtowc and mbstate_t are properly declared... $ECHO_C" >&6; }
+if test "${gl_cv_func_mbrtowc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <wchar.h>
+int
+main ()
+{
+wchar_t wc;
+ char const s[] = "";
+ size_t n = 1;
+ mbstate_t state;
+ return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_mbrtowc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_func_mbrtowc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_mbrtowc" >&5
+echo "${ECHO_T}$gl_cv_func_mbrtowc" >&6; }
+ if test $gl_cv_func_mbrtowc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MBRTOWC 1
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_readlink = no; then
+ HAVE_READLINK=0
+ gl_LIBOBJS="$gl_LIBOBJS readlink.$ac_objext"
+
+ :
+
+ fi
+
+
+
+ GNULIB_READLINK=1
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-included-regex was given.
+if test "${with_included_regex+set}" = set; 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.
+ { echo "$as_me:$LINENO: checking for working re_compile_pattern" >&5
+echo $ECHO_N "checking for working re_compile_pattern... $ECHO_C" >&6; }
+if test "${gl_cv_func_re_compile_pattern_working+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ gl_cv_func_re_compile_pattern_working=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ #if HAVE_LOCALE_H
+ #include <locale.h>
+ #endif
+ #include <limits.h>
+ #include <regex.h>
+
+int
+main ()
+{
+static struct re_pattern_buffer regex;
+ unsigned char folded_chars[UCHAR_MAX + 1];
+ int i;
+ const char *s;
+ struct re_registers regs;
+
+ #if HAVE_LOCALE_H
+ /* http://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. */
+ if (setlocale (LC_ALL, "en_US.UTF-8"))
+ {
+ 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)
+ return 1;
+ if (re_search (&regex, data, sizeof data - 1,
+ 0, sizeof data - 1, &regs)
+ != -1)
+ return 1;
+ if (! setlocale (LC_ALL, "C"))
+ return 1;
+ }
+ #endif
+
+ /* 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)
+ return 1;
+
+ /* This should fail, but succeeds for glibc-2.5. */
+ if (re_search (&regex, "a\nb", 3, 0, 3, &regs) != -1)
+ return 1;
+
+ /* 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)
+ return 1;
+
+ /* 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)
+ return 1;
+
+ /* 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)
+ return 1;
+
+ /* This should match, but does not for glibc-2.2.1. */
+ if (re_match (&regex, "an", 2, 0, &regs) != 2)
+ return 1;
+
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("x", 1, &regex);
+ if (s)
+ return 1;
+
+ /* glibc-2.2.93 does not work with a negative RANGE argument. */
+ if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1)
+ return 1;
+
+ /* 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)
+ return 1;
+
+ if (re_search (&regex, "WXY", 3, 0, 3, &regs) < 0)
+ return 1;
+
+ /* REG_STARTEND was added to glibc on 2004-01-15.
+ Reject older versions. */
+ if (! REG_STARTEND)
+ return 1;
+
+ /* Reject hosts whose regoff_t values are too narrow.
+ These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t
+ and 32-bit int. */
+ if (sizeof (regoff_t) < sizeof (ptrdiff_t)
+ || sizeof (regoff_t) < sizeof (ssize_t))
+ return 1;
+
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_re_compile_pattern_working=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+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.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_re_compile_pattern_working" >&5
+echo "${ECHO_T}$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
+ ;;
+ *) { { echo "$as_me:$LINENO: error: Invalid value for --with-included-regex: $with_included_regex" >&5
+echo "$as_me: error: Invalid value for --with-included-regex: $with_included_regex" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ if test $ac_use_included_regex = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define _REGEX_LARGE_OFFSETS 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_syntax_options rpl_re_syntax_options
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_set_syntax rpl_re_set_syntax
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_compile_pattern rpl_re_compile_pattern
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_compile_fastmap rpl_re_compile_fastmap
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_search rpl_re_search
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_search_2 rpl_re_search_2
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_match rpl_re_match
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_match_2 rpl_re_match_2
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_set_registers rpl_re_set_registers
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_comp rpl_re_comp
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define re_exec rpl_re_exec
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define regcomp rpl_regcomp
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define regexec rpl_regexec
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define regerror rpl_regerror
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define regfree rpl_regfree
+_ACEOF
+
+ gl_LIBOBJS="$gl_LIBOBJS regex.$ac_objext"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether isblank is declared" >&5
+echo $ECHO_N "checking whether isblank is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_isblank+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+
+int
+main ()
+{
+#ifndef isblank
+ char *p = (char *) isblank;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_isblank=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_isblank=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_isblank" >&5
+echo "${ECHO_T}$ac_cv_have_decl_isblank" >&6; }
+if test $ac_cv_have_decl_isblank = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISBLANK 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISBLANK 0
+_ACEOF
+
+
+fi
+
+
+
+ fi
+
+
+
+for ac_func in rmdir
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+
+
+
+for ac_func in rpmatch
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_rpmatch = no; then
+ :
+ fi
+
+
+ gl_LIBOBJS="$gl_LIBOBJS safe-read.$ac_objext"
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS safe-write.$ac_objext"
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS save-cwd.$ac_objext"
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS savedir.$ac_objext"
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_setenv = no; then
+ gl_LIBOBJS="$gl_LIBOBJS setenv.$ac_objext"
+
+
+
+
+
+
+
+
+
+for ac_header in search.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_func in tsearch
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+ { echo "$as_me:$LINENO: checking if environ is properly declared" >&5
+echo $ECHO_N "checking if environ is properly declared... $ECHO_C" >&6; }
+ if test "${gt_cv_var_environ_declaration+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <unistd.h>
+ extern struct { int foo; } environ;
+int
+main ()
+{
+environ.foo = 1;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_var_environ_declaration=no
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_var_environ_declaration=yes
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ { echo "$as_me:$LINENO: result: $gt_cv_var_environ_declaration" >&5
+echo "${ECHO_T}$gt_cv_var_environ_declaration" >&6; }
+ if test $gt_cv_var_environ_declaration = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ENVIRON_DECL 1
+_ACEOF
+
+ fi
+
+
+ fi
+
+
+
+for ac_func in unsetenv
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+ if test $ac_cv_func_unsetenv = no; then
+ gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext"
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking if environ is properly declared" >&5
+echo $ECHO_N "checking if environ is properly declared... $ECHO_C" >&6; }
+ if test "${gt_cv_var_environ_declaration+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <unistd.h>
+ extern struct { int foo; } environ;
+int
+main ()
+{
+environ.foo = 1;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_var_environ_declaration=no
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_var_environ_declaration=yes
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ { echo "$as_me:$LINENO: result: $gt_cv_var_environ_declaration" >&5
+echo "${ECHO_T}$gt_cv_var_environ_declaration" >&6; }
+ if test $gt_cv_var_environ_declaration = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ENVIRON_DECL 1
+_ACEOF
+
+ fi
+
+
+ else
+ { echo "$as_me:$LINENO: checking for unsetenv() return type" >&5
+echo $ECHO_N "checking for unsetenv() return type... $ECHO_C" >&6; }
+if test "${gt_cv_func_unsetenv_ret+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+int unsetenv (const char *name);
+#else
+int unsetenv();
+#endif
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_func_unsetenv_ret='int'
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_func_unsetenv_ret='void'
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_func_unsetenv_ret" >&5
+echo "${ECHO_T}$gt_cv_func_unsetenv_ret" >&6; }
+ if test $gt_cv_func_unsetenv_ret = 'void'; then
+
+cat >>confdefs.h <<\_ACEOF
+#define VOID_UNSETENV 1
+_ACEOF
+
+ fi
+ fi
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_sleep = no; then
+ HAVE_SLEEP=0
+ gl_LIBOBJS="$gl_LIBOBJS sleep.$ac_objext"
+ :
+ fi
+
+
+
+ GNULIB_SLEEP=1
+
+
+ { echo "$as_me:$LINENO: checking for ssize_t" >&5
+echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6; }
+if test "${gt_cv_ssize_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+int
+main ()
+{
+int x = sizeof (ssize_t *) + sizeof (ssize_t);
+ return !x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_ssize_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_ssize_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_ssize_t" >&5
+echo "${ECHO_T}$gt_cv_ssize_t" >&6; }
+ if test $gt_cv_ssize_t = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ssize_t int
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for struct stat.st_atim.tv_nsec" >&5
+echo $ECHO_N "checking for struct stat.st_atim.tv_nsec... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_atim_tv_nsec+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_atim.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_atim_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_atim.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_atim_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_atim_tv_nsec=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_atim_tv_nsec" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_atim_tv_nsec" >&6; }
+if test $ac_cv_member_struct_stat_st_atim_tv_nsec = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1
+_ACEOF
+
+{ echo "$as_me:$LINENO: checking whether struct stat.st_atim is of type struct timespec" >&5
+echo $ECHO_N "checking whether struct stat.st_atim is of type struct timespec... $ECHO_C" >&6; }
+if test "${ac_cv_typeof_struct_stat_st_atim_is_struct_timespec+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 ()
+{
+
+ st.st_atim = ts;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&5
+echo "${ECHO_T}$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
+
+cat >>confdefs.h <<\_ACEOF
+#define TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC 1
+_ACEOF
+
+ fi
+else
+ { echo "$as_me:$LINENO: checking for struct stat.st_atimespec.tv_nsec" >&5
+echo $ECHO_N "checking for struct stat.st_atimespec.tv_nsec... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_atimespec_tv_nsec+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_atimespec.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_atimespec_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_atimespec.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_atimespec_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_atimespec_tv_nsec=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_atimespec_tv_nsec" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_atimespec_tv_nsec" >&6; }
+if test $ac_cv_member_struct_stat_st_atimespec_tv_nsec = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC 1
+_ACEOF
+
+
+else
+ { echo "$as_me:$LINENO: checking for struct stat.st_atimensec" >&5
+echo $ECHO_N "checking for struct stat.st_atimensec... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_atimensec+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_atimensec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_atimensec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_atimensec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_atimensec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_atimensec=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_atimensec" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_atimensec" >&6; }
+if test $ac_cv_member_struct_stat_st_atimensec = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_ATIMENSEC 1
+_ACEOF
+
+
+else
+ { echo "$as_me:$LINENO: checking for struct stat.st_atim.st__tim.tv_nsec" >&5
+echo $ECHO_N "checking for struct stat.st_atim.st__tim.tv_nsec... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_atim.st__tim.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_atim.st__tim.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" >&6; }
+if test $ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC 1
+_ACEOF
+
+
+fi
+
+fi
+
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for struct stat.st_birthtimespec.tv_nsec" >&5
+echo $ECHO_N "checking for struct stat.st_birthtimespec.tv_nsec... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_birthtimespec_tv_nsec+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_birthtimespec.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_birthtimespec_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_birthtimespec.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_birthtimespec_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_birthtimespec_tv_nsec=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" >&6; }
+if test $ac_cv_member_struct_stat_st_birthtimespec_tv_nsec = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1
+_ACEOF
+
+
+else
+ { echo "$as_me:$LINENO: checking for struct stat.st_birthtimensec" >&5
+echo $ECHO_N "checking for struct stat.st_birthtimensec... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_birthtimensec+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_birthtimensec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_birthtimensec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_birthtimensec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_birthtimensec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_birthtimensec=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_birthtimensec" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_birthtimensec" >&6; }
+if test $ac_cv_member_struct_stat_st_birthtimensec = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC 1
+_ACEOF
+
+
+else
+ { echo "$as_me:$LINENO: checking for struct stat.st_birthtim.tv_nsec" >&5
+echo $ECHO_N "checking for struct stat.st_birthtim.tv_nsec... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_birthtim_tv_nsec+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_birthtim.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_birthtim_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_birthtim.tv_nsec)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_birthtim_tv_nsec=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_birthtim_tv_nsec=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_birthtim_tv_nsec" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_birthtim_tv_nsec" >&6; }
+if test $ac_cv_member_struct_stat_st_birthtim_tv_nsec = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC 1
+_ACEOF
+
+
+fi
+
+fi
+
+fi
+
+
+
+ { echo "$as_me:$LINENO: checking for va_copy" >&5
+echo $ECHO_N "checking for va_copy... $ECHO_C" >&6; }
+ if test "${gl_cv_func_va_copy+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+int
+main ()
+{
+
+#ifndef va_copy
+void (*func) (va_list, va_list) = va_copy;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_va_copy=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_func_va_copy=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ { echo "$as_me:$LINENO: result: $gl_cv_func_va_copy" >&5
+echo "${ECHO_T}$gl_cv_func_va_copy" >&6; }
+ if test $gl_cv_func_va_copy = no; then
+ # Provide a substitute, either __va_copy or as a simple assignment.
+ if test "${gl_cv_func___va_copy+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+int
+main ()
+{
+
+#ifndef __va_copy
+error, bail out
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func___va_copy=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_func___va_copy=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ if test $gl_cv_func___va_copy = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define va_copy __va_copy
+_ACEOF
+
+ else
+
+
+
+cat >>confdefs.h <<\_ACEOF
+#define va_copy gl_va_copy
+_ACEOF
+
+ fi
+ fi
+
+
+
+
+ # Define two additional variables used in the Makefile substitution.
+
+ if test "$ac_cv_header_stdbool_h" = yes; then
+ STDBOOL_H=''
+ else
+ STDBOOL_H='stdbool.h'
+ fi
+
+
+ if test "$ac_cv_type__Bool" = yes; then
+ HAVE__BOOL=1
+ else
+ HAVE__BOOL=0
+ fi
+
+
+
+
+
+ if test $ac_cv_type_long_long_int = yes; then
+ HAVE_LONG_LONG_INT=1
+ else
+ HAVE_LONG_LONG_INT=0
+ fi
+
+
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ HAVE_UNSIGNED_LONG_LONG_INT=1
+ else
+ HAVE_UNSIGNED_LONG_LONG_INT=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 $ac_cv_header_stdint_h = yes; then
+ { echo "$as_me:$LINENO: checking absolute name of <stdint.h>" >&5
+echo $ECHO_N "checking absolute name of <stdint.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_stdint_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_stdint_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdint.h>
+_ACEOF
+ gl_cv_absolute_stdint_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/stdint.h#{s#.*"\(.*/stdint.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_stdint_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_stdint_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_STDINT_H "$gl_cv_absolute_stdint_h"
+_ACEOF
+
+
+ ABSOLUTE_STDINT_H=\"$gl_cv_absolute_stdint_h\"
+ HAVE_STDINT_H=1
+ else
+ ABSOLUTE_STDINT_H=\"no/such/file/stdint.h\"
+ HAVE_STDINT_H=0
+ fi
+
+
+
+ if test $ac_cv_header_stdint_h = yes; then
+ { echo "$as_me:$LINENO: checking whether stdint.h conforms to C99" >&5
+echo $ECHO_N "checking whether stdint.h conforms to C99... $ECHO_C" >&6; }
+if test "${gl_cv_header_working_stdint_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gl_cv_header_working_stdint_h=no
+ cat >conftest.$ac_ext <<_ACEOF
+
+ /* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
+#include ABSOLUTE_STDINT_H
+#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;
+struct s {
+ int check_PTRDIFF: PTRDIFF_MIN < (ptrdiff_t) 0 && (ptrdiff_t) 0 < PTRDIFF_MAX ? 1 : -1;
+ int check_SIG_ATOMIC: SIG_ATOMIC_MIN <= (sig_atomic_t) 0 && (sig_atomic_t) 0 < SIG_ATOMIC_MAX ? 1 : -1;
+ int check_SIZE: (size_t) 0 < SIZE_MAX ? 1 : -1;
+ int check_WCHAR: WCHAR_MIN <= (wchar_t) 0 && (wchar_t) 0 < WCHAR_MAX ? 1 : -1;
+ int check_WINT: WINT_MIN <= (wint_t) 0 && (wint_t) 0 < WINT_MAX
+ && (WINT_MIN < (wint_t) 0 || (wint_t) -1 == (wint_t) WINT_MAX)
+ ? 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 ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_header_working_stdint_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_header_working_stdint_h" >&5
+echo "${ECHO_T}$gl_cv_header_working_stdint_h" >&6; }
+ fi
+ if test "$gl_cv_header_working_stdint_h" = yes; then
+ STDINT_H=
+ else
+
+
+for ac_header in sys/inttypes.h sys/bitypes.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ if test $ac_cv_header_sys_inttypes_h = yes; then
+ HAVE_SYS_INTTYPES_H=1
+ else
+ HAVE_SYS_INTTYPES_H=0
+ fi
+
+ if test $ac_cv_header_sys_bitypes_h = yes; then
+ HAVE_SYS_BITYPES_H=1
+ else
+ HAVE_SYS_BITYPES_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+ for gltype in ptrdiff_t sig_atomic_t size_t wchar_t wint_t ; do
+ { echo "$as_me:$LINENO: checking for bit size of $gltype" >&5
+echo $ECHO_N "checking for bit size of $gltype... $ECHO_C" >&6; }
+if { as_var=gl_cv_bitsizeof_${gltype}; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof ($gltype) * CHAR_BIT) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) result=$ac_lo;;
+'') result=unknown ;;
+esac
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+#include <limits.h>
+static long int longval () { return sizeof ($gltype) * CHAR_BIT; }
+static unsigned long int ulongval () { return sizeof ($gltype) * CHAR_BIT; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if ((sizeof ($gltype) * CHAR_BIT) < 0)
+ {
+ long int i = longval ();
+ if (i != (sizeof ($gltype) * CHAR_BIT))
+ return 1;
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != (sizeof ($gltype) * CHAR_BIT))
+ return 1;
+ fprintf (f, "%lu\n", i);
+ }
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ result=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+result=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+ eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+ac_res=`eval echo '${'gl_cv_bitsizeof_${gltype}'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+ eval result=\$gl_cv_bitsizeof_${gltype}
+ if test $result = unknown; then
+ result=0
+ fi
+ GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ cat >>confdefs.h <<_ACEOF
+#define BITSIZEOF_${GLTYPE} $result
+_ACEOF
+
+ eval BITSIZEOF_${GLTYPE}=\$result
+ done
+
+
+
+
+
+
+
+ for gltype in sig_atomic_t wchar_t wint_t ; do
+ { echo "$as_me:$LINENO: checking whether $gltype is signed" >&5
+echo $ECHO_N "checking whether $gltype is signed... $ECHO_C" >&6; }
+if { as_var=gl_cv_type_${gltype}_signed; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ result=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ result=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ eval gl_cv_type_${gltype}_signed=\$result
+
+fi
+ac_res=`eval echo '${'gl_cv_type_${gltype}_signed'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+ eval result=\$gl_cv_type_${gltype}_signed
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ if test "$result" = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SIGNED_${GLTYPE} 1
+_ACEOF
+
+ 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
+
+
+
+
+
+
+
+ for gltype in ptrdiff_t sig_atomic_t size_t wchar_t wint_t ; do
+ { echo "$as_me:$LINENO: checking for $gltype integer literal suffix" >&5
+echo $ECHO_N "checking for $gltype integer literal suffix... $ECHO_C" >&6; }
+if { as_var=gl_cv_type_${gltype}_suffix; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+
+ extern $gltype foo;
+ extern $gltype1 foo;
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval gl_cv_type_${gltype}_suffix=\$glsuf
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" != no && break
+ done
+fi
+ac_res=`eval echo '${'gl_cv_type_${gltype}_suffix'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" = no && result=
+ eval ${GLTYPE}_SUFFIX=\$result
+ cat >>confdefs.h <<_ACEOF
+#define ${GLTYPE}_SUFFIX $result
+_ACEOF
+
+ done
+
+
+
+ STDINT_H=stdint.h
+ fi
+
+
+
+
+ { echo "$as_me:$LINENO: checking absolute name of <stdio.h>" >&5
+echo $ECHO_N "checking absolute name of <stdio.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_stdio_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_stdio_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+_ACEOF
+ gl_cv_absolute_stdio_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/stdio.h#{s#.*"\(.*/stdio.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_stdio_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_stdio_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_STDIO_H "$gl_cv_absolute_stdio_h"
+_ACEOF
+
+
+ ABSOLUTE_STDIO_H=\"$gl_cv_absolute_stdio_h\"
+
+
+
+
+ { echo "$as_me:$LINENO: checking absolute name of <stdlib.h>" >&5
+echo $ECHO_N "checking absolute name of <stdlib.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_stdlib_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_stdlib_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+_ACEOF
+ gl_cv_absolute_stdlib_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/stdlib.h#{s#.*"\(.*/stdlib.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_stdlib_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_stdlib_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_STDLIB_H "$gl_cv_absolute_stdlib_h"
+_ACEOF
+
+
+ ABSOLUTE_STDLIB_H=\"$gl_cv_absolute_stdlib_h\"
+
+
+
+
+
+
+
+
+
+for ac_func in stpcpy
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_stpcpy = no; then
+ HAVE_STPCPY=0
+
+ :
+
+ fi
+
+
+
+ GNULIB_STPCPY=1
+
+
+
+
+
+for ac_func in strcasecmp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_strcasecmp = no; then
+ HAVE_STRCASECMP=0
+
+ :
+
+ fi
+
+
+
+
+for ac_func in strncasecmp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_strncasecmp = no; then
+
+ :
+
+ fi
+ { echo "$as_me:$LINENO: checking whether strncasecmp is declared" >&5
+echo $ECHO_N "checking whether strncasecmp is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strncasecmp+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strncasecmp
+ char *p = (char *) strncasecmp;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strncasecmp=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_strncasecmp=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strncasecmp" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strncasecmp" >&6; }
+if test $ac_cv_have_decl_strncasecmp = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRNCASECMP 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRNCASECMP 0
+_ACEOF
+
+
+fi
+
+
+ if test $ac_cv_have_decl_strncasecmp = no; then
+ HAVE_DECL_STRNCASECMP=0
+ fi
+
+
+
+
+
+
+
+for ac_func in strchrnul
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_strchrnul = no; then
+ HAVE_STRCHRNUL=0
+ :
+ fi
+
+
+
+ GNULIB_STRCHRNUL=1
+
+
+
+
+for ac_func in strdup
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+
+
+
+
+ if test $ac_cv_have_decl_strdup = no; then
+ HAVE_DECL_STRDUP=0
+ fi
+ :
+
+
+
+ GNULIB_STRDUP=1
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_strerror = no; then
+ gl_LIBOBJS="$gl_LIBOBJS strerror.$ac_objext"
+
+ :
+
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_strndup = no; then
+ HAVE_DECL_STRNDUP=0
+ fi
+
+ # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
+ { echo "$as_me:$LINENO: checking for working strndup" >&5
+echo $ECHO_N "checking for working strndup... $ECHO_C" >&6; }
+if test "${gl_cv_func_strndup+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: checking for strndup" >&5
+echo $ECHO_N "checking for strndup... $ECHO_C" >&6; }
+if test "${ac_cv_func_strndup+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define strndup to an innocuous variant, in case <limits.h> declares strndup.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define strndup innocuous_strndup
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char strndup (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef strndup
+
+/* 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 strndup ();
+/* 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_strndup || defined __stub___strndup
+choke me
+#endif
+
+int
+main ()
+{
+return strndup ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_strndup=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_func_strndup=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_strndup" >&5
+echo "${ECHO_T}$ac_cv_func_strndup" >&6; }
+if test $ac_cv_func_strndup = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#ifdef _AIX
+ too risky
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "too risky" >/dev/null 2>&1; then
+ gl_cv_func_strndup=no
+else
+ gl_cv_func_strndup=yes
+fi
+rm -f conftest*
+
+else
+ gl_cv_func_strndup=no
+fi
+
+else
+ cat >conftest.$ac_ext <<_ACEOF
+
+ /* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+ #include <stdlib.h>
+int
+main ()
+{
+
+#ifndef HAVE_DECL_STRNDUP
+ extern char *strndup (const char *, size_t);
+#endif
+ char *s;
+ s = strndup ("some longer string", 15);
+ free (s);
+ s = strndup ("shorter string", 13);
+ return s[13] != '\0';
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_strndup=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gl_cv_func_strndup=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_func_strndup" >&5
+echo "${ECHO_T}$gl_cv_func_strndup" >&6; }
+ if test $gl_cv_func_strndup = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRNDUP 1
+_ACEOF
+
+ else
+ HAVE_STRNDUP=0
+ gl_LIBOBJS="$gl_LIBOBJS strndup.$ac_objext"
+ :
+ fi
+
+
+
+ GNULIB_STRNDUP=1
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_strnlen = no; then
+ HAVE_DECL_STRNLEN=0
+ fi
+
+ { echo "$as_me:$LINENO: checking for working strnlen" >&5
+echo $ECHO_N "checking for working strnlen... $ECHO_C" >&6; }
+if test "${ac_cv_func_strnlen_working+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_strnlen_working=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+#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
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_strnlen_working=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_strnlen_working=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_strnlen_working" >&5
+echo "${ECHO_T}$ac_cv_func_strnlen_working" >&6; }
+test $ac_cv_func_strnlen_working = no && gl_LIBOBJS="$gl_LIBOBJS strnlen.$ac_objext"
+
+ if test $ac_cv_func_strnlen_working = no; then
+ # This is necessary because automake-1.6.1 doens't understand
+ # that the above use of AC_FUNC_STRNLEN means we may have to use
+ # lib/strnlen.c.
+ #AC_LIBOBJ(strnlen)
+
+cat >>confdefs.h <<\_ACEOF
+#define strnlen rpl_strnlen
+_ACEOF
+
+ :
+ fi
+
+
+
+ GNULIB_STRNLEN=1
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether <inttypes.h> defines strtoimax as a macro" >&5
+echo $ECHO_N "checking whether <inttypes.h> defines strtoimax as a macro... $ECHO_C" >&6; }
+if test "${jm_cv_func_strtoimax_macro+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <inttypes.h>
+#ifdef strtoimax
+ inttypes_h_defines_strtoimax
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "inttypes_h_defines_strtoimax" >/dev/null 2>&1; then
+ jm_cv_func_strtoimax_macro=yes
+else
+ jm_cv_func_strtoimax_macro=no
+fi
+rm -f conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $jm_cv_func_strtoimax_macro" >&5
+echo "${ECHO_T}$jm_cv_func_strtoimax_macro" >&6; }
+
+ if test "$jm_cv_func_strtoimax_macro" != yes; then
+
+for ac_func in strtoimax
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_strtoimax = no; then
+
+ { echo "$as_me:$LINENO: checking whether strtoll is declared" >&5
+echo $ECHO_N "checking whether strtoll is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strtoll+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strtoll
+ char *p = (char *) strtoll;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strtoll=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_strtoll=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoll" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoll" >&6; }
+if test $ac_cv_have_decl_strtoll = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLL 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLL 0
+_ACEOF
+
+
+fi
+
+
+
+
+ fi
+ fi
+
+
+
+ GNULIB_STRTOIMAX=1
+
+
+
+for ac_func in strtol
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+
+
+
+ if test "$ac_cv_type_long_long_int" = yes; then
+
+for ac_func in strtoll
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_strtoll = no; then
+
+ :
+
+ fi
+ fi
+
+
+
+for ac_func in strtoul
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+
+
+
+ if test "$ac_cv_type_unsigned_long_long_int" = yes; then
+
+for ac_func in strtoull
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_strtoull = no; then
+
+ :
+
+ fi
+ fi
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether <inttypes.h> defines strtoumax as a macro" >&5
+echo $ECHO_N "checking whether <inttypes.h> defines strtoumax as a macro... $ECHO_C" >&6; }
+if test "${jm_cv_func_strtoumax_macro+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <inttypes.h>
+#ifdef strtoumax
+ inttypes_h_defines_strtoumax
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "inttypes_h_defines_strtoumax" >/dev/null 2>&1; then
+ jm_cv_func_strtoumax_macro=yes
+else
+ jm_cv_func_strtoumax_macro=no
+fi
+rm -f conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $jm_cv_func_strtoumax_macro" >&5
+echo "${ECHO_T}$jm_cv_func_strtoumax_macro" >&6; }
+
+ if test "$jm_cv_func_strtoumax_macro" != yes; then
+
+for ac_func in strtoumax
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ gl_LIBOBJS="$gl_LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+ if test $ac_cv_func_strtoumax = no; then
+
+ { echo "$as_me:$LINENO: checking whether strtoull is declared" >&5
+echo $ECHO_N "checking whether strtoull is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strtoull+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strtoull
+ char *p = (char *) strtoull;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strtoull=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_strtoull=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoull" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoull" >&6; }
+if test $ac_cv_have_decl_strtoull = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOULL 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOULL 0
+_ACEOF
+
+
+fi
+
+
+
+
+ fi
+ fi
+
+
+
+ GNULIB_STRTOUMAX=1
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_lstat = yes; then
+ HAVE_LSTAT=1
+ else
+ HAVE_LSTAT=0
+ fi
+
+
+ { echo "$as_me:$LINENO: checking whether mkdir is declared" >&5
+echo $ECHO_N "checking whether mkdir is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_mkdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/stat.h>
+
+int
+main ()
+{
+#ifndef mkdir
+ char *p = (char *) mkdir;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_mkdir=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_mkdir=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_mkdir" >&5
+echo "${ECHO_T}$ac_cv_have_decl_mkdir" >&6; }
+if test $ac_cv_have_decl_mkdir = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MKDIR 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MKDIR 0
+_ACEOF
+
+
+for ac_header in io.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+fi
+
+
+ if test $ac_cv_have_decl_mkdir = yes; then
+ HAVE_DECL_MKDIR=1
+ else
+ HAVE_DECL_MKDIR=0
+ fi
+
+ if test "$ac_cv_header_io_h" = yes; then
+ HAVE_IO_H=1
+ else
+ HAVE_IO_H=0
+ fi
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking absolute name of <sys/stat.h>" >&5
+echo $ECHO_N "checking absolute name of <sys/stat.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_sys_stat_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_sys_stat_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/stat.h>
+_ACEOF
+ gl_cv_absolute_sys_stat_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/sys/stat.h#{s#.*"\(.*/sys/stat.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_sys_stat_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_sys_stat_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_SYS_STAT_H "$gl_cv_absolute_sys_stat_h"
+_ACEOF
+
+
+ ABSOLUTE_SYS_STAT_H=\"$gl_cv_absolute_sys_stat_h\"
+
+ SYS_STAT_H='sys/stat.h'
+
+
+ { echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+if test -z "$MKDIR_P"; then
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+done
+IFS=$as_save_IFS
+
+fi
+
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ test -d ./--version && rmdir ./--version
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+echo "${ECHO_T}$MKDIR_P" >&6; }
+
+
+
+
+ { echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+if test -z "$MKDIR_P"; then
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+done
+IFS=$as_save_IFS
+
+fi
+
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ test -d ./--version && rmdir ./--version
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+echo "${ECHO_T}$MKDIR_P" >&6; }
+
+
+
+
+
+
+
+
+ if test $ac_cv_header_sysexits_h = yes; then
+ HAVE_SYSEXITS_H=1
+ { echo "$as_me:$LINENO: checking absolute name of <sysexits.h>" >&5
+echo $ECHO_N "checking absolute name of <sysexits.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_sysexits_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_sysexits_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sysexits.h>
+_ACEOF
+ gl_cv_absolute_sysexits_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/sysexits.h#{s#.*"\(.*/sysexits.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_sysexits_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_sysexits_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_SYSEXITS_H "$gl_cv_absolute_sysexits_h"
+_ACEOF
+
+
+ ABSOLUTE_SYSEXITS_H=\"$gl_cv_absolute_sysexits_h\"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sysexits.h>
+int
+main ()
+{
+switch (0)
+ {
+ case EX_OK:
+ case EX_USAGE:
+ case EX_DATAERR:
+ case EX_NOINPUT:
+ case EX_NOUSER:
+ case EX_NOHOST:
+ case EX_UNAVAILABLE:
+ case EX_SOFTWARE:
+ case EX_OSERR:
+ case EX_OSFILE:
+ case EX_CANTCREAT:
+ case EX_IOERR:
+ case EX_TEMPFAIL:
+ case EX_PROTOCOL:
+ case EX_NOPERM:
+ case EX_CONFIG:
+ break;
+ }
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ SYSEXITS_H=
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ SYSEXITS_H=sysexits.h
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ else
+ HAVE_SYSEXITS_H=0
+ SYSEXITS_H=sysexits.h
+ fi
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS tempname.$ac_objext"
+
+ :
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether localtime_r is compatible with its POSIX signature" >&5
+echo $ECHO_N "checking whether localtime_r is compatible with its POSIX signature... $ECHO_C" >&6; }
+if test "${gl_cv_time_r_posix+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <time.h>
+int
+main ()
+{
+/* 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;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_time_r_posix=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_time_r_posix=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_time_r_posix" >&5
+echo "${ECHO_T}$gl_cv_time_r_posix" >&6; }
+ if test $gl_cv_time_r_posix = yes; then
+ REPLACE_LOCALTIME_R=0
+ else
+ REPLACE_LOCALTIME_R=1
+ gl_LIBOBJS="$gl_LIBOBJS time_r.$ac_objext"
+
+ :
+
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_header_unistd_h = yes; then
+ HAVE_UNISTD_H=1
+ { echo "$as_me:$LINENO: checking absolute name of <unistd.h>" >&5
+echo $ECHO_N "checking absolute name of <unistd.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_unistd_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_unistd_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <unistd.h>
+_ACEOF
+ gl_cv_absolute_unistd_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/unistd.h#{s#.*"\(.*/unistd.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_unistd_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_unistd_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_UNISTD_H "$gl_cv_absolute_unistd_h"
+_ACEOF
+
+
+ ABSOLUTE_UNISTD_H=\"$gl_cv_absolute_unistd_h\"
+ else
+ HAVE_UNISTD_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS dup-safer.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS fd-safer.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS pipe-safer.$ac_objext"
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS unlinkdir.$ac_objext"
+
+ # The Hurd, the Linux kernel, the FreeBSD kernel version 2.2 and later,
+ # and Cygwin never let anyone (even root) unlink directories.
+ # If anyone knows of another system for which unlink can never
+ # remove a directory, please report it to <bug-coreutils@gnu.org>.
+ # Unfortunately this is difficult to test for, since it requires root access
+ # and might create garbage in the file system,
+ # so the code below simply relies on the kernel name and version number.
+ case $host in
+ *-*-gnu[0-9]* | \
+ *-*-linux-* | *-*-linux | \
+ *-*-freebsd2.2* | *-*-freebsd[3-9]* | *-*-freebsd[1-9][0-9]* | \
+ *-cygwin)
+
+cat >>confdefs.h <<\_ACEOF
+#define UNLINK_CANNOT_UNLINK_DIR 1
+_ACEOF
+;;
+ esac
+
+
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_UNLOCKED_IO 1
+_ACEOF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_utime_null = no; then
+ gl_LIBOBJS="$gl_LIBOBJS utime.$ac_objext"
+
+cat >>confdefs.h <<\_ACEOF
+#define utime rpl_utime
+_ACEOF
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether utimes accepts a null argument" >&5
+echo $ECHO_N "checking whether utimes accepts a null argument... $ECHO_C" >&6; }
+if test "${ac_cv_func_utimes_null+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ rm -f conftest.data; > conftest.data
+if test "$cross_compiling" = yes; then
+ ac_cv_func_utimes_null=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* In case stat has been defined to rpl_stat, undef it here. */
+#undef stat
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+int
+main () {
+struct stat s, t;
+return ! (stat ("conftest.data", &s) == 0
+ && utimes ("conftest.data", 0) == 0
+ && stat ("conftest.data", &t) == 0
+ && t.st_mtime >= s.st_mtime
+ && t.st_mtime - s.st_mtime < 120));
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_utimes_null=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_utimes_null=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+rm -f core core.* *.core
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_utimes_null" >&5
+echo "${ECHO_T}$ac_cv_func_utimes_null" >&6; }
+
+ if test $ac_cv_func_utimes_null = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_UTIMES_NULL 1
+_ACEOF
+
+ fi
+
+
+
+ fi
+
+
+ gl_LIBOBJS="$gl_LIBOBJS utimens.$ac_objext"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+cat >>confdefs.h <<\_ACEOF
+#define REPLACE_VASNPRINTF 1
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for ptrdiff_t" >&5
+echo $ECHO_N "checking for ptrdiff_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_ptrdiff_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef ptrdiff_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_ptrdiff_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_ptrdiff_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_ptrdiff_t" >&5
+echo "${ECHO_T}$ac_cv_type_ptrdiff_t" >&6; }
+if test $ac_cv_type_ptrdiff_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_PTRDIFF_T 1
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+for ac_func in snprintf wcslen
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+ fi
+
+
+
+
+for ac_func in vsnprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+ if test $ac_cv_func_vsnprintf = no; then
+
+
+ gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext"
+ if test $ac_cv_func_vsnprintf = yes; then
+ REPLACE_VSNPRINTF=1
+ fi
+ :
+
+ fi
+
+
+
+
+ if test $ac_cv_have_decl_vsnprintf = no; then
+ HAVE_DECL_VSNPRINTF=0
+ fi
+
+
+
+ GNULIB_VSNPRINTF=1
+
+
+ { echo "$as_me:$LINENO: checking whether <wchar.h> is standalone" >&5
+echo $ECHO_N "checking whether <wchar.h> is standalone... $ECHO_C" >&6; }
+if test "${gl_cv_header_wchar_h_standalone+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#include <wchar.h>
+wchar_t w;
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_header_wchar_h_standalone=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gl_cv_header_wchar_h_standalone=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_header_wchar_h_standalone" >&5
+echo "${ECHO_T}$gl_cv_header_wchar_h_standalone" >&6; }
+ if test $gl_cv_header_wchar_h_standalone = yes; then
+ WCHAR_H=
+ else
+ { echo "$as_me:$LINENO: checking absolute name of <wchar.h>" >&5
+echo $ECHO_N "checking absolute name of <wchar.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_wchar_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_wchar_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <wchar.h>
+_ACEOF
+ gl_cv_absolute_wchar_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/wchar.h#{s#.*"\(.*/wchar.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_wchar_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_wchar_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_WCHAR_H "$gl_cv_absolute_wchar_h"
+_ACEOF
+
+
+ ABSOLUTE_WCHAR_H=\"$gl_cv_absolute_wchar_h\"
+ WCHAR_H=wchar.h
+ 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
+
+
+ WCTYPE_H=wctype.h
+ if test $ac_cv_header_wctype_h = yes; then
+ if test $ac_cv_func_iswcntrl = yes; then
+ WCTYPE_H=
+ fi
+ { echo "$as_me:$LINENO: checking absolute name of <wctype.h>" >&5
+echo $ECHO_N "checking absolute name of <wctype.h>... $ECHO_C" >&6; }
+if test "${gl_cv_absolute_wctype_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+
+
+ if test $ac_cv_header_wctype_h = yes; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <wctype.h>
+_ACEOF
+ gl_cv_absolute_wctype_h=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+sed -n '\#/wctype.h#{s#.*"\(.*/wctype.h\)".*#\1#;s#^/[^/]#//&#;p;q;}'`
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $gl_cv_absolute_wctype_h" >&5
+echo "${ECHO_T}$gl_cv_absolute_wctype_h" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define ABSOLUTE_WCTYPE_H "$gl_cv_absolute_wctype_h"
+_ACEOF
+
+
+ ABSOLUTE_WCTYPE_H=\"$gl_cv_absolute_wctype_h\"
+ HAVE_WCTYPE_H=1
+ else
+ ABSOLUTE_WCTYPE_H=\"no/such/file/wctype.h\"
+ HAVE_WCTYPE_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking whether wcwidth is declared" >&5
+echo $ECHO_N "checking whether wcwidth is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_wcwidth+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* AIX 3.2.5 declares wcwidth in <string.h>. */
+#include <string.h>
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+
+
+int
+main ()
+{
+#ifndef wcwidth
+ char *p = (char *) wcwidth;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_wcwidth=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_wcwidth=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_wcwidth" >&5
+echo "${ECHO_T}$ac_cv_have_decl_wcwidth" >&6; }
+if test $ac_cv_have_decl_wcwidth = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_WCWIDTH 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_WCWIDTH 0
+_ACEOF
+
+
+fi
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS xmalloc.$ac_objext"
+
+
+
+ :
+
+
+ :
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS xgetcwd.$ac_objext"
+
+
+
+
+
+ :
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS xstrtol.$ac_objext"
+ gl_LIBOBJS="$gl_LIBOBJS xstrtoul.$ac_objext"
+
+ LIBTAR_LIBDEPS="$gl_libdeps"
+
+ LIBTAR_LTLIBDEPS="$gl_ltlibdeps"
+
+
+
+
+
+
+# paxutils modules
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; }
+if test "${ac_cv_header_time+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_time=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_time=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TIME_WITH_SYS_TIME 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for struct stat.st_blksize" >&5
+echo $ECHO_N "checking for struct stat.st_blksize... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_blksize+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_blksize)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_blksize=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_blksize)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_blksize=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_blksize=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_blksize" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_blksize" >&6; }
+if test $ac_cv_member_struct_stat_st_blksize = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BLKSIZE 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ST_BLKSIZE 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+
+ # Set LIB_SETSOCKOPT to -lnsl -lsocket if necessary.
+ pu_save_LIBS=$LIBS
+ LIB_SETSOCKOPT=
+ { echo "$as_me:$LINENO: checking for library containing setsockopt" >&5
+echo $ECHO_N "checking for library containing setsockopt... $ECHO_C" >&6; }
+if test "${ac_cv_search_setsockopt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char setsockopt ();
+int
+main ()
+{
+return setsockopt ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' socket; 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
+ rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_setsockopt=$ac_res
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if test "${ac_cv_search_setsockopt+set}" = set; then
+ break
+fi
+done
+if test "${ac_cv_search_setsockopt+set}" = set; then
+ :
+else
+ ac_cv_search_setsockopt=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_setsockopt" >&5
+echo "${ECHO_T}$ac_cv_search_setsockopt" >&6; }
+ac_res=$ac_cv_search_setsockopt
+if test "$ac_res" != no; then
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+ { echo "$as_me:$LINENO: checking for library containing setsockopt" >&5
+echo $ECHO_N "checking for library containing setsockopt... $ECHO_C" >&6; }
+if test "${ac_cv_search_setsockopt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char setsockopt ();
+int
+main ()
+{
+return setsockopt ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' socket; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib -lnsl $ac_func_search_save_LIBS"
+ fi
+ rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_setsockopt=$ac_res
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if test "${ac_cv_search_setsockopt+set}" = set; then
+ break
+fi
+done
+if test "${ac_cv_search_setsockopt+set}" = set; then
+ :
+else
+ ac_cv_search_setsockopt=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_setsockopt" >&5
+echo "${ECHO_T}$ac_cv_search_setsockopt" >&6; }
+ac_res=$ac_cv_search_setsockopt
+if test "$ac_res" != no; then
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+ { echo "$as_me:$LINENO: checking for library containing setsockopt" >&5
+echo $ECHO_N "checking for library containing setsockopt... $ECHO_C" >&6; }
+if test "${ac_cv_search_setsockopt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char setsockopt ();
+int
+main ()
+{
+return setsockopt ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' nsl; 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
+ rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_setsockopt=$ac_res
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if test "${ac_cv_search_setsockopt+set}" = set; then
+ break
+fi
+done
+if test "${ac_cv_search_setsockopt+set}" = set; then
+ :
+else
+ ac_cv_search_setsockopt=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_setsockopt" >&5
+echo "${ECHO_T}$ac_cv_search_setsockopt" >&6; }
+ac_res=$ac_cv_search_setsockopt
+if test "$ac_res" != no; then
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+ case "$ac_cv_search_setsockopt" in
+ -l*) LIB_SETSOCKOPT=$ac_cv_search_setsockopt
+ esac
+
+ LIBS=$pu_save_LIBS
+
+
+
+
+
+
+
+ enable_rmt() {
+ if test $ac_cv_header_sys_mtio_h = yes; then
+ { echo "$as_me:$LINENO: checking for remote tape header files" >&5
+echo $ECHO_N "checking for remote tape header files... $ECHO_C" >&6; }
+if test "${pu_cv_header_rmt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#if HAVE_SGTTY_H
+# include <sgtty.h>
+#endif
+#include <sys/socket.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ pu_cv_header_rmt=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ pu_cv_header_rmt=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $pu_cv_header_rmt" >&5
+echo "${ECHO_T}$pu_cv_header_rmt" >&6; }
+ test $pu_cv_header_rmt = yes && PU_RMT_PROG='rmt$(EXEEXT)'
+
+ fi
+ }
+
+
+for ac_header in sys/mtio.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ { echo "$as_me:$LINENO: checking which ioctl field to test for reversed bytes" >&5
+echo $ECHO_N "checking which ioctl field to test for reversed bytes... $ECHO_C" >&6; }
+if test "${pu_cv_header_mtio_check_field+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/mtio.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "mt_model" >/dev/null 2>&1; then
+ pu_cv_header_mtio_check_field=mt_model
+else
+ pu_cv_header_mtio_check_field=mt_type
+fi
+rm -f conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $pu_cv_header_mtio_check_field" >&5
+echo "${ECHO_T}$pu_cv_header_mtio_check_field" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define MTIO_CHECK_FIELD $pu_cv_header_mtio_check_field
+_ACEOF
+
+
+
+
+ if test "x$DEFAULT_RMT_DIR" != x; then
+ DEFAULT_RMT_COMMAND=$DEFAULT_RMT_DIR/rmt
+ else
+ DEFAULT_RMT_DIR='$(libexecdir)'
+ fi
+
+ { echo "$as_me:$LINENO: checking whether to build rmt" >&5
+echo $ECHO_N "checking whether to build rmt... $ECHO_C" >&6; }
+
+# Check whether --with-rmt was given.
+if test "${with_rmt+set}" = set; then
+ withval=$with_rmt; case $withval in
+ yes|no) { { echo "$as_me:$LINENO: error: Invalid argument to --with-rmt" >&5
+echo "$as_me: error: Invalid argument to --with-rmt" >&2;}
+ { (exit 1); exit 1; }; };;
+ /*) DEFAULT_RMT_COMMAND=$withval
+ { echo "$as_me:$LINENO: result: no, use $withval instead" >&5
+echo "${ECHO_T}no, use $withval instead" >&6; };;
+ *) { { echo "$as_me:$LINENO: error: Argument to --with-rmt must be an absolute file name" >&5
+echo "$as_me: error: Argument to --with-rmt must be an absolute file name" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+else
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+ enable_rmt
+ if test "$PU_RMT_PROG" = ""; then
+ { echo "$as_me:$LINENO: WARNING: not building rmt, required header files are missing" >&5
+echo "$as_me: WARNING: not building rmt, required header files are missing" >&2;}
+ fi
+fi
+
+
+
+ if test "x$DEFAULT_RMT_COMMAND" != x; then
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_RMT_COMMAND "$DEFAULT_RMT_COMMAND"
+_ACEOF
+
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_header in sys/buf.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+ { echo "$as_me:$LINENO: checking for struct stat.st_blksize" >&5
+echo $ECHO_N "checking for struct stat.st_blksize... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_stat_st_blksize+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static struct stat ac_aggr;
+if (ac_aggr.st_blksize)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_blksize=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static struct stat ac_aggr;
+if (sizeof ac_aggr.st_blksize)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_stat_st_blksize=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_stat_st_blksize=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_blksize" >&5
+echo "${ECHO_T}$ac_cv_member_struct_stat_st_blksize" >&6; }
+if test $ac_cv_member_struct_stat_st_blksize = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BLKSIZE 1
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_func in fsync getdtablesize lstat mkfifo readlink strerror symlink setlocale utimes
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+{ echo "$as_me:$LINENO: checking whether getgrgid is declared" >&5
+echo $ECHO_N "checking whether getgrgid is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getgrgid+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <grp.h>
+
+int
+main ()
+{
+#ifndef getgrgid
+ char *p = (char *) getgrgid;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getgrgid=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_getgrgid=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getgrgid" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getgrgid" >&6; }
+if test $ac_cv_have_decl_getgrgid = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETGRGID 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETGRGID 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether getpwuid is declared" >&5
+echo $ECHO_N "checking whether getpwuid is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getpwuid+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <pwd.h>
+
+int
+main ()
+{
+#ifndef getpwuid
+ char *p = (char *) getpwuid;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getpwuid=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_getpwuid=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getpwuid" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getpwuid" >&6; }
+if test $ac_cv_have_decl_getpwuid = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETPWUID 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETPWUID 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether time is declared" >&5
+echo $ECHO_N "checking whether time is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_time+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <time.h>
+
+int
+main ()
+{
+#ifndef time
+ char *p = (char *) time;
+ return !p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_time=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl_time=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_time" >&5
+echo "${ECHO_T}$ac_cv_have_decl_time" >&6; }
+if test $ac_cv_have_decl_time = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_TIME 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_TIME 0
+_ACEOF
+
+
+fi
+
+
+
+
+for ac_func in waitpid
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ case " $LIBOBJS " in
+ *" $ac_func.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
+ ;;
+esac
+
+fi
+done
+
+
+
+{ echo "$as_me:$LINENO: checking for remote shell" >&5
+echo $ECHO_N "checking for remote shell... $ECHO_C" >&6; }
+if test "${tar_cv_path_RSH+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RSH"; then
+ tar_cv_path_RSH=$RSH
+ else
+ tar_cv_path_RSH=no
+ for ac_file in /usr/ucb/rsh /usr/bin/remsh /usr/bin/rsh /usr/bsd/rsh \
+ /usr/bin/nsh /usr/bin/rcmd
+ do
+ # Prefer a non-symlink rsh to a symlink one, so that binaries built
+ # on AIX 4.1.4, where /usr/ucb/rsh is a symlink to /usr/bin/rsh
+ # will run on AIX 4.3.0, which has only /usr/bin/rsh.
+ if test -f $ac_file; then
+ if (test -h $ac_file) 2>/dev/null; then
+ test $tar_cv_path_RSH = no && tar_cv_path_RSH=$ac_file
+ else
+ tar_cv_path_RSH=$ac_file
+ break
+ fi
+ fi
+ done
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $tar_cv_path_RSH" >&5
+echo "${ECHO_T}$tar_cv_path_RSH" >&6; }
+if test $tar_cv_path_RSH = no; then
+
+for ac_header in netdb.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define REMOTE_SHELL "$tar_cv_path_RSH"
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for default archive format" >&5
+echo $ECHO_N "checking for default archive format... $ECHO_C" >&6; }
+
+
+
+if test -z "$DEFAULT_ARCHIVE_FORMAT"; then
+ DEFAULT_ARCHIVE_FORMAT="GNU"
+fi
+case $DEFAULT_ARCHIVE_FORMAT in
+ V7|OLDGNU|USTAR|POSIX|GNU) ;;
+ *) { { echo "$as_me:$LINENO: error: Invalid format name" >&5
+echo "$as_me: error: Invalid format name" >&2;}
+ { (exit 1); exit 1; }; };;
+esac
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_ARCHIVE_FORMAT ${DEFAULT_ARCHIVE_FORMAT}_FORMAT
+_ACEOF
+
+{ echo "$as_me:$LINENO: result: $DEFAULT_ARCHIVE_FORMAT" >&5
+echo "${ECHO_T}$DEFAULT_ARCHIVE_FORMAT" >&6; }
+
+{ echo "$as_me:$LINENO: checking for default archive" >&5
+echo $ECHO_N "checking for default archive... $ECHO_C" >&6; }
+
+
+if test -z "$DEFAULT_ARCHIVE"; then
+ DEFAULT_ARCHIVE=-
+else
+ if test -z "`ls $DEFAULT_ARCHIVE 2>/dev/null`"; then
+ { echo "$as_me:$LINENO: WARNING: DEFAULT_ARCHIVE \`$DEFAULT_ARCHIVE' not found on this system" >&5
+echo "$as_me: WARNING: DEFAULT_ARCHIVE \`$DEFAULT_ARCHIVE' not found on this system" >&2;}
+ fi
+ # FIXME: Look for DEFTAPE in <sys/mtio.h>.
+ # FIXME: Let DEVICE_PREFIX be configured from the environment.
+ # FIXME: Rearrange, here.
+ case $DEFAULT_ARCHIVE in
+ *[0-7][lmh])
+
+cat >>confdefs.h <<\_ACEOF
+#define DENSITY_LETTER 1
+_ACEOF
+
+ device_prefix=`echo $DEFAULT_ARCHIVE | sed 's/0-7lmh$//'`
+ ;;
+ *[0-7])
+ device_prefix=`echo $DEFAULT_ARCHIVE | sed 's/0-7$//'`
+ ;;
+ *)
+ device_prefix=
+ ;;
+ esac
+ case "$device_prefix" in
+ ?*)
+
+cat >>confdefs.h <<_ACEOF
+#define DEVICE_PREFIX "$device_prefix"
+_ACEOF
+
+ ;;
+ esac
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_ARCHIVE "$DEFAULT_ARCHIVE"
+_ACEOF
+
+{ echo "$as_me:$LINENO: result: $DEFAULT_ARCHIVE" >&5
+echo "${ECHO_T}$DEFAULT_ARCHIVE" >&6; }
+
+
+{ echo "$as_me:$LINENO: checking for default blocking" >&5
+echo $ECHO_N "checking for default blocking... $ECHO_C" >&6; }
+DEFAULT_BLOCKING=${DEFAULT_BLOCKING-20}
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_BLOCKING $DEFAULT_BLOCKING
+_ACEOF
+
+{ echo "$as_me:$LINENO: result: $DEFAULT_BLOCKING" >&5
+echo "${ECHO_T}$DEFAULT_BLOCKING" >&6; }
+
+{ echo "$as_me:$LINENO: checking for default quoting style" >&5
+echo $ECHO_N "checking for default quoting style... $ECHO_C" >&6; }
+
+
+DEFAULT_QUOTING_STYLE="escape"
+
+
+case $DEFAULT_QUOTING_STYLE in
+ literal|shell|shell-always|c|escape|locale|clocale) ;;
+*) { { echo "$as_me:$LINENO: error: Invalid quoting style" >&5
+echo "$as_me: error: Invalid quoting style" >&2;}
+ { (exit 1); exit 1; }; };;
+esac
+{ echo "$as_me:$LINENO: result: $DEFAULT_QUOTING_STYLE" >&5
+echo "${ECHO_T}$DEFAULT_QUOTING_STYLE" >&6; }
+DEFAULT_QUOTING_STYLE=`echo ${DEFAULT_QUOTING_STYLE}|sed 's/-/_/g'`_quoting_style
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_QUOTING_STYLE $DEFAULT_QUOTING_STYLE
+_ACEOF
+
+
+# Iconv
+
+ 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+set}" = set; then
+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { echo "$as_me:$LINENO: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
+else
+ { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
+fi
+if test "${acl_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # 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="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
+if test "${acl_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's 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
+{ echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+ { echo "$as_me:$LINENO: checking for shared library run path origin" >&5
+echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6; }
+if test "${acl_cv_rpath+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ 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
+{ echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
+echo "${ECHO_T}$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+set}" = set; then
+ enableval=$enable_rpath; :
+else
+ enable_rpath=yes
+fi
+
+
+
+ acl_libdirstem=lib
+ searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib64 ) acl_libdirstem=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ 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\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; 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\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ fi
+ fi
+
+fi
+
+ LIBICONV=
+ LTLIBICONV=
+ INCICONV=
+ LIBICONV_PREFIX=
+ 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
+ dir="$additional_libdir"
+ if test -n "$acl_shlibext"; then
+ if test -f "$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"; 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"; 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"; 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
+ 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"; 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"; 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"; 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"; 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"; 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/"'*$,,'`
+ LIBICONV_PREFIX="$basedir"
+ 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*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; 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$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_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$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_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*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.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
+
+
+
+
+
+
+
+ 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
+
+
+ { echo "$as_me:$LINENO: checking for iconv" >&5
+echo $ECHO_N "checking for iconv... $ECHO_C" >&6; }
+if test "${am_cv_func_iconv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_func_iconv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$am_save_LIBS"
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5
+echo "${ECHO_T}$am_cv_func_iconv" >&6; }
+ if test "$am_cv_func_iconv" = yes; then
+ { echo "$as_me:$LINENO: checking for working iconv" >&5
+echo $ECHO_N "checking for working iconv... $ECHO_C" >&6; }
+if test "${am_cv_func_iconv_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ if test "$cross_compiling" = yes; then
+ case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <iconv.h>
+#include <string.h>
+int main ()
+{
+ /* 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 const char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ return 1;
+ }
+ }
+#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 const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ 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,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ return 1;
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ if (/* Try standardized names. */
+ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+ /* Try IRIX, OSF/1 names. */
+ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+ /* Try AIX names. */
+ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+ /* Try HP-UX names. */
+ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+ return 1;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_func_iconv_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+am_cv_func_iconv_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+ LIBS="$am_save_LIBS"
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_func_iconv_works" >&5
+echo "${ECHO_T}$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
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ICONV 1
+_ACEOF
+
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ { echo "$as_me:$LINENO: checking how to link with libiconv" >&5
+echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6; }
+ { echo "$as_me:$LINENO: result: $LIBICONV" >&5
+echo "${ECHO_T}$LIBICONV" >&6; }
+ else
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+
+
+
+ if test "$am_cv_func_iconv" = yes; then
+ { echo "$as_me:$LINENO: checking for iconv declaration" >&5
+echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6; }
+ if test "${am_cv_proto_iconv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_proto_iconv_arg1=""
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ am_cv_proto_iconv_arg1="const"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
+fi
+
+ am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ { echo "$as_me:$LINENO: result: ${ac_t:-
+ }$am_cv_proto_iconv" >&5
+echo "${ECHO_T}${ac_t:-
+ }$am_cv_proto_iconv" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+_ACEOF
+
+ fi
+
+
+for ac_header in iconv.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ ( cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to bug-tar@gnu.org ##
+## ------------------------------ ##
+_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ echo "$as_me:$LINENO: checking for iconv_t" >&5
+echo $ECHO_N "checking for iconv_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_iconv_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#ifdef HAVE_ICONV_H
+# include <iconv.h>
+#endif
+
+
+typedef iconv_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_iconv_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_iconv_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_iconv_t" >&5
+echo "${ECHO_T}$ac_cv_type_iconv_t" >&6; }
+if test $ac_cv_type_iconv_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define iconv_t int
+_ACEOF
+
+fi
+
+
+# Gettext.
+
+ { echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
+ # Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval=$enable_nls; USE_NLS=$enableval
+else
+ USE_NLS=yes
+fi
+
+ { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
+
+
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_MSGFMT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$MSGFMT" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&5
+ 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$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+ { echo "$as_me:$LINENO: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_GMSGFMT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ 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
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_XGETTEXT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$XGETTEXT" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&5
+ 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$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+ { echo "$as_me:$LINENO: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_MSGMERGE+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$MSGMERGE" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&5
+ if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
+ ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+ test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+ ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+ { echo "$as_me:$LINENO: result: $MSGMERGE" >&5
+echo "${ECHO_T}$MSGMERGE" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ test -n "$localedir" || localedir='${datadir}/locale'
+
+
+ ac_config_commands="$ac_config_commands po-directories"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { echo "$as_me:$LINENO: checking for CFPreferencesCopyAppValue" >&5
+echo $ECHO_N "checking for CFPreferencesCopyAppValue... $ECHO_C" >&6; }
+if test "${gt_cv_func_CFPreferencesCopyAppValue+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <CoreFoundation/CFPreferences.h>
+int
+main ()
+{
+CFPreferencesCopyAppValue(NULL, NULL)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_func_CFPreferencesCopyAppValue=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_func_CFPreferencesCopyAppValue=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gt_save_LIBS"
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
+echo "${ECHO_T}$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_CFPREFERENCESCOPYAPPVALUE 1
+_ACEOF
+
+ fi
+ { echo "$as_me:$LINENO: checking for CFLocaleCopyCurrent" >&5
+echo $ECHO_N "checking for CFLocaleCopyCurrent... $ECHO_C" >&6; }
+if test "${gt_cv_func_CFLocaleCopyCurrent+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <CoreFoundation/CFLocale.h>
+int
+main ()
+{
+CFLocaleCopyCurrent();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_func_CFLocaleCopyCurrent=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ gt_cv_func_CFLocaleCopyCurrent=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gt_save_LIBS"
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
+echo "${ECHO_T}$gt_cv_func_CFLocaleCopyCurrent" >&6; }
+ if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_CFLOCALECOPYCURRENT 1
+_ACEOF
+
+ 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
+
+ { echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5
+echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6; }
+if { as_var=$gt_func_gnugettext_libc; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+int
+main ()
+{
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$gt_func_gnugettext_libc=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$gt_func_gnugettext_libc=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$gt_func_gnugettext_libc'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$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
+
+
+ { echo "$as_me:$LINENO: checking for iconv" >&5
+echo $ECHO_N "checking for iconv... $ECHO_C" >&6; }
+if test "${am_cv_func_iconv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_func_iconv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$am_save_LIBS"
+ fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5
+echo "${ECHO_T}$am_cv_func_iconv" >&6; }
+ if test "$am_cv_func_iconv" = yes; then
+ { echo "$as_me:$LINENO: checking for working iconv" >&5
+echo $ECHO_N "checking for working iconv... $ECHO_C" >&6; }
+if test "${am_cv_func_iconv_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ if test "$cross_compiling" = yes; then
+ case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <iconv.h>
+#include <string.h>
+int main ()
+{
+ /* 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 const char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ return 1;
+ }
+ }
+#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 const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ 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,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ return 1;
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ if (/* Try standardized names. */
+ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+ /* Try IRIX, OSF/1 names. */
+ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+ /* Try AIX names. */
+ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+ /* Try HP-UX names. */
+ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+ return 1;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_func_iconv_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+am_cv_func_iconv_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+ LIBS="$am_save_LIBS"
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_func_iconv_works" >&5
+echo "${ECHO_T}$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
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ICONV 1
+_ACEOF
+
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ { echo "$as_me:$LINENO: checking how to link with libiconv" >&5
+echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6; }
+ { echo "$as_me:$LINENO: result: $LIBICONV" >&5
+echo "${ECHO_T}$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\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; 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\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ fi
+ fi
+
+fi
+
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ LIBINTL_PREFIX=
+ 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
+ dir="$additional_libdir"
+ if test -n "$acl_shlibext"; then
+ if test -f "$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"; 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"; 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"; 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
+ 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"; 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"; 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"; 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"; 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"; 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/"'*$,,'`
+ LIBINTL_PREFIX="$basedir"
+ 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*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; 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$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_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$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_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*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.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
+
+ { echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5
+echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6; }
+if { as_var=$gt_func_gnugettext_libintl; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 ()
+{
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$gt_func_gnugettext_libintl=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$gt_func_gnugettext_libintl=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 ()
+{
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ eval "$gt_func_gnugettext_libintl=yes"
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"
+fi
+ac_res=`eval echo '${'$gt_func_gnugettext_libintl'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$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
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_NLS 1
+_ACEOF
+
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ { echo "$as_me:$LINENO: checking whether to use NLS" >&5
+echo $ECHO_N "checking whether to use NLS... $ECHO_C" >&6; }
+ { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
+ if test "$USE_NLS" = "yes"; then
+ { echo "$as_me:$LINENO: checking where the gettext function comes from" >&5
+echo $ECHO_N "checking where the gettext function comes from... $ECHO_C" >&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
+ { echo "$as_me:$LINENO: result: $gt_source" >&5
+echo "${ECHO_T}$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
+ { echo "$as_me:$LINENO: checking how to link with libintl" >&5
+echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6; }
+ { echo "$as_me:$LINENO: result: $LIBINTL" >&5
+echo "${ECHO_T}$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
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_GETTEXT 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DCGETTEXT 1
+_ACEOF
+
+ fi
+
+ POSUB=po
+ fi
+
+
+
+ INTLLIBS="$LIBINTL"
+
+
+
+
+
+
+
+
+# Initialize the test suite.
+ac_config_commands="$ac_config_commands tests/atconfig"
+
+
+ac_config_files="$ac_config_files tests/Makefile tests/atlocal"
+ # FIXME: tests/preset?
+
+AUTOM4TE=${AUTOM4TE-"${am_missing_run}autom4te"}
+
+
+
+
+# Check whether --enable-backup-scripts was given.
+if test "${enable_backup_scripts+set}" = set; then
+ enableval=$enable_backup_scripts; case $enableval in
+ yes) BACKUP_LIBEXEC_SCRIPTS='$(BACKUP_LIBEXEC_SCRIPTS_LIST)'
+ BACKUP_SBIN_SCRIPTS='$(BACKUP_SBIN_SCRIPTS_LIST)'
+ ;;
+ esac
+fi
+
+
+
+if date +%Y-%m-%d 2>/dev/null >&2; then
+ BACKUP_SED_COND='/^\#ELSE_DATE_FORMAT_OK/,/^\#ENDIF_DATE_FORMAT_OK/d;/^\#IF_DATE_FORMAT_OK/d'
+else
+ BACKUP_SED_COND='/^\#IF_DATE_FORMAT_OK/,/^\#ELSE_DATE_FORMAT_OK/d;/^\#ENDIF_DATE_FORMAT_OK/d'
+fi
+
+ac_config_files="$ac_config_files Makefile doc/Makefile lib/Makefile po/Makefile.in scripts/Makefile rmt/Makefile src/Makefile"
+
+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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_unset $ac_var ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ test "x$cache_file" != "x/dev/null" &&
+ { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+ cat confcache >$cache_file
+ else
+ { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+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=`echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"GL_COND_LIBTOOL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"GL_COND_LIBTOOL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+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 "$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
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $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}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+
+# PATH needs CR
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+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
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. 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" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # 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
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+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
+fi
+echo >conf$$.file
+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 -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+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=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+# Find out whether ``test -x'' works. Don't use a zero-byte file, as
+# systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ as_executable_p="test -x"
+else
+ as_executable_p=:
+fi
+rm -f conf$$.file
+
+# 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
+
+# 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 GNU tar $as_me 1.17, which was
+generated by GNU Autoconf 2.60. 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
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+GNU tar config.status 1.17
+configured by $0, generated by GNU Autoconf 2.60,
+ with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 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'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+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=$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 )
+ echo "$ac_cs_version"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$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
+if \$ac_cs_recheck; then
+ echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ CONFIG_SHELL=$SHELL
+ export CONFIG_SHELL
+ exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+# 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%}"
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.hin" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
+ "tests/atconfig") CONFIG_COMMANDS="$CONFIG_COMMANDS tests/atconfig" ;;
+ "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+ "tests/atlocal") CONFIG_FILES="$CONFIG_FILES tests/atlocal" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
+ "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+ "scripts/Makefile") CONFIG_FILES="$CONFIG_FILES scripts/Makefile" ;;
+ "rmt/Makefile") CONFIG_FILES="$CONFIG_FILES rmt/Makefile" ;;
+ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp=
+ trap 'exit_status=$?
+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+am__isrc!$am__isrc$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+RANLIB!$RANLIB$ac_delim
+YACC!$YACC$ac_delim
+YFLAGS!$YFLAGS$ac_delim
+CPP!$CPP$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+STDBOOL_H!$STDBOOL_H$ac_delim
+HAVE__BOOL!$HAVE__BOOL$ac_delim
+GL_COND_LIBTOOL_TRUE!$GL_COND_LIBTOOL_TRUE$ac_delim
+GL_COND_LIBTOOL_FALSE!$GL_COND_LIBTOOL_FALSE$ac_delim
+ALLOCA!$ALLOCA$ac_delim
+ALLOCA_H!$ALLOCA_H$ac_delim
+GETOPT_H!$GETOPT_H$ac_delim
+GNULIB_CHOWN!$GNULIB_CHOWN$ac_delim
+GNULIB_DUP2!$GNULIB_DUP2$ac_delim
+GNULIB_FCHDIR!$GNULIB_FCHDIR$ac_delim
+GNULIB_FTRUNCATE!$GNULIB_FTRUNCATE$ac_delim
+GNULIB_GETCWD!$GNULIB_GETCWD$ac_delim
+GNULIB_GETLOGIN_R!$GNULIB_GETLOGIN_R$ac_delim
+GNULIB_LSEEK!$GNULIB_LSEEK$ac_delim
+GNULIB_READLINK!$GNULIB_READLINK$ac_delim
+GNULIB_SLEEP!$GNULIB_SLEEP$ac_delim
+_ACEOF
+
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+ break
+ elif $ac_last_try; then
+ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+ ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ cat >conf$$subs.sed <<_ACEOF
+HAVE_DUP2!$HAVE_DUP2$ac_delim
+HAVE_FTRUNCATE!$HAVE_FTRUNCATE$ac_delim
+HAVE_READLINK!$HAVE_READLINK$ac_delim
+HAVE_SLEEP!$HAVE_SLEEP$ac_delim
+HAVE_DECL_GETLOGIN_R!$HAVE_DECL_GETLOGIN_R$ac_delim
+REPLACE_CHOWN!$REPLACE_CHOWN$ac_delim
+REPLACE_FCHDIR!$REPLACE_FCHDIR$ac_delim
+REPLACE_GETCWD!$REPLACE_GETCWD$ac_delim
+REPLACE_LSEEK!$REPLACE_LSEEK$ac_delim
+LIB_CLOCK_GETTIME!$LIB_CLOCK_GETTIME$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+ABSOLUTE_DIRENT_H!$ABSOLUTE_DIRENT_H$ac_delim
+DIRENT_H!$DIRENT_H$ac_delim
+ABSOLUTE_FCNTL_H!$ABSOLUTE_FCNTL_H$ac_delim
+FCNTL_H!$FCNTL_H$ac_delim
+ABSOLUTE_FLOAT_H!$ABSOLUTE_FLOAT_H$ac_delim
+FLOAT_H!$FLOAT_H$ac_delim
+FNMATCH_H!$FNMATCH_H$ac_delim
+LIBINTL!$LIBINTL$ac_delim
+LTLIBINTL!$LTLIBINTL$ac_delim
+ABSOLUTE_SYS_TIME_H!$ABSOLUTE_SYS_TIME_H$ac_delim
+HAVE_SYS_TIME_H!$HAVE_SYS_TIME_H$ac_delim
+HAVE_STRUCT_TIMEVAL!$HAVE_STRUCT_TIMEVAL$ac_delim
+REPLACE_GETTIMEOFDAY!$REPLACE_GETTIMEOFDAY$ac_delim
+SYS_TIME_H!$SYS_TIME_H$ac_delim
+HAVE_LONG_LONG_INT!$HAVE_LONG_LONG_INT$ac_delim
+HAVE_UNSIGNED_LONG_LONG_INT!$HAVE_UNSIGNED_LONG_LONG_INT$ac_delim
+HAVE_INTTYPES_H!$HAVE_INTTYPES_H$ac_delim
+HAVE_SYS_TYPES_H!$HAVE_SYS_TYPES_H$ac_delim
+ABSOLUTE_STDINT_H!$ABSOLUTE_STDINT_H$ac_delim
+HAVE_STDINT_H!$HAVE_STDINT_H$ac_delim
+HAVE_SYS_INTTYPES_H!$HAVE_SYS_INTTYPES_H$ac_delim
+HAVE_SYS_BITYPES_H!$HAVE_SYS_BITYPES_H$ac_delim
+BITSIZEOF_PTRDIFF_T!$BITSIZEOF_PTRDIFF_T$ac_delim
+BITSIZEOF_SIG_ATOMIC_T!$BITSIZEOF_SIG_ATOMIC_T$ac_delim
+BITSIZEOF_SIZE_T!$BITSIZEOF_SIZE_T$ac_delim
+BITSIZEOF_WCHAR_T!$BITSIZEOF_WCHAR_T$ac_delim
+BITSIZEOF_WINT_T!$BITSIZEOF_WINT_T$ac_delim
+HAVE_SIGNED_SIG_ATOMIC_T!$HAVE_SIGNED_SIG_ATOMIC_T$ac_delim
+HAVE_SIGNED_WCHAR_T!$HAVE_SIGNED_WCHAR_T$ac_delim
+HAVE_SIGNED_WINT_T!$HAVE_SIGNED_WINT_T$ac_delim
+PTRDIFF_T_SUFFIX!$PTRDIFF_T_SUFFIX$ac_delim
+SIG_ATOMIC_T_SUFFIX!$SIG_ATOMIC_T_SUFFIX$ac_delim
+SIZE_T_SUFFIX!$SIZE_T_SUFFIX$ac_delim
+WCHAR_T_SUFFIX!$WCHAR_T_SUFFIX$ac_delim
+WINT_T_SUFFIX!$WINT_T_SUFFIX$ac_delim
+STDINT_H!$STDINT_H$ac_delim
+PRI_MACROS_BROKEN!$PRI_MACROS_BROKEN$ac_delim
+GNULIB_IMAXABS!$GNULIB_IMAXABS$ac_delim
+GNULIB_IMAXDIV!$GNULIB_IMAXDIV$ac_delim
+GNULIB_STRTOIMAX!$GNULIB_STRTOIMAX$ac_delim
+GNULIB_STRTOUMAX!$GNULIB_STRTOUMAX$ac_delim
+HAVE_DECL_IMAXABS!$HAVE_DECL_IMAXABS$ac_delim
+HAVE_DECL_IMAXDIV!$HAVE_DECL_IMAXDIV$ac_delim
+HAVE_DECL_STRTOIMAX!$HAVE_DECL_STRTOIMAX$ac_delim
+HAVE_DECL_STRTOUMAX!$HAVE_DECL_STRTOUMAX$ac_delim
+ABSOLUTE_INTTYPES_H!$ABSOLUTE_INTTYPES_H$ac_delim
+PRIPTR_PREFIX!$PRIPTR_PREFIX$ac_delim
+INTTYPES_H!$INTTYPES_H$ac_delim
+GLIBC21!$GLIBC21$ac_delim
+GNULIB_MEMMEM!$GNULIB_MEMMEM$ac_delim
+GNULIB_MEMPCPY!$GNULIB_MEMPCPY$ac_delim
+GNULIB_MEMRCHR!$GNULIB_MEMRCHR$ac_delim
+GNULIB_STPCPY!$GNULIB_STPCPY$ac_delim
+GNULIB_STPNCPY!$GNULIB_STPNCPY$ac_delim
+GNULIB_STRCHRNUL!$GNULIB_STRCHRNUL$ac_delim
+GNULIB_STRDUP!$GNULIB_STRDUP$ac_delim
+GNULIB_STRNDUP!$GNULIB_STRNDUP$ac_delim
+GNULIB_STRNLEN!$GNULIB_STRNLEN$ac_delim
+GNULIB_STRPBRK!$GNULIB_STRPBRK$ac_delim
+GNULIB_STRSEP!$GNULIB_STRSEP$ac_delim
+GNULIB_STRCASESTR!$GNULIB_STRCASESTR$ac_delim
+GNULIB_STRTOK_R!$GNULIB_STRTOK_R$ac_delim
+GNULIB_MBSLEN!$GNULIB_MBSLEN$ac_delim
+GNULIB_MBSCHR!$GNULIB_MBSCHR$ac_delim
+GNULIB_MBSRCHR!$GNULIB_MBSRCHR$ac_delim
+GNULIB_MBSSTR!$GNULIB_MBSSTR$ac_delim
+GNULIB_MBSCASECMP!$GNULIB_MBSCASECMP$ac_delim
+GNULIB_MBSNCASECMP!$GNULIB_MBSNCASECMP$ac_delim
+GNULIB_MBSPCASECMP!$GNULIB_MBSPCASECMP$ac_delim
+GNULIB_MBSCASESTR!$GNULIB_MBSCASESTR$ac_delim
+GNULIB_MBSCSPN!$GNULIB_MBSCSPN$ac_delim
+GNULIB_MBSPBRK!$GNULIB_MBSPBRK$ac_delim
+GNULIB_MBSSPN!$GNULIB_MBSSPN$ac_delim
+GNULIB_MBSSEP!$GNULIB_MBSSEP$ac_delim
+GNULIB_MBSTOK_R!$GNULIB_MBSTOK_R$ac_delim
+HAVE_DECL_MEMMEM!$HAVE_DECL_MEMMEM$ac_delim
+HAVE_MEMPCPY!$HAVE_MEMPCPY$ac_delim
+HAVE_DECL_MEMRCHR!$HAVE_DECL_MEMRCHR$ac_delim
+HAVE_STPCPY!$HAVE_STPCPY$ac_delim
+_ACEOF
+
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+ break
+ elif $ac_last_try; then
+ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+ ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ cat >conf$$subs.sed <<_ACEOF
+HAVE_STPNCPY!$HAVE_STPNCPY$ac_delim
+HAVE_STRCASECMP!$HAVE_STRCASECMP$ac_delim
+HAVE_DECL_STRNCASECMP!$HAVE_DECL_STRNCASECMP$ac_delim
+HAVE_STRCHRNUL!$HAVE_STRCHRNUL$ac_delim
+HAVE_DECL_STRDUP!$HAVE_DECL_STRDUP$ac_delim
+HAVE_STRNDUP!$HAVE_STRNDUP$ac_delim
+HAVE_DECL_STRNDUP!$HAVE_DECL_STRNDUP$ac_delim
+HAVE_DECL_STRNLEN!$HAVE_DECL_STRNLEN$ac_delim
+HAVE_STRPBRK!$HAVE_STRPBRK$ac_delim
+HAVE_STRSEP!$HAVE_STRSEP$ac_delim
+HAVE_STRCASESTR!$HAVE_STRCASESTR$ac_delim
+HAVE_DECL_STRTOK_R!$HAVE_DECL_STRTOK_R$ac_delim
+GNULIB_GETSUBOPT!$GNULIB_GETSUBOPT$ac_delim
+GNULIB_MKDTEMP!$GNULIB_MKDTEMP$ac_delim
+GNULIB_MKSTEMP!$GNULIB_MKSTEMP$ac_delim
+HAVE_GETSUBOPT!$HAVE_GETSUBOPT$ac_delim
+HAVE_MKDTEMP!$HAVE_MKDTEMP$ac_delim
+REPLACE_MKSTEMP!$REPLACE_MKSTEMP$ac_delim
+GNULIB_FPRINTF_POSIX!$GNULIB_FPRINTF_POSIX$ac_delim
+GNULIB_PRINTF_POSIX!$GNULIB_PRINTF_POSIX$ac_delim
+GNULIB_SNPRINTF!$GNULIB_SNPRINTF$ac_delim
+GNULIB_SPRINTF_POSIX!$GNULIB_SPRINTF_POSIX$ac_delim
+GNULIB_VFPRINTF_POSIX!$GNULIB_VFPRINTF_POSIX$ac_delim
+GNULIB_VPRINTF_POSIX!$GNULIB_VPRINTF_POSIX$ac_delim
+GNULIB_VSNPRINTF!$GNULIB_VSNPRINTF$ac_delim
+GNULIB_VSPRINTF_POSIX!$GNULIB_VSPRINTF_POSIX$ac_delim
+GNULIB_VASPRINTF!$GNULIB_VASPRINTF$ac_delim
+GNULIB_FSEEK!$GNULIB_FSEEK$ac_delim
+GNULIB_FSEEKO!$GNULIB_FSEEKO$ac_delim
+GNULIB_FTELL!$GNULIB_FTELL$ac_delim
+GNULIB_FTELLO!$GNULIB_FTELLO$ac_delim
+GNULIB_FFLUSH!$GNULIB_FFLUSH$ac_delim
+REPLACE_FPRINTF!$REPLACE_FPRINTF$ac_delim
+REPLACE_VFPRINTF!$REPLACE_VFPRINTF$ac_delim
+REPLACE_PRINTF!$REPLACE_PRINTF$ac_delim
+REPLACE_VPRINTF!$REPLACE_VPRINTF$ac_delim
+REPLACE_SNPRINTF!$REPLACE_SNPRINTF$ac_delim
+HAVE_DECL_SNPRINTF!$HAVE_DECL_SNPRINTF$ac_delim
+REPLACE_VSNPRINTF!$REPLACE_VSNPRINTF$ac_delim
+HAVE_DECL_VSNPRINTF!$HAVE_DECL_VSNPRINTF$ac_delim
+REPLACE_SPRINTF!$REPLACE_SPRINTF$ac_delim
+REPLACE_VSPRINTF!$REPLACE_VSPRINTF$ac_delim
+HAVE_VASPRINTF!$HAVE_VASPRINTF$ac_delim
+REPLACE_VASPRINTF!$REPLACE_VASPRINTF$ac_delim
+HAVE_FSEEKO!$HAVE_FSEEKO$ac_delim
+REPLACE_FSEEKO!$REPLACE_FSEEKO$ac_delim
+REPLACE_FSEEK!$REPLACE_FSEEK$ac_delim
+HAVE_FTELLO!$HAVE_FTELLO$ac_delim
+REPLACE_FTELLO!$REPLACE_FTELLO$ac_delim
+REPLACE_FTELL!$REPLACE_FTELL$ac_delim
+REPLACE_FFLUSH!$REPLACE_FFLUSH$ac_delim
+ABSOLUTE_STDIO_H!$ABSOLUTE_STDIO_H$ac_delim
+ABSOLUTE_STDLIB_H!$ABSOLUTE_STDLIB_H$ac_delim
+ABSOLUTE_STRING_H!$ABSOLUTE_STRING_H$ac_delim
+HAVE_LSTAT!$HAVE_LSTAT$ac_delim
+HAVE_DECL_MKDIR!$HAVE_DECL_MKDIR$ac_delim
+HAVE_IO_H!$HAVE_IO_H$ac_delim
+ABSOLUTE_SYS_STAT_H!$ABSOLUTE_SYS_STAT_H$ac_delim
+SYS_STAT_H!$SYS_STAT_H$ac_delim
+HAVE_SYSEXITS_H!$HAVE_SYSEXITS_H$ac_delim
+ABSOLUTE_SYSEXITS_H!$ABSOLUTE_SYSEXITS_H$ac_delim
+SYSEXITS_H!$SYSEXITS_H$ac_delim
+REPLACE_LOCALTIME_R!$REPLACE_LOCALTIME_R$ac_delim
+REPLACE_NANOSLEEP!$REPLACE_NANOSLEEP$ac_delim
+REPLACE_STRPTIME!$REPLACE_STRPTIME$ac_delim
+REPLACE_TIMEGM!$REPLACE_TIMEGM$ac_delim
+ABSOLUTE_TIME_H!$ABSOLUTE_TIME_H$ac_delim
+TIME_H_DEFINES_STRUCT_TIMESPEC!$TIME_H_DEFINES_STRUCT_TIMESPEC$ac_delim
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC!$SYS_TIME_H_DEFINES_STRUCT_TIMESPEC$ac_delim
+HAVE_UNISTD_H!$HAVE_UNISTD_H$ac_delim
+ABSOLUTE_UNISTD_H!$ABSOLUTE_UNISTD_H$ac_delim
+EOVERFLOW!$EOVERFLOW$ac_delim
+ABSOLUTE_WCHAR_H!$ABSOLUTE_WCHAR_H$ac_delim
+WCHAR_H!$WCHAR_H$ac_delim
+HAVE_ISWCNTRL!$HAVE_ISWCNTRL$ac_delim
+HAVE_WINT_T!$HAVE_WINT_T$ac_delim
+ABSOLUTE_WCTYPE_H!$ABSOLUTE_WCTYPE_H$ac_delim
+HAVE_WCTYPE_H!$HAVE_WCTYPE_H$ac_delim
+WCTYPE_H!$WCTYPE_H$ac_delim
+LIBTAR_LIBDEPS!$LIBTAR_LIBDEPS$ac_delim
+LIBTAR_LTLIBDEPS!$LIBTAR_LTLIBDEPS$ac_delim
+LIB_SETSOCKOPT!$LIB_SETSOCKOPT$ac_delim
+PU_RMT_PROG!$PU_RMT_PROG$ac_delim
+DEFAULT_RMT_DIR!$DEFAULT_RMT_DIR$ac_delim
+DEFAULT_RMT_COMMAND!$DEFAULT_RMT_COMMAND$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+DEFAULT_ARCHIVE_FORMAT!$DEFAULT_ARCHIVE_FORMAT$ac_delim
+DEFAULT_ARCHIVE!$DEFAULT_ARCHIVE$ac_delim
+DEFAULT_BLOCKING!$DEFAULT_BLOCKING$ac_delim
+DEFAULT_QUOTING_STYLE!$DEFAULT_QUOTING_STYLE$ac_delim
+LIBICONV!$LIBICONV$ac_delim
+LTLIBICONV!$LTLIBICONV$ac_delim
+USE_NLS!$USE_NLS$ac_delim
+MSGFMT!$MSGFMT$ac_delim
+GMSGFMT!$GMSGFMT$ac_delim
+MSGFMT_015!$MSGFMT_015$ac_delim
+GMSGFMT_015!$GMSGFMT_015$ac_delim
+_ACEOF
+
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+ break
+ elif $ac_last_try; then
+ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+ ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-3.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ cat >conf$$subs.sed <<_ACEOF
+XGETTEXT!$XGETTEXT$ac_delim
+XGETTEXT_015!$XGETTEXT_015$ac_delim
+MSGMERGE!$MSGMERGE$ac_delim
+INTL_MACOSX_LIBS!$INTL_MACOSX_LIBS$ac_delim
+INTLLIBS!$INTLLIBS$ac_delim
+POSUB!$POSUB$ac_delim
+AUTOM4TE!$AUTOM4TE$ac_delim
+BACKUP_LIBEXEC_SCRIPTS!$BACKUP_LIBEXEC_SCRIPTS$ac_delim
+BACKUP_SBIN_SCRIPTS!$BACKUP_SBIN_SCRIPTS$ac_delim
+BACKUP_SED_COND!$BACKUP_SED_COND$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+gl_LIBOBJS!$gl_LIBOBJS$ac_delim
+gl_LTLIBOBJS!$gl_LTLIBOBJS$ac_delim
+_ACEOF
+
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 13; then
+ break
+ elif $ac_last_try; then
+ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+ ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-4.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ 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[ ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[ ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+ { (exit 1); exit 1; }; };;
+ :[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="$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 ||
+ { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+ ac_file_inputs="$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 "`IFS=:
+ echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ fi
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$tmp/stdin";;
+ 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 ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { as_dir="$ac_dir"
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# 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=
+
+case `sed -n '/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ 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
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;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
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" | sed -f "$tmp/subs-3.sed" | sed -f "$tmp/subs-4.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+ { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&2;}
+
+ rm -f "$tmp/stdin"
+ case $ac_file in
+ -) cat "$tmp/out"; rm -f "$tmp/out";;
+ *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+ esac
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+_ACEOF
+
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status. If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless. But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*'
+ac_dB='\\)[ (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+ sed -n '
+ t rset
+ :rset
+ s/^[ ]*#[ ]*define[ ][ ]*//
+ t ok
+ d
+ :ok
+ s/[\\&,]/\\&/g
+ s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+ s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+ ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then 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.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[ #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+ # Write a here document:
+ cat >>$CONFIG_STATUS <<_ACEOF
+ # First, check the format of the line:
+ cat >"\$tmp/defines.sed" <<\\CEOF
+/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def
+/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def
+b
+:def
+_ACEOF
+ sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+ ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+ sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+ grep . conftest.tail >/dev/null || break
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
+
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+ if test x"$ac_file" != x-; then
+ echo "/* $configure_input */" >"$tmp/config.h"
+ cat "$ac_result" >>"$tmp/config.h"
+ if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f $ac_file
+ mv "$tmp/config.h" $ac_file
+ fi
+ else
+ echo "/* $configure_input */"
+ cat "$ac_result"
+ fi
+ rm -f "$tmp/out12"
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`$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 ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { as_dir=$dirpart/$fdir
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ "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"
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/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 assigment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ 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 ;;
+ "tests/atconfig":C) cat >tests/atconfig <<ATEOF
+# Configurable variable values for building test suites.
+# Generated by $0.
+# Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+
+# The test suite will define top_srcdir=$at_top_srcdir/../.. etc.
+at_testdir='tests'
+abs_builddir='$ac_abs_builddir'
+at_srcdir='$ac_srcdir'
+abs_srcdir='$ac_abs_srcdir'
+at_top_srcdir='$ac_top_srcdir'
+abs_top_srcdir='$ac_abs_top_srcdir'
+at_top_build_prefix='$ac_top_build_prefix'
+abs_top_builddir='$ac_abs_top_builddir'
+
+# Backward compatibility with Autotest <= 2.59b:
+at_top_builddir=\$at_top_build_prefix
+
+AUTOTEST_PATH='tests'
+
+SHELL=\${CONFIG_SHELL-'$SHELL'}
+ATEOF
+ ;;
+
+ esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# 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 || { (exit 1); exit 1; }
+fi
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..c1d3fb9
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,248 @@
+# Configure template for GNU tar.
+
+# Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AC_INIT([GNU tar], [1.17], [bug-tar@gnu.org])
+AC_CONFIG_SRCDIR([src/tar.c])
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CONFIG_HEADERS([config.h:config.hin])
+AC_PREREQ([2.60])
+AM_INIT_AUTOMAKE([1.9 gnits tar-ustar dist-bzip2 dist-shar std-options])
+
+AC_PROG_CC
+AC_EXEEXT
+AC_PROG_RANLIB
+AC_PROG_YACC
+gl_EARLY
+
+AC_SYS_LARGEFILE
+AC_ISC_POSIX
+AC_C_INLINE
+
+AC_CHECK_HEADERS_ONCE(fcntl.h linux/fd.h memory.h net/errno.h \
+ sgtty.h string.h stropts.h \
+ sys/param.h sys/device.h sys/filio.h sys/gentape.h \
+ sys/inet.h sys/io/trioctl.h \
+ sys/mtio.h sys/time.h sys/tprintf.h sys/tape.h \
+ unistd.h locale.h)
+
+AC_CHECK_HEADERS([sys/buf.h], [], [],
+[#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif])
+
+AC_HEADER_SYS_WAIT
+AM_STDBOOL_H
+
+AC_HEADER_DIRENT
+AC_HEADER_MAJOR
+AC_HEADER_STAT
+AC_HEADER_STDC
+
+AC_MSG_CHECKING([for st_fstype string in struct stat])
+AC_CACHE_VAL(diff_cv_st_fstype_string,
+ [AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/stat.h>], [struct stat s; s.st_fstype[0] = 'x';],
+ diff_cv_st_fstype_string=yes,
+ diff_cv_st_fstype_string=no)])
+AC_MSG_RESULT($diff_cv_st_fstype_string)
+if test $diff_cv_st_fstype_string = yes; then
+ AC_DEFINE(HAVE_ST_FSTYPE_STRING, 1,
+ [Define if struct stat has a char st_fstype[] member.])
+fi
+
+AC_TYPE_SIGNAL
+AC_TYPE_MODE_T
+AC_TYPE_PID_T
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_TYPE_UID_T
+AC_CHECK_TYPE(major_t, , AC_DEFINE(major_t, int,
+ [Type of major device numbers.]))
+AC_CHECK_TYPE(minor_t, , AC_DEFINE(minor_t, int,
+ [Type of minor device numbers.]))
+AC_CHECK_TYPE(dev_t, unsigned)
+AC_CHECK_TYPE(ino_t, unsigned)
+
+gt_TYPE_SSIZE_T
+
+# gnulib modules
+gl_INIT
+# paxutils modules
+tar_PAXUTILS
+
+AC_CHECK_FUNCS(fsync getdtablesize lstat mkfifo readlink strerror symlink setlocale utimes)
+AC_CHECK_DECLS([getgrgid],,, [#include <grp.h>])
+AC_CHECK_DECLS([getpwuid],,, [#include <pwd.h>])
+AC_CHECK_DECLS([time],,, [#include <time.h>])
+
+AC_REPLACE_FUNCS(waitpid)
+
+AC_CACHE_CHECK(for remote shell, tar_cv_path_RSH,
+ [if test -n "$RSH"; then
+ tar_cv_path_RSH=$RSH
+ else
+ tar_cv_path_RSH=no
+ for ac_file in /usr/ucb/rsh /usr/bin/remsh /usr/bin/rsh /usr/bsd/rsh \
+ /usr/bin/nsh /usr/bin/rcmd
+ do
+ # Prefer a non-symlink rsh to a symlink one, so that binaries built
+ # on AIX 4.1.4, where /usr/ucb/rsh is a symlink to /usr/bin/rsh
+ # will run on AIX 4.3.0, which has only /usr/bin/rsh.
+ if test -f $ac_file; then
+ if (test -h $ac_file) 2>/dev/null; then
+ test $tar_cv_path_RSH = no && tar_cv_path_RSH=$ac_file
+ else
+ tar_cv_path_RSH=$ac_file
+ break
+ fi
+ fi
+ done
+ fi])
+if test $tar_cv_path_RSH = no; then
+ AC_CHECK_HEADERS(netdb.h)
+else
+ AC_DEFINE_UNQUOTED(REMOTE_SHELL, "$tar_cv_path_RSH",
+ [Define to the full path of your rsh, if any.])
+fi
+
+AC_MSG_CHECKING(for default archive format)
+
+AC_ARG_VAR([DEFAULT_ARCHIVE_FORMAT],
+ [Set the default archive format. Allowed values are: V7, OLDGNU, USTAR, POSIX, GNU. Default is GNU])
+
+if test -z "$DEFAULT_ARCHIVE_FORMAT"; then
+ DEFAULT_ARCHIVE_FORMAT="GNU"
+fi
+case $DEFAULT_ARCHIVE_FORMAT in
+ V7|OLDGNU|USTAR|POSIX|GNU) ;;
+ *) AC_MSG_ERROR(Invalid format name);;
+esac
+AC_DEFINE_UNQUOTED(DEFAULT_ARCHIVE_FORMAT, ${DEFAULT_ARCHIVE_FORMAT}_FORMAT,
+ [By default produce archives of this format])
+AC_MSG_RESULT($DEFAULT_ARCHIVE_FORMAT)
+
+AC_MSG_CHECKING(for default archive)
+
+AC_ARG_VAR([DEFAULT_ARCHIVE],
+ [Set the name of the default archive (default: -)])
+if test -z "$DEFAULT_ARCHIVE"; then
+ DEFAULT_ARCHIVE=-
+else
+ if test -z "`ls $DEFAULT_ARCHIVE 2>/dev/null`"; then
+ AC_MSG_WARN(DEFAULT_ARCHIVE \`$DEFAULT_ARCHIVE' not found on this system)
+ fi
+ # FIXME: Look for DEFTAPE in <sys/mtio.h>.
+ # FIXME: Let DEVICE_PREFIX be configured from the environment.
+ # FIXME: Rearrange, here.
+ case $DEFAULT_ARCHIVE in
+ *[[0-7][lmh]])
+ AC_DEFINE(DENSITY_LETTER, 1,
+ [Define to 1 if density may be indicated by [lmh] at end of device.])
+ device_prefix=`echo $DEFAULT_ARCHIVE | sed 's/[0-7][lmh]$//'`
+ ;;
+ *[[0-7]])
+ device_prefix=`echo $DEFAULT_ARCHIVE | sed 's/[0-7]$//'`
+ ;;
+ *)
+ device_prefix=
+ ;;
+ esac
+ case "$device_prefix" in
+ ?*)
+ AC_DEFINE_UNQUOTED(DEVICE_PREFIX, "$device_prefix",
+ [Define to a string giving the prefix of the default device, without the part specifying the unit and density.])
+ ;;
+ esac
+fi
+AC_DEFINE_UNQUOTED(DEFAULT_ARCHIVE, "$DEFAULT_ARCHIVE",
+ [Define to a string giving the full name of the default archive file.])
+AC_MSG_RESULT($DEFAULT_ARCHIVE)
+
+AC_ARG_VAR([DEFAULT_BLOCKING],
+ [Define default blocking factor (default: 20)])
+AC_MSG_CHECKING(for default blocking)
+DEFAULT_BLOCKING=${DEFAULT_BLOCKING-20}
+AC_DEFINE_UNQUOTED(DEFAULT_BLOCKING, $DEFAULT_BLOCKING,
+ [Define to a number giving the default blocking size for archives.])
+AC_MSG_RESULT($DEFAULT_BLOCKING)
+
+AC_MSG_CHECKING(for default quoting style)
+
+m4_define([QUOTING_STYLES],dnl
+ [literal|shell|shell-always|c|escape|locale|clocale])
+DEFAULT_QUOTING_STYLE="escape"
+AC_ARG_VAR([DEFAULT_QUOTING_STYLE],
+ [Set the default quoting style. Allowed values are: ] m4_bpatsubst(QUOTING_STYLES,[|], [[, ]]) [. Default is "escape".])
+
+case $DEFAULT_QUOTING_STYLE in
+QUOTING_STYLES) ;;
+*) AC_MSG_ERROR(Invalid quoting style);;
+esac
+AC_MSG_RESULT($DEFAULT_QUOTING_STYLE)
+DEFAULT_QUOTING_STYLE=`echo ${DEFAULT_QUOTING_STYLE}|sed 's/-/_/g'`_quoting_style
+AC_DEFINE_UNQUOTED(DEFAULT_QUOTING_STYLE, $DEFAULT_QUOTING_STYLE,
+ [Define to a default quoting style (see lib/quoteargs.c for the list)])
+
+# Iconv
+AM_ICONV
+AC_CHECK_HEADERS(iconv.h)
+AC_CHECK_TYPE(iconv_t,:,
+ AC_DEFINE(iconv_t, int,
+ [Conversion descriptor type]),
+ [
+#ifdef HAVE_ICONV_H
+# include <iconv.h>
+#endif
+])
+
+# Gettext.
+AM_GNU_GETTEXT([external], [need-formatstring-macros])
+AM_GNU_GETTEXT_VERSION([0.16])
+
+# Initialize the test suite.
+AC_CONFIG_TESTDIR(tests)
+AC_CONFIG_FILES([tests/Makefile tests/atlocal]) # FIXME: tests/preset?
+AM_MISSING_PROG([AUTOM4TE], [autom4te])
+
+AC_SUBST(BACKUP_LIBEXEC_SCRIPTS)
+AC_SUBST(BACKUP_SBIN_SCRIPTS)
+AC_ARG_ENABLE(backup-scripts,
+ AC_HELP_STRING([--enable-backup-scripts],
+ [Create and install backup and restore scripts]),
+ [case $enableval in
+ yes) BACKUP_LIBEXEC_SCRIPTS='$(BACKUP_LIBEXEC_SCRIPTS_LIST)'
+ BACKUP_SBIN_SCRIPTS='$(BACKUP_SBIN_SCRIPTS_LIST)'
+ ;;
+ esac])
+
+AC_SUBST(BACKUP_SED_COND)
+if date +%Y-%m-%d 2>/dev/null >&2; then
+ BACKUP_SED_COND='/^\#ELSE_DATE_FORMAT_OK/,/^\#ENDIF_DATE_FORMAT_OK/d;/^\#IF_DATE_FORMAT_OK/d'
+else
+ BACKUP_SED_COND='/^\#IF_DATE_FORMAT_OK/,/^\#ELSE_DATE_FORMAT_OK/d;/^\#ENDIF_DATE_FORMAT_OK/d'
+fi
+
+AC_OUTPUT([Makefile\
+ doc/Makefile\
+ lib/Makefile\
+ po/Makefile.in\
+ scripts/Makefile\
+ rmt/Makefile\
+ src/Makefile])
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..ee2f412
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,86 @@
+# Makefile for GNU tar documentation.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2006 Free
+# Software Foundation, Inc.
+
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software Foundation,
+## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+info_TEXINFOS = tar.texi
+tar_TEXINFOS = \
+ dumpdir.texi\
+ fdl.texi\
+ freemanuals.texi\
+ genfile.texi\
+ getdate.texi\
+ header.texi\
+ intern.texi\
+ rendition.texi\
+ snapshot.texi\
+ sparse.texi\
+ value.texi
+EXTRA_DIST = gendocs_template mastermenu.el texify.sed
+DISTCLEANFILES=*.info*
+
+# The rendering level is anyone of PUBLISH, DISTRIB or PROOF.
+# Just call `make RENDITION=PROOF [target]' if you want PROOF rendition.
+RENDITION = DISTRIB
+
+MAKEINFOFLAGS=-D$(RENDITION)
+
+header.texi: $(top_srcdir)/src/tar.h
+ sed -f $(srcdir)/texify.sed $(top_srcdir)/src/tar.h \
+ | expand >$@
+
+master-menu: $(tar_TEXINFOS)
+ emacs -batch -l mastermenu.el -f make-master-menu $(info_TEXINFOS)
+
+check-options:
+ @ARGP_HELP_FMT='usage-indent=0,short-opt-col=0,long-opt-col=0,\
+doc-opt-col=0,opt-doc-col=0,header-col=0,rmargin=1' \
+ $(top_builddir)/src/tar --usage | \
+ sed -n 's/^\[--\([^]\=\[]*\).*/\1/p' | sort | uniq > opts.$$$$;\
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) -E - \
+ $(info_TEXINFOS) | \
+ sed -n '/^@macro/,/^@end macro/d;s/@opindex *\([^@,]*\).*/\1/p' \
+ | sort | uniq > docs.$$$$;\
+ (echo 'Not documented options:';\
+ join -v1 opts.$$$$ docs.$$$$;\
+ echo 'Non-existing options:';\
+ join -v2 opts.$$$$ docs.$$$$) > report.$$$$;\
+ rm opts.$$$$ docs.$$$$;\
+ if [ -n "`sed '1,2d' report.$$$$`" ]; then \
+ cat report.$$$$;\
+ rm report.$$$$;\
+ exit 1;\
+ fi;\
+ rm report.$$$$
+
+
+clean-local:
+ rm -rf manual
+
+GENDOCS=gendocs.sh
+
+TEXI2DVI=texi2dvi -t '@set $(RENDITION)' -E
+
+# Make sure you set TEXINPUTS
+# Usual value is:
+# /usr/share/texmf/pdftex/plain/misc:/usr/share/texmf/pdftex/config
+manual:
+ TEXINPUTS=$(srcdir):$(top_srcdir)/build-tex:$(TEXINPUTS) \
+ MAKEINFO="$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ TEXI2DVI="$(TEXI2DVI) -t @finalout" \
+ $(GENDOCS) tar 'GNU tar manual'
+
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..9ee50ef
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,917 @@
+# Makefile.in generated by automake 1.10a from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007 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 GNU tar documentation.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2006 Free
+# Software Foundation, Inc.
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/stamp-vti $(srcdir)/version.texi $(tar_TEXINFOS) \
+ texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/absolute-header.m4 \
+ $(top_srcdir)/m4/alloca.m4 $(top_srcdir)/m4/allocsa.m4 \
+ $(top_srcdir)/m4/argmatch.m4 $(top_srcdir)/m4/argp.m4 \
+ $(top_srcdir)/m4/backupfile.m4 $(top_srcdir)/m4/bison.m4 \
+ $(top_srcdir)/m4/canonicalize-lgpl.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/chown.m4 \
+ $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close-stream.m4 $(top_srcdir)/m4/closeout.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/d-ino.m4 \
+ $(top_srcdir)/m4/dirfd.m4 $(top_srcdir)/m4/dirname.m4 \
+ $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/double-slash-root.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eealloc.m4 \
+ $(top_srcdir)/m4/eoverflow.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exclude.m4 $(top_srcdir)/m4/exitfail.m4 \
+ $(top_srcdir)/m4/extensions.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-safer.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+ $(top_srcdir)/m4/fileblocks.m4 $(top_srcdir)/m4/float_h.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fpending.m4 \
+ $(top_srcdir)/m4/ftruncate.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdate.m4 $(top_srcdir)/m4/getdelim.m4 \
+ $(top_srcdir)/m4/getline.m4 $(top_srcdir)/m4/getopt.m4 \
+ $(top_srcdir)/m4/getpagesize.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/hash.m4 \
+ $(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intmax_t.m4 \
+ $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lchown.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/lstat.m4 $(top_srcdir)/m4/mbchar.m4 \
+ $(top_srcdir)/m4/mbiter.m4 $(top_srcdir)/m4/mbrtowc.m4 \
+ $(top_srcdir)/m4/mbscasecmp.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mempcpy.m4 \
+ $(top_srcdir)/m4/memrchr.m4 $(top_srcdir)/m4/memset.m4 \
+ $(top_srcdir)/m4/mkdtemp.m4 $(top_srcdir)/m4/mktime.m4 \
+ $(top_srcdir)/m4/modechange.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/pathmax.m4 \
+ $(top_srcdir)/m4/paxutils.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quote.m4 \
+ $(top_srcdir)/m4/quotearg.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/rmdir.m4 \
+ $(top_srcdir)/m4/rmt.m4 $(top_srcdir)/m4/rpmatch.m4 \
+ $(top_srcdir)/m4/rtapelib.m4 $(top_srcdir)/m4/safe-read.m4 \
+ $(top_srcdir)/m4/safe-write.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/savedir.m4 $(top_srcdir)/m4/setenv.m4 \
+ $(top_srcdir)/m4/sleep.m4 $(top_srcdir)/m4/ssize_t.m4 \
+ $(top_srcdir)/m4/stat-time.m4 $(top_srcdir)/m4/stdarg.m4 \
+ $(top_srcdir)/m4/stdbool.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/string_h.m4 $(top_srcdir)/m4/strndup.m4 \
+ $(top_srcdir)/m4/strnlen.m4 $(top_srcdir)/m4/strtoimax.m4 \
+ $(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoll.m4 \
+ $(top_srcdir)/m4/strtoul.m4 $(top_srcdir)/m4/strtoull.m4 \
+ $(top_srcdir)/m4/strtoumax.m4 $(top_srcdir)/m4/sys_stat_h.m4 \
+ $(top_srcdir)/m4/sys_time_h.m4 $(top_srcdir)/m4/sysexits.m4 \
+ $(top_srcdir)/m4/system.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/time_r.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
+ $(top_srcdir)/m4/unlinkdir.m4 $(top_srcdir)/m4/unlocked-io.m4 \
+ $(top_srcdir)/m4/utimbuf.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wchar.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wctype.m4 \
+ $(top_srcdir)/m4/wcwidth.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xgetcwd.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/xstrtol.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+INFO_DEPS = tar.info
+TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex
+am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux
+DVIS = tar.dvi
+PDFS = tar.pdf
+PSS = tar.ps
+HTMLS = tar.html
+TEXINFOS = tar.texi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+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 = `echo $$p | sed -e 's|^.*/||'`;
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ABSOLUTE_DIRENT_H = @ABSOLUTE_DIRENT_H@
+ABSOLUTE_FCNTL_H = @ABSOLUTE_FCNTL_H@
+ABSOLUTE_FLOAT_H = @ABSOLUTE_FLOAT_H@
+ABSOLUTE_INTTYPES_H = @ABSOLUTE_INTTYPES_H@
+ABSOLUTE_STDINT_H = @ABSOLUTE_STDINT_H@
+ABSOLUTE_STDIO_H = @ABSOLUTE_STDIO_H@
+ABSOLUTE_STDLIB_H = @ABSOLUTE_STDLIB_H@
+ABSOLUTE_STRING_H = @ABSOLUTE_STRING_H@
+ABSOLUTE_SYSEXITS_H = @ABSOLUTE_SYSEXITS_H@
+ABSOLUTE_SYS_STAT_H = @ABSOLUTE_SYS_STAT_H@
+ABSOLUTE_SYS_TIME_H = @ABSOLUTE_SYS_TIME_H@
+ABSOLUTE_TIME_H = @ABSOLUTE_TIME_H@
+ABSOLUTE_UNISTD_H = @ABSOLUTE_UNISTD_H@
+ABSOLUTE_WCHAR_H = @ABSOLUTE_WCHAR_H@
+ABSOLUTE_WCTYPE_H = @ABSOLUTE_WCTYPE_H@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOM4TE = @AUTOM4TE@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BACKUP_LIBEXEC_SCRIPTS = @BACKUP_LIBEXEC_SCRIPTS@
+BACKUP_SBIN_SCRIPTS = @BACKUP_SBIN_SCRIPTS@
+BACKUP_SED_COND = @BACKUP_SED_COND@
+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@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFAULT_ARCHIVE = @DEFAULT_ARCHIVE@
+DEFAULT_ARCHIVE_FORMAT = @DEFAULT_ARCHIVE_FORMAT@
+DEFAULT_BLOCKING = @DEFAULT_BLOCKING@
+DEFAULT_QUOTING_STYLE = @DEFAULT_QUOTING_STYLE@
+DEFAULT_RMT_COMMAND = @DEFAULT_RMT_COMMAND@
+DEFAULT_RMT_DIR = @DEFAULT_RMT_DIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRENT_H = @DIRENT_H@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EOVERFLOW = @EOVERFLOW@
+EXEEXT = @EXEEXT@
+FCNTL_H = @FCNTL_H@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+GETOPT_H = @GETOPT_H@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GREP = @GREP@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_MKDIR = @HAVE_DECL_MKDIR@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_IO_H = @HAVE_IO_H@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_READLINK = @HAVE_READLINK@
+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_SLEEP = @HAVE_SLEEP@
+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_STRNDUP = @HAVE_STRNDUP@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_SYSEXITS_H = @HAVE_SYSEXITS_H@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE__BOOL = @HAVE__BOOL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTTYPES_H = @INTTYPES_H@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTAR_LIBDEPS = @LIBTAR_LIBDEPS@
+LIBTAR_LTLIBDEPS = @LIBTAR_LTLIBDEPS@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_SETSOCKOPT = @LIB_SETSOCKOPT@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PU_RMT_PROG = @PU_RMT_PROG@
+RANLIB = @RANLIB@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_FCHDIR = @REPLACE_FCHDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STRPTIME = @REPLACE_STRPTIME@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYSEXITS_H = @SYSEXITS_H@
+SYS_STAT_H = @SYS_STAT_H@
+SYS_TIME_H = @SYS_TIME_H@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WCHAR_H = @WCHAR_H@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WCTYPE_H = @WCTYPE_H@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+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@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+info_TEXINFOS = tar.texi
+tar_TEXINFOS = \
+ dumpdir.texi\
+ fdl.texi\
+ freemanuals.texi\
+ genfile.texi\
+ getdate.texi\
+ header.texi\
+ intern.texi\
+ rendition.texi\
+ snapshot.texi\
+ sparse.texi\
+ value.texi
+
+EXTRA_DIST = gendocs_template mastermenu.el texify.sed
+DISTCLEANFILES = *.info*
+
+# The rendering level is anyone of PUBLISH, DISTRIB or PROOF.
+# Just call `make RENDITION=PROOF [target]' if you want PROOF rendition.
+RENDITION = DISTRIB
+MAKEINFOFLAGS = -D$(RENDITION)
+GENDOCS = gendocs.sh
+TEXI2DVI = texi2dvi -t '@set $(RENDITION)' -E
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .ps
+$(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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits doc/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnits doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(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
+
+tar.info: tar.texi $(srcdir)/version.texi $(tar_TEXINFOS)
+ restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ 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 && \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ `test -f 'tar.texi' || echo '$(srcdir)/'`tar.texi; \
+ then \
+ rc=0; \
+ else \
+ rc=$$?; \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+tar.dvi: tar.texi $(srcdir)/version.texi $(tar_TEXINFOS)
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) -o $@ `test -f 'tar.texi' || echo '$(srcdir)/'`tar.texi
+
+tar.pdf: tar.texi $(srcdir)/version.texi $(tar_TEXINFOS)
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) -o $@ `test -f 'tar.texi' || echo '$(srcdir)/'`tar.texi
+
+tar.html: tar.texi $(srcdir)/version.texi $(tar_TEXINFOS)
+ rm -rf $(@:.html=.htp)
+ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) `test -f 'tar.texi' || echo '$(srcdir)/'`tar.texi; \
+ then \
+ rm -rf $@; \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+ else \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+ exit 1; \
+ fi
+$(srcdir)/version.texi: $(srcdir)/stamp-vti
+$(srcdir)/stamp-vti: tar.texi $(top_srcdir)/configure
+ @(dir=.; test -f ./tar.texi || dir=$(srcdir); \
+ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/tar.texi`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > vti.tmp
+ @cmp -s vti.tmp $(srcdir)/version.texi \
+ || (echo "Updating $(srcdir)/version.texi"; \
+ cp vti.tmp $(srcdir)/version.texi)
+ -@rm -f vti.tmp
+ @cp $(srcdir)/version.texi $@
+
+mostlyclean-vti:
+ -rm -f vti.tmp
+
+maintainer-clean-vti:
+ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
+.dvi.ps:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ $(DVIPS) -o $@ $<
+
+uninstall-dvi-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(DVIS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
+ rm -f "$(DESTDIR)$(dvidir)/$$f"; \
+ done
+
+uninstall-html-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(HTMLS)'; for p in $$list; do \
+ f=$(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)' && \
+ (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; 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'"; \
+ install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+ 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)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
+ done
+
+uninstall-ps-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PSS)'; for p in $$list; do \
+ f=$(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 tar.aux tar.cp tar.cps tar.fn tar.ky tar.log tar.op tar.ops tar.pg \
+ tar.tmp tar.toc tar.tp tar.tps tar.vr tar.dvi tar.pdf tar.ps \
+ tar.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
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-generic clean-local 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-info-am
+
+install-dvi: install-dvi-am
+
+install-dvi-am: $(DVIS)
+ @$(NORMAL_INSTALL)
+ test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
+ @list='$(DVIS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(dvidir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(dvidir)/$$f"; \
+ done
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am: $(HTMLS)
+ @$(NORMAL_INSTALL)
+ test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
+ @list='$(HTMLS)'; for p in $$list; do \
+ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ if test -d "$$d$$p"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
+ echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \
+ else \
+ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \
+ fi; \
+ done
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ 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 \
+ relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
+ echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
+ $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
+ else : ; fi; \
+ done; \
+ done
+ @$(POST_INSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ 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)
+ test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
+ @list='$(PDFS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/$$f"; \
+ done
+install-ps: install-ps-am
+
+install-ps-am: $(PSS)
+ @$(NORMAL_INSTALL)
+ test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
+ @list='$(PSS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(psdir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(psdir)/$$f"; \
+ 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-pdf-am uninstall-ps-am
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+ dist-info 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-aminfo maintainer-clean-generic \
+ maintainer-clean-vti mostlyclean mostlyclean-aminfo \
+ mostlyclean-generic mostlyclean-vti pdf pdf-am ps ps-am \
+ uninstall uninstall-am uninstall-dvi-am uninstall-html-am \
+ uninstall-info-am uninstall-pdf-am uninstall-ps-am
+
+
+header.texi: $(top_srcdir)/src/tar.h
+ sed -f $(srcdir)/texify.sed $(top_srcdir)/src/tar.h \
+ | expand >$@
+
+master-menu: $(tar_TEXINFOS)
+ emacs -batch -l mastermenu.el -f make-master-menu $(info_TEXINFOS)
+
+check-options:
+ @ARGP_HELP_FMT='usage-indent=0,short-opt-col=0,long-opt-col=0,\
+doc-opt-col=0,opt-doc-col=0,header-col=0,rmargin=1' \
+ $(top_builddir)/src/tar --usage | \
+ sed -n 's/^\[--\([^]\=\[]*\).*/\1/p' | sort | uniq > opts.$$$$;\
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) -E - \
+ $(info_TEXINFOS) | \
+ sed -n '/^@macro/,/^@end macro/d;s/@opindex *\([^@,]*\).*/\1/p' \
+ | sort | uniq > docs.$$$$;\
+ (echo 'Not documented options:';\
+ join -v1 opts.$$$$ docs.$$$$;\
+ echo 'Non-existing options:';\
+ join -v2 opts.$$$$ docs.$$$$) > report.$$$$;\
+ rm opts.$$$$ docs.$$$$;\
+ if [ -n "`sed '1,2d' report.$$$$`" ]; then \
+ cat report.$$$$;\
+ rm report.$$$$;\
+ exit 1;\
+ fi;\
+ rm report.$$$$
+
+clean-local:
+ rm -rf manual
+
+# Make sure you set TEXINPUTS
+# Usual value is:
+# /usr/share/texmf/pdftex/plain/misc:/usr/share/texmf/pdftex/config
+manual:
+ TEXINPUTS=$(srcdir):$(top_srcdir)/build-tex:$(TEXINPUTS) \
+ MAKEINFO="$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ TEXI2DVI="$(TEXI2DVI) -t @finalout" \
+ $(GENDOCS) tar 'GNU tar manual'
+# 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/dumpdir.texi b/doc/dumpdir.texi
new file mode 100644
index 0000000..73b1736
--- /dev/null
+++ b/doc/dumpdir.texi
@@ -0,0 +1,132 @@
+@c This is part of the paxutils manual.
+@c Copyright (C) 2006 Free Software Foundation, Inc.
+@c Written by Sergey Poznyakoff
+@c This file is distributed under GFDL 1.1 or any later version
+@c published by the Free Software Foundation.
+
+ Incremental archives keep information about contents of each
+dumped directory in special data blocks called @dfn{dumpdirs}.
+
+ Dumpdir is a sequence of entries of the following form:
+
+@smallexample
+@var{C} @var{filename} \0
+@end smallexample
+
+@noindent
+where @var{C} is one of the @dfn{control codes} described below,
+@var{filename} is the name of the file @var{C} operates upon, and
+@samp{\0} represents a nul character (ASCII 0). The white space
+characters were added for readability, real dumpdirs do not contain
+them.
+
+ Each dumpdir ends with a single nul character.
+
+ The following table describes control codes and their meanings:
+
+@table @samp
+@item Y
+@var{filename} is contained in the archive.
+
+@item N
+@var{filename} was present in the directory at the time the archive
+was made, yet it was not dumped to the archive, because it had not
+changed since the last backup.
+
+@item D
+@var{filename} is a directory.
+
+@item R
+This code requests renaming of the @var{filename} to the name
+specified with the following @samp{T} command.
+
+@item T
+Specify target file name for @samp{R} command (see below).
+
+@item X
+Specify @dfn{temporary directory} name for a rename operation (see below).
+@end table
+
+ Codes @samp{Y}, @samp{N} and @samp{D} require @var{filename} argument
+to be a relative file name to the directory this dumpdir describes,
+whereas codes @samp{R}, @samp{T} and @samp{X} require their argument
+to be an absolute file name.
+
+ The three codes @samp{R}, @samp{T} and @samp{X} specify a
+@dfn{renaming operation}. In the simplest case it is:
+
+@smallexample
+R@file{source}\0T@file{dest}\0
+@end smallexample
+
+@noindent
+which means ``rename file @file{source} to file @file{dest}''.
+
+ However, there are cases that require using a @dfn{temporary
+directory}. For example, consider the following scenario:
+
+@enumerate 1
+@item
+Previous run dumped a directory @file{foo} which contained the
+following three directories:
+
+@smallexample
+a
+b
+c
+@end smallexample
+
+@item
+They were renamed @emph{cyclically}, so that:
+
+@example
+@file{a} became @file{b}
+@file{b} became @file{c}
+@file{c} became @file{a}
+@end example
+
+@item
+New incremental dump was made.
+@end enumerate
+
+ This case cannot be handled by three successive renames, since
+renaming @file{a} to @file{b} will destroy existing directory.
+To handle such case a temporary directory is required. @GNUTAR{}
+will create the following dumpdir (newlines have been added for
+readability):
+
+@smallexample
+@group
+Xfoo\0
+Rfoo/a\0T\0
+Rfoo/b\0Tfoo/c\0
+Rfoo/c\0Tfoo/a\0
+R\0Tfoo/a\0
+@end group
+@end smallexample
+
+ The first command, @samp{Xfoo\0}, instructs the extractor to create a
+temporary directory in the directory @file{foo}. Second command,
+@samp{Rfoo/aT\0}, says ``rename file @file{foo/a} to the temporary
+directory that has just been created'' (empty file name after a
+command means use temporary directory). Third and fourth commands
+work as usual, and, finally, the last command, @samp{R\0Tfoo/a\0}
+tells tar to rename the temporary directory to @file{foo/a}.
+
+ The exact placement of a dumpdir in the archive depends on the
+archive format (@pxref{Formats}):
+
+@itemize
+@item PAX archives
+
+In PAX archives, dumpdir is stored in the extended header of the
+corresponding directory, in variable @code{GNU.dumpdir}.
+
+@item GNU and old GNU archives
+
+These formats implement special header type @samp{D}, which is similar
+to ustar header @samp{5} (directory), except that it precedes a data
+block containing the dumpdir.
+@end itemize
+
+@c End of dumpdir.texi
diff --git a/doc/fdl.texi b/doc/fdl.texi
new file mode 100644
index 0000000..fe78df8
--- /dev/null
+++ b/doc/fdl.texi
@@ -0,0 +1,452 @@
+
+@node GNU Free Documentation License
+@appendixsec GNU Free Documentation License
+
+@cindex FDL, GNU Free Documentation License
+@center Version 1.2, November 2002
+
+@display
+Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@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
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification. Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{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.
+
+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 for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+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.
+@end enumerate
+
+@page
+@appendixsubsec 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.2
+ 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...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/freemanuals.texi b/doc/freemanuals.texi
new file mode 100644
index 0000000..25343f9
--- /dev/null
+++ b/doc/freemanuals.texi
@@ -0,0 +1,89 @@
+@cindex free documentation
+
+The biggest deficiency in the free software community today is not in
+the software---it is the lack of good free documentation that we can
+include with the free software. Many of our most important
+programs do not come with free reference manuals and free introductory
+texts. Documentation is an essential part of any software package;
+when an important free software package does not come with a free
+manual and a free tutorial, that is a major gap. We have many such
+gaps today.
+
+Consider Perl, for instance. The tutorial manuals that people
+normally use are non-free. How did this come about? Because the
+authors of those manuals published them with restrictive terms---no
+copying, no modification, source files not available---which exclude
+them from the free software world.
+
+That wasn't the first time this sort of thing happened, and it was far
+from the last. Many times we have heard a GNU user eagerly describe a
+manual that he is writing, his intended contribution to the community,
+only to learn that he had ruined everything by signing a publication
+contract to make it non-free.
+
+Free documentation, like free software, is a matter of freedom, not
+price. The problem with the non-free manual is not that publishers
+charge a price for printed copies---that in itself is fine. (The Free
+Software Foundation sells printed copies of manuals, too.) The
+problem is the restrictions on the use of the manual. Free manuals
+are available in source code form, and give you permission to copy and
+modify. Non-free manuals do not allow this.
+
+The criteria of freedom for a free manual are roughly the same as for
+free software. Redistribution (including the normal kinds of
+commercial redistribution) must be permitted, so that the manual can
+accompany every copy of the program, both on-line and on paper.
+
+Permission for modification of the technical content is crucial too.
+When people modify the software, adding or changing features, if they
+are conscientious they will change the manual too---so they can
+provide accurate and clear documentation for the modified program. A
+manual that leaves you no choice but to write a new manual to document
+a changed version of the program is not really available to our
+community.
+
+Some kinds of limits on the way modification is handled are
+acceptable. For example, requirements to preserve the original
+author's copyright notice, the distribution terms, or the list of
+authors, are ok. It is also no problem to require modified versions
+to include notice that they were modified. Even entire sections that
+may not be deleted or changed are acceptable, as long as they deal
+with nontechnical topics (like this one). These kinds of restrictions
+are acceptable because they don't obstruct the community's normal use
+of the manual.
+
+However, it must be possible to modify all the @emph{technical}
+content of the manual, and then distribute the result in all the usual
+media, through all the usual channels. Otherwise, the restrictions
+obstruct the use of the manual, it is not free, and we need another
+manual to replace it.
+
+Please spread the word about this issue. Our community continues to
+lose manuals to proprietary publishing. If we spread the word that
+free software needs free reference manuals and free tutorials, perhaps
+the next person who wants to contribute by writing documentation will
+realize, before it is too late, that only free manuals contribute to
+the free software community.
+
+If you are writing documentation, please insist on publishing it under
+the GNU Free Documentation License or another free documentation
+license. Remember that this decision requires your approval---you
+don't have to let the publisher decide. Some commercial publishers
+will use a free license if you insist, but they will not propose the
+option; it is up to you to raise the issue and say firmly that this is
+what you want. If the publisher you are dealing with refuses, please
+try other publishers. If you're not sure whether a proposed license
+is free, write to @email{licensing@@gnu.org}.
+
+You can encourage commercial publishers to sell more free, copylefted
+manuals and tutorials by buying them, and particularly by buying
+copies from the publishers that paid for their writing or for major
+improvements. Meanwhile, try to avoid buying non-free documentation
+at all. Check the distribution terms of a manual before you buy it,
+and insist that whoever seeks your business must respect your freedom.
+Check the history of the book, and try reward the publishers that have
+paid or pay the authors to work on it.
+
+The Free Software Foundation maintains a list of free documentation
+published by other publishers, at
+@url{http://www.fsf.org/doc/other-free-books.html}.
diff --git a/doc/gendocs_template b/doc/gendocs_template
new file mode 100755
index 0000000..844f64c
--- /dev/null
+++ b/doc/gendocs_template
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- $Id: gendocs_template,v 1.3 2007/01/19 15:41:39 gray Exp $ -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<head>
+<title>%%TITLE%% - GNU Project - Free Software Foundation (FSF)</title>
+<meta http-equiv="content-type" content='text/html; charset=utf-8' />
+<link rel="stylesheet" type="text/css" href="/gnu.css" />
+<link rev="made" href="mailto:gray@gnu.org" />
+ <link rel="icon" type="image/png" href="/graphics/gnu-head-icon.png" />
+</head>
+
+<!-- This document is in XML, and xhtml 1.0 -->
+<!-- Please make sure to properly nest your tags -->
+<!-- and ensure that your final document validates -->
+<!-- consistent with W3C xhtml 1.0 and CSS standards -->
+<!-- See validator.w3.org -->
+
+<body>
+
+<h3>%%TITLE%%</h3>
+
+<address>Free Software Foundation</address>
+<address>last updated %%DATE%%</address>
+<p>
+<a href="/graphics/gnu-head.jpg">
+ <img src="/graphics/gnu-head-sm.jpg"
+ alt=" [image of the head of a GNU] "
+ width="129" height="122" />
+</a>
+<a href="/philosophy/gif.html">(no gifs due to patent problems)</a>
+</p>
+<hr />
+
+The manual for %%PACKAGE%% is available in the following formats:</p>
+
+<ul>
+ <li><a href="%%PACKAGE%%.html">HTML
+ (%%HTML_MONO_SIZE%%K characters)</a> - entirely on one web page.</li>
+ <li><a href="html_node/index.html">HTML</a> - with one web page per
+ node.</li>
+ <li><a href="%%PACKAGE%%.html.gz">HTML compressed
+ (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
+ one web page.</li>
+ <li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
+ (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per node.</li>
+ <li><a href="%%PACKAGE%%.info.tar.gz">Info document
+ (%%INFO_TGZ_SIZE%%K characters gzipped tar file)</a>.</li>
+ <li><a href="%%PACKAGE%%.txt">ASCII text
+ (%%ASCII_SIZE%%K characters)</a>.</li>
+ <li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
+ (%%ASCII_GZ_SIZE%%K gzipped characters)</a>.</li>
+ <li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
+ (%%DVI_GZ_SIZE%%K characters gzipped)</a>.</li>
+ <li><a href="%%PACKAGE%%.ps.gz">PostScript file
+ (%%PS_GZ_SIZE%%K characters gzipped)</a>.</li>
+ <li><a href="%%PACKAGE%%.pdf">PDF file
+ (%%PDF_SIZE%%K characters)</a>.</li>
+ <li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
+ (%%TEXI_TGZ_SIZE%%K characters gzipped tar file)</a></li>
+</ul>
+
+<p>(This page generated by the <a
+href="%%SCRIPTURL%%">%%SCRIPTNAME%%</a> script.)
+</p>
+
+<p>
+<a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml10"
+ alt="Valid XHTML 1.0!" height="31" width="88" /></a>
+</p>
+
+<div class="copyright">
+<p>
+Return to the <a href="/home.html">GNU Project home page</a>.
+</p>
+
+<p>
+Please send FSF &amp; GNU inquiries to
+<a href="mailto:gnu@gnu.org"><em>gnu@gnu.org</em></a>.
+There are also <a href="/home.html#ContactInfo">other ways to contact</a>
+the FSF.
+<br />
+Please send broken links and other corrections (or suggestions) to
+<a href="mailto:webmasters@gnu.org"><em>webmasters@gnu.org</em></a>.
+</p>
+
+<p>
+Copyright (C) 2004 Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02111, USA
+<br />
+Verbatim copying and distribution of this entire article is
+permitted in any medium, provided this notice is preserved.
+</p>
+
+<p>
+Updated:
+<!-- timestamp start -->
+$Date: 2007/01/19 15:41:39 $ $Author: gray $
+<!-- timestamp end -->
+</p>
+</div>
+
+</body>
+</html>
diff --git a/doc/genfile.texi b/doc/genfile.texi
new file mode 100644
index 0000000..f9ef870
--- /dev/null
+++ b/doc/genfile.texi
@@ -0,0 +1,331 @@
+@c This is part of the paxutils manual.
+@c Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+@c Written by Sergey Poznyakoff
+@c This file is distributed under GFDL 1.1 or any later version
+@c published by the Free Software Foundation.
+
+@cindex genfile
+ This appendix describes @command{genfile}, an auxiliary program
+used in the GNU tar testsuite. If you are not interested in developing
+GNU tar, skip this appendix.
+
+ Initially, @command{genfile} was used to generate data files for
+the testsuite, hence its name. However, new operation modes were being
+implemented as the testsuite grew more sophisticated, and now
+@command{genfile} is a multi-purpose instrument.
+
+ There are three basic operation modes:
+
+@table @asis
+@item File Generation
+ This is the default mode. In this mode, @command{genfile}
+generates data files.
+
+@item File Status
+ In this mode @command{genfile} displays status of specified files.
+
+@item Synchronous Execution.
+ In this mode @command{genfile} executes the given program with
+@option{--checkpoint} option and executes a set of actions when
+specified checkpoints are reached.
+@end table
+
+@menu
+* Generate Mode:: File Generation Mode.
+* Status Mode:: File Status Mode.
+* Exec Mode:: Synchronous Execution mode.
+@end menu
+
+@node Generate Mode
+@appendixsec Generate Mode
+
+@cindex Generate Mode, @command{genfile}
+@cindex @command{genfile}, generate mode
+@cindex @command{genfile}, create file
+ In this mode @command{genfile} creates a data file for the test
+suite. The size of the file is given with the @option{--length}
+(@option{-l}) option. By default the file contents is written to the
+standard output, this can be changed using @option{--file}
+(@option{-f}) command line option. Thus, the following two commands
+are equivalent:
+
+@smallexample
+@group
+genfile --length 100 > outfile
+genfile --length 100 --file outfile
+@end group
+@end smallexample
+
+ If @option{--length} is not given, @command{genfile} will
+generate an empty (zero-length) file.
+
+@cindex @command{genfile}, seeking to a given offset
+ The command line option @option{--seek=@var{N}} istructs @command{genfile}
+to skip the given number of bytes (@var{N}) in the output file before
+writing to it. It is similar to the @option{seek=@var{N}} of the
+@command{dd} utility.
+
+@cindex @command{genfile}, reading a list of file names
+ You can instruct @command{genfile} to create several files at one
+go, by giving it @option{--files-from} (@option{-T}) option followed
+by a name of file containing a list of file names. Using dash
+(@samp{-}) instead of the file name causes @command{genfile} to read
+file list from the standard input. For example:
+
+@smallexample
+@group
+# Read file names from file @file{file.list}
+genfile --files-from file.list
+# Read file names from standard input
+genfile --files-from -
+@end group
+@end smallexample
+
+@cindex File lists separated by NUL characters
+ The list file is supposed to contain one file name per line. To
+use file lists separated by ASCII NUL character, use @option{--null}
+(@option{-0}) command line option:
+
+@smallexample
+genfile --null --files-from file.list
+@end smallexample
+
+@cindex pattern, @command{genfile}
+ The default data pattern for filling the generated file consists
+of first 256 letters of ASCII code, repeated enough times to fill the
+entire file. This behavior can be changed with @option{--pattern}
+option. This option takes a mandatory argument, specifying pattern
+name to use. Currently two patterns are implemented:
+
+@table @option
+@item --pattern=default
+ The default pattern as described above.
+
+@item --pattern=zero
+ Fills the file with zeroes.
+@end table
+
+ If no file name was given, the program exits with the code
+@code{0}. Otherwise, it exits with @code{0} only if it was able to
+create a file of the specified length.
+
+@cindex Sparse files, creating using @command{genfile}
+@cindex @command{genfile}, creating sparse files
+ Special option @option{--sparse} (@option{-s}) instructs
+@command{genfile} to create a sparse file. Sparse files consist of
+@dfn{data fragments}, separated by @dfn{holes} or blocks of zeros. On
+many operating systems, actual disk storage is not allocated for
+holes, but they are counted in the length of the file. To create a
+sparse file, @command{genfile} should know where to put data fragments,
+and what data to use to fill them. So, when @option{--sparse} is given
+the rest of the command line specifies a so-called @dfn{file map}.
+
+ The file map consists of any number of @dfn{fragment
+descriptors}. Each descriptor is composed of two values: a number,
+specifying fragment offset from the end of the previous fragment or,
+for the very first fragment, from the beginning of the file, and
+@dfn{contents string}, i.e., a string of characters, specifying the
+pattern to fill the fragment with. File offset can be suffixed with
+the following quantifiers:
+
+@table @samp
+@item k
+@itemx K
+The number is expressed in kilobytes.
+@item m
+@itemx M
+The number is expressed in megabytes.
+@item g
+@itemx G
+The number is expressed in gigabytes.
+@end table
+
+ For each letter in contents string @command{genfile} will generate
+a @dfn{block} of data, filled with this letter and will write it to
+the fragment. The size of block is given by @option{--block-size}
+option. It defaults to 512. Thus, if the string consists of @var{n}
+characters, the resulting file fragment will contain
+@code{@var{n}*@var{block-size}} of data.
+
+ Last fragment descriptor can have only file offset part. In this
+case @command{genfile} will create a hole at the end of the file up to
+the given offset.
+
+ For example, consider the following invocation:
+
+@smallexample
+genfile --sparse --file sparsefile 0 ABCD 1M EFGHI 2000K
+@end smallexample
+
+@noindent
+It will create 3101184-bytes long file of the following structure:
+
+@multitable @columnfractions .35 .20 .45
+@item Offset @tab Length @tab Contents
+@item 0 @tab 4*512=2048 @tab Four 512-byte blocks, filled with
+letters @samp{A}, @samp{B}, @samp{C} and @samp{D}.
+@item 2048 @tab 1046528 @tab Zero bytes
+@item 1050624 @tab 5*512=2560 @tab Five blocks, filled with letters
+@samp{E}, @samp{F}, @samp{G}, @samp{H}, @samp{I}.
+@item 1053184 @tab 2048000 @tab Zero bytes
+@end multitable
+
+ The exit code of @command{genfile --status} command is @code{0}
+only if created file is actually sparse.
+
+@node Status Mode
+@appendixsec Status Mode
+
+ In status mode, @command{genfile} prints file system status for
+each file specified in the command line. This mode is toggled by
+@option{--stat} (@option{-S}) command line option. An optional argument to this
+option specifies output @dfn{format}: a comma-separated list of
+@code{struct stat} fields to be displayed. This list can contain
+following identifiers @FIXME{should we also support @samp{%} notations
+as in stat(1)??}:
+
+@table @asis
+@item name
+ The file name.
+
+@item dev
+@itemx st_dev
+ Device number in decimal.
+
+@item ino
+@itemx st_ino
+ Inode number.
+
+@item mode[.@var{number}]
+@itemx st_mode[.@var{number}]
+ File mode in octal. Optional @var{number} specifies octal mask to
+be applied to the mode before outputting. For example, @code{--stat
+mode.777} will preserve lower nine bits of it. Notice, that you can
+use any punctuation character in place of @samp{.}.
+
+@item nlink
+@itemx st_nlink
+ Number of hard links.
+
+@item uid
+@itemx st_uid
+ User ID of owner.
+
+@item gid
+@itemx st_gid
+ Group ID of owner.
+
+@item size
+@itemx st_size
+ File size in decimal.
+
+@item blksize
+@itemx st_blksize
+ The size in bytes of each file block.
+
+@item blocks
+@itemx st_blocks
+ Number of blocks allocated.
+
+@item atime
+@itemx st_atime
+ Time of last access.
+
+@item mtime
+@itemx st_mtime
+ Time of last modification
+
+@item ctime
+@itemx st_ctime
+ Time of last status change
+
+@item sparse
+ A boolean value indicating whether the file is @samp{sparse}.
+@end table
+
+ Modification times are displayed in @acronym{UTC} as
+@acronym{UNIX} timestamps, unless suffixed with @samp{H} (for
+``human-readable''), as in @samp{ctimeH}, in which case usual
+@code{tar tv} output format is used.
+
+ The default output format is: @samp{name,dev,ino,mode,
+nlink,uid,gid,size,blksize,blocks,atime,mtime,ctime}.
+
+ For example, the following command will display file names and
+corresponding times of last access for each file in the current working
+directory:
+
+@smallexample
+genfile --stat=name,atime *
+@end smallexample
+
+@node Exec Mode
+@appendixsec Exec Mode
+
+@cindex Exec Mode, @command{genfile}
+ This mode is designed for testing the behavior of @code{paxutils}
+commands when some of the files change during archiving. It is an
+experimental mode.
+
+ The @samp{Exec Mode} is toggled by @option{--run} command line
+option (or its alias @option{-r}). The argument to this option gives
+the command line to be executed. The actual command line is
+constructed by inserting @option{--checkpoint} option between the
+command name and its first argument (if any). Due to this, the
+argument to @option{--run} may not use traditional @command{tar}
+option syntax, i.e., the following is wrong:
+
+@smallexample
+# Wrong!
+genfile --run 'tar cf foo bar'
+@end smallexample
+
+@noindent
+
+Use the following syntax instead:
+
+@smallexample
+genfile --run 'tar -cf foo bar'
+@end smallexample
+
+ The rest of command line after @option{--run} or its equivalent
+specifies checkpoint values and actions to be executed upon reaching
+them. Checkpoint values are introduced with @option{--checkpoint}
+command line option. Argument to this option is the number of
+checkpoint in decimal.
+
+ Any number of @dfn{actions} may be specified after a
+checkpoint. Available actions are
+
+@table @option
+@item --cut @var{file}
+@itemx --truncate @var{file}
+ Truncate @var{file} to the size specified by previous
+@option{--length} option (or 0, if it is not given).
+
+@item --append @var{file}
+ Append data to @var{file}. The size of data and its pattern are
+given by previous @option{--length} and @option{pattern} options.
+
+@item --touch @var{file}
+ Update the access and modification times of @var{file}. These
+timestamps are changed to the current time, unless @option{--date}
+option was given, in which case they are changed to the specified
+time. Argument to @option{--date} option is a date specification in
+an almost arbitrary format (@pxref{Date input formats}).
+
+@item --exec @var{command}
+ Execute given shell command.
+
+@end table
+
+ Option @option{--verbose} instructs @command{genfile} to print on
+standard output notifications about checkpoints being executed and to
+verbosely describe exit status of the command.
+
+ While the command is being executed its standard output remains
+connected to descriptor 1. All messages it prints to file descriptor
+2, except checkpoint notifications, are forwarded to standard
+error.
+
+ @command{Genfile} exits with the exit status of the executed command.
diff --git a/doc/getdate.texi b/doc/getdate.texi
new file mode 100644
index 0000000..eae4526
--- /dev/null
+++ b/doc/getdate.texi
@@ -0,0 +1,553 @@
+@c GNU date syntax documentation
+
+@c Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+@c 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.2 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+@node Date input formats
+@chapter Date input formats
+
+@cindex date input formats
+@findex get_date
+
+First, a quote:
+
+@quotation
+Our units of temporal measurement, from seconds on up to months, are so
+complicated, asymmetrical and disjunctive so as to make coherent mental
+reckoning in time all but impossible. Indeed, had some tyrannical god
+contrived to enslave our minds to time, to make it all but impossible
+for us to escape subjection to sodden routines and unpleasant surprises,
+he could hardly have done better than handing down our present system.
+It is like a set of trapezoidal building blocks, with no vertical or
+horizontal surfaces, like a language in which the simplest thought
+demands ornate constructions, useless particles and lengthy
+circumlocutions. Unlike the more successful patterns of language and
+science, which enable us to face experience boldly or at least
+level-headedly, our system of temporal calculation silently and
+persistently encourages our terror of time.
+
+@dots{} It is as though architects had to measure length in feet, width
+in meters and height in ells; as though basic instruction manuals
+demanded a knowledge of five different languages. It is no wonder then
+that we often look into our own immediate past or future, last Tuesday
+or a week from Sunday, with feelings of helpless confusion. @dots{}
+
+--- Robert Grudin, @cite{Time and the Art of Living}.
+@end quotation
+
+This section describes the textual date representations that @sc{gnu}
+programs accept. These are the strings you, as a user, can supply as
+arguments to the various programs. The C interface (via the
+@code{get_date} function) is not described here.
+
+@menu
+* General date syntax:: Common rules.
+* Calendar date items:: 19 Dec 1994.
+* Time of day items:: 9:20pm.
+* Time zone items:: @sc{est}, @sc{pdt}, @sc{gmt}.
+* Day of week items:: Monday and others.
+* Relative items in date strings:: next tuesday, 2 years ago.
+* Pure numbers in date strings:: 19931219, 1440.
+* Seconds since the Epoch:: @@1078100502.
+* Specifying time zone rules:: TZ="America/New_York", TZ="UTC0".
+* Authors of get_date:: Bellovin, Eggert, Salz, Berets, et al.
+@end menu
+
+
+@node General date syntax
+@section General date syntax
+
+@cindex general date syntax
+
+@cindex items in date strings
+A @dfn{date} is a string, possibly empty, containing many items
+separated by whitespace. The whitespace may be omitted when no
+ambiguity arises. The empty string means the beginning of today (i.e.,
+midnight). Order of the items is immaterial. A date string may contain
+many flavors of items:
+
+@itemize @bullet
+@item calendar date items
+@item time of day items
+@item time zone items
+@item day of the week items
+@item relative items
+@item pure numbers.
+@end itemize
+
+@noindent We describe each of these item types in turn, below.
+
+@cindex numbers, written-out
+@cindex ordinal numbers
+@findex first @r{in date strings}
+@findex next @r{in date strings}
+@findex last @r{in date strings}
+A few ordinal numbers may be written out in words in some contexts. This is
+most useful for specifying day of the week items or relative items (see
+below). Among the most commonly used ordinal numbers, the word
+@samp{last} stands for @math{-1}, @samp{this} stands for 0, and
+@samp{first} and @samp{next} both stand for 1. Because the word
+@samp{second} stands for the unit of time there is no way to write the
+ordinal number 2, but for convenience @samp{third} stands for 3,
+@samp{fourth} for 4, @samp{fifth} for 5,
+@samp{sixth} for 6, @samp{seventh} for 7, @samp{eighth} for 8,
+@samp{ninth} for 9, @samp{tenth} for 10, @samp{eleventh} for 11 and
+@samp{twelfth} for 12.
+
+@cindex months, written-out
+When a month is written this way, it is still considered to be written
+numerically, instead of being ``spelled in full''; this changes the
+allowed strings.
+
+@cindex language, in dates
+In the current implementation, only English is supported for words and
+abbreviations like @samp{AM}, @samp{DST}, @samp{EST}, @samp{first},
+@samp{January}, @samp{Sunday}, @samp{tomorrow}, and @samp{year}.
+
+@cindex language, in dates
+@cindex time zone item
+The output of the @command{date} command
+is not always acceptable as a date string,
+not only because of the language problem, but also because there is no
+standard meaning for time zone items like @samp{IST}. When using
+@command{date} to generate a date string intended to be parsed later,
+specify a date format that is independent of language and that does not
+use time zone items other than @samp{UTC} and @samp{Z}. Here are some
+ways to do this:
+
+@example
+$ LC_ALL=C TZ=UTC0 date
+Mon Mar 1 00:21:42 UTC 2004
+$ TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ'
+2004-03-01 00:21:42Z
+$ date --iso-8601=ns | tr T ' ' # --iso-8601 is a GNU extension.
+2004-02-29 16:21:42,692722128-0800
+$ date --rfc-2822 # a GNU extension
+Sun, 29 Feb 2004 16:21:42 -0800
+$ date +'%Y-%m-%d %H:%M:%S %z' # %z is a GNU extension.
+2004-02-29 16:21:42 -0800
+$ date +'@@%s.%N' # %s and %N are GNU extensions.
+@@1078100502.692722128
+@end example
+
+@cindex case, ignored in dates
+@cindex comments, in dates
+Alphabetic case is completely ignored in dates. Comments may be introduced
+between round parentheses, as long as included parentheses are properly
+nested. Hyphens not followed by a digit are currently ignored. Leading
+zeros on numbers are ignored.
+
+Invalid dates like @samp{2005-02-29} or times like @samp{24:00} are
+rejected. In the typical case of a host that does not support leap
+seconds, a time like @samp{23:59:60} is rejected even if it
+corresponds to a valid leap second.
+
+
+@node Calendar date items
+@section Calendar date items
+
+@cindex calendar date item
+
+A @dfn{calendar date item} specifies a day of the year. It is
+specified differently, depending on whether the month is specified
+numerically or literally. All these strings specify the same calendar date:
+
+@example
+1972-09-24 # @sc{iso} 8601.
+72-9-24 # Assume 19xx for 69 through 99,
+ # 20xx for 00 through 68.
+72-09-24 # Leading zeros are ignored.
+9/24/72 # Common U.S. writing.
+24 September 1972
+24 Sept 72 # September has a special abbreviation.
+24 Sep 72 # Three-letter abbreviations always allowed.
+Sep 24, 1972
+24-sep-72
+24sep72
+@end example
+
+The year can also be omitted. In this case, the last specified year is
+used, or the current year if none. For example:
+
+@example
+9/24
+sep 24
+@end example
+
+Here are the rules.
+
+@cindex @sc{iso} 8601 date format
+@cindex date format, @sc{iso} 8601
+For numeric months, the @sc{iso} 8601 format
+@samp{@var{year}-@var{month}-@var{day}} is allowed, where @var{year} is
+any positive number, @var{month} is a number between 01 and 12, and
+@var{day} is a number between 01 and 31. A leading zero must be present
+if a number is less than ten. If @var{year} is 68 or smaller, then 2000
+is added to it; otherwise, if @var{year} is less than 100,
+then 1900 is added to it. The construct
+@samp{@var{month}/@var{day}/@var{year}}, popular in the United States,
+is accepted. Also @samp{@var{month}/@var{day}}, omitting the year.
+
+@cindex month names in date strings
+@cindex abbreviations for months
+Literal months may be spelled out in full: @samp{January},
+@samp{February}, @samp{March}, @samp{April}, @samp{May}, @samp{June},
+@samp{July}, @samp{August}, @samp{September}, @samp{October},
+@samp{November} or @samp{December}. Literal months may be abbreviated
+to their first three letters, possibly followed by an abbreviating dot.
+It is also permitted to write @samp{Sept} instead of @samp{September}.
+
+When months are written literally, the calendar date may be given as any
+of the following:
+
+@example
+@var{day} @var{month} @var{year}
+@var{day} @var{month}
+@var{month} @var{day} @var{year}
+@var{day}-@var{month}-@var{year}
+@end example
+
+Or, omitting the year:
+
+@example
+@var{month} @var{day}
+@end example
+
+
+@node Time of day items
+@section Time of day items
+
+@cindex time of day item
+
+A @dfn{time of day item} in date strings specifies the time on a given
+day. Here are some examples, all of which represent the same time:
+
+@example
+20:02:00.000000
+20:02
+8:02pm
+20:02-0500 # In @sc{est} (U.S. Eastern Standard Time).
+@end example
+
+More generally, the time of day may be given as
+@samp{@var{hour}:@var{minute}:@var{second}}, where @var{hour} is
+a number between 0 and 23, @var{minute} is a number between 0 and
+59, and @var{second} is a number between 0 and 59 possibly followed by
+@samp{.} or @samp{,} and a fraction containing one or more digits.
+Alternatively,
+@samp{:@var{second}} can be omitted, in which case it is taken to
+be zero. On the rare hosts that support leap seconds, @var{second}
+may be 60.
+
+@findex am @r{in date strings}
+@findex pm @r{in date strings}
+@findex midnight @r{in date strings}
+@findex noon @r{in date strings}
+If the time is followed by @samp{am} or @samp{pm} (or @samp{a.m.}
+or @samp{p.m.}), @var{hour} is restricted to run from 1 to 12, and
+@samp{:@var{minute}} may be omitted (taken to be zero). @samp{am}
+indicates the first half of the day, @samp{pm} indicates the second
+half of the day. In this notation, 12 is the predecessor of 1:
+midnight is @samp{12am} while noon is @samp{12pm}.
+(This is the zero-oriented interpretation of @samp{12am} and @samp{12pm},
+as opposed to the old tradition derived from Latin
+which uses @samp{12m} for noon and @samp{12pm} for midnight.)
+
+@cindex time zone correction
+@cindex minutes, time zone correction by
+The time may alternatively be followed by a time zone correction,
+expressed as @samp{@var{s}@var{hh}@var{mm}}, where @var{s} is @samp{+}
+or @samp{-}, @var{hh} is a number of zone hours and @var{mm} is a number
+of zone minutes. You can also separate @var{hh} from @var{mm} with a colon.
+When a time zone correction is given this way, it
+forces interpretation of the time relative to
+Coordinated Universal Time (@sc{utc}), overriding any previous
+specification for the time zone or the local time zone. For example,
+@samp{+0530} and @samp{+05:30} both stand for the time zone 5.5 hours
+ahead of @sc{utc} (e.g., India). The @var{minute}
+part of the time of day may not be elided when a time zone correction
+is used. This is the best way to specify a time zone correction by
+fractional parts of an hour.
+
+Either @samp{am}/@samp{pm} or a time zone correction may be specified,
+but not both.
+
+
+@node Time zone items
+@section Time zone items
+
+@cindex time zone item
+
+A @dfn{time zone item} specifies an international time zone, indicated
+by a small set of letters, e.g., @samp{UTC} or @samp{Z}
+for Coordinated Universal
+Time. Any included periods are ignored. By following a
+non-daylight-saving time zone by the string @samp{DST} in a separate
+word (that is, separated by some white space), the corresponding
+daylight saving time zone may be specified.
+Alternatively, a non-daylight-saving time zone can be followed by a
+time zone correction, to add the two values. This is normally done
+only for @samp{UTC}; for example, @samp{UTC+05:30} is equivalent to
+@samp{+05:30}.
+
+Time zone items other than @samp{UTC} and @samp{Z}
+are obsolescent and are not recommended, because they
+are ambiguous; for example, @samp{EST} has a different meaning in
+Australia than in the United States. Instead, it's better to use
+unambiguous numeric time zone corrections like @samp{-0500}, as
+described in the previous section.
+
+If neither a time zone item nor a time zone correction is supplied,
+time stamps are interpreted using the rules of the default time zone
+(@pxref{Specifying time zone rules}).
+
+
+@node Day of week items
+@section Day of week items
+
+@cindex day of week item
+
+The explicit mention of a day of the week will forward the date
+(only if necessary) to reach that day of the week in the future.
+
+Days of the week may be spelled out in full: @samp{Sunday},
+@samp{Monday}, @samp{Tuesday}, @samp{Wednesday}, @samp{Thursday},
+@samp{Friday} or @samp{Saturday}. Days may be abbreviated to their
+first three letters, optionally followed by a period. The special
+abbreviations @samp{Tues} for @samp{Tuesday}, @samp{Wednes} for
+@samp{Wednesday} and @samp{Thur} or @samp{Thurs} for @samp{Thursday} are
+also allowed.
+
+@findex next @var{day}
+@findex last @var{day}
+A number may precede a day of the week item to move forward
+supplementary weeks. It is best used in expression like @samp{third
+monday}. In this context, @samp{last @var{day}} or @samp{next
+@var{day}} is also acceptable; they move one week before or after
+the day that @var{day} by itself would represent.
+
+A comma following a day of the week item is ignored.
+
+
+@node Relative items in date strings
+@section Relative items in date strings
+
+@cindex relative items in date strings
+@cindex displacement of dates
+
+@dfn{Relative items} adjust a date (or the current date if none) forward
+or backward. The effects of relative items accumulate. Here are some
+examples:
+
+@example
+1 year
+1 year ago
+3 years
+2 days
+@end example
+
+@findex year @r{in date strings}
+@findex month @r{in date strings}
+@findex fortnight @r{in date strings}
+@findex week @r{in date strings}
+@findex day @r{in date strings}
+@findex hour @r{in date strings}
+@findex minute @r{in date strings}
+The unit of time displacement may be selected by the string @samp{year}
+or @samp{month} for moving by whole years or months. These are fuzzy
+units, as years and months are not all of equal duration. More precise
+units are @samp{fortnight} which is worth 14 days, @samp{week} worth 7
+days, @samp{day} worth 24 hours, @samp{hour} worth 60 minutes,
+@samp{minute} or @samp{min} worth 60 seconds, and @samp{second} or
+@samp{sec} worth one second. An @samp{s} suffix on these units is
+accepted and ignored.
+
+@findex ago @r{in date strings}
+The unit of time may be preceded by a multiplier, given as an optionally
+signed number. Unsigned numbers are taken as positively signed. No
+number at all implies 1 for a multiplier. Following a relative item by
+the string @samp{ago} is equivalent to preceding the unit by a
+multiplier with value @math{-1}.
+
+@findex day @r{in date strings}
+@findex tomorrow @r{in date strings}
+@findex yesterday @r{in date strings}
+The string @samp{tomorrow} is worth one day in the future (equivalent
+to @samp{day}), the string @samp{yesterday} is worth
+one day in the past (equivalent to @samp{day ago}).
+
+@findex now @r{in date strings}
+@findex today @r{in date strings}
+@findex this @r{in date strings}
+The strings @samp{now} or @samp{today} are relative items corresponding
+to zero-valued time displacement, these strings come from the fact
+a zero-valued time displacement represents the current time when not
+otherwise changed by previous items. They may be used to stress other
+items, like in @samp{12:00 today}. The string @samp{this} also has
+the meaning of a zero-valued time displacement, but is preferred in
+date strings like @samp{this thursday}.
+
+When a relative item causes the resulting date to cross a boundary
+where the clocks were adjusted, typically for daylight saving time,
+the resulting date and time are adjusted accordingly.
+
+The fuzz in units can cause problems with relative items. For
+example, @samp{2003-07-31 -1 month} might evaluate to 2003-07-01,
+because 2003-06-31 is an invalid date. To determine the previous
+month more reliably, you can ask for the month before the 15th of the
+current month. For example:
+
+@example
+$ date -R
+Thu, 31 Jul 2003 13:02:39 -0700
+$ date --date='-1 month' +'Last month was %B?'
+Last month was July?
+$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
+Last month was June!
+@end example
+
+Also, take care when manipulating dates around clock changes such as
+daylight saving leaps. In a few cases these have added or subtracted
+as much as 24 hours from the clock, so it is often wise to adopt
+universal time by setting the @env{TZ} environment variable to
+@samp{UTC0} before embarking on calendrical calculations.
+
+@node Pure numbers in date strings
+@section Pure numbers in date strings
+
+@cindex pure numbers in date strings
+
+The precise interpretation of a pure decimal number depends
+on the context in the date string.
+
+If the decimal number is of the form @var{yyyy}@var{mm}@var{dd} and no
+other calendar date item (@pxref{Calendar date items}) appears before it
+in the date string, then @var{yyyy} is read as the year, @var{mm} as the
+month number and @var{dd} as the day of the month, for the specified
+calendar date.
+
+If the decimal number is of the form @var{hh}@var{mm} and no other time
+of day item appears before it in the date string, then @var{hh} is read
+as the hour of the day and @var{mm} as the minute of the hour, for the
+specified time of day. @var{mm} can also be omitted.
+
+If both a calendar date and a time of day appear to the left of a number
+in the date string, but no relative item, then the number overrides the
+year.
+
+
+@node Seconds since the Epoch
+@section Seconds since the Epoch
+
+If you precede a number with @samp{@@}, it represents an internal time
+stamp as a count of seconds. The number can contain an internal
+decimal point (either @samp{.} or @samp{,}); any excess precision not
+supported by the internal representation is truncated toward minus
+infinity. Such a number cannot be combined with any other date
+item, as it specifies a complete time stamp.
+
+@cindex beginning of time, for @acronym{POSIX}
+@cindex epoch, for @acronym{POSIX}
+Internally, computer times are represented as a count of seconds since
+an epoch---a well-defined point of time. On @acronym{GNU} and
+@acronym{POSIX} systems, the epoch is 1970-01-01 00:00:00 @sc{utc}, so
+@samp{@@0} represents this time, @samp{@@1} represents 1970-01-01
+00:00:01 @sc{utc}, and so forth. @acronym{GNU} and most other
+@acronym{POSIX}-compliant systems support such times as an extension
+to @acronym{POSIX}, using negative counts, so that @samp{@@-1}
+represents 1969-12-31 23:59:59 @sc{utc}.
+
+Traditional Unix systems count seconds with 32-bit two's-complement
+integers and can represent times from 1901-12-13 20:45:52 through
+2038-01-19 03:14:07 @sc{utc}. More modern systems use 64-bit counts
+of seconds with nanosecond subcounts, and can represent all the times
+in the known lifetime of the universe to a resolution of 1 nanosecond.
+
+On most hosts, these counts ignore the presence of leap seconds.
+For example, on most hosts @samp{@@915148799} represents 1998-12-31
+23:59:59 @sc{utc}, @samp{@@915148800} represents 1999-01-01 00:00:00
+@sc{utc}, and there is no way to represent the intervening leap second
+1998-12-31 23:59:60 @sc{utc}.
+
+@node Specifying time zone rules
+@section Specifying time zone rules
+
+@vindex TZ
+Normally, dates are interpreted using the rules of the current time
+zone, which in turn are specified by the @env{TZ} environment
+variable, or by a system default if @env{TZ} is not set. To specify a
+different set of default time zone rules that apply just to one date,
+start the date with a string of the form @samp{TZ="@var{rule}"}. The
+two quote characters (@samp{"}) must be present in the date, and any
+quotes or backslashes within @var{rule} must be escaped by a
+backslash.
+
+For example, with the @acronym{GNU} @command{date} command you can
+answer the question ``What time is it in New York when a Paris clock
+shows 6:30am on October 31, 2004?'' by using a date beginning with
+@samp{TZ="Europe/Paris"} as shown in the following shell transcript:
+
+@example
+$ export TZ="America/New_York"
+$ date --date='TZ="Europe/Paris" 2004-10-31 06:30'
+Sun Oct 31 01:30:00 EDT 2004
+@end example
+
+In this example, the @option{--date} operand begins with its own
+@env{TZ} setting, so the rest of that operand is processed according
+to @samp{Europe/Paris} rules, treating the string @samp{2004-10-31
+06:30} as if it were in Paris. However, since the output of the
+@command{date} command is processed according to the overall time zone
+rules, it uses New York time. (Paris was normally six hours ahead of
+New York in 2004, but this example refers to a brief Halloween period
+when the gap was five hours.)
+
+A @env{TZ} value is a rule that typically names a location in the
+@uref{http://www.twinsun.com/tz/tz-link.htm, @samp{tz} database}.
+A recent catalog of location names appears in the
+@uref{http://twiki.org/cgi-bin/xtra/tzdate, TWiki Date and Time
+Gateway}. A few non-@acronym{GNU} hosts require a colon before a
+location name in a @env{TZ} setting, e.g.,
+@samp{TZ=":America/New_York"}.
+
+The @samp{tz} database includes a wide variety of locations ranging
+from @samp{Arctic/Longyearbyen} to @samp{Antarctica/South_Pole}, but
+if you are at sea and have your own private time zone, or if you are
+using a non-@acronym{GNU} host that does not support the @samp{tz}
+database, you may need to use a @acronym{POSIX} rule instead. Simple
+@acronym{POSIX} rules like @samp{UTC0} specify a time zone without
+daylight saving time; other rules can specify simple daylight saving
+regimes. @xref{TZ Variable,, Specifying the Time Zone with @code{TZ},
+libc, The GNU C Library}.
+
+@node Authors of get_date
+@section Authors of @code{get_date}
+
+@cindex authors of @code{get_date}
+
+@cindex Bellovin, Steven M.
+@cindex Salz, Rich
+@cindex Berets, Jim
+@cindex MacKenzie, David
+@cindex Meyering, Jim
+@cindex Eggert, Paul
+@code{get_date} was originally implemented by Steven M. Bellovin
+(@email{smb@@research.att.com}) while at the University of North Carolina
+at Chapel Hill. The code was later tweaked by a couple of people on
+Usenet, then completely overhauled by Rich $alz (@email{rsalz@@bbn.com})
+and Jim Berets (@email{jberets@@bbn.com}) in August, 1990. Various
+revisions for the @sc{gnu} system were made by David MacKenzie, Jim Meyering,
+Paul Eggert and others.
+
+@cindex Pinard, F.
+@cindex Berry, K.
+This chapter was originally produced by Fran@,{c}ois Pinard
+(@email{pinard@@iro.umontreal.ca}) from the @file{getdate.y} source code,
+and then edited by K.@: Berry (@email{kb@@cs.umb.edu}).
diff --git a/doc/header.texi b/doc/header.texi
new file mode 100644
index 0000000..0d1616e
--- /dev/null
+++ b/doc/header.texi
@@ -0,0 +1,242 @@
+@comment GNU tar Archive Format description.
+@comment
+@comment Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+@comment 2000, 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+@comment
+@comment This program is free software; you can redistribute it and/or modify it
+@comment under the terms of the GNU General Public License as published by the
+@comment Free Software Foundation; either version 2, or (at your option) any later
+@comment version.
+@comment
+@comment This program is distributed in the hope that it will be useful, but
+@comment WITHOUT ANY WARRANTY; without even the implied warranty of
+@comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+@comment Public License for more details.
+@comment
+@comment You should have received a copy of the GNU General Public License along
+@comment with this program; if not, write to the Free Software Foundation, Inc.,
+@comment 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+/*@r{ tar Header Block, from POSIX 1003.1-1990. }*/
+
+/*@r{ POSIX header. }*/
+
+struct posix_header
+@{ /*@r{ byte offset }*/
+ char name[100]; /*@r{ 0 }*/
+ char mode[8]; /*@r{ 100 }*/
+ char uid[8]; /*@r{ 108 }*/
+ char gid[8]; /*@r{ 116 }*/
+ char size[12]; /*@r{ 124 }*/
+ char mtime[12]; /*@r{ 136 }*/
+ char chksum[8]; /*@r{ 148 }*/
+ char typeflag; /*@r{ 156 }*/
+ char linkname[100]; /*@r{ 157 }*/
+ char magic[6]; /*@r{ 257 }*/
+ char version[2]; /*@r{ 263 }*/
+ char uname[32]; /*@r{ 265 }*/
+ char gname[32]; /*@r{ 297 }*/
+ char devmajor[8]; /*@r{ 329 }*/
+ char devminor[8]; /*@r{ 337 }*/
+ char prefix[155]; /*@r{ 345 }*/
+ /*@r{ 500 }*/
+@};
+
+#define TMAGIC "ustar" /*@r{ ustar and a null }*/
+#define TMAGLEN 6
+#define TVERSION "00" /*@r{ 00 and no null }*/
+#define TVERSLEN 2
+
+/*@r{ Values used in typeflag field. }*/
+#define REGTYPE '0' /*@r{ regular file }*/
+#define AREGTYPE '\0' /*@r{ regular file }*/
+#define LNKTYPE '1' /*@r{ link }*/
+#define SYMTYPE '2' /*@r{ reserved }*/
+#define CHRTYPE '3' /*@r{ character special }*/
+#define BLKTYPE '4' /*@r{ block special }*/
+#define DIRTYPE '5' /*@r{ directory }*/
+#define FIFOTYPE '6' /*@r{ FIFO special }*/
+#define CONTTYPE '7' /*@r{ reserved }*/
+
+#define XHDTYPE 'x' /*@r{ Extended header referring to the
+ next file in the archive }*/
+#define XGLTYPE 'g' /*@r{ Global extended header }*/
+
+/*@r{ Bits used in the mode field, values in octal. }*/
+#define TSUID 04000 /*@r{ set UID on execution }*/
+#define TSGID 02000 /*@r{ set GID on execution }*/
+#define TSVTX 01000 /*@r{ reserved }*/
+ /*@r{ file permissions }*/
+#define TUREAD 00400 /*@r{ read by owner }*/
+#define TUWRITE 00200 /*@r{ write by owner }*/
+#define TUEXEC 00100 /*@r{ execute/search by owner }*/
+#define TGREAD 00040 /*@r{ read by group }*/
+#define TGWRITE 00020 /*@r{ write by group }*/
+#define TGEXEC 00010 /*@r{ execute/search by group }*/
+#define TOREAD 00004 /*@r{ read by other }*/
+#define TOWRITE 00002 /*@r{ write by other }*/
+#define TOEXEC 00001 /*@r{ execute/search by other }*/
+
+/*@r{ tar Header Block, GNU extensions. }*/
+
+/*@r{ In GNU tar, SYMTYPE is for to symbolic links, and CONTTYPE is for
+ contiguous files, so maybe disobeying the `reserved' comment in POSIX
+ header description. I suspect these were meant to be used this way, and
+ should not have really been `reserved' in the published standards. }*/
+
+/*@r{ *BEWARE* *BEWARE* *BEWARE* that the following information is still
+ boiling, and may change. Even if the OLDGNU format description should be
+ accurate, the so-called GNU format is not yet fully decided. It is
+ surely meant to use only extensions allowed by POSIX, but the sketch
+ below repeats some ugliness from the OLDGNU format, which should rather
+ go away. Sparse files should be saved in such a way that they do *not*
+ require two passes at archive creation time. Huge files get some POSIX
+ fields to overflow, alternate solutions have to be sought for this. }*/
+
+/*@r{ Descriptor for a single file hole. }*/
+
+struct sparse
+@{ /*@r{ byte offset }*/
+ char offset[12]; /*@r{ 0 }*/
+ char numbytes[12]; /*@r{ 12 }*/
+ /*@r{ 24 }*/
+@};
+
+/*@r{ Sparse files are not supported in POSIX ustar format. For sparse files
+ with a POSIX header, a GNU extra header is provided which holds overall
+ sparse information and a few sparse descriptors. When an old GNU header
+ replaces both the POSIX header and the GNU extra header, it holds some
+ sparse descriptors too. Whether POSIX or not, if more sparse descriptors
+ are still needed, they are put into as many successive sparse headers as
+ necessary. The following constants tell how many sparse descriptors fit
+ in each kind of header able to hold them. }*/
+
+#define SPARSES_IN_EXTRA_HEADER 16
+#define SPARSES_IN_OLDGNU_HEADER 4
+#define SPARSES_IN_SPARSE_HEADER 21
+
+/*@r{ Extension header for sparse files, used immediately after the GNU extra
+ header, and used only if all sparse information cannot fit into that
+ extra header. There might even be many such extension headers, one after
+ the other, until all sparse information has been recorded. }*/
+
+struct sparse_header
+@{ /*@r{ byte offset }*/
+ struct sparse sp[SPARSES_IN_SPARSE_HEADER];
+ /*@r{ 0 }*/
+ char isextended; /*@r{ 504 }*/
+ /*@r{ 505 }*/
+@};
+
+/*@r{ The old GNU format header conflicts with POSIX format in such a way that
+ POSIX archives may fool old GNU tar's, and POSIX tar's might well be
+ fooled by old GNU tar archives. An old GNU format header uses the space
+ used by the prefix field in a POSIX header, and cumulates information
+ normally found in a GNU extra header. With an old GNU tar header, we
+ never see any POSIX header nor GNU extra header. Supplementary sparse
+ headers are allowed, however. }*/
+
+struct oldgnu_header
+@{ /*@r{ byte offset }*/
+ char unused_pad1[345]; /*@r{ 0 }*/
+ char atime[12]; /*@r{ 345 Incr. archive: atime of the file }*/
+ char ctime[12]; /*@r{ 357 Incr. archive: ctime of the file }*/
+ char offset[12]; /*@r{ 369 Multivolume archive: the offset of
+ the start of this volume }*/
+ char longnames[4]; /*@r{ 381 Not used }*/
+ char unused_pad2; /*@r{ 385 }*/
+ struct sparse sp[SPARSES_IN_OLDGNU_HEADER];
+ /*@r{ 386 }*/
+ char isextended; /*@r{ 482 Sparse file: Extension sparse header
+ follows }*/
+ char realsize[12]; /*@r{ 483 Sparse file: Real size}*/
+ /*@r{ 495 }*/
+@};
+
+/*@r{ OLDGNU_MAGIC uses both magic and version fields, which are contiguous.
+ Found in an archive, it indicates an old GNU header format, which will be
+ hopefully become obsolescent. With OLDGNU_MAGIC, uname and gname are
+ valid, though the header is not truly POSIX conforming. }*/
+#define OLDGNU_MAGIC "ustar " /*@r{ 7 chars and a null }*/
+
+/*@r{ The standards committee allows only capital A through capital Z for
+ user-defined expansion. Other letters in use include:
+
+ 'A' Solaris Access Control List
+ 'E' Solaris Extended Attribute File
+ 'I' Inode only, as in 'star'
+ 'N' Obsolete GNU tar, for file names that do not fit into the main header.
+ 'X' POSIX 1003.1-2001 eXtended (VU version) }*/
+
+/*@r{ This is a dir entry that contains the names of files that were in the
+ dir at the time the dump was made. }*/
+#define GNUTYPE_DUMPDIR 'D'
+
+/*@r{ Identifies the *next* file on the tape as having a long linkname. }*/
+#define GNUTYPE_LONGLINK 'K'
+
+/*@r{ Identifies the *next* file on the tape as having a long name. }*/
+#define GNUTYPE_LONGNAME 'L'
+
+/*@r{ This is the continuation of a file that began on another volume. }*/
+#define GNUTYPE_MULTIVOL 'M'
+
+/*@r{ This is for sparse files. }*/
+#define GNUTYPE_SPARSE 'S'
+
+/*@r{ This file is a tape/volume header. Ignore it on extraction. }*/
+#define GNUTYPE_VOLHDR 'V'
+
+/*@r{ Solaris extended header }*/
+#define SOLARIS_XHDTYPE 'X'
+
+/*@r{ J@"org Schilling star header }*/
+
+struct star_header
+@{ /*@r{ byte offset }*/
+ char name[100]; /*@r{ 0 }*/
+ char mode[8]; /*@r{ 100 }*/
+ char uid[8]; /*@r{ 108 }*/
+ char gid[8]; /*@r{ 116 }*/
+ char size[12]; /*@r{ 124 }*/
+ char mtime[12]; /*@r{ 136 }*/
+ char chksum[8]; /*@r{ 148 }*/
+ char typeflag; /*@r{ 156 }*/
+ char linkname[100]; /*@r{ 157 }*/
+ char magic[6]; /*@r{ 257 }*/
+ char version[2]; /*@r{ 263 }*/
+ char uname[32]; /*@r{ 265 }*/
+ char gname[32]; /*@r{ 297 }*/
+ char devmajor[8]; /*@r{ 329 }*/
+ char devminor[8]; /*@r{ 337 }*/
+ char prefix[131]; /*@r{ 345 }*/
+ char atime[12]; /*@r{ 476 }*/
+ char ctime[12]; /*@r{ 488 }*/
+ /*@r{ 500 }*/
+@};
+
+#define SPARSES_IN_STAR_HEADER 4
+#define SPARSES_IN_STAR_EXT_HEADER 21
+
+struct star_in_header
+@{
+ char fill[345]; /*@r{ 0 Everything that is before t_prefix }*/
+ char prefix[1]; /*@r{ 345 t_name prefix }*/
+ char fill2; /*@r{ 346 }*/
+ char fill3[8]; /*@r{ 347 }*/
+ char isextended; /*@r{ 355 }*/
+ struct sparse sp[SPARSES_IN_STAR_HEADER]; /*@r{ 356 }*/
+ char realsize[12]; /*@r{ 452 Actual size of the file }*/
+ char offset[12]; /*@r{ 464 Offset of multivolume contents }*/
+ char atime[12]; /*@r{ 476 }*/
+ char ctime[12]; /*@r{ 488 }*/
+ char mfill[8]; /*@r{ 500 }*/
+ char xmagic[4]; /*@r{ 508 "tar" }*/
+@};
+
+struct star_ext_header
+@{
+ struct sparse sp[SPARSES_IN_STAR_EXT_HEADER];
+ char isextended;
+@};
+
diff --git a/doc/intern.texi b/doc/intern.texi
new file mode 100644
index 0000000..5081de6
--- /dev/null
+++ b/doc/intern.texi
@@ -0,0 +1,335 @@
+@c This is part of the paxutils manual.
+@c Copyright (C) 2006 Free Software Foundation, Inc.
+@c This file is distributed under GFDL 1.1 or any later version
+@c published by the Free Software Foundation.
+
+@menu
+* Standard:: Basic Tar Format
+* Extensions:: @acronym{GNU} Extensions to the Archive Format
+* Sparse Formats:: Storing Sparse Files
+* Snapshot Files::
+* Dumpdir::
+@end menu
+
+@node Standard
+@unnumberedsec Basic Tar Format
+@UNREVISED
+
+While an archive may contain many files, the archive itself is a
+single ordinary file. Like any other file, an archive file can be
+written to a storage device such as a tape or disk, sent through a
+pipe or over a network, saved on the active file system, or even
+stored in another archive. An archive file is not easy to read or
+manipulate without using the @command{tar} utility or Tar mode in
+@acronym{GNU} Emacs.
+
+Physically, an archive consists of a series of file entries terminated
+by an end-of-archive entry, which consists of two 512 blocks of zero
+bytes. A file
+entry usually describes one of the files in the archive (an
+@dfn{archive member}), and consists of a file header and the contents
+of the file. File headers contain file names and statistics, checksum
+information which @command{tar} uses to detect file corruption, and
+information about file types.
+
+Archives are permitted to have more than one member with the same
+member name. One way this situation can occur is if more than one
+version of a file has been stored in the archive. For information
+about adding new versions of a file to an archive, see @ref{update}.
+@FIXME-xref{To learn more about having more than one archive member with the
+same name, see -backup node, when it's written.}
+
+In addition to entries describing archive members, an archive may
+contain entries which @command{tar} itself uses to store information.
+@xref{label}, for an example of such an archive entry.
+
+A @command{tar} archive file contains a series of blocks. Each block
+contains @code{BLOCKSIZE} bytes. Although this format may be thought
+of as being on magnetic tape, other media are often used.
+
+Each file archived is represented by a header block which describes
+the file, followed by zero or more blocks which give the contents
+of the file. At the end of the archive file there are two 512-byte blocks
+filled with binary zeros as an end-of-file marker. A reasonable system
+should write such end-of-file marker at the end of an archive, but
+must not assume that such a block exists when reading an archive. In
+particular @GNUTAR{} always issues a warning if it does not encounter it.
+
+The blocks may be @dfn{blocked} for physical I/O operations.
+Each record of @var{n} blocks (where @var{n} is set by the
+@option{--blocking-factor=@var{512-size}} (@option{-b @var{512-size}}) option to @command{tar}) is written with a single
+@w{@samp{write ()}} operation. On magnetic tapes, the result of
+such a write is a single record. When writing an archive,
+the last record of blocks should be written at the full size, with
+blocks after the zero block containing all zeros. When reading
+an archive, a reasonable system should properly handle an archive
+whose last record is shorter than the rest, or which contains garbage
+records after a zero block.
+
+The header block is defined in C as follows. In the @GNUTAR{}
+distribution, this is part of file @file{src/tar.h}:
+
+@smallexample
+@include header.texi
+@end smallexample
+
+All characters in header blocks are represented by using 8-bit
+characters in the local variant of ASCII. Each field within the
+structure is contiguous; that is, there is no padding used within
+the structure. Each character on the archive medium is stored
+contiguously.
+
+Bytes representing the contents of files (after the header block
+of each file) are not translated in any way and are not constrained
+to represent characters in any character set. The @command{tar} format
+does not distinguish text files from binary files, and no translation
+of file contents is performed.
+
+The @code{name}, @code{linkname}, @code{magic}, @code{uname}, and
+@code{gname} are null-terminated character strings. All other fields
+are zero-filled octal numbers in ASCII. Each numeric field of width
+@var{w} contains @var{w} minus 1 digits, and a null.
+
+The @code{name} field is the file name of the file, with directory names
+(if any) preceding the file name, separated by slashes.
+
+@FIXME{how big a name before field overflows?}
+
+The @code{mode} field provides nine bits specifying file permissions
+and three bits to specify the Set @acronym{UID}, Set @acronym{GID}, and Save Text
+(@dfn{sticky}) modes. Values for these bits are defined above.
+When special permissions are required to create a file with a given
+mode, and the user restoring files from the archive does not hold such
+permissions, the mode bit(s) specifying those special permissions
+are ignored. Modes which are not supported by the operating system
+restoring files from the archive will be ignored. Unsupported modes
+should be faked up when creating or updating an archive; e.g., the
+group permission could be copied from the @emph{other} permission.
+
+The @code{uid} and @code{gid} fields are the numeric user and group
+@acronym{ID} of the file owners, respectively. If the operating system does
+not support numeric user or group @acronym{ID}s, these fields should be ignored.
+
+The @code{size} field is the size of the file in bytes; linked files
+are archived with this field specified as zero. @FIXME-xref{Modifiers, in
+particular the @option{--incremental} (@option{-G}) option.}
+
+The @code{mtime} field is the data modification time of the file at
+the time it was archived. It is the ASCII representation of the octal
+value of the last time the file's contents were modified, represented
+as an integer number of
+seconds since January 1, 1970, 00:00 Coordinated Universal Time.
+
+The @code{chksum} field is the ASCII representation of the octal value
+of the simple sum of all bytes in the header block. Each 8-bit
+byte in the header is added to an unsigned integer, initialized to
+zero, the precision of which shall be no less than seventeen bits.
+When calculating the checksum, the @code{chksum} field is treated as
+if it were all blanks.
+
+The @code{typeflag} field specifies the type of file archived. If a
+particular implementation does not recognize or permit the specified
+type, the file will be extracted as if it were a regular file. As this
+action occurs, @command{tar} issues a warning to the standard error.
+
+The @code{atime} and @code{ctime} fields are used in making incremental
+backups; they store, respectively, the particular file's access and
+status change times.
+
+The @code{offset} is used by the @option{--multi-volume} (@option{-M}) option, when
+making a multi-volume archive. The offset is number of bytes into
+the file that we need to restart at to continue the file on the next
+tape, i.e., where we store the location that a continued file is
+continued at.
+
+The following fields were added to deal with sparse files. A file
+is @dfn{sparse} if it takes in unallocated blocks which end up being
+represented as zeros, i.e., no useful data. A test to see if a file
+is sparse is to look at the number blocks allocated for it versus the
+number of characters in the file; if there are fewer blocks allocated
+for the file than would normally be allocated for a file of that
+size, then the file is sparse. This is the method @command{tar} uses to
+detect a sparse file, and once such a file is detected, it is treated
+differently from non-sparse files.
+
+Sparse files are often @code{dbm} files, or other database-type files
+which have data at some points and emptiness in the greater part of
+the file. Such files can appear to be very large when an @samp{ls
+-l} is done on them, when in truth, there may be a very small amount
+of important data contained in the file. It is thus undesirable
+to have @command{tar} think that it must back up this entire file, as
+great quantities of room are wasted on empty blocks, which can lead
+to running out of room on a tape far earlier than is necessary.
+Thus, sparse files are dealt with so that these empty blocks are
+not written to the tape. Instead, what is written to the tape is a
+description, of sorts, of the sparse file: where the holes are, how
+big the holes are, and how much data is found at the end of the hole.
+This way, the file takes up potentially far less room on the tape,
+and when the file is extracted later on, it will look exactly the way
+it looked beforehand. The following is a description of the fields
+used to handle a sparse file:
+
+The @code{sp} is an array of @code{struct sparse}. Each @code{struct
+sparse} contains two 12-character strings which represent an offset
+into the file and a number of bytes to be written at that offset.
+The offset is absolute, and not relative to the offset in preceding
+array element.
+
+The header can hold four of these @code{struct sparse} at the moment;
+if more are needed, they are not stored in the header.
+
+The @code{isextended} flag is set when an @code{extended_header}
+is needed to deal with a file. Note that this means that this flag
+can only be set when dealing with a sparse file, and it is only set
+in the event that the description of the file will not fit in the
+allotted room for sparse structures in the header. In other words,
+an extended_header is needed.
+
+The @code{extended_header} structure is used for sparse files which
+need more sparse structures than can fit in the header. The header can
+fit 4 such structures; if more are needed, the flag @code{isextended}
+gets set and the next block is an @code{extended_header}.
+
+Each @code{extended_header} structure contains an array of 21
+sparse structures, along with a similar @code{isextended} flag
+that the header had. There can be an indeterminate number of such
+@code{extended_header}s to describe a sparse file.
+
+@table @asis
+
+@item @code{REGTYPE}
+@itemx @code{AREGTYPE}
+These flags represent a regular file. In order to be compatible
+with older versions of @command{tar}, a @code{typeflag} value of
+@code{AREGTYPE} should be silently recognized as a regular file.
+New archives should be created using @code{REGTYPE}. Also, for
+backward compatibility, @command{tar} treats a regular file whose name
+ends with a slash as a directory.
+
+@item @code{LNKTYPE}
+This flag represents a file linked to another file, of any type,
+previously archived. Such files are identified in Unix by each
+file having the same device and inode number. The linked-to name is
+specified in the @code{linkname} field with a trailing null.
+
+@item @code{SYMTYPE}
+This represents a symbolic link to another file. The linked-to name
+is specified in the @code{linkname} field with a trailing null.
+
+@item @code{CHRTYPE}
+@itemx @code{BLKTYPE}
+These represent character special files and block special files
+respectively. In this case the @code{devmajor} and @code{devminor}
+fields will contain the major and minor device numbers respectively.
+Operating systems may map the device specifications to their own
+local specification, or may ignore the entry.
+
+@item @code{DIRTYPE}
+This flag specifies a directory or sub-directory. The directory
+name in the @code{name} field should end with a slash. On systems where
+disk allocation is performed on a directory basis, the @code{size} field
+will contain the maximum number of bytes (which may be rounded to
+the nearest disk block allocation unit) which the directory may
+hold. A @code{size} field of zero indicates no such limiting. Systems
+which do not support limiting in this manner should ignore the
+@code{size} field.
+
+@item @code{FIFOTYPE}
+This specifies a FIFO special file. Note that the archiving of a
+FIFO file archives the existence of this file and not its contents.
+
+@item @code{CONTTYPE}
+This specifies a contiguous file, which is the same as a normal
+file except that, in operating systems which support it, all its
+space is allocated contiguously on the disk. Operating systems
+which do not allow contiguous allocation should silently treat this
+type as a normal file.
+
+@item @code{A} @dots{} @code{Z}
+These are reserved for custom implementations. Some of these are
+used in the @acronym{GNU} modified format, as described below.
+
+@end table
+
+Other values are reserved for specification in future revisions of
+the P1003 standard, and should not be used by any @command{tar} program.
+
+The @code{magic} field indicates that this archive was output in
+the P1003 archive format. If this field contains @code{TMAGIC},
+the @code{uname} and @code{gname} fields will contain the ASCII
+representation of the owner and group of the file respectively.
+If found, the user and group @acronym{ID}s are used rather than the values in
+the @code{uid} and @code{gid} fields.
+
+For references, see ISO/IEC 9945-1:1990 or IEEE Std 1003.1-1990, pages
+169-173 (section 10.1) for @cite{Archive/Interchange File Format}; and
+IEEE Std 1003.2-1992, pages 380-388 (section 4.48) and pages 936-940
+(section E.4.48) for @cite{pax - Portable archive interchange}.
+
+@node Extensions
+@unnumberedsec @acronym{GNU} Extensions to the Archive Format
+@UNREVISED
+
+The @acronym{GNU} format uses additional file types to describe new types of
+files in an archive. These are listed below.
+
+@table @code
+@item GNUTYPE_DUMPDIR
+@itemx 'D'
+This represents a directory and a list of files created by the
+@option{--incremental} (@option{-G}) option. The @code{size} field gives the total
+size of the associated list of files. Each file name is preceded by
+either a @samp{Y} (the file should be in this archive) or an @samp{N}.
+(The file is a directory, or is not stored in the archive.) Each file
+name is terminated by a null. There is an additional null after the
+last file name.
+
+@item GNUTYPE_MULTIVOL
+@itemx 'M'
+This represents a file continued from another volume of a multi-volume
+archive created with the @option{--multi-volume} (@option{-M}) option. The original
+type of the file is not given here. The @code{size} field gives the
+maximum size of this piece of the file (assuming the volume does
+not end before the file is written out). The @code{offset} field
+gives the offset from the beginning of the file where this part of
+the file begins. Thus @code{size} plus @code{offset} should equal
+the original size of the file.
+
+@item GNUTYPE_SPARSE
+@itemx 'S'
+This flag indicates that we are dealing with a sparse file. Note
+that archiving a sparse file requires special operations to find
+holes in the file, which mark the positions of these holes, along
+with the number of bytes of data to be found after the hole.
+
+@item GNUTYPE_VOLHDR
+@itemx 'V'
+This file type is used to mark the volume header that was given with
+the @option{--label=@var{archive-label}} (@option{-V @var{archive-label}}) option when the archive was created. The @code{name}
+field contains the @code{name} given after the @option{--label=@var{archive-label}} (@option{-V @var{archive-label}}) option.
+The @code{size} field is zero. Only the first file in each volume
+of an archive should have this type.
+
+@end table
+
+You may have trouble reading a @acronym{GNU} format archive on a
+non-@acronym{GNU} system if the options @option{--incremental} (@option{-G}),
+@option{--multi-volume} (@option{-M}), @option{--sparse} (@option{-S}), or @option{--label=@var{archive-label}} (@option{-V @var{archive-label}}) were
+used when writing the archive. In general, if @command{tar} does not
+use the @acronym{GNU}-added fields of the header, other versions of
+@command{tar} should be able to read the archive. Otherwise, the
+@command{tar} program will give an error, the most likely one being a
+checksum error.
+
+@node Sparse Formats
+@unnumberedsec Storing Sparse Files
+@include sparse.texi
+
+@node Snapshot Files
+@unnumberedsec Format of the Incremental Snapshot Files
+@include snapshot.texi
+
+@node Dumpdir
+@unnumberedsec Dumpdir
+@include dumpdir.texi
+
diff --git a/doc/mastermenu.el b/doc/mastermenu.el
new file mode 100644
index 0000000..c477f95
--- /dev/null
+++ b/doc/mastermenu.el
@@ -0,0 +1,91 @@
+;;; mastermenu.el --- Redefinition of texinfo-master-menu-list
+
+;; Copyright (C) 2006 Free Software Foundation, Inc.
+
+;; Author: Sergey Poznyakoff
+;; Maintainer: bug-tar@gnu.org
+;; Keywords: maint, tex, docs
+
+;; This file is part of GNU tar documentation suite
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, write to the Free Software Foundation,
+;; Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file redefines texinfo-master-menu-list so that it takes into
+;; account included files.
+
+;; Known bugs: @menu without previous sectioning command will inherit
+;; documentation string from the previous menu. However, since such a
+;; menu is illegal in a texinfo file, we can live with it.
+
+(require 'texinfo)
+(require 'texnfo-upd)
+
+(defun texinfo-master-menu-list-recursive (title)
+ "Auxiliary function used by `texinfo-master-menu-list'."
+ (save-excursion
+ (let (master-menu-list)
+ (while (re-search-forward "\\(^@menu\\|^@include\\)" nil t)
+ (cond
+ ((string= (match-string 0) "@include")
+ (skip-chars-forward " \t")
+ (let ((included-name (let ((start (point)))
+ (end-of-line)
+ (skip-chars-backward " \t")
+ (buffer-substring start (point)))))
+ (end-of-line)
+ (let ((prev-title (texinfo-copy-menu-title)))
+ (save-excursion
+ (set-buffer (find-file-noselect included-name))
+ (setq master-menu-list
+ (append (texinfo-master-menu-list-recursive prev-title)
+ master-menu-list))))))
+ (t
+ (setq master-menu-list
+ (cons (list
+ (texinfo-copy-menu)
+ (let ((menu-title (texinfo-copy-menu-title)))
+ (if (string= menu-title "")
+ title
+ menu-title)))
+ master-menu-list)))))
+ master-menu-list)))
+
+(defun texinfo-master-menu-list ()
+ "Return a list of menu entries and header lines for the master menu,
+recursing into included files.
+
+Start with the menu for chapters and indices and then find each
+following menu and the title of the node preceding that menu.
+
+The master menu list has this form:
+
+ \(\(\(... \"entry-1-2\" \"entry-1\"\) \"title-1\"\)
+ \(\(... \"entry-2-2\" \"entry-2-1\"\) \"title-2\"\)
+ ...\)
+
+However, there does not need to be a title field."
+
+ (reverse (texinfo-master-menu-list-recursive "")))
+
+(defun make-master-menu ()
+ "Create master menu in the first Emacs argument."
+ (find-file (car command-line-args-left))
+ (texinfo-master-menu nil)
+ (save-buffer))
+
+
+;;; mastermenu.el ends here
diff --git a/doc/rendition.texi b/doc/rendition.texi
new file mode 100644
index 0000000..19f024a
--- /dev/null
+++ b/doc/rendition.texi
@@ -0,0 +1,90 @@
+@c This is part of GNU tar manual.
+@c Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
+@c 2003, 2004, 2006 Free Software Foundation, Inc.
+@c See file tar.texi for copying conditions.
+
+@c This file contains support for 'renditions' by Fran@,{c}ois Pinard
+@c I extended it by adding a FIXME_FOOTNOTE variable, which controls
+@c whether FIXME information should be placed in footnotes or
+@c inlined. --gray
+
+@c ======================================================================
+@c This document has three levels of rendition: PUBLISH, DISTRIB or PROOF,
+@c as decided by @set symbols. The PUBLISH rendition does not show
+@c notes or marks asking for revision. Most users will prefer having more
+@c information, even if this information is not fully revised for adequacy,
+@c so DISTRIB is the default for distributions. The PROOF rendition
+@c show all marks to the point of ugliness, but is nevertheless useful to
+@c those working on the manual itself.
+@c ======================================================================
+
+@c Set this symbol if you wish FIXMEs to appear in footnotes, instead
+@c of being inserted into the text.
+@c @set PROOF_FOOTNOTED
+
+@ifclear PUBLISH
+@ifclear DISTRIB
+@ifclear PROOF
+@set DISTRIB
+@end ifclear
+@end ifclear
+@end ifclear
+
+@ifset PUBLISH
+@set RENDITION The book, version
+@end ifset
+
+@ifset DISTRIB
+@set RENDITION FTP release, version
+@end ifset
+
+@ifset PROOF
+@set RENDITION Proof reading version
+@end ifset
+
+@c Output marks for nodes needing revision, but not in PUBLISH rendition.
+
+@macro UNREVISED
+@ifclear PUBLISH
+@quotation
+@emph{(This message will disappear, once this node revised.)}
+@end quotation
+@end ifclear
+@end macro
+
+@c Output various FIXME information only in PROOF rendition.
+
+@macro FIXME{string}
+@ifset PROOF
+@ifset PROOF_FOOTNOTED
+@footnote{@strong{FIXME:} \string\}
+@end ifset
+@ifclear PROOF_FOOTNOTED
+@cartouche
+@strong{<FIXME>} \string\ @strong{</>}
+@end cartouche
+@end ifclear
+@end ifset
+
+@end macro
+
+@macro FIXME-ref{string}
+@ifset PROOF
+@strong{<REF>} \string\ @strong{</>}
+@end ifset
+@end macro
+
+@macro FIXME-pxref{string}
+@ifset PROOF
+@strong{<PXREF>} \string\ @strong{</>}
+@end ifset
+
+@end macro
+
+@macro FIXME-xref{string}
+@ifset PROOF
+@strong{<XREF>} \string\ @strong{</>}
+@end ifset
+@end macro
+
+@c End of rendition.texi
diff --git a/doc/snapshot.texi b/doc/snapshot.texi
new file mode 100644
index 0000000..d5f35ab
--- /dev/null
+++ b/doc/snapshot.texi
@@ -0,0 +1,66 @@
+@c This is part of the paxutils manual.
+@c Copyright (C) 2005 Free Software Foundation, Inc.
+@c Written by Sergey Poznyakoff
+@c This file is distributed under GFDL 1.1 or any later version
+@c published by the Free Software Foundation.
+
+ A @dfn{snapshot file} (or @dfn{directory file}) is created during
+incremental backups (@pxref{Incremental Dumps}). It
+contains the status of the file system at the time of the dump and is
+used to determine which files were modified since the last backup.
+
+ @GNUTAR{} version @value{VERSION} supports two snapshot file
+formats. The first format, called @dfn{format 0}, is the one used by
+@GNUTAR{} versions up to 1.15.1. The second format, called @dfn{format
+1} is an extended version of this format, that contains more metadata
+and allows for further extensions.
+
+ @samp{Format 0} snapshot file begins with a line containing a
+decimal number that represents the UNIX timestamp of the beginning of
+the last archivation. This line is followed by directory metadata
+descriptions, one per line. Each description has the following format:
+
+@smallexample
+[@var{nfs}]@var{dev} @var{inode} @var{name}
+@end smallexample
+
+@noindent
+where optional @var{nfs} is a single plus character (@samp{+}) if this
+directory is located on an NFS-mounted partition, @var{dev} and
+@var{inode} are the device and inode numbers of the directory, and
+@var{name} is the directory name.
+
+ @samp{Format 1} snapshot file begins with a line specifying the
+format of the file. This line has the following structure:
+
+@smallexample
+@samp{GNU tar-}@var{tar-version}@samp{-}@var{incr-format-version}
+@end smallexample
+
+@noindent
+where @var{tar-version} is the version of @GNUTAR{} implementation
+that created this snapshot, and @var{incr-format-version} is the
+version number of the snapshot format (in this case @samp{1}).
+
+ The following line contains two decimal numbers, representing the
+time of the last backup. First number is the number of seconds, the
+second one is the number of nanoseconds, since the beginning of the
+epoch.
+
+ Following lines contain directory metadata, one line per
+directory. The line format is:
+
+@smallexample
+[@var{nfs}]@var{mtime-sec} @var{mtime-nsec} @var{dev} @var{inode} @var{name}
+@end smallexample
+
+@noindent
+where @var{mtime-sec} and @var{mtime-nsec} represent the last
+modification time of this directory with nanosecond precision;
+@var{nfs}, @var{dev}, @var{inode} and @var{name} have the same meaning
+as with @samp{format 0}.
+
+
+@c End of snapshot.texi
+
+
diff --git a/doc/sparse.texi b/doc/sparse.texi
new file mode 100644
index 0000000..e8a9ea1
--- /dev/null
+++ b/doc/sparse.texi
@@ -0,0 +1,235 @@
+@c This is part of the paxutils manual.
+@c Copyright (C) 2006 Free Software Foundation, Inc.
+@c This file is distributed under GFDL 1.1 or any later version
+@c published by the Free Software Foundation.
+
+@cindex sparse formats
+@cindex sparse versions
+The notion of sparse file, and the ways of handling it from the point
+of view of @GNUTAR{} user have been described in detail in
+@ref{sparse}. This chapter describes the internal format @GNUTAR{}
+uses to store such files.
+
+The support for sparse files in @GNUTAR{} has a long history. The
+earliest version featuring this support that I was able to find was 1.09,
+released in November, 1990. The format introduced back then is called
+@dfn{old GNU} sparse format and in spite of the fact that its design
+contained many flaws, it was the only format @GNUTAR{} supported
+until version 1.14 (May, 2004), which introduced initial support for
+sparse archives in @acronym{PAX} archives (@pxref{posix}). This
+format was not free from design flows, either and it was subsequently
+improved in versions 1.15.2 (November, 2005) and 1.15.92 (June,
+2006).
+
+In addition to GNU sparse format, @GNUTAR{} is able to read and
+extract sparse files archived by @command{star}.
+
+The following subsections describe each format in detail.
+
+@menu
+* Old GNU Format::
+* PAX 0:: PAX Format, Versions 0.0 and 0.1
+* PAX 1:: PAX Format, Version 1.0
+@end menu
+
+@node Old GNU Format
+@appendixsubsec Old GNU Format
+
+@cindex sparse formats, Old GNU
+@cindex Old GNU sparse format
+The format introduced some time around 1990 (v. 1.09). It was
+designed on top of standard @code{ustar} headers in such an
+unfortunate way that some of its fields overwrote fields required by
+POSIX.
+
+An old GNU sparse header is designated by type @samp{S}
+(@code{GNUTYPE_SPARSE}) and has the following layout:
+
+@multitable @columnfractions 0.10 0.10 0.20 0.20 0.40
+@headitem Offset @tab Size @tab Name @tab Data type @tab Contents
+@item 0 @tab 345 @tab @tab N/A @tab Not used.
+@item 345 @tab 12 @tab atime @tab Number @tab @code{atime} of the file.
+@item 357 @tab 12 @tab ctime @tab Number @tab @code{ctime} of the file .
+@item 369 @tab 12 @tab offset @tab Number @tab For
+multivolume archives: the offset of the start of this volume.
+@item 381 @tab 4 @tab @tab N/A @tab Not used.
+@item 385 @tab 1 @tab @tab N/A @tab Not used.
+@item 386 @tab 96 @tab sp @tab @code{sparse_header} @tab (4 entries) File map.
+@item 482 @tab 1 @tab isextended @tab Bool @tab @code{1} if an
+extension sparse header follows, @code{0} otherwise.
+@item 483 @tab 12 @tab realsize @tab Number @tab Real size of the file.
+@end multitable
+
+Each of @code{sparse_header} object at offset 386 describes a single
+data chunk. It has the following structure:
+
+@multitable @columnfractions 0.10 0.10 0.20 0.60
+@headitem Offset @tab Size @tab Data type @tab Contents
+@item 0 @tab 12 @tab Number @tab Offset of the
+beginning of the chunk.
+@item 12 @tab 12 @tab Number @tab Size of the chunk.
+@end multitable
+
+If the member contains more than four chunks, the @code{isextended}
+field of the header has the value @code{1} and the main header is
+followed by one or more @dfn{extension headers}. Each such header has
+the following structure:
+
+@multitable @columnfractions 0.10 0.10 0.20 0.20 0.40
+@headitem Offset @tab Size @tab Name @tab Data type @tab Contents
+@item 0 @tab 21 @tab sp @tab @code{sparse_header} @tab
+(21 entires) File map.
+@item 504 @tab 1 @tab isextended @tab Bool @tab @code{1} if an
+extension sparse header follows, or @code{0} otherwise.
+@end multitable
+
+A header with @code{isextended=0} ends the map.
+
+@node PAX 0
+@appendixsubsec PAX Format, Versions 0.0 and 0.1
+
+@cindex sparse formats, v.0.0
+There are two formats available in this branch. The version @code{0.0}
+is the initial version of sparse format used by @command{tar}
+versions 1.14--1.15.1. The sparse file map is kept in extended
+(@code{x}) PAX header variables:
+
+@table @code
+@vrindex GNU.sparse.size, extended header variable
+@item GNU.sparse.size
+Real size of the stored file
+
+@item GNU.sparse.numblocks
+@vrindex GNU.sparse.numblocks, extended header variable
+Number of blocks in the sparse map
+
+@item GNU.sparse.offset
+@vrindex GNU.sparse.offset, extended header variable
+Offset of the data block
+
+@item GNU.sparse.numbytes
+@vrindex GNU.sparse.numbytes, extended header variable
+Size of the data block
+@end table
+
+The latter two variables repeat for each data block, so the overall
+structure is like this:
+
+@smallexample
+@group
+GNU.sparse.size=@var{size}
+GNU.sparse.numblocks=@var{numblocks}
+repeat @var{numblocks} times
+ GNU.sparse.offset=@var{offset}
+ GNU.sparse.numbytes=@var{numbytes}
+end repeat
+@end group
+@end smallexample
+
+This format presented the following two problems:
+
+@enumerate 1
+@item
+Whereas the POSIX specification allows a variable to appear multiple
+times in a header, it requires that only the last occurrence be
+meaningful. Thus, multiple occurrences of @code{GNU.sparse.offset} and
+@code{GNU.sparse.numbytes} are conflicting with the POSIX specs.
+
+@item
+Attempting to extract such archives using a third-party @command{tar}s
+results in extraction of sparse files in @emph{compressed form}. If
+the @command{tar} implementation in question does not support POSIX
+format, it will also extract a file containing extension header
+attributes. This file can be used to expand the file to its original
+state. However, posix-aware @command{tar}s will usually ignore the
+unknown variables, which makes restoring the file more
+difficult. @xref{extracting sparse v.0.x, Extraction of sparse
+members in v.0.0 format}, for the detailed description of how to
+restore such members using non-GNU @command{tar}s.
+@end enumerate
+
+@cindex sparse formats, v.0.1
+@GNUTAR{} 1.15.2 introduced sparse format version @code{0.1}, which
+attempted to solve these problems. As its predecessor, this format
+stores sparse map in the extended POSIX header. It retains
+@code{GNU.sparse.size} and @code{GNU.sparse.numblocks} variables, but
+instead of @code{GNU.sparse.offset}/@code{GNU.sparse.numbytes} pairs
+it uses a single variable:
+
+@table @code
+@item GNU.sparse.map
+@vrindex GNU.sparse.map, extended header variable
+Map of non-null data chunks. It is a string consisting of
+comma-separated values "@var{offset},@var{size}[,@var{offset-1},@var{size-1}...]"
+@end table
+
+To address the 2nd problem, the @code{name} field in @code{ustar}
+is replaced with a special name, constructed using the following pattern:
+
+@smallexample
+%d/GNUSparseFile.%p/%f
+@end smallexample
+
+@vrindex GNU.sparse.name, extended header variable
+The real name of the sparse file is stored in the variable
+@code{GNU.sparse.name}. Thus, those @command{tar} implementations
+that are not aware of GNU extensions will at least extract the files
+into separate directories, giving the user a possibility to expand it
+afterwards. @xref{extracting sparse v.0.x, Extraction of sparse
+members in v.0.1 format}, for the detailed description of how to
+restore such members using non-GNU @command{tar}s.
+
+The resulting @code{GNU.sparse.map} string can be @emph{very} long.
+Although POSIX does not impose any limit on the length of a @code{x}
+header variable, this possibly can confuse some tars.
+
+@node PAX 1
+@appendixsubsec PAX Format, Version 1.0
+
+@cindex sparse formats, v.1.0
+The version @code{1.0} of sparse format was introduced with @GNUTAR{}
+1.15.92. Its main objective was to make the resulting file
+extractable with little effort even by non-posix aware @command{tar}
+implementations. Starting from this version, the extended header
+preceding a sparse member always contains the following variables that
+identify the format being used:
+
+@table @code
+@item GNU.sparse.major
+@vrindex GNU.sparse.major, extended header variable
+Major version
+
+@item GNU.sparse.minor
+@vrindex GNU.sparse.minor, extended header variable
+Minor version
+@end table
+
+The @code{name} field in @code{ustar} header contains a special name,
+constructed using the following pattern:
+
+@smallexample
+%d/GNUSparseFile.%p/%f
+@end smallexample
+
+@vrindex GNU.sparse.name, extended header variable, in v.1.0
+@vrindex GNU.sparse.realsize, extended header variable
+The real name of the sparse file is stored in the variable
+@code{GNU.sparse.name}. The real size of the file is stored in the
+variable @code{GNU.sparse.realsize}.
+
+The sparse map itself is stored in the file data block, preceding the actual
+file data. It consists of a series of octal numbers of arbitrary length, delimited
+by newlines. The map is padded with nulls to the nearest block boundary.
+
+The first number gives the number of entries in the map. Following are map entries,
+each one consisting of two numbers giving the offset and size of the
+data block it describes.
+
+The format is designed in such a way that non-posix aware tars and tars not
+supporting @code{GNU.sparse.*} keywords will extract each sparse file
+in its condensed form with the file map prepended and will place it
+into a separate directory. Then, using a simple program it would be
+possible to expand the file to its original form even without @GNUTAR{}.
+@xref{Sparse Recovery}, for the detailed information on how to extract
+sparse members without @GNUTAR{}.
+
diff --git a/doc/stamp-vti b/doc/stamp-vti
new file mode 100644
index 0000000..ebaa8b2
--- /dev/null
+++ b/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 8 June 2007
+@set UPDATED-MONTH June 2007
+@set EDITION 1.17
+@set VERSION 1.17
diff --git a/doc/tar.info b/doc/tar.info
new file mode 100644
index 0000000..6ab7504
--- /dev/null
+++ b/doc/tar.info
@@ -0,0 +1,387 @@
+This is tar.info, produced by makeinfo version 4.8 from tar.texi.
+
+ This manual is for GNU `tar' (version 1.17, 8 June 2007), which
+creates and extracts files from archives.
+
+ Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003,
+2004, 2005, 2006, 2007 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.1 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, with the Front-Cover Texts
+ being "A GNU Manual," and with the Back-Cover Texts as in (a)
+ below. A copy of the license is included in the section entitled
+ "GNU Free Documentation License".
+
+ (a) The FSF's Back-Cover Text is: "You are free to copy and modify
+ this GNU Manual. Buying copies from GNU Press supports the FSF in
+ developing GNU and promoting software freedom."
+
+INFO-DIR-SECTION Archiving
+START-INFO-DIR-ENTRY
+* Tar: (tar). Making tape (or disk) archives.
+END-INFO-DIR-ENTRY
+
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* tar: (tar)tar invocation. Invoking GNU `tar'.
+END-INFO-DIR-ENTRY
+
+
+Indirect:
+tar.info-1: 1234
+tar.info-2: 301079
+
+Tag Table:
+(Indirect)
+Node: Top1234
+Node: Introduction10405
+Node: Book Contents11192
+Node: Definitions13364
+Node: What tar Does15167
+Node: Naming tar Archives17933
+Node: Authors18653
+Node: Reports20466
+Node: Tutorial20826
+Node: assumptions21639
+Node: stylistic conventions24114
+Node: basic tar options24557
+Node: frequent operations28195
+Node: Two Frequent Options28847
+Node: file tutorial29478
+Node: verbose tutorial30839
+Ref: verbose member listing33053
+Node: help tutorial35806
+Node: create36160
+Node: prepare for examples37661
+Node: Creating the archive39429
+Node: create verbose42261
+Node: short create43082
+Node: create dir45835
+Node: list48542
+Ref: listing member and file names49816
+Node: list dir52097
+Node: extract53086
+Node: extracting archives54263
+Node: extracting files54753
+Ref: extracting files-Footnote-157400
+Node: extract dir57780
+Node: extracting untrusted archives60163
+Node: failing commands61042
+Node: going further62142
+Node: tar invocation62292
+Node: Synopsis63788
+Node: using tar options68757
+Ref: TAR_OPTIONS70342
+Node: Styles71359
+Node: Long Options73071
+Node: Short Options75243
+Ref: Short Options-Footnote-177051
+Node: Old Options77268
+Ref: Old Options-Footnote-180218
+Node: Mixing80388
+Ref: Mixing-Footnote-182754
+Node: All Options82874
+Node: Operation Summary83479
+Ref: --append83599
+Ref: --catenate83679
+Ref: --compare83750
+Ref: --concatenate83953
+Ref: --create84063
+Ref: --delete84131
+Ref: --diff84244
+Ref: --extract84300
+Ref: --get84402
+Ref: --list84460
+Ref: --update84528
+Node: Option Summary84738
+Ref: --absolute-names84893
+Ref: --after-date85071
+Ref: --anchored85123
+Ref: --atime-preserve85256
+Ref: --backup87771
+Ref: --block-number87962
+Ref: --blocking-factor88136
+Ref: --bzip288288
+Ref: --checkpoint88395
+Ref: --check-links88730
+Ref: --compress88981
+Ref: --uncompress88981
+Ref: --confirmation89185
+Ref: --delay-directory-restore89253
+Ref: --dereference89454
+Ref: --directory89639
+Ref: --exclude89892
+Ref: --exclude-from90011
+Ref: --exclude-caches90157
+Ref: --exclude-caches-under90351
+Ref: --exclude-caches-all90529
+Ref: --exclude-tag90658
+Ref: --exclude-tag-under90813
+Ref: --exclude-tag-all90981
+Ref: --file91095
+Ref: --files-from91295
+Ref: --force-local91498
+Ref: --format91689
+Ref: --group92359
+Ref: --gzip92707
+Ref: --gunzip92707
+Ref: --ungzip92707
+Ref: --help92930
+Ref: --ignore-case93064
+Ref: --ignore-command-error93191
+Ref: --ignore-failed-read93302
+Ref: --ignore-zeros93432
+Ref: --incremental93577
+Ref: --index-file93842
+Ref: --info-script93927
+Ref: --new-volume-script93927
+Ref: --interactive94248
+Ref: --keep-newer-files94460
+Ref: --keep-old-files94602
+Ref: --label94733
+Ref: --listed-incremental95021
+Ref: --mode95385
+Ref: --mtime95676
+Ref: --multi-volume96117
+Ref: --newer96318
+Ref: --newer-mtime96596
+Ref: --no-anchored96820
+Ref: --no-delay-directory-restore96957
+Ref: --no-ignore-case97210
+Ref: --no-ignore-command-error97303
+Ref: --no-overwrite-dir97458
+Ref: --no-quote-chars97601
+Ref: --no-recursion97782
+Ref: --no-same-owner97887
+Ref: --no-same-permissions98070
+Ref: --no-unquote98272
+Ref: --no-wildcards98410
+Ref: --no-wildcards-match-slash98494
+Ref: --null98596
+Ref: --numeric-owner98824
+Ref: --occurrence99475
+Ref: --old-archive100042
+Ref: --one-file-system100091
+Ref: --overwrite100273
+Ref: --overwrite-dir100415
+Ref: --owner100560
+Ref: --pax-option100939
+Ref: --portability101238
+Ref: --posix101303
+Ref: --preserve101345
+Ref: --preserve-order101483
+Ref: --preserve-permissions101547
+Ref: --same-permissions101547
+Ref: --quote-chars101961
+Ref: --quoting-style102114
+Ref: --read-full-records102435
+Ref: --record-size102600
+Ref: --recursion102731
+Ref: --recursive-unlink102834
+Ref: --remove-files103001
+Ref: --restrict103147
+Ref: --rmt-command103335
+Ref: --rsh-command103476
+Ref: --same-order103598
+Ref: --same-owner103890
+Ref: --seek104267
+Ref: --show-defaults104524
+Ref: --show-omitted-dirs104892
+Ref: --show-transformed-names105046
+Ref: --show-stored-names105046
+Ref: --sparse105435
+Ref: --sparse-version105574
+Ref: --starting-file105798
+Ref: --strip-components105987
+Ref: --suffix106299
+Ref: --tape-length106434
+Ref: --test-label106589
+Ref: --to-command106741
+Ref: --to-stdout106900
+Ref: --totals107053
+Ref: --touch107284
+Ref: --transform107486
+Ref: --unlink-first108078
+Ref: --unquote108246
+Ref: --use-compress-program108353
+Ref: --utc108521
+Ref: --verbose108614
+Ref: --verify108866
+Ref: --version108984
+Ref: --volno-file109156
+Ref: --wildcards109343
+Ref: --wildcards-match-slash109463
+Ref: Option Summary-Footnote-1109591
+Ref: Option Summary-Footnote-2109809
+Node: Short Option Summary109978
+Node: help112149
+Ref: help-Footnote-1115979
+Node: defaults116189
+Node: verbose117206
+Ref: totals119507
+Ref: Progress information121097
+Ref: show-omitted-dirs121883
+Ref: block-number122302
+Node: interactive123293
+Node: operations125372
+Node: Basic tar125631
+Ref: Basic tar-Footnote-1128735
+Node: Advanced tar128879
+Node: Operations129724
+Node: append131694
+Ref: append-Footnote-1134859
+Node: appending files135025
+Node: multiple136806
+Node: update139496
+Node: how to update140535
+Node: concatenate142318
+Ref: concatenate-Footnote-1145567
+Node: delete145705
+Node: compare147548
+Node: create options149038
+Node: override149496
+Node: Ignore Failed Read152934
+Node: extract options153154
+Node: Reading154050
+Node: read full records155613
+Node: Ignore Zeros155949
+Node: Writing156940
+Node: Dealing with Old Files157497
+Node: Overwrite Old Files159924
+Node: Keep Old Files161381
+Node: Keep Newer Files161891
+Node: Unlink First162181
+Node: Recursive Unlink162585
+Node: Data Modification Times163138
+Node: Setting Access Permissions163948
+Node: Directory Modification Times and Permissions164580
+Node: Writing to Standard Output168186
+Node: Writing to an External Program169721
+Node: remove files172434
+Node: Scarce172627
+Node: Starting File172875
+Node: Same Order173695
+Node: backup174531
+Node: Applications177755
+Node: looking ahead179268
+Node: Backups180094
+Node: Full Dumps181926
+Node: Incremental Dumps183732
+Ref: incremental-op190036
+Ref: Incremental Dumps-Footnote-1190410
+Ref: Incremental Dumps-Footnote-2190560
+Node: Backup Levels191047
+Node: Backup Parameters193434
+Node: General-Purpose Variables194615
+Ref: RSH197772
+Node: Magnetic Tape Control199651
+Node: User Hooks200988
+Node: backup-specs example202316
+Node: Scripted Backups203459
+Ref: Scripted Backups-Footnote-1206321
+Node: Scripted Restoration206705
+Node: Choosing209313
+Node: file210498
+Ref: remote-dev213197
+Ref: local and remote archives213589
+Node: Selecting Archive Members214619
+Ref: input name quoting215300
+Node: files217286
+Ref: files-Footnote-1220560
+Node: nul220718
+Node: exclude222015
+Node: problems with exclude226040
+Node: wildcards228085
+Node: controlling pattern-matching230669
+Ref: controlling pattern-matching-Footnote-1234659
+Node: quoting styles234875
+Node: transform241347
+Ref: show-transformed-names243337
+Node: after246801
+Node: recurse250466
+Node: one253235
+Node: directory254731
+Node: absolute257804
+Ref: absolute-Footnote-1260994
+Node: Date input formats261345
+Node: General date syntax263661
+Node: Calendar date items266612
+Node: Time of day items268609
+Node: Time zone items270725
+Node: Day of week items271959
+Node: Relative items in date strings272948
+Node: Pure numbers in date strings275750
+Node: Seconds since the Epoch276731
+Node: Specifying time zone rules278352
+Node: Authors of get_date280716
+Node: Formats281468
+Node: Compression286156
+Node: gzip286448
+Node: sparse292054
+Node: Attributes295108
+Node: Portability301079
+Node: Portable Names302522
+Node: dereference303227
+Node: old304621
+Node: ustar305806
+Node: gnu306397
+Node: posix307274
+Node: PAX keywords307755
+Node: Checksumming312083
+Node: Large or Negative Values314007
+Node: Other Tars315607
+Node: Split Recovery316741
+Node: Sparse Recovery320471
+Ref: extracting sparse v.0.x324102
+Ref: Sparse Recovery-Footnote-1327391
+Ref: Sparse Recovery-Footnote-2327414
+Node: cpio327535
+Node: Media332291
+Node: Device334221
+Node: Remote Tape Server339289
+Node: Common Problems and Solutions343019
+Node: Blocking343411
+Node: Format Variations349918
+Node: Blocking Factor350830
+Node: Many362484
+Node: Tape Positioning366278
+Node: mt368151
+Node: Using Multiple Tapes369706
+Node: Multi-Volume Archives371772
+Ref: tape-length373257
+Ref: change volume prompt373561
+Ref: volno-file374431
+Ref: info-script374983
+Ref: Multi-Volume Archives-Footnote-1380088
+Ref: Multi-Volume Archives-Footnote-2380198
+Node: Tape Files380265
+Node: Tarcat381749
+Node: label382794
+Ref: --test-label option384423
+Ref: label-Footnote-1387468
+Node: verify387703
+Node: Write Protection391003
+Node: Changes391833
+Node: Configuring Help Summary395418
+Node: Tar Internals401913
+Node: Standard402248
+Node: Extensions424449
+Node: Sparse Formats427009
+Node: Old GNU Format428299
+Node: PAX 0430710
+Node: PAX 1433837
+Node: Snapshot Files435571
+Node: Dumpdir437681
+Node: Genfile440903
+Node: Generate Mode441996
+Node: Status Mode446293
+Node: Exec Mode448092
+Node: Free Software Needs Free Documentation450328
+Node: Copying This Manual455299
+Node: GNU Free Documentation License455581
+Node: Index of Command Line Options477988
+Node: Index500552
+
+End Tag Table
diff --git a/doc/tar.info-1 b/doc/tar.info-1
new file mode 100644
index 0000000..362a137
--- /dev/null
+++ b/doc/tar.info-1
@@ -0,0 +1,7594 @@
+This is tar.info, produced by makeinfo version 4.8 from tar.texi.
+
+ This manual is for GNU `tar' (version 1.17, 8 June 2007), which
+creates and extracts files from archives.
+
+ Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003,
+2004, 2005, 2006, 2007 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.1 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, with the Front-Cover Texts
+ being "A GNU Manual," and with the Back-Cover Texts as in (a)
+ below. A copy of the license is included in the section entitled
+ "GNU Free Documentation License".
+
+ (a) The FSF's Back-Cover Text is: "You are free to copy and modify
+ this GNU Manual. Buying copies from GNU Press supports the FSF in
+ developing GNU and promoting software freedom."
+
+INFO-DIR-SECTION Archiving
+START-INFO-DIR-ENTRY
+* Tar: (tar). Making tape (or disk) archives.
+END-INFO-DIR-ENTRY
+
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* tar: (tar)tar invocation. Invoking GNU `tar'.
+END-INFO-DIR-ENTRY
+
+
+File: tar.info, Node: Top, Next: Introduction, Up: (dir)
+
+GNU tar: an archiver tool
+*************************
+
+This manual is for GNU `tar' (version 1.17, 8 June 2007), which creates
+and extracts files from archives.
+
+ Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003,
+2004, 2005, 2006, 2007 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.1 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, with the Front-Cover Texts
+ being "A GNU Manual," and with the Back-Cover Texts as in (a)
+ below. A copy of the license is included in the section entitled
+ "GNU Free Documentation License".
+
+ (a) The FSF's Back-Cover Text is: "You are free to copy and modify
+ this GNU Manual. Buying copies from GNU Press supports the FSF in
+ developing GNU and promoting software freedom."
+
+ The first part of this master menu lists the major nodes in this Info
+document. The rest of the menu lists all the lower level nodes.
+
+* Menu:
+
+* Introduction::
+* Tutorial::
+* tar invocation::
+* operations::
+* Backups::
+* Choosing::
+* Date input formats::
+* Formats::
+* Media::
+
+Appendices
+
+* Changes::
+* Configuring Help Summary::
+* Tar Internals::
+* Genfile::
+* Free Software Needs Free Documentation::
+* Copying This Manual::
+* Index of Command Line Options::
+* Index::
+
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Book Contents:: What this Book Contains
+* Definitions:: Some Definitions
+* What tar Does:: What `tar' Does
+* Naming tar Archives:: How `tar' Archives are Named
+* Authors:: GNU `tar' Authors
+* Reports:: Reporting bugs or suggestions
+
+Tutorial Introduction to `tar'
+
+* assumptions::
+* stylistic conventions::
+* basic tar options:: Basic `tar' Operations and Options
+* frequent operations::
+* Two Frequent Options::
+* create:: How to Create Archives
+* list:: How to List Archives
+* extract:: How to Extract Members from an Archive
+* going further::
+
+Two Frequently Used Options
+
+* file tutorial::
+* verbose tutorial::
+* help tutorial::
+
+How to Create Archives
+
+* prepare for examples::
+* Creating the archive::
+* create verbose::
+* short create::
+* create dir::
+
+How to List Archives
+
+* list dir::
+
+How to Extract Members from an Archive
+
+* extracting archives::
+* extracting files::
+* extract dir::
+* extracting untrusted archives::
+* failing commands::
+
+Invoking GNU `tar'
+
+* Synopsis::
+* using tar options::
+* Styles::
+* All Options::
+* help::
+* defaults::
+* verbose::
+* interactive::
+
+The Three Option Styles
+
+* Long Options:: Long Option Style
+* Short Options:: Short Option Style
+* Old Options:: Old Option Style
+* Mixing:: Mixing Option Styles
+
+All `tar' Options
+
+* Operation Summary::
+* Option Summary::
+* Short Option Summary::
+
+GNU `tar' Operations
+
+* Basic tar::
+* Advanced tar::
+* create options::
+* extract options::
+* backup::
+* Applications::
+* looking ahead::
+
+Advanced GNU `tar' Operations
+
+* Operations::
+* append::
+* update::
+* concatenate::
+* delete::
+* compare::
+
+How to Add Files to Existing Archives: `--append'
+
+* appending files:: Appending Files to an Archive
+* multiple::
+
+Updating an Archive
+
+* how to update::
+
+Options Used by `--create'
+
+* override:: Overriding File Metadata.
+* Ignore Failed Read::
+
+Options Used by `--extract'
+
+* Reading:: Options to Help Read Archives
+* Writing:: Changing How `tar' Writes Files
+* Scarce:: Coping with Scarce Resources
+
+Options to Help Read Archives
+
+* read full records::
+* Ignore Zeros::
+
+Changing How `tar' Writes Files
+
+* Dealing with Old Files::
+* Overwrite Old Files::
+* Keep Old Files::
+* Keep Newer Files::
+* Unlink First::
+* Recursive Unlink::
+* Data Modification Times::
+* Setting Access Permissions::
+* Directory Modification Times and Permissions::
+* Writing to Standard Output::
+* Writing to an External Program::
+* remove files::
+
+Coping with Scarce Resources
+
+* Starting File::
+* Same Order::
+
+Performing Backups and Restoring Files
+
+* Full Dumps:: Using `tar' to Perform Full Dumps
+* Incremental Dumps:: Using `tar' to Perform Incremental Dumps
+* Backup Levels:: Levels of Backups
+* Backup Parameters:: Setting Parameters for Backups and Restoration
+* Scripted Backups:: Using the Backup Scripts
+* Scripted Restoration:: Using the Restore Script
+
+Setting Parameters for Backups and Restoration
+
+* General-Purpose Variables::
+* Magnetic Tape Control::
+* User Hooks::
+* backup-specs example:: An Example Text of `Backup-specs'
+
+Choosing Files and Names for `tar'
+
+* file:: Choosing the Archive's Name
+* Selecting Archive Members::
+* files:: Reading Names from a File
+* exclude:: Excluding Some Files
+* wildcards:: Wildcards Patterns and Matching
+* quoting styles:: Ways of Quoting Special Characters in Names
+* transform:: Modifying File and Member Names
+* after:: Operating Only on New Files
+* recurse:: Descending into Directories
+* one:: Crossing File System Boundaries
+
+Reading Names from a File
+
+* nul::
+
+Excluding Some Files
+
+* problems with exclude::
+
+Wildcards Patterns and Matching
+
+* controlling pattern-matching::
+
+Crossing File System Boundaries
+
+* directory:: Changing Directory
+* absolute:: Absolute File Names
+
+Date input formats
+
+* General date syntax:: Common rules.
+* Calendar date items:: 19 Dec 1994.
+* Time of day items:: 9:20pm.
+* Time zone items:: EST, PDT, GMT.
+* Day of week items:: Monday and others.
+* Relative items in date strings:: next tuesday, 2 years ago.
+* Pure numbers in date strings:: 19931219, 1440.
+* Seconds since the Epoch:: @1078100502.
+* Specifying time zone rules:: TZ="America/New_York", TZ="UTC0".
+* Authors of get_date:: Bellovin, Eggert, Salz, Berets, et al.
+
+Controlling the Archive Format
+
+* Portability:: Making `tar' Archives More Portable
+* Compression:: Using Less Space through Compression
+* Attributes:: Handling File Attributes
+* cpio:: Comparison of `tar' and `cpio'
+
+Making `tar' Archives More Portable
+
+* Portable Names:: Portable Names
+* dereference:: Symbolic Links
+* old:: Old V7 Archives
+* ustar:: Ustar Archives
+* gnu:: GNU and old GNU format archives.
+* posix:: POSIX archives
+* Checksumming:: Checksumming Problems
+* Large or Negative Values:: Large files, negative time stamps, etc.
+* Other Tars:: How to Extract GNU-Specific Data Using
+ Other `tar' Implementations
+
+GNU `tar' and POSIX `tar'
+
+* PAX keywords:: Controlling Extended Header Keywords.
+
+How to Extract GNU-Specific Data Using Other `tar' Implementations
+
+* Split Recovery:: Members Split Between Volumes
+* Sparse Recovery:: Sparse Members
+
+Using Less Space through Compression
+
+* gzip:: Creating and Reading Compressed Archives
+* sparse:: Archiving Sparse Files
+
+Tapes and Other Archive Media
+
+* Device:: Device selection and switching
+* Remote Tape Server::
+* Common Problems and Solutions::
+* Blocking:: Blocking
+* Many:: Many archives on one tape
+* Using Multiple Tapes:: Using Multiple Tapes
+* label:: Including a Label in the Archive
+* verify::
+* Write Protection::
+
+Blocking
+
+* Format Variations:: Format Variations
+* Blocking Factor:: The Blocking Factor of an Archive
+
+Many Archives on One Tape
+
+* Tape Positioning:: Tape Positions and Tape Marks
+* mt:: The `mt' Utility
+
+Using Multiple Tapes
+
+* Multi-Volume Archives:: Archives Longer than One Tape or Disk
+* Tape Files:: Tape Files
+* Tarcat:: Concatenate Volumes into a Single Archive
+
+
+Tar Internals
+
+* Standard:: Basic Tar Format
+* Extensions:: GNU Extensions to the Archive Format
+* Sparse Formats:: Storing Sparse Files
+* Snapshot Files::
+* Dumpdir::
+
+Storing Sparse Files
+
+* Old GNU Format::
+* PAX 0:: PAX Format, Versions 0.0 and 0.1
+* PAX 1:: PAX Format, Version 1.0
+
+Genfile
+
+* Generate Mode:: File Generation Mode.
+* Status Mode:: File Status Mode.
+* Exec Mode:: Synchronous Execution mode.
+
+Copying This Manual
+
+* GNU Free Documentation License:: License for copying this manual
+
+
+File: tar.info, Node: Introduction, Next: Tutorial, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+GNU `tar' creates and manipulates "archives" which are actually
+collections of many other files; the program provides users with an
+organized and systematic method for controlling a large amount of data.
+The name "tar" originally came from the phrase "Tape ARchive", but
+archives need not (and these days, typically do not) reside on tapes.
+
+* Menu:
+
+* Book Contents:: What this Book Contains
+* Definitions:: Some Definitions
+* What tar Does:: What `tar' Does
+* Naming tar Archives:: How `tar' Archives are Named
+* Authors:: GNU `tar' Authors
+* Reports:: Reporting bugs or suggestions
+
+
+File: tar.info, Node: Book Contents, Next: Definitions, Up: Introduction
+
+1.1 What this Book Contains
+===========================
+
+The first part of this chapter introduces you to various terms that will
+recur throughout the book. It also tells you who has worked on GNU
+`tar' and its documentation, and where you should send bug reports or
+comments.
+
+ The second chapter is a tutorial (*note Tutorial::) which provides a
+gentle introduction for people who are new to using `tar'. It is meant
+to be self contained, not requiring any reading from subsequent
+chapters to make sense. It moves from topic to topic in a logical,
+progressive order, building on information already explained.
+
+ Although the tutorial is paced and structured to allow beginners to
+learn how to use `tar', it is not intended solely for beginners. The
+tutorial explains how to use the three most frequently used operations
+(`create', `list', and `extract') as well as two frequently used
+options (`file' and `verbose'). The other chapters do not refer to the
+tutorial frequently; however, if a section discusses something which is
+a complex variant of a basic concept, there may be a cross reference to
+that basic concept. (The entire book, including the tutorial, assumes
+that the reader understands some basic concepts of using a Unix-type
+operating system; *note Tutorial::.)
+
+ The third chapter presents the remaining five operations, and
+information about using `tar' options and option syntax.
+
+ The other chapters are meant to be used as a reference. Each
+chapter presents everything that needs to be said about a specific
+topic.
+
+ One of the chapters (*note Date input formats::) exists in its
+entirety in other GNU manuals, and is mostly self-contained. In
+addition, one section of this manual (*note Standard::) contains a big
+quote which is taken directly from `tar' sources.
+
+ In general, we give both long and short (abbreviated) option names
+at least once in each section where the relevant option is covered, so
+that novice readers will become familiar with both styles. (A few
+options have no short versions, and the relevant sections will indicate
+this.)
+
+
+File: tar.info, Node: Definitions, Next: What tar Does, Prev: Book Contents, Up: Introduction
+
+1.2 Some Definitions
+====================
+
+The `tar' program is used to create and manipulate `tar' archives. An
+"archive" is a single file which contains the contents of many files,
+while still identifying the names of the files, their owner(s), and so
+forth. (In addition, archives record access permissions, user and
+group, size in bytes, and data modification time. Some archives also
+record the file names in each archived directory, as well as other file
+and directory information.) You can use `tar' to "create" a new
+archive in a specified directory.
+
+ The files inside an archive are called "members". Within this
+manual, we use the term "file" to refer only to files accessible in the
+normal ways (by `ls', `cat', and so forth), and the term "member" to
+refer only to the members of an archive. Similarly, a "file name" is
+the name of a file, as it resides in the file system, and a "member
+name" is the name of an archive member within the archive.
+
+ The term "extraction" refers to the process of copying an archive
+member (or multiple members) into a file in the file system. Extracting
+all the members of an archive is often called "extracting the archive".
+The term "unpack" can also be used to refer to the extraction of many
+or all the members of an archive. Extracting an archive does not
+destroy the archive's structure, just as creating an archive does not
+destroy the copies of the files that exist outside of the archive. You
+may also "list" the members in a given archive (this is often thought
+of as "printing" them to the standard output, or the command line), or
+"append" members to a pre-existing archive. All of these operations
+can be performed using `tar'.
+
+
+File: tar.info, Node: What tar Does, Next: Naming tar Archives, Prev: Definitions, Up: Introduction
+
+1.3 What `tar' Does
+===================
+
+The `tar' program provides the ability to create `tar' archives, as
+well as various other kinds of manipulation. For example, you can use
+`tar' on previously created archives to extract files, to store
+additional files, or to update or list files which were already stored.
+
+ Initially, `tar' archives were used to store files conveniently on
+magnetic tape. The name `tar' comes from this use; it stands for
+`t'ape `ar'chiver. Despite the utility's name, `tar' can direct its
+output to available devices, files, or other programs (using pipes).
+`tar' may even access remote devices or files (as archives).
+
+ You can use `tar' archives in many ways. We want to stress a few of
+them: storage, backup, and transportation.
+
+Storage
+ Often, `tar' archives are used to store related files for
+ convenient file transfer over a network. For example, the GNU
+ Project distributes its software bundled into `tar' archives, so
+ that all the files relating to a particular program (or set of
+ related programs) can be transferred as a single unit.
+
+ A magnetic tape can store several files in sequence. However, the
+ tape has no names for these files; it only knows their relative
+ position on the tape. One way to store several files on one tape
+ and retain their names is by creating a `tar' archive. Even when
+ the basic transfer mechanism can keep track of names, as FTP can,
+ the nuisance of handling multiple files, directories, and multiple
+ links makes `tar' archives useful.
+
+ Archive files are also used for long-term storage. You can think
+ of this as transportation from the present into the future. (It
+ is a science-fiction idiom that you can move through time as well
+ as in space; the idea here is that `tar' can be used to move
+ archives in all dimensions, even time!)
+
+Backup
+ Because the archive created by `tar' is capable of preserving file
+ information and directory structure, `tar' is commonly used for
+ performing full and incremental backups of disks. A backup puts a
+ collection of files (possibly pertaining to many users and
+ projects) together on a disk or a tape. This guards against
+ accidental destruction of the information in those files. GNU
+ `tar' has special features that allow it to be used to make
+ incremental and full dumps of all the files in a file system.
+
+Transportation
+ You can create an archive on one system, transfer it to another
+ system, and extract the contents there. This allows you to
+ transport a group of files from one system to another.
+
+
+File: tar.info, Node: Naming tar Archives, Next: Authors, Prev: What tar Does, Up: Introduction
+
+1.4 How `tar' Archives are Named
+================================
+
+Conventionally, `tar' archives are given names ending with `.tar'.
+This is not necessary for `tar' to operate properly, but this manual
+follows that convention in order to accustom readers to it and to make
+examples more clear.
+
+ Often, people refer to `tar' archives as "`tar' files," and archive
+members as "files" or "entries". For people familiar with the
+operation of `tar', this causes no difficulty. However, in this
+manual, we consistently refer to "archives" and "archive members" to
+make learning to use `tar' easier for novice users.
+
+
+File: tar.info, Node: Authors, Next: Reports, Prev: Naming tar Archives, Up: Introduction
+
+1.5 GNU `tar' Authors
+=====================
+
+GNU `tar' was originally written by John Gilmore, and modified by many
+people. The GNU enhancements were written by Jay Fenlason, then Joy
+Kendall, and the whole package has been further maintained by Thomas
+Bushnell, n/BSG, Franc,ois Pinard, Paul Eggert, and finally Sergey
+Poznyakoff with the help of numerous and kind users.
+
+ We wish to stress that `tar' is a collective work, and owes much to
+all those people who reported problems, offered solutions and other
+insights, or shared their thoughts and suggestions. An impressive, yet
+partial list of those contributors can be found in the `THANKS' file
+from the GNU `tar' distribution.
+
+ Jay Fenlason put together a draft of a GNU `tar' manual, borrowing
+notes from the original man page from John Gilmore. This was withdrawn
+in version 1.11. Thomas Bushnell, n/BSG and Amy Gorin worked on a
+tutorial and manual for GNU `tar'. Franc,ois Pinard put version 1.11.8
+of the manual together by taking information from all these sources and
+merging them. Melissa Weisshaus finally edited and redesigned the book
+to create version 1.12. The book for versions from 1.14 up to 1.17
+were edited by the current maintainer, Sergey Poznyakoff.
+
+ For version 1.12, Daniel Hagerty contributed a great deal of
+technical consulting. In particular, he is the primary author of *note
+Backups::.
+
+ In July, 2003 GNU `tar' was put on CVS at savannah.gnu.org (see
+`http://savannah.gnu.org/projects/tar'), and active development and
+maintenance work has started again. Currently GNU `tar' is being
+maintained by Paul Eggert, Sergey Poznyakoff and Jeff Bailey.
+
+ Support for POSIX archives was added by Sergey Poznyakoff.
+
+
+File: tar.info, Node: Reports, Prev: Authors, Up: Introduction
+
+1.6 Reporting bugs or suggestions
+=================================
+
+If you find problems or have suggestions about this program or manual,
+please report them to `bug-tar@gnu.org'.
+
+ When reporting a bug, please be sure to include as much detail as
+possible, in order to reproduce it. .
+
+
+File: tar.info, Node: Tutorial, Next: tar invocation, Prev: Introduction, Up: Top
+
+2 Tutorial Introduction to `tar'
+********************************
+
+This chapter guides you through some basic examples of three `tar'
+operations: `--create', `--list', and `--extract'. If you already know
+how to use some other version of `tar', then you may not need to read
+this chapter. This chapter omits most complicated details about how
+`tar' works.
+
+* Menu:
+
+* assumptions::
+* stylistic conventions::
+* basic tar options:: Basic `tar' Operations and Options
+* frequent operations::
+* Two Frequent Options::
+* create:: How to Create Archives
+* list:: How to List Archives
+* extract:: How to Extract Members from an Archive
+* going further::
+
+
+File: tar.info, Node: assumptions, Next: stylistic conventions, Up: Tutorial
+
+2.1 Assumptions this Tutorial Makes
+===================================
+
+This chapter is paced to allow beginners to learn about `tar' slowly.
+At the same time, we will try to cover all the basic aspects of these
+three operations. In order to accomplish both of these tasks, we have
+made certain assumptions about your knowledge before reading this
+manual, and the hardware you will be using:
+
+ * Before you start to work through this tutorial, you should
+ understand what the terms "archive" and "archive member" mean
+ (*note Definitions::). In addition, you should understand
+ something about how Unix-type operating systems work, and you
+ should know how to use some basic utilities. For example, you
+ should know how to create, list, copy, rename, edit, and delete
+ files and directories; how to change between directories; and how
+ to figure out where you are in the file system. You should have
+ some basic understanding of directory structure and how files are
+ named according to which directory they are in. You should
+ understand concepts such as standard output and standard input,
+ what various definitions of the term "argument" mean, and the
+ differences between relative and absolute file names.
+
+ * This manual assumes that you are working from your own home
+ directory (unless we state otherwise). In this tutorial, you will
+ create a directory to practice `tar' commands in. When we show
+ file names, we will assume that those names are relative to your
+ home directory. For example, my home directory is
+ `/home/fsf/melissa'. All of my examples are in a subdirectory of
+ the directory named by that file name; the subdirectory is called
+ `practice'.
+
+ * In general, we show examples of archives which exist on (or can be
+ written to, or worked with from) a directory on a hard disk. In
+ most cases, you could write those archives to, or work with them
+ on any other device, such as a tape drive. However, some of the
+ later examples in the tutorial and next chapter will not work on
+ tape drives. Additionally, working with tapes is much more
+ complicated than working with hard disks. For these reasons, the
+ tutorial does not cover working with tape drives. *Note Media::,
+ for complete information on using `tar' archives with tape drives.
+
+
+
+File: tar.info, Node: stylistic conventions, Next: basic tar options, Prev: assumptions, Up: Tutorial
+
+2.2 Stylistic Conventions
+=========================
+
+In the examples, `$' represents a typical shell prompt. It precedes
+lines you should type; to make this more clear, those lines are shown
+in `this font', as opposed to lines which represent the computer's
+response; those lines are shown in `this font', or sometimes `like
+this'.
+
+
+File: tar.info, Node: basic tar options, Next: frequent operations, Prev: stylistic conventions, Up: Tutorial
+
+2.3 Basic `tar' Operations and Options
+======================================
+
+`tar' can take a wide variety of arguments which specify and define the
+actions it will have on the particular set of files or the archive.
+The main types of arguments to `tar' fall into one of two classes:
+operations, and options.
+
+ Some arguments fall into a class called "operations"; exactly one of
+these is both allowed and required for any instance of using `tar'; you
+may _not_ specify more than one. People sometimes speak of "operating
+modes". You are in a particular operating mode when you have specified
+the operation which specifies it; there are eight operations in total,
+and thus there are eight operating modes.
+
+ The other arguments fall into the class known as "options". You are
+not required to specify any options, and you are allowed to specify more
+than one at a time (depending on the way you are using `tar' at that
+time). Some options are used so frequently, and are so useful for
+helping you type commands more carefully that they are effectively
+"required". We will discuss them in this chapter.
+
+ You can write most of the `tar' operations and options in any of
+three forms: long (mnemonic) form, short form, and old style. Some of
+the operations and options have no short or "old" forms; however, the
+operations and options which we will cover in this tutorial have
+corresponding abbreviations. We will indicate those abbreviations
+appropriately to get you used to seeing them. (Note that the "old
+style" option forms exist in GNU `tar' for compatibility with Unix
+`tar'. In this book we present a full discussion of this way of
+writing options and operations (*note Old Options::), and we discuss
+the other two styles of writing options (*Note Long Options::, and
+*note Short Options::).
+
+ In the examples and in the text of this tutorial, we usually use the
+long forms of operations and options; but the "short" forms produce the
+same result and can make typing long `tar' commands easier. For
+example, instead of typing
+
+ tar --create --verbose --file=afiles.tar apple angst aspic
+
+you can type
+ tar -c -v -f afiles.tar apple angst aspic
+
+or even
+ tar -cvf afiles.tar apple angst aspic
+
+For more information on option syntax, see *note Advanced tar::. In
+discussions in the text, when we name an option by its long form, we
+also give the corresponding short option in parentheses.
+
+ The term, "option", can be confusing at times, since "operations"
+are often lumped in with the actual, _optional_ "options" in certain
+general class statements. For example, we just talked about "short and
+long forms of options and operations". However, experienced `tar'
+users often refer to these by shorthand terms such as, "short and long
+options". This term assumes that the "operations" are included, also.
+Context will help you determine which definition of "options" to use.
+
+ Similarly, the term "command" can be confusing, as it is often used
+in two different ways. People sometimes refer to `tar' "commands". A
+`tar' "command" is the entire command line of user input which tells
+`tar' what to do -- including the operation, options, and any arguments
+(file names, pipes, other commands, etc.). However, you will also
+sometimes hear the term "the `tar' command". When the word "command"
+is used specifically like this, a person is usually referring to the
+`tar' _operation_, not the whole line. Again, use context to figure
+out which of the meanings the speaker intends.
+
+
+File: tar.info, Node: frequent operations, Next: Two Frequent Options, Prev: basic tar options, Up: Tutorial
+
+2.4 The Three Most Frequently Used Operations
+=============================================
+
+Here are the three most frequently used operations (both short and long
+forms), as well as a brief description of their meanings. The rest of
+this chapter will cover how to use these operations in detail. We will
+present the rest of the operations in the next chapter.
+
+`--create'
+`-c'
+ Create a new `tar' archive.
+
+`--list'
+`-t'
+ List the contents of an archive.
+
+`--extract'
+`-x'
+ Extract one or more members from an archive.
+
+
+File: tar.info, Node: Two Frequent Options, Next: create, Prev: frequent operations, Up: Tutorial
+
+2.5 Two Frequently Used Options
+===============================
+
+To understand how to run `tar' in the three operating modes listed
+previously, you also need to understand how to use two of the options to
+`tar': `--file' (which takes an archive file as an argument) and
+`--verbose'. (You are usually not _required_ to specify either of
+these options when you run `tar', but they can be very useful in making
+things more clear and helping you avoid errors.)
+
+* Menu:
+
+* file tutorial::
+* verbose tutorial::
+* help tutorial::
+
+
+File: tar.info, Node: file tutorial, Next: verbose tutorial, Up: Two Frequent Options
+
+The `--file' Option
+-------------------
+
+`--file=ARCHIVE-NAME'
+`-f ARCHIVE-NAME'
+ Specify the name of an archive file.
+
+ You can specify an argument for the `--file=ARCHIVE-NAME' (`-f
+ARCHIVE-NAME') option whenever you use `tar'; this option determines
+the name of the archive file that `tar' will work on.
+
+ If you don't specify this argument, then `tar' will examine the
+environment variable `TAPE'. If it is set, its value will be used as
+the archive name. Otherwise, `tar' will use the default archive,
+determined at the compile time. Usually it is standard output or some
+physical tape drive attached to your machine (you can verify what the
+default is by running `tar --show-defaults', *note defaults::). If
+there is no tape drive attached, or the default is not meaningful, then
+`tar' will print an error message. The error message might look
+roughly like one of the following:
+
+ tar: can't open /dev/rmt8 : No such device or address
+ tar: can't open /dev/rsmt0 : I/O error
+
+To avoid confusion, we recommend that you always specify an archive file
+name by using `--file=ARCHIVE-NAME' (`-f ARCHIVE-NAME') when writing
+your `tar' commands. For more information on using the
+`--file=ARCHIVE-NAME' (`-f ARCHIVE-NAME') option, see *note file::.
+
+
+File: tar.info, Node: verbose tutorial, Next: help tutorial, Prev: file tutorial, Up: Two Frequent Options
+
+The `--verbose' Option
+----------------------
+
+`--verbose'
+`-v'
+ Show the files being worked on as `tar' is running.
+
+ `--verbose' (`-v') shows details about the results of running `tar'.
+This can be especially useful when the results might not be obvious.
+For example, if you want to see the progress of `tar' as it writes
+files into the archive, you can use the `--verbose' option. In the
+beginning, you may find it useful to use `--verbose' at all times; when
+you are more accustomed to `tar', you will likely want to use it at
+certain times but not at others. We will use `--verbose' at times to
+help make something clear, and we will give many examples both using
+and not using `--verbose' to show the differences.
+
+ Each instance of `--verbose' on the command line increases the
+verbosity level by one, so if you need more details on the output,
+specify it twice.
+
+ When reading archives (`--list', `--extract', `--diff'), `tar' by
+default prints only the names of the members being extracted. Using
+`--verbose' will show a full, `ls' style member listing.
+
+ In contrast, when writing archives (`--create', `--append',
+`--update'), `tar' does not print file names by default. So, a single
+`--verbose' option shows the file names being added to the archive,
+while two `--verbose' options enable the full listing.
+
+ For example, to create an archive in verbose mode:
+
+ $ tar -cvf afiles.tar apple angst aspic
+ apple
+ angst
+ aspic
+
+Creating the same archive with the verbosity level 2 could give:
+
+ $ tar -cvvf afiles.tar apple angst aspic
+ -rw-r--r-- gray/staff 62373 2006-06-09 12:06 apple
+ -rw-r--r-- gray/staff 11481 2006-06-09 12:06 angst
+ -rw-r--r-- gray/staff 23152 2006-06-09 12:06 aspic
+
+This works equally well using short or long forms of options. Using
+long forms, you would simply write out the mnemonic form of the option
+twice, like this:
+
+ $ tar --create --verbose --verbose ...
+
+Note that you must double the hyphens properly each time.
+
+ Later in the tutorial, we will give examples using
+`--verbose --verbose'.
+
+ The full output consists of six fields:
+
+ * File type and permissions in symbolic form. These are displayed
+ in the same format as the first column of `ls -l' output (*note
+ format=verbose: (fileutils)What information is listed.).
+
+ * Owner name and group separated by a slash character. If these
+ data are not available (for example, when listing a `v7' format
+ archive), numeric ID values are printed instead.
+
+ * Size of the file, in bytes.
+
+ * File modification date in ISO 8601 format.
+
+ * File modification time.
+
+ * File name. If the name contains any special characters (white
+ space, newlines, etc.) these are displayed in an unambiguous form
+ using so called "quoting style". For the detailed discussion of
+ available styles and on how to use them, see *note quoting
+ styles::.
+
+ Depending on the file type, the name can be followed by some
+ additional information, described in the following table:
+
+ `-> LINK-NAME'
+ The file or archive member is a "symbolic link" and LINK-NAME
+ is the name of file it links to.
+
+ `link to LINK-NAME'
+ The file or archive member is a "hard link" and LINK-NAME is
+ the name of file it links to.
+
+ `--Long Link--'
+ The archive member is an old GNU format long link. You will
+ normally not encounter this.
+
+ `--Long Name--'
+ The archive member is an old GNU format long name. You will
+ normally not encounter this.
+
+ `--Volume Header--'
+ The archive member is a GNU "volume header" (*note Tape
+ Files::).
+
+ `--Continued at byte N--'
+ Encountered only at the beginning of a multi-volume archive
+ (*note Using Multiple Tapes::). This archive member is a
+ continuation from the previous volume. The number N gives the
+ offset where the original file was split.
+
+ `unknown file type C'
+ An archive member of unknown type. C is the type character
+ from the archive header. If you encounter such a message, it
+ means that either your archive contains proprietary member
+ types GNU `tar' is not able to handle, or the archive is
+ corrupted.
+
+
+ For example, here is an archive listing containing most of the
+special suffixes explained above:
+
+ V--------- 0/0 1536 2006-06-09 13:07 MyVolume--Volume Header--
+ -rw-r--r-- gray/staff 456783 2006-06-09 12:06 aspic--Continued at
+ byte 32456--
+ -rw-r--r-- gray/staff 62373 2006-06-09 12:06 apple
+ lrwxrwxrwx gray/staff 0 2006-06-09 13:01 angst -> apple
+ -rw-r--r-- gray/staff 35793 2006-06-09 12:06 blues
+ hrw-r--r-- gray/staff 0 2006-06-09 12:06 music link to blues
+
+
+
+File: tar.info, Node: help tutorial, Prev: verbose tutorial, Up: Two Frequent Options
+
+Getting Help: Using the `--help' Option
+---------------------------------------
+
+`--help'
+ The `--help' option to `tar' prints out a very brief list of all
+ operations and option available for the current version of `tar'
+ available on your system.
+
+
+File: tar.info, Node: create, Next: list, Prev: Two Frequent Options, Up: Tutorial
+
+2.6 How to Create Archives
+==========================
+
+ _(This message will disappear, once this node revised.)_
+
+One of the basic operations of `tar' is `--create' (`-c'), which you
+use to create a `tar' archive. We will explain `--create' first
+because, in order to learn about the other operations, you will find it
+useful to have an archive available to practice on.
+
+ To make this easier, in this section you will first create a
+directory containing three files. Then, we will show you how to create
+an _archive_ (inside the new directory). Both the directory, and the
+archive are specifically for you to practice on. The rest of this
+chapter and the next chapter will show many examples using this
+directory and the files you will create: some of those files may be
+other directories and other archives.
+
+ The three files you will archive in this example are called `blues',
+`folk', and `jazz'. The archive is called `collection.tar'.
+
+ This section will proceed slowly, detailing how to use `--create' in
+`verbose' mode, and showing examples using both short and long forms.
+In the rest of the tutorial, and in the examples in the next chapter,
+we will proceed at a slightly quicker pace. This section moves more
+slowly to allow beginning users to understand how `tar' works.
+
+* Menu:
+
+* prepare for examples::
+* Creating the archive::
+* create verbose::
+* short create::
+* create dir::
+
+
+File: tar.info, Node: prepare for examples, Next: Creating the archive, Up: create
+
+2.6.1 Preparing a Practice Directory for Examples
+-------------------------------------------------
+
+To follow along with this and future examples, create a new directory
+called `practice' containing files called `blues', `folk' and `jazz'.
+The files can contain any information you like: ideally, they should
+contain information which relates to their names, and be of different
+lengths. Our examples assume that `practice' is a subdirectory of your
+home directory.
+
+ Now `cd' to the directory named `practice'; `practice' is now your
+"working directory". (_Please note_: Although the full file name of
+this directory is `/HOMEDIR/practice', in our examples we will refer to
+this directory as `practice'; the HOMEDIR is presumed.
+
+ In general, you should check that the files to be archived exist
+where you think they do (in the working directory) by running `ls'.
+Because you just created the directory and the files and have changed to
+that directory, you probably don't need to do that this time.
+
+ It is very important to make sure there isn't already a file in the
+working directory with the archive name you intend to use (in this case,
+`collection.tar'), or that you don't care about its contents. Whenever
+you use `create', `tar' will erase the current contents of the file
+named by `--file=ARCHIVE-NAME' (`-f ARCHIVE-NAME') if it exists. `tar'
+will not tell you if you are about to overwrite an archive unless you
+specify an option which does this (*note backup::, for the information
+on how to do so). To add files to an existing archive, you need to use
+a different option, such as `--append' (`-r'); see *note append:: for
+information on how to do this.
+
+
+File: tar.info, Node: Creating the archive, Next: create verbose, Prev: prepare for examples, Up: create
+
+2.6.2 Creating the Archive
+--------------------------
+
+To place the files `blues', `folk', and `jazz' into an archive named
+`collection.tar', use the following command:
+
+ $ tar --create --file=collection.tar blues folk jazz
+
+ The order of the arguments is not very important, _when using long
+option forms_. You could also say:
+
+ $ tar blues --create folk --file=collection.tar jazz
+
+However, you can see that this order is harder to understand; this is
+why we will list the arguments in the order that makes the commands
+easiest to understand (and we encourage you to do the same when you use
+`tar', to avoid errors).
+
+ Note that the sequence `--file=collection.tar' is considered to be
+_one_ argument. If you substituted any other string of characters for
+`collection.tar', then that string would become the name of the
+archive file you create.
+
+ The order of the options becomes more important when you begin to use
+short forms. With short forms, if you type commands in the wrong order
+(even if you type them correctly in all other ways), you may end up with
+results you don't expect. For this reason, it is a good idea to get
+into the habit of typing options in the order that makes inherent sense.
+*Note short create::, for more information on this.
+
+ In this example, you type the command as shown above: `--create' is
+the operation which creates the new archive (`collection.tar'), and
+`--file' is the option which lets you give it the name you chose. The
+files, `blues', `folk', and `jazz', are now members of the archive,
+`collection.tar' (they are "file name arguments" to the `--create'
+operation. *Note Choosing::, for the detailed discussion on these.)
+Now that they are in the archive, they are called _archive members_,
+not files. (*note members: Definitions.).
+
+ When you create an archive, you _must_ specify which files you want
+placed in the archive. If you do not specify any archive members, GNU
+`tar' will complain.
+
+ If you now list the contents of the working directory (`ls'), you
+will find the archive file listed as well as the files you saw
+previously:
+
+ blues folk jazz collection.tar
+
+Creating the archive `collection.tar' did not destroy the copies of the
+files in the directory.
+
+ Keep in mind that if you don't indicate an operation, `tar' will not
+run and will prompt you for one. If you don't name any files, `tar'
+will complain. You must have write access to the working directory, or
+else you will not be able to create an archive in that directory.
+
+ _Caution_: Do not attempt to use `--create' (`-c') to add files to
+an existing archive; it will delete the archive and write a new one.
+Use `--append' (`-r') instead. *Note append::.
+
+
+File: tar.info, Node: create verbose, Next: short create, Prev: Creating the archive, Up: create
+
+2.6.3 Running `--create' with `--verbose'
+-----------------------------------------
+
+If you include the `--verbose' (`-v') option on the command line, `tar'
+will list the files it is acting on as it is working. In verbose mode,
+the `create' example above would appear as:
+
+ $ tar --create --verbose --file=collection.tar blues folk jazz
+ blues
+ folk
+ jazz
+
+ This example is just like the example we showed which did not use
+`--verbose', except that `tar' generated the remaining lines .
+
+ In the rest of the examples in this chapter, we will frequently use
+`verbose' mode so we can show actions or `tar' responses that you would
+otherwise not see, and which are important for you to understand.
+
+
+File: tar.info, Node: short create, Next: create dir, Prev: create verbose, Up: create
+
+2.6.4 Short Forms with `create'
+-------------------------------
+
+As we said before, the `--create' (`-c') operation is one of the most
+basic uses of `tar', and you will use it countless times. Eventually,
+you will probably want to use abbreviated (or "short") forms of
+options. A full discussion of the three different forms that options
+can take appears in *note Styles::; for now, here is what the previous
+example (including the `--verbose' (`-v') option) looks like using
+short option forms:
+
+ $ tar -cvf collection.tar blues folk jazz
+ blues
+ folk
+ jazz
+
+As you can see, the system responds the same no matter whether you use
+long or short option forms.
+
+ One difference between using short and long option forms is that,
+although the exact placement of arguments following options is no more
+specific when using short forms, it is easier to become confused and
+make a mistake when using short forms. For example, suppose you
+attempted the above example in the following way:
+
+ $ tar -cfv collection.tar blues folk jazz
+
+In this case, `tar' will make an archive file called `v', containing
+the files `blues', `folk', and `jazz', because the `v' is the closest
+"file name" to the `-f' option, and is thus taken to be the chosen
+archive file name. `tar' will try to add a file called
+`collection.tar' to the `v' archive file; if the file `collection.tar'
+did not already exist, `tar' will report an error indicating that this
+file does not exist. If the file `collection.tar' does already exist
+(e.g., from a previous command you may have run), then `tar' will add
+this file to the archive. Because the `-v' option did not get
+registered, `tar' will not run under `verbose' mode, and will not
+report its progress.
+
+ The end result is that you may be quite confused about what happened,
+and possibly overwrite a file. To illustrate this further, we will show
+you how an example we showed previously would look using short forms.
+
+ This example,
+
+ $ tar blues --create folk --file=collection.tar jazz
+
+is confusing as it is. When shown using short forms, however, it
+becomes much more so:
+
+ $ tar blues -c folk -f collection.tar jazz
+
+It would be very easy to put the wrong string of characters immediately
+following the `-f', but doing that could sacrifice valuable data.
+
+ For this reason, we recommend that you pay very careful attention to
+the order of options and placement of file and archive names,
+especially when using short option forms. Not having the option name
+written out mnemonically can affect how well you remember which option
+does what, and therefore where different names have to be placed.
+
+
+File: tar.info, Node: create dir, Prev: short create, Up: create
+
+2.6.5 Archiving Directories
+---------------------------
+
+You can archive a directory by specifying its directory name as a file
+name argument to `tar'. The files in the directory will be archived
+relative to the working directory, and the directory will be re-created
+along with its contents when the archive is extracted.
+
+ To archive a directory, first move to its superior directory. If you
+have followed the previous instructions in this tutorial, you should
+type:
+
+ $ cd ..
+ $
+
+This will put you into the directory which contains `practice', i.e.,
+your home directory. Once in the superior directory, you can specify
+the subdirectory, `practice', as a file name argument. To store
+`practice' in the new archive file `music.tar', type:
+
+ $ tar --create --verbose --file=music.tar practice
+
+`tar' should output:
+
+ practice/
+ practice/blues
+ practice/folk
+ practice/jazz
+ practice/collection.tar
+
+ Note that the archive thus created is not in the subdirectory
+`practice', but rather in the current working directory--the directory
+from which `tar' was invoked. Before trying to archive a directory
+from its superior directory, you should make sure you have write access
+to the superior directory itself, not only the directory you are trying
+archive with `tar'. For example, you will probably not be able to
+store your home directory in an archive by invoking `tar' from the root
+directory; *Note absolute::. (Note also that `collection.tar', the
+original archive file, has itself been archived. `tar' will accept any
+file as a file to be archived, regardless of its content. When
+`music.tar' is extracted, the archive file `collection.tar' will be
+re-written into the file system).
+
+ If you give `tar' a command such as
+
+ $ tar --create --file=foo.tar .
+
+`tar' will report `tar: ./foo.tar is the archive; not dumped'. This
+happens because `tar' creates the archive `foo.tar' in the current
+directory before putting any files into it. Then, when `tar' attempts
+to add all the files in the directory `.' to the archive, it notices
+that the file `./foo.tar' is the same as the archive `foo.tar', and
+skips it. (It makes no sense to put an archive into itself.) GNU `tar'
+will continue in this case, and create the archive normally, except for
+the exclusion of that one file. (_Please note:_ Other implementations
+of `tar' may not be so clever; they will enter an infinite loop when
+this happens, so you should not depend on this behavior unless you are
+certain you are running GNU `tar'. In general, it is wise to always
+place the archive outside of the directory being dumped.
+
+
+File: tar.info, Node: list, Next: extract, Prev: create, Up: Tutorial
+
+2.7 How to List Archives
+========================
+
+Frequently, you will find yourself wanting to determine exactly what a
+particular archive contains. You can use the `--list' (`-t') operation
+to get the member names as they currently appear in the archive, as
+well as various attributes of the files at the time they were archived.
+For example, you can examine the archive `collection.tar' that you
+created in the last section with the command,
+
+ $ tar --list --file=collection.tar
+
+The output of `tar' would then be:
+
+ blues
+ folk
+ jazz
+
+The archive `bfiles.tar' would list as follows:
+
+ ./birds
+ baboon
+ ./box
+
+Be sure to use a `--file=ARCHIVE-NAME' (`-f ARCHIVE-NAME') option just
+as with `--create' (`-c') to specify the name of the archive.
+
+ If you use the `--verbose' (`-v') option with `--list', then `tar'
+will print out a listing reminiscent of `ls -l', showing owner, file
+size, and so forth. This output is described in detail in *note
+verbose member listing::.
+
+ If you had used `--verbose' (`-v') mode, the example above would
+look like:
+
+ $ tar --list --verbose --file=collection.tar folk
+ -rw-r--r-- myself user 62 1990-05-23 10:55 folk
+
+ It is important to notice that the output of `tar --list --verbose'
+does not necessarily match that produced by `tar --create --verbose'
+while creating the archive. It is because GNU `tar', unless told
+explicitly not to do so, removes some directory prefixes from file
+names before storing them in the archive (*Note absolute::, for more
+information). In other words, in verbose mode GNU `tar' shows "file
+names" when creating an archive and "member names" when listing it.
+Consider this example:
+
+ $ tar cfv archive /etc/mail
+ tar: Removing leading `/' from member names
+ /etc/mail/
+ /etc/mail/sendmail.cf
+ /etc/mail/aliases
+ $ tar tf archive
+ etc/mail/
+ etc/mail/sendmail.cf
+ etc/mail/aliases
+
+ This default behavior can sometimes be inconvenient. You can force
+GNU `tar' show member names when creating archive by supplying
+`--show-stored-names' option.
+
+`--show-stored-names'
+ Print member (as opposed to _file_) names when creating the
+ archive.
+
+ You can specify one or more individual member names as arguments when
+using `list'. In this case, `tar' will only list the names of members
+you identify. For example, `tar --list --file=afiles.tar apple' would
+only print `apple'.
+
+ Because `tar' preserves file names, these must be specified as they
+appear in the archive (i.e., relative to the directory from which the
+archive was created). Therefore, it is essential when specifying
+member names to `tar' that you give the exact member names. For
+example, `tar --list --file=bfiles.tar birds' would produce an error
+message something like `tar: birds: Not found in archive', because
+there is no member named `birds', only one named `./birds'. While the
+names `birds' and `./birds' name the same file, _member_ names by
+default are compared verbatim.
+
+ However, `tar --list --file=bfiles.tar baboon' would respond with
+`baboon', because this exact member name is in the archive file
+`bfiles.tar'. If you are not sure of the exact file name, use
+"globbing patterns", for example:
+
+ $ tar --list --file=bfiles.tar --wildcards '*b*'
+
+will list all members whose name contains `b'. *Note wildcards::, for
+a detailed discussion of globbing patterns and related `tar' command
+line options.
+
+* Menu:
+
+* list dir::
+
+
+File: tar.info, Node: list dir, Up: list
+
+Listing the Contents of a Stored Directory
+------------------------------------------
+
+To get information about the contents of an archived directory, use the
+directory name as a file name argument in conjunction with `--list'
+(`-t'). To find out file attributes, include the `--verbose' (`-v')
+option.
+
+ For example, to find out about files in the directory `practice', in
+the archive file `music.tar', type:
+
+ $ tar --list --verbose --file=music.tar practice
+
+ `tar' responds:
+
+ drwxrwxrwx myself user 0 1990-05-31 21:49 practice/
+ -rw-r--r-- myself user 42 1990-05-21 13:29 practice/blues
+ -rw-r--r-- myself user 62 1990-05-23 10:55 practice/folk
+ -rw-r--r-- myself user 40 1990-05-21 13:30 practice/jazz
+ -rw-r--r-- myself user 10240 1990-05-31 21:49 practice/collection.tar
+
+ When you use a directory name as a file name argument, `tar' acts on
+all the files (including sub-directories) in that directory.
+
+
+File: tar.info, Node: extract, Next: going further, Prev: list, Up: Tutorial
+
+2.8 How to Extract Members from an Archive
+==========================================
+
+ _(This message will disappear, once this node revised.)_
+
+Creating an archive is only half the job--there is no point in storing
+files in an archive if you can't retrieve them. The act of retrieving
+members from an archive so they can be used and manipulated as
+unarchived files again is called "extraction". To extract files from
+an archive, use the `--extract' (`--get' or `-x') operation. As with
+`--create', specify the name of the archive with `--file' (`-f')
+option. Extracting an archive does not modify the archive in any way;
+you can extract it multiple times if you want or need to.
+
+ Using `--extract', you can extract an entire archive, or specific
+files. The files can be directories containing other files, or not. As
+with `--create' (`-c') and `--list' (`-t'), you may use the short or the
+long form of the operation without affecting the performance.
+
+* Menu:
+
+* extracting archives::
+* extracting files::
+* extract dir::
+* extracting untrusted archives::
+* failing commands::
+
+
+File: tar.info, Node: extracting archives, Next: extracting files, Up: extract
+
+2.8.1 Extracting an Entire Archive
+----------------------------------
+
+To extract an entire archive, specify the archive file name only, with
+no individual file names as arguments. For example,
+
+ $ tar -xvf collection.tar
+
+produces this:
+
+ -rw-r--r-- me user 28 1996-10-18 16:31 jazz
+ -rw-r--r-- me user 21 1996-09-23 16:44 blues
+ -rw-r--r-- me user 20 1996-09-23 16:44 folk
+
+
+File: tar.info, Node: extracting files, Next: extract dir, Prev: extracting archives, Up: extract
+
+2.8.2 Extracting Specific Files
+-------------------------------
+
+To extract specific archive members, give their exact member names as
+arguments, as printed by `--list' (`-t'). If you had mistakenly
+deleted one of the files you had placed in the archive `collection.tar'
+earlier (say, `blues'), you can extract it from the archive without
+changing the archive's structure. Its contents will be identical to
+the original file `blues' that you deleted.
+
+ First, make sure you are in the `practice' directory, and list the
+files in the directory. Now, delete the file, `blues', and list the
+files in the directory again.
+
+ You can now extract the member `blues' from the archive file
+`collection.tar' like this:
+
+ $ tar --extract --file=collection.tar blues
+
+If you list the files in the directory again, you will see that the file
+`blues' has been restored, with its original permissions, data
+modification times, and owner.(1) (These parameters will be identical
+to those which the file had when you originally placed it in the
+archive; any changes you may have made before deleting the file from
+the file system, however, will _not_ have been made to the archive
+member.) The archive file, `collection.tar', is the same as it was
+before you extracted `blues'. You can confirm this by running `tar'
+with `--list' (`-t').
+
+ Remember that as with other operations, specifying the exact member
+name is important. `tar --extract --file=bfiles.tar birds' will fail,
+because there is no member named `birds'. To extract the member named
+`./birds', you must specify `tar --extract --file=bfiles.tar ./birds'.
+If you don't remember the exact member names, use `--list' (`-t') option
+(*note list::). You can also extract those members that match a
+specific "globbing pattern". For example, to extract from `bfiles.tar'
+all files that begin with `b', no matter their directory prefix, you
+could type:
+
+ $ tar -x -f bfiles.tar --wildcards --no-anchored 'b*'
+
+Here, `--wildcards' instructs `tar' to treat command line arguments as
+globbing patterns and `--no-anchored' informs it that the patterns
+apply to member names after any `/' delimiter. The use of globbing
+patterns is discussed in detail in *Note wildcards::.
+
+ You can extract a file to standard output by combining the above
+options with the `--to-stdout' (`-O') option (*note Writing to Standard
+Output::).
+
+ If you give the `--verbose' option, then `--extract' will print the
+names of the archive members as it extracts them.
+
+ ---------- Footnotes ----------
+
+ (1) This is only accidentally true, but not in general. Whereas
+modification times are always restored, in most cases, one has to be
+root for restoring the owner, and use a special option for restoring
+permissions. Here, it just happens that the restoring user is also the
+owner of the archived members, and that the current `umask' is
+compatible with original permissions.
+
+
+File: tar.info, Node: extract dir, Next: extracting untrusted archives, Prev: extracting files, Up: extract
+
+2.8.3 Extracting Files that are Directories
+-------------------------------------------
+
+Extracting directories which are members of an archive is similar to
+extracting other files. The main difference to be aware of is that if
+the extracted directory has the same name as any directory already in
+the working directory, then files in the extracted directory will be
+placed into the directory of the same name. Likewise, if there are
+files in the pre-existing directory with the same names as the members
+which you extract, the files from the extracted archive will replace
+the files already in the working directory (and possible
+subdirectories). This will happen regardless of whether or not the
+files in the working directory were more recent than those extracted
+(there exist, however, special options that alter this behavior *note
+Writing::).
+
+ However, if a file was stored with a directory name as part of its
+file name, and that directory does not exist under the working
+directory when the file is extracted, `tar' will create the directory.
+
+ We can demonstrate how to use `--extract' to extract a directory
+file with an example. Change to the `practice' directory if you
+weren't there, and remove the files `folk' and `jazz'. Then, go back
+to the parent directory and extract the archive `music.tar'. You may
+either extract the entire archive, or you may extract only the files
+you just deleted. To extract the entire archive, don't give any file
+names as arguments after the archive name `music.tar'. To extract only
+the files you deleted, use the following command:
+
+ $ tar -xvf music.tar practice/folk practice/jazz
+ practice/folk
+ practice/jazz
+
+If you were to specify two `--verbose' (`-v') options, `tar' would have
+displayed more detail about the extracted files, as shown in the
+example below:
+
+ $ tar -xvvf music.tar practice/folk practice/jazz
+ -rw-r--r-- me user 28 1996-10-18 16:31 practice/jazz
+ -rw-r--r-- me user 20 1996-09-23 16:44 practice/folk
+
+Because you created the directory with `practice' as part of the file
+names of each of the files by archiving the `practice' directory as
+`practice', you must give `practice' as part of the file names when you
+extract those files from the archive.
+
+
+File: tar.info, Node: extracting untrusted archives, Next: failing commands, Prev: extract dir, Up: extract
+
+2.8.4 Extracting Archives from Untrusted Sources
+------------------------------------------------
+
+Extracting files from archives can overwrite files that already exist.
+If you receive an archive from an untrusted source, you should make a
+new directory and extract into that directory, so that you don't have
+to worry about the extraction overwriting one of your existing files.
+For example, if `untrusted.tar' came from somewhere else on the
+Internet, and you don't necessarily trust its contents, you can extract
+it as follows:
+
+ $ mkdir newdir
+ $ cd newdir
+ $ tar -xvf ../untrusted.tar
+
+ It is also a good practice to examine contents of the archive before
+extracting it, using `--list' (`-t') option, possibly combined with
+`--verbose' (`-v').
+
+
+File: tar.info, Node: failing commands, Prev: extracting untrusted archives, Up: extract
+
+2.8.5 Commands That Will Fail
+-----------------------------
+
+Here are some sample commands you might try which will not work, and why
+they won't work.
+
+ If you try to use this command,
+
+ $ tar -xvf music.tar folk jazz
+
+you will get the following response:
+
+ tar: folk: Not found in archive
+ tar: jazz: Not found in archive
+ $
+
+This is because these files were not originally _in_ the parent
+directory `..', where the archive is located; they were in the
+`practice' directory, and their file names reflect this:
+
+ $ tar -tvf music.tar
+ practice/folk
+ practice/jazz
+ practice/rock
+
+Likewise, if you try to use this command,
+
+ $ tar -tvf music.tar folk jazz
+
+you would get a similar response. Members with those names are not in
+the archive. You must use the correct member names, or wildcards, in
+order to extract the files from the archive.
+
+ If you have forgotten the correct names of the files in the archive,
+use `tar --list --verbose' to list them correctly.
+
+
+File: tar.info, Node: going further, Prev: extract, Up: Tutorial
+
+2.9 Going Further Ahead in this Manual
+======================================
+
+
+File: tar.info, Node: tar invocation, Next: operations, Prev: Tutorial, Up: Top
+
+3 Invoking GNU `tar'
+********************
+
+ _(This message will disappear, once this node revised.)_
+
+This chapter is about how one invokes the GNU `tar' command, from the
+command synopsis (*note Synopsis::). There are numerous options, and
+many styles for writing them. One mandatory option specifies the
+operation `tar' should perform (*note Operation Summary::), other
+options are meant to detail how this operation should be performed
+(*note Option Summary::). Non-option arguments are not always
+interpreted the same way, depending on what the operation is.
+
+ You will find in this chapter everything about option styles and
+rules for writing them (*note Styles::). On the other hand, operations
+and options are fully described elsewhere, in other chapters. Here,
+you will find only synthetic descriptions for operations and options,
+together with pointers to other parts of the `tar' manual.
+
+ Some options are so special they are fully described right in this
+chapter. They have the effect of inhibiting the normal operation of
+`tar' or else, they globally alter the amount of feedback the user
+receives about what is going on. These are the `--help' and
+`--version' (*note help::), `--verbose' (*note verbose::) and
+`--interactive' options (*note interactive::).
+
+* Menu:
+
+* Synopsis::
+* using tar options::
+* Styles::
+* All Options::
+* help::
+* defaults::
+* verbose::
+* interactive::
+
+
+File: tar.info, Node: Synopsis, Next: using tar options, Up: tar invocation
+
+3.1 General Synopsis of `tar'
+=============================
+
+The GNU `tar' program is invoked as either one of:
+
+ tar OPTION... [NAME]...
+ tar LETTER... [ARGUMENT]... [OPTION]... [NAME]...
+
+ The second form is for when old options are being used.
+
+ You can use `tar' to store files in an archive, to extract them from
+an archive, and to do other types of archive manipulation. The primary
+argument to `tar', which is called the "operation", specifies which
+action to take. The other arguments to `tar' are either "options",
+which change the way `tar' performs an operation, or file names or
+archive members, which specify the files or members `tar' is to act on.
+
+ You can actually type in arguments in any order, even if in this
+manual the options always precede the other arguments, to make examples
+easier to understand. Further, the option stating the main operation
+mode (the `tar' main command) is usually given first.
+
+ Each NAME in the synopsis above is interpreted as an archive member
+name when the main command is one of `--compare' (`--diff', `-d'),
+`--delete', `--extract' (`--get', `-x'), `--list' (`-t') or `--update'
+(`-u'). When naming archive members, you must give the exact name of
+the member in the archive, as it is printed by `--list'. For
+`--append' (`-r') and `--create' (`-c'), these NAME arguments specify
+the names of either files or directory hierarchies to place in the
+archive. These files or hierarchies should already exist in the file
+system, prior to the execution of the `tar' command.
+
+ `tar' interprets relative file names as being relative to the
+working directory. `tar' will make all file names relative (by
+removing leading slashes when archiving or restoring files), unless you
+specify otherwise (using the `--absolute-names' option). *Note
+absolute::, for more information about `--absolute-names'.
+
+ If you give the name of a directory as either a file name or a member
+name, then `tar' acts recursively on all the files and directories
+beneath that directory. For example, the name `/' identifies all the
+files in the file system to `tar'.
+
+ The distinction between file names and archive member names is
+especially important when shell globbing is used, and sometimes a
+source of confusion for newcomers. *Note wildcards::, for more
+information about globbing. The problem is that shells may only glob
+using existing files in the file system. Only `tar' itself may glob on
+archive members, so when needed, you must ensure that wildcard
+characters reach `tar' without being interpreted by the shell first.
+Using a backslash before `*' or `?', or putting the whole argument
+between quotes, is usually sufficient for this.
+
+ Even if NAMEs are often specified on the command line, they can also
+be read from a text file in the file system, using the
+`--files-from=FILE-OF-NAMES' (`-T FILE-OF-NAMES') option.
+
+ If you don't use any file name arguments, `--append' (`-r'),
+`--delete' and `--concatenate' (`--catenate', `-A') will do nothing,
+while `--create' (`-c') will usually yield a diagnostic and inhibit
+`tar' execution. The other operations of `tar' (`--list', `--extract',
+`--compare', and `--update') will act on the entire contents of the
+archive.
+
+ Besides successful exits, GNU `tar' may fail for many reasons. Some
+reasons correspond to bad usage, that is, when the `tar' command is
+improperly written. Errors may be encountered later, while
+encountering an error processing the archive or the files. Some errors
+are recoverable, in which case the failure is delayed until `tar' has
+completed all its work. Some errors are such that it would not
+meaningful, or at least risky, to continue processing: `tar' then
+aborts processing immediately. All abnormal exits, whether immediate
+or delayed, should always be clearly diagnosed on `stderr', after a
+line stating the nature of the error.
+
+ Possible exit codes of GNU `tar' are summarized in the following
+table:
+
+0
+ `Successful termination'.
+
+1
+ `Some files differ'. If tar was invoked with `--compare'
+ (`--diff', `-d') command line option, this means that some files
+ in the archive differ from their disk counterparts (*note
+ compare::). If tar was given `--create', `--append' or `--update'
+ option, this exit code means that some files were changed while
+ being archived and so the resulting archive does not contain the
+ exact copy of the file set.
+
+2
+ `Fatal error'. This means that some fatal, unrecoverable error
+ occurred.
+
+ If `tar' has invoked a subprocess and that subprocess exited with a
+nonzero exit code, `tar' exits with that code as well. This can
+happen, for example, if `tar' was given some compression option (*note
+gzip::) and the external compressor program failed. Another example is
+`rmt' failure during backup to the remote device (*note Remote Tape
+Server::).
+
+
+File: tar.info, Node: using tar options, Next: Styles, Prev: Synopsis, Up: tar invocation
+
+3.2 Using `tar' Options
+=======================
+
+GNU `tar' has a total of eight operating modes which allow you to
+perform a variety of tasks. You are required to choose one operating
+mode each time you employ the `tar' program by specifying one, and only
+one operation as an argument to the `tar' command (two lists of four
+operations each may be found at *note frequent operations:: and *note
+Operations::). Depending on circumstances, you may also wish to
+customize how the chosen operating mode behaves. For example, you may
+wish to change the way the output looks, or the format of the files
+that you wish to archive may require you to do something special in
+order to make the archive look right.
+
+ You can customize and control `tar''s performance by running `tar'
+with one or more options (such as `--verbose' (`-v'), which we used in
+the tutorial). As we said in the tutorial, "options" are arguments to
+`tar' which are (as their name suggests) optional. Depending on the
+operating mode, you may specify one or more options. Different options
+will have different effects, but in general they all change details of
+the operation, such as archive format, archive name, or level of user
+interaction. Some options make sense with all operating modes, while
+others are meaningful only with particular modes. You will likely use
+some options frequently, while you will only use others infrequently, or
+not at all. (A full list of options is available in *note All
+Options::.)
+
+ The `TAR_OPTIONS' environment variable specifies default options to
+be placed in front of any explicit options. For example, if
+`TAR_OPTIONS' is `-v --unlink-first', `tar' behaves as if the two
+options `-v' and `--unlink-first' had been specified before any
+explicit options. Option specifications are separated by whitespace.
+A backslash escapes the next character, so it can be used to specify an
+option containing whitespace or a backslash.
+
+ Note that `tar' options are case sensitive. For example, the
+options `-T' and `-t' are different; the first requires an argument for
+stating the name of a file providing a list of NAMEs, while the second
+does not require an argument and is another way to write `--list'
+(`-t').
+
+ In addition to the eight operations, there are many options to
+`tar', and three different styles for writing both: long (mnemonic)
+form, short form, and old style. These styles are discussed below.
+Both the options and the operations can be written in any of these three
+styles.
+
+
+File: tar.info, Node: Styles, Next: All Options, Prev: using tar options, Up: tar invocation
+
+3.3 The Three Option Styles
+===========================
+
+There are three styles for writing operations and options to the command
+line invoking `tar'. The different styles were developed at different
+times during the history of `tar'. These styles will be presented
+below, from the most recent to the oldest.
+
+ Some options must take an argument. (For example, `--file' (`-f'))
+takes the name of an archive file as an argument. If you do not supply
+an archive file name, `tar' will use a default, but this can be
+confusing; thus, we recommend that you always supply a specific archive
+file name.) Where you _place_ the arguments generally depends on which
+style of options you choose. We will detail specific information
+relevant to each option style in the sections on the different option
+styles, below. The differences are subtle, yet can often be very
+important; incorrect option placement can cause you to overwrite a
+number of important files. We urge you to note these differences, and
+only use the option style(s) which makes the most sense to you until
+you feel comfortable with the others.
+
+ Some options _may_ take an argument. Such options may have at most
+long and short forms, they do not have old style equivalent. The rules
+for specifying an argument for such options are stricter than those for
+specifying mandatory arguments. Please, pay special attention to them.
+
+* Menu:
+
+* Long Options:: Long Option Style
+* Short Options:: Short Option Style
+* Old Options:: Old Option Style
+* Mixing:: Mixing Option Styles
+
+
+File: tar.info, Node: Long Options, Next: Short Options, Up: Styles
+
+3.3.1 Long Option Style
+-----------------------
+
+Each option has at least one "long" (or "mnemonic") name starting with
+two dashes in a row, e.g., `--list'. The long names are more clear than
+their corresponding short or old names. It sometimes happens that a
+single long option has many different names which are synonymous, such
+as `--compare' and `--diff'. In addition, long option names can be
+given unique abbreviations. For example, `--cre' can be used in place
+of `--create' because there is no other long option which begins with
+`cre'. (One way to find this out is by trying it and seeing what
+happens; if a particular abbreviation could represent more than one
+option, `tar' will tell you that that abbreviation is ambiguous and
+you'll know that that abbreviation won't work. You may also choose to
+run `tar --help' to see a list of options. Be aware that if you run
+`tar' with a unique abbreviation for the long name of an option you
+didn't want to use, you are stuck; `tar' will perform the command as
+ordered.)
+
+ Long options are meant to be obvious and easy to remember, and their
+meanings are generally easier to discern than those of their
+corresponding short options (see below). For example:
+
+ $ tar --create --verbose --blocking-factor=20 --file=/dev/rmt0
+
+gives a fairly good set of hints about what the command does, even for
+those not fully acquainted with `tar'.
+
+ Long options which require arguments take those arguments
+immediately following the option name. There are two ways of
+specifying a mandatory argument. It can be separated from the option
+name either by an equal sign, or by any amount of white space
+characters. For example, the `--file' option (which tells the name of
+the `tar' archive) is given a file such as `archive.tar' as argument by
+using any of the following notations: `--file=archive.tar' or `--file
+archive.tar'.
+
+ In contrast, optional arguments must always be introduced using an
+equal sign. For example, the `--backup' option takes an optional
+argument specifying backup type. It must be used as
+`--backup=BACKUP-TYPE'.
+
+
+File: tar.info, Node: Short Options, Next: Old Options, Prev: Long Options, Up: Styles
+
+3.3.2 Short Option Style
+------------------------
+
+Most options also have a "short option" name. Short options start with
+a single dash, and are followed by a single character, e.g., `-t'
+(which is equivalent to `--list'). The forms are absolutely identical
+in function; they are interchangeable.
+
+ The short option names are faster to type than long option names.
+
+ Short options which require arguments take their arguments
+immediately following the option, usually separated by white space. It
+is also possible to stick the argument right after the short option
+name, using no intervening space. For example, you might write
+`-f archive.tar' or `-farchive.tar' instead of using
+`--file=archive.tar'. Both `--file=ARCHIVE-NAME' and `-f ARCHIVE-NAME'
+denote the option which indicates a specific archive, here named
+`archive.tar'.
+
+ Short options which take optional arguments take their arguments
+immediately following the option letter, _without any intervening white
+space characters_.
+
+ Short options' letters may be clumped together, but you are not
+required to do this (as compared to old options; see below). When
+short options are clumped as a set, use one (single) dash for them all,
+e.g., ``tar' -cvf'. Only the last option in such a set is allowed to
+have an argument(1).
+
+ When the options are separated, the argument for each option which
+requires an argument directly follows that option, as is usual for Unix
+programs. For example:
+
+ $ tar -c -v -b 20 -f /dev/rmt0
+
+ If you reorder short options' locations, be sure to move any
+arguments that belong to them. If you do not move the arguments
+properly, you may end up overwriting files.
+
+ ---------- Footnotes ----------
+
+ (1) Clustering many options, the last of which has an argument, is a
+rather opaque way to write options. Some wonder if GNU `getopt' should
+not even be made helpful enough for considering such usages as invalid.
+
+
+File: tar.info, Node: Old Options, Next: Mixing, Prev: Short Options, Up: Styles
+
+3.3.3 Old Option Style
+----------------------
+
+ _(This message will disappear, once this node revised.)_
+
+Like short options, "old options" are single letters. However, old
+options must be written together as a single clumped set, without
+spaces separating them or dashes preceding them(1). This set of
+letters must be the first to appear on the command line, after the
+`tar' program name and some white space; old options cannot appear
+anywhere else. The letter of an old option is exactly the same letter
+as the corresponding short option. For example, the old option `t' is
+the same as the short option `-t', and consequently, the same as the
+long option `--list'. So for example, the command `tar cv' specifies
+the option `-v' in addition to the operation `-c'.
+
+ When options that need arguments are given together with the command,
+all the associated arguments follow, in the same order as the options.
+Thus, the example given previously could also be written in the old
+style as follows:
+
+ $ tar cvbf 20 /dev/rmt0
+
+Here, `20' is the argument of `-b' and `/dev/rmt0' is the argument of
+`-f'.
+
+ On the other hand, this old style syntax makes it difficult to match
+option letters with their corresponding arguments, and is often
+confusing. In the command `tar cvbf 20 /dev/rmt0', for example, `20'
+is the argument for `-b', `/dev/rmt0' is the argument for `-f', and
+`-v' does not have a corresponding argument. Even using short options
+like in `tar -c -v -b 20 -f /dev/rmt0' is clearer, putting all
+arguments next to the option they pertain to.
+
+ If you want to reorder the letters in the old option argument, be
+sure to reorder any corresponding argument appropriately.
+
+ This old way of writing `tar' options can surprise even experienced
+users. For example, the two commands:
+
+ tar cfz archive.tar.gz file
+ tar -cfz archive.tar.gz file
+
+are quite different. The first example uses `archive.tar.gz' as the
+value for option `f' and recognizes the option `z'. The second
+example, however, uses `z' as the value for option `f' -- probably not
+what was intended.
+
+ Old options are kept for compatibility with old versions of `tar'.
+
+ This second example could be corrected in many ways, among which the
+following are equivalent:
+
+ tar -czf archive.tar.gz file
+ tar -cf archive.tar.gz -z file
+ tar cf archive.tar.gz -z file
+
+ As far as we know, all `tar' programs, GNU and non-GNU, support old
+options. GNU `tar' supports them not only for historical reasons, but
+also because many people are used to them. For compatibility with Unix
+`tar', the first argument is always treated as containing command and
+option letters even if it doesn't start with `-'. Thus, `tar c' is
+equivalent to `tar -c': both of them specify the `--create' (`-c')
+command to create an archive.
+
+ ---------- Footnotes ----------
+
+ (1) Beware that if you precede options with a dash, you are
+announcing the short option style instead of the old option style;
+short options are decoded differently.
+
+
+File: tar.info, Node: Mixing, Prev: Old Options, Up: Styles
+
+3.3.4 Mixing Option Styles
+--------------------------
+
+All three styles may be intermixed in a single `tar' command, so long
+as the rules for each style are fully respected(1). Old style options
+and either of the modern styles of options may be mixed within a single
+`tar' command. However, old style options must be introduced as the
+first arguments only, following the rule for old options (old options
+must appear directly after the `tar' command and some white space).
+Modern options may be given only after all arguments to the old options
+have been collected. If this rule is not respected, a modern option
+might be falsely interpreted as the value of the argument to one of the
+old style options.
+
+ For example, all the following commands are wholly equivalent, and
+illustrate the many combinations and orderings of option styles.
+
+ tar --create --file=archive.tar
+ tar --create -f archive.tar
+ tar --create -farchive.tar
+ tar --file=archive.tar --create
+ tar --file=archive.tar -c
+ tar -c --file=archive.tar
+ tar -c -f archive.tar
+ tar -c -farchive.tar
+ tar -cf archive.tar
+ tar -cfarchive.tar
+ tar -f archive.tar --create
+ tar -f archive.tar -c
+ tar -farchive.tar --create
+ tar -farchive.tar -c
+ tar c --file=archive.tar
+ tar c -f archive.tar
+ tar c -farchive.tar
+ tar cf archive.tar
+ tar f archive.tar --create
+ tar f archive.tar -c
+ tar fc archive.tar
+
+ On the other hand, the following commands are _not_ equivalent to
+the previous set:
+
+ tar -f -c archive.tar
+ tar -fc archive.tar
+ tar -fcarchive.tar
+ tar -farchive.tarc
+ tar cfarchive.tar
+
+These last examples mean something completely different from what the
+user intended (judging based on the example in the previous set which
+uses long options, whose intent is therefore very clear). The first
+four specify that the `tar' archive would be a file named `-c', `c',
+`carchive.tar' or `archive.tarc', respectively. The first two examples
+also specify a single non-option, NAME argument having the value
+`archive.tar'. The last example contains only old style option letters
+(repeating option `c' twice), not all of which are meaningful (eg., `.',
+`h', or `i'), with no argument value.
+
+ ---------- Footnotes ----------
+
+ (1) Before GNU `tar' version 1.11.6, a bug prevented intermixing old
+style options with long options in some cases.
+
+
+File: tar.info, Node: All Options, Next: help, Prev: Styles, Up: tar invocation
+
+3.4 All `tar' Options
+=====================
+
+The coming manual sections contain an alphabetical listing of all `tar'
+operations and options, with brief descriptions and cross references to
+more in-depth explanations in the body of the manual. They also
+contain an alphabetically arranged table of the short option forms with
+their corresponding long option. You can use this table as a reference
+for deciphering `tar' commands in scripts.
+
+* Menu:
+
+* Operation Summary::
+* Option Summary::
+* Short Option Summary::
+
+
+File: tar.info, Node: Operation Summary, Next: Option Summary, Up: All Options
+
+3.4.1 Operations
+----------------
+
+`--append'
+`-r'
+ Appends files to the end of the archive. *Note append::.
+
+`--catenate'
+`-A'
+ Same as `--concatenate'. *Note concatenate::.
+
+`--compare'
+`-d'
+ Compares archive members with their counterparts in the file
+ system, and reports differences in file size, mode, owner,
+ modification date and contents. *Note compare::.
+
+`--concatenate'
+`-A'
+ Appends other `tar' archives to the end of the archive. *Note
+ concatenate::.
+
+`--create'
+`-c'
+ Creates a new `tar' archive. *Note create::.
+
+`--delete'
+ Deletes members from the archive. Don't try this on a archive on a
+ tape! *Note delete::.
+
+`--diff'
+`-d'
+ Same `--compare'. *Note compare::.
+
+`--extract'
+`-x'
+ Extracts members from the archive into the file system. *Note
+ extract::.
+
+`--get'
+`-x'
+ Same as `--extract'. *Note extract::.
+
+`--list'
+`-t'
+ Lists the members in an archive. *Note list::.
+
+`--update'
+`-u'
+ Adds files to the end of the archive, but only if they are newer
+ than their counterparts already in the archive, or if they do not
+ already exist in the archive. *Note update::.
+
+
+
+File: tar.info, Node: Option Summary, Next: Short Option Summary, Prev: Operation Summary, Up: All Options
+
+3.4.2 `tar' Options
+-------------------
+
+`--absolute-names'
+`-P'
+ Normally when creating an archive, `tar' strips an initial `/'
+ from member names. This option disables that behavior. *Note
+ absolute::.
+
+`--after-date'
+ (See `--newer', *note after::)
+
+`--anchored'
+ A pattern must match an initial subsequence of the name's
+ components. *Note controlling pattern-matching::.
+
+`--atime-preserve'
+`--atime-preserve=replace'
+`--atime-preserve=system'
+ Attempt to preserve the access time of files when reading them.
+ This option currently is effective only on files that you own,
+ unless you have superuser privileges.
+
+ `--atime-preserve=replace' remembers the access time of a file
+ before reading it, and then restores the access time afterwards.
+ This may cause problems if other programs are reading the file at
+ the same time, as the times of their accesses will be lost. On
+ most platforms restoring the access time also requires `tar' to
+ restore the data modification time too, so this option may also
+ cause problems if other programs are writing the file at the same
+ time. (Tar attempts to detect this situation, but cannot do so
+ reliably due to race conditions.) Worse, on most platforms
+ restoring the access time also updates the status change time,
+ which means that this option is incompatible with incremental
+ backups.
+
+ `--atime-preserve=system' avoids changing time stamps on files,
+ without interfering with time stamp updates caused by other
+ programs, so it works better with incremental backups. However,
+ it requires a special `O_NOATIME' option from the underlying
+ operating and file system implementation, and it also requires
+ that searching directories does not update their access times. As
+ of this writing (November 2005) this works only with Linux, and
+ only with Linux kernels 2.6.8 and later. Worse, there is
+ currently no reliable way to know whether this feature actually
+ works. Sometimes `tar' knows that it does not work, and if you use
+ `--atime-preserve=system' then `tar' complains and exits right
+ away. But other times `tar' might think that the option works
+ when it actually does not.
+
+ Currently `--atime-preserve' with no operand defaults to
+ `--atime-preserve=replace', but this may change in the future as
+ support for `--atime-preserve=system' improves.
+
+ If your operating system does not support
+ `--atime-preserve=system', you might be able to preserve access
+ times reliably by by using the `mount' command. For example, you
+ can mount the file system read-only, or access the file system via
+ a read-only loopback mount, or use the `noatime' mount option
+ available on some systems. However, mounting typically requires
+ superuser privileges and can be a pain to manage.
+
+`--backup=BACKUP-TYPE'
+ Rather than deleting files from the file system, `tar' will back
+ them up using simple or numbered backups, depending upon
+ BACKUP-TYPE. *Note backup::.
+
+`--block-number'
+`-R'
+ With this option present, `tar' prints error messages for read
+ errors with the block number in the archive file. *Note
+ block-number::.
+
+`--blocking-factor=BLOCKING'
+`-b BLOCKING'
+ Sets the blocking factor `tar' uses to BLOCKING x 512 bytes per
+ record. *Note Blocking Factor::.
+
+`--bzip2'
+`-j'
+ This option tells `tar' to read or write archives through `bzip2'.
+ *Note gzip::.
+
+`--checkpoint[=NUMBER]'
+ This option directs `tar' to print periodic checkpoint messages as
+ it reads through the archive. It is intended for when you want a
+ visual indication that `tar' is still running, but don't want to
+ see `--verbose' output. For a detailed description, see *note
+ Progress information::.
+
+`--check-links'
+`-l'
+ If this option was given, `tar' will check the number of links
+ dumped for each processed file. If this number does not match the
+ total number of hard links for the file, a warning message will be
+ output (1).
+
+`--compress'
+`--uncompress'
+`-Z'
+ `tar' will use the `compress' program when reading or writing the
+ archive. This allows you to directly act on archives while saving
+ space. *Note gzip::.
+
+`--confirmation'
+ (See `--interactive'.) *Note interactive::.
+
+`--delay-directory-restore'
+ Delay setting modification times and permissions of extracted
+ directories until the end of extraction. *Note Directory
+ Modification Times and Permissions::.
+
+`--dereference'
+`-h'
+ When creating a `tar' archive, `tar' will archive the file that a
+ symbolic link points to, rather than archiving the symlink. *Note
+ dereference::.
+
+`--directory=DIR'
+`-C DIR'
+ When this option is specified, `tar' will change its current
+ directory to DIR before performing any operations. When this
+ option is used during archive creation, it is order sensitive.
+ *Note directory::.
+
+`--exclude=PATTERN'
+ When performing operations, `tar' will skip files that match
+ PATTERN. *Note exclude::.
+
+`--exclude-from=FILE'
+`-X FILE'
+ Similar to `--exclude', except `tar' will use the list of patterns
+ in the file FILE. *Note exclude::.
+
+`--exclude-caches'
+ Exclude from dump any directory containing a valid cache directory
+ tag file, but still dump the directory node and the tag file
+ itself.
+
+ *Note exclude::.
+
+`--exclude-caches-under'
+ Exclude from dump any directory containing a valid cache directory
+ tag file, but still dump the directory node itself.
+
+ *Note exclude::.
+
+`--exclude-caches-all'
+ Exclude from dump any directory containing a valid cache directory
+ tag file. *Note exclude::.
+
+`--exclude-tag=FILE'
+ Exclude from dump any directory containing file named FILE, but
+ dump the directory node and FILE itself. *Note exclude::.
+
+`--exclude-tag-under=FILE'
+ Exclude from dump the contents of any directory containing file
+ named FILE, but dump the directory node itself. *Note exclude::.
+
+`--exclude-tag-all=FILE'
+ Exclude from dump any directory containing file named FILE. *Note
+ exclude::.
+
+`--file=ARCHIVE'
+`-f ARCHIVE'
+ `tar' will use the file ARCHIVE as the `tar' archive it performs
+ operations on, rather than `tar''s compilation dependent default.
+ *Note file tutorial::.
+
+`--files-from=FILE'
+`-T FILE'
+ `tar' will use the contents of FILE as a list of archive members
+ or files to operate on, in addition to those specified on the
+ command-line. *Note files::.
+
+`--force-local'
+ Forces `tar' to interpret the file name given to `--file' as a
+ local file, even if it looks like a remote tape drive name. *Note
+ local and remote archives::.
+
+`--format=FORMAT'
+`-H FORMAT'
+ Selects output archive format. FORMAT may be one of the following:
+
+ `v7'
+ Creates an archive that is compatible with Unix V7 `tar'.
+
+ `oldgnu'
+ Creates an archive that is compatible with GNU `tar' version
+ 1.12 or earlier.
+
+ `gnu'
+ Creates archive in GNU tar 1.13 format. Basically it is the
+ same as `oldgnu' with the only difference in the way it
+ handles long numeric fields.
+
+ `ustar'
+ Creates a POSIX.1-1988 compatible archive.
+
+ `posix'
+ Creates a POSIX.1-2001 archive.
+
+
+ *Note Formats::, for a detailed discussion of these formats.
+
+`--group=GROUP'
+ Files added to the `tar' archive will have a group ID of GROUP,
+ rather than the group from the source file. GROUP is first decoded
+ as a group symbolic name, but if this interpretation fails, it has
+ to be a decimal numeric group ID. *Note override::.
+
+ Also see the comments for the `--owner=USER' option.
+
+`--gzip'
+`--gunzip'
+`--ungzip'
+`-z'
+ This option tells `tar' to read or write archives through `gzip',
+ allowing `tar' to directly operate on several kinds of compressed
+ archives transparently. *Note gzip::.
+
+`--help'
+`-?'
+ `tar' will print out a short message summarizing the operations and
+ options to `tar' and exit. *Note help::.
+
+`--ignore-case'
+ Ignore case when matching member or file names with patterns.
+ *Note controlling pattern-matching::.
+
+`--ignore-command-error'
+ Ignore exit codes of subprocesses. *Note Writing to an External
+ Program::.
+
+`--ignore-failed-read'
+ Do not exit unsuccessfully merely because an unreadable file was
+ encountered. *Note Reading::.
+
+`--ignore-zeros'
+`-i'
+ With this option, `tar' will ignore zeroed blocks in the archive,
+ which normally signals EOF. *Note Reading::.
+
+`--incremental'
+`-G'
+ Informs `tar' that it is working with an old GNU-format
+ incremental backup archive. It is intended primarily for
+ backwards compatibility only. *Note Incremental Dumps::, for a
+ detailed discussion of incremental archives.
+
+`--index-file=FILE'
+ Send verbose output to FILE instead of to standard output.
+
+`--info-script=SCRIPT-FILE'
+`--new-volume-script=SCRIPT-FILE'
+`-F SCRIPT-FILE'
+ When `tar' is performing multi-tape backups, SCRIPT-FILE is run at
+ the end of each tape. If SCRIPT-FILE exits with nonzero status,
+ `tar' fails immediately. *Note info-script::, for a detailed
+ discussion of SCRIPT-FILE.
+
+`--interactive'
+`--confirmation'
+`-w'
+ Specifies that `tar' should ask the user for confirmation before
+ performing potentially destructive options, such as overwriting
+ files. *Note interactive::.
+
+`--keep-newer-files'
+ Do not replace existing files that are newer than their archive
+ copies when extracting files from an archive.
+
+`--keep-old-files'
+`-k'
+ Do not overwrite existing files when extracting files from an
+ archive. *Note Keep Old Files::.
+
+`--label=NAME'
+`-V NAME'
+ When creating an archive, instructs `tar' to write NAME as a name
+ record in the archive. When extracting or listing archives, `tar'
+ will only operate on archives that have a label matching the
+ pattern specified in NAME. *Note Tape Files::.
+
+`--listed-incremental=SNAPSHOT-FILE'
+`-g SNAPSHOT-FILE'
+ During a `--create' operation, specifies that the archive that
+ `tar' creates is a new GNU-format incremental backup, using
+ SNAPSHOT-FILE to determine which files to backup. With other
+ operations, informs `tar' that the archive is in incremental
+ format. *Note Incremental Dumps::.
+
+`--mode=PERMISSIONS'
+ When adding files to an archive, `tar' will use PERMISSIONS for
+ the archive members, rather than the permissions from the files.
+ PERMISSIONS can be specified either as an octal number or as
+ symbolic permissions, like with `chmod'. *Note override::.
+
+`--mtime=DATE'
+ When adding files to an archive, `tar' will use DATE as the
+ modification time of members when creating archives, instead of
+ their actual modification times. The value of DATE can be either
+ a textual date representation (*note Date input formats::) or a
+ name of the existing file, starting with `/' or `.'. In the
+ latter case, the modification time of that file is used. *Note
+ override::.
+
+`--multi-volume'
+`-M'
+ Informs `tar' that it should create or otherwise operate on a
+ multi-volume `tar' archive. *Note Using Multiple Tapes::.
+
+`--new-volume-script'
+ (see -info-script)
+
+`--newer=DATE'
+`--after-date=DATE'
+`-N'
+ When creating an archive, `tar' will only add files that have
+ changed since DATE. If DATE begins with `/' or `.', it is taken
+ to be the name of a file whose data modification time specifies
+ the date. *Note after::.
+
+`--newer-mtime=DATE'
+ Like `--newer', but add only files whose contents have changed (as
+ opposed to just `--newer', which will also back up files for which
+ any status information has changed). *Note after::.
+
+`--no-anchored'
+ An exclude pattern can match any subsequence of the name's
+ components. *Note controlling pattern-matching::.
+
+`--no-delay-directory-restore'
+ Modification times and permissions of extracted directories are
+ set when all files from this directory have been extracted. This
+ is the default. *Note Directory Modification Times and
+ Permissions::.
+
+`--no-ignore-case'
+ Use case-sensitive matching. *Note controlling pattern-matching::.
+
+`--no-ignore-command-error'
+ Print warnings about subprocesses that terminated with a nonzero
+ exit code. *Note Writing to an External Program::.
+
+`--no-overwrite-dir'
+ Preserve metadata of existing directories when extracting files
+ from an archive. *Note Overwrite Old Files::.
+
+`--no-quote-chars=STRING'
+ Remove characters listed in STRING from the list of quoted
+ characters set by the previous `--quote-chars' option (*note
+ quoting styles::).
+
+`--no-recursion'
+ With this option, `tar' will not recurse into directories. *Note
+ recurse::.
+
+`--no-same-owner'
+`-o'
+ When extracting an archive, do not attempt to preserve the owner
+ specified in the `tar' archive. This the default behavior for
+ ordinary users.
+
+`--no-same-permissions'
+ When extracting an archive, subtract the user's umask from files
+ from the permissions specified in the archive. This is the
+ default behavior for ordinary users.
+
+`--no-unquote'
+ Treat all input file or member names literally, do not interpret
+ escape sequences. *Note input name quoting::.
+
+`--no-wildcards'
+ Do not use wildcards. *Note controlling pattern-matching::.
+
+`--no-wildcards-match-slash'
+ Wildcards do not match `/'. *Note controlling pattern-matching::.
+
+`--null'
+ When `tar' is using the `--files-from' option, this option
+ instructs `tar' to expect file names terminated with NUL, so `tar'
+ can correctly work with file names that contain newlines. *Note
+ nul::.
+
+`--numeric-owner'
+ This option will notify `tar' that it should use numeric user and
+ group IDs when creating a `tar' file, rather than names. *Note
+ Attributes::.
+
+`-o'
+ The function of this option depends on the action `tar' is
+ performing. When extracting files, `-o' is a synonym for
+ `--no-same-owner', i.e., it prevents `tar' from restoring
+ ownership of files being extracted.
+
+ When creating an archive, it is a synonym for `--old-archive'.
+ This behavior is for compatibility with previous versions of GNU
+ `tar', and will be removed in future releases.
+
+ *Note Changes::, for more information.
+
+`--occurrence[=NUMBER]'
+ This option can be used in conjunction with one of the subcommands
+ `--delete', `--diff', `--extract' or `--list' when a list of files
+ is given either on the command line or via `-T' option.
+
+ This option instructs `tar' to process only the NUMBERth
+ occurrence of each named file. NUMBER defaults to 1, so
+
+ tar -x -f archive.tar --occurrence filename
+
+ will extract the first occurrence of the member `filename' from
+ `archive.tar' and will terminate without scanning to the end of
+ the archive.
+
+`--old-archive'
+ Synonym for `--format=v7'.
+
+`--one-file-system'
+ Used when creating an archive. Prevents `tar' from recursing into
+ directories that are on different file systems from the current
+ directory (2).
+
+`--overwrite'
+ Overwrite existing files and directory metadata when extracting
+ files from an archive. *Note Overwrite Old Files::.
+
+`--overwrite-dir'
+ Overwrite the metadata of existing directories when extracting
+ files from an archive. *Note Overwrite Old Files::.
+
+`--owner=USER'
+ Specifies that `tar' should use USER as the owner of members when
+ creating archives, instead of the user associated with the source
+ file. USER is first decoded as a user symbolic name, but if this
+ interpretation fails, it has to be a decimal numeric user ID.
+ *Note override::.
+
+ This option does not affect extraction from archives.
+
+`--pax-option=KEYWORD-LIST'
+ This option is meaningful only with POSIX.1-2001 archives (*note
+ posix::). It modifies the way `tar' handles the extended header
+ keywords. KEYWORD-LIST is a comma-separated list of keyword
+ options. *Note PAX keywords::, for a detailed discussion.
+
+`--portability'
+`--old-archive'
+ Synonym for `--format=v7'.
+
+`--posix'
+ Same as `--format=posix'.
+
+`--preserve'
+ Synonymous with specifying both `--preserve-permissions' and
+ `--same-order'. *Note Setting Access Permissions::.
+
+`--preserve-order'
+ (See `--same-order'; *note Reading::.)
+
+`--preserve-permissions'
+`--same-permissions'
+`-p'
+ When `tar' is extracting an archive, it normally subtracts the
+ users' umask from the permissions specified in the archive and uses
+ that number as the permissions to create the destination file.
+ Specifying this option instructs `tar' that it should use the
+ permissions directly from the archive. *Note Setting Access
+ Permissions::.
+
+`--quote-chars=STRING'
+ Always quote characters from STRING, even if the selected quoting
+ style would not quote them (*note quoting styles::).
+
+`--quoting-style=STYLE'
+ Set quoting style to use when printing member and file names
+ (*note quoting styles::). Valid STYLE values are: `literal',
+ `shell', `shell-always', `c', `escape', `locale', and `clocale'.
+ Default quoting style is `escape', unless overridden while
+ configuring the package.
+
+`--read-full-records'
+`-B'
+ Specifies that `tar' should reblock its input, for reading from
+ pipes on systems with buggy implementations. *Note Reading::.
+
+`--record-size=SIZE'
+ Instructs `tar' to use SIZE bytes per record when accessing the
+ archive. *Note Blocking Factor::.
+
+`--recursion'
+ With this option, `tar' recurses into directories (default).
+ *Note recurse::.
+
+`--recursive-unlink'
+ Remove existing directory hierarchies before extracting
+ directories of the same name from the archive. *Note Recursive
+ Unlink::.
+
+`--remove-files'
+ Directs `tar' to remove the source file from the file system after
+ appending it to an archive. *Note remove files::.
+
+`--restrict'
+ Disable use of some potentially harmful `tar' options. Currently
+ this option disables shell invocation from multi-volume menu
+ (*note Using Multiple Tapes::).
+
+`--rmt-command=CMD'
+ Notifies `tar' that it should use CMD instead of the default
+ `/usr/libexec/rmt' (*note Remote Tape Server::).
+
+`--rsh-command=CMD'
+ Notifies `tar' that is should use CMD to communicate with remote
+ devices. *Note Device::.
+
+`--same-order'
+`--preserve-order'
+`-s'
+ This option is an optimization for `tar' when running on machines
+ with small amounts of memory. It informs `tar' that the list of
+ file arguments has already been sorted to match the order of files
+ in the archive. *Note Reading::.
+
+`--same-owner'
+ When extracting an archive, `tar' will attempt to preserve the
+ owner specified in the `tar' archive with this option present.
+ This is the default behavior for the superuser; this option has an
+ effect only for ordinary users. *Note Attributes::.
+
+`--same-permissions'
+ (See `--preserve-permissions'; *note Setting Access Permissions::.)
+
+`--seek'
+`-n'
+ Assume that the archive media supports seeks to arbitrary
+ locations. Usually `tar' determines automatically whether the
+ archive can be seeked or not. This option is intended for use in
+ cases when such recognition fails.
+
+`--show-defaults'
+ Displays the default options used by `tar' and exits successfully.
+ This option is intended for use in shell scripts. Here is an
+ example of what you can see using this option:
+
+ $ tar --show-defaults
+ --format=gnu -f- -b20 --quoting-style=escape \
+ --rmt-command=/usr/libexec/rmt --rsh-command=/usr/bin/rsh
+
+`--show-omitted-dirs'
+ Instructs `tar' to mention the directories it is skipping when
+ operating on a `tar' archive. *Note show-omitted-dirs::.
+
+`--show-transformed-names'
+`--show-stored-names'
+ Display file or member names after applying any transformations
+ (*note transform::). In particular, when used in conjunction with
+ one of the archive creation operations it instructs `tar' to list
+ the member names stored in the archive, as opposed to the actual
+ file names. *Note listing member and file names::.
+
+`--sparse'
+`-S'
+ Invokes a GNU extension when adding files to an archive that
+ handles sparse files efficiently. *Note sparse::.
+
+`--sparse-version=VERSION'
+ Specifies the "format version" to use when archiving sparse files.
+ Implies `--sparse'. *Note sparse::. For the description of the
+ supported sparse formats, *Note Sparse Formats::.
+
+`--starting-file=NAME'
+`-K NAME'
+ This option affects extraction only; `tar' will skip extracting
+ files in the archive until it finds one that matches NAME. *Note
+ Scarce::.
+
+`--strip-components=NUMBER'
+ Strip given NUMBER of leading components from file names before
+ extraction. For example, if archive `archive.tar' contained
+ `/some/file/name', then running
+
+ tar --extract --file archive.tar --strip-components=2
+
+ would extract this file to file `name'.
+
+ , summary
+
+`--suffix=SUFFIX'
+ Alters the suffix `tar' uses when backing up files from the default
+ `~'. *Note backup::.
+
+`--tape-length=NUM'
+`-L NUM'
+ Specifies the length of tapes that `tar' is writing as being
+ NUM x 1024 bytes long. *Note Using Multiple Tapes::.
+
+`--test-label'
+ Reads the volume label. If an argument is specified, test whether
+ it matches the volume label. *Note --test-label option::.
+
+`--to-command=COMMAND'
+ During extraction `tar' will pipe extracted files to the standard
+ input of COMMAND. *Note Writing to an External Program::.
+
+`--to-stdout'
+`-O'
+ During extraction, `tar' will extract files to stdout rather than
+ to the file system. *Note Writing to Standard Output::.
+
+`--totals[=SIGNO]'
+ Displays the total number of bytes transferred when processing an
+ archive. If an argument is given, these data are displayed on
+ request, when signal SIGNO is delivered to `tar'. *Note totals::.
+
+`--touch'
+`-m'
+ Sets the data modification time of extracted files to the
+ extraction time, rather than the data modification time stored in
+ the archive. *Note Data Modification Times::.
+
+`--transform=SED-EXPR'
+ Transform file or member names using `sed' replacement expression
+ SED-EXPR. For example,
+
+ $ tar cf archive.tar --transform 's,^\./,usr/,' .
+
+ will add to `archive' files from the current working directory,
+ replacing initial `./' prefix with `usr/'. For the detailed
+ discussion, *Note transform::.
+
+ To see transformed member names in verbose listings, use
+ `--show-transformed-names' option (*note show-transformed-names::).
+
+`--uncompress'
+ (See `--compress'. *note gzip::)
+
+`--ungzip'
+ (See `--gzip'. *note gzip::)
+
+`--unlink-first'
+`-U'
+ Directs `tar' to remove the corresponding file from the file
+ system before extracting it from the archive. *Note Unlink
+ First::.
+
+`--unquote'
+ Enable unquoting input file or member names (default). *Note
+ input name quoting::.
+
+`--use-compress-program=PROG'
+ Instructs `tar' to access the archive through PROG, which is
+ presumed to be a compression program of some sort. *Note gzip::.
+
+`--utc'
+ Display file modification dates in UTC. This option implies
+ `--verbose'.
+
+`--verbose'
+`-v'
+ Specifies that `tar' should be more verbose about the operations
+ it is performing. This option can be specified multiple times for
+ some operations to increase the amount of information displayed.
+ *Note verbose::.
+
+`--verify'
+`-W'
+ Verifies that the archive was correctly written when creating an
+ archive. *Note verify::.
+
+`--version'
+ Print information about the program's name, version, origin and
+ legal status, all on standard output, and then exit successfully.
+ *Note help::.
+
+`--volno-file=FILE'
+ Used in conjunction with `--multi-volume'. `tar' will keep track
+ of which volume of a multi-volume archive it is working in FILE.
+ *Note volno-file::.
+
+`--wildcards'
+ Use wildcards when matching member names with patterns. *Note
+ controlling pattern-matching::.
+
+`--wildcards-match-slash'
+ Wildcards match `/'. *Note controlling pattern-matching::.
+
+ ---------- Footnotes ----------
+
+ (1) Earlier versions of GNU `tar' understood `-l' as a synonym for
+`--one-file-system'. The current semantics, which complies to UNIX98,
+was introduced with version 1.15.91. *Note Changes::, for more
+information.
+
+ (2) Earlier versions of GNU `tar' understood `-l' as a synonym for
+`--one-file-system'. This has changed in version 1.15.91. *Note
+Changes::, for more information.
+
+
+File: tar.info, Node: Short Option Summary, Prev: Option Summary, Up: All Options
+
+3.4.3 Short Options Cross Reference
+-----------------------------------
+
+Here is an alphabetized list of all of the short option forms, matching
+them with the equivalent long option.
+
+Short Option Reference
+--------------------------------------------------------------------------
+-A *note --concatenate::.
+-B *note --read-full-records::.
+-C *note --directory::.
+-F *note --info-script::.
+-G *note --incremental::.
+-K *note --starting-file::.
+-L *note --tape-length::.
+-M *note --multi-volume::.
+-N *note --newer::.
+-O *note --to-stdout::.
+-P *note --absolute-names::.
+-R *note --block-number::.
+-S *note --sparse::.
+-T *note --files-from::.
+-U *note --unlink-first::.
+-V *note --label::.
+-W *note --verify::.
+-X *note --exclude-from::.
+-Z *note --compress::.
+-b *note --blocking-factor::.
+-c *note --create::.
+-d *note --compare::.
+-f *note --file::.
+-g *note --listed-incremental::.
+-h *note --dereference::.
+-i *note --ignore-zeros::.
+-j *note --bzip2::.
+-k *note --keep-old-files::.
+-l *note --check-links::.
+-m *note --touch::.
+-o When creating, *note --no-same-owner::, when extracting --
+ *note --portability::.
+
+ The later usage is deprecated. It is retained for
+ compatibility with the earlier versions of GNU `tar'. In
+ future releases `-o' will be equivalent to
+ `--no-same-owner' only.
+-p *note --preserve-permissions::.
+-r *note --append::.
+-s *note --same-order::.
+-t *note --list::.
+-u *note --update::.
+-v *note --verbose::.
+-w *note --interactive::.
+-x *note --extract::.
+-z *note --gzip::.
+
+
+File: tar.info, Node: help, Next: defaults, Prev: All Options, Up: tar invocation
+
+3.5 GNU `tar' documentation
+===========================
+
+Being careful, the first thing is really checking that you are using
+GNU `tar', indeed. The `--version' option causes `tar' to print
+information about its name, version, origin and legal status, all on
+standard output, and then exit successfully. For example,
+`tar --version' might print:
+
+ tar (GNU tar) 1.17
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This is free software. You may redistribute copies of it under the terms
+ of the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
+ There is NO WARRANTY, to the extent permitted by law.
+
+ Written by John Gilmore and Jay Fenlason.
+
+The first occurrence of `tar' in the result above is the program name
+in the package (for example, `rmt' is another program), while the
+second occurrence of `tar' is the name of the package itself,
+containing possibly many programs. The package is currently named
+`tar', after the name of the main program it contains(1).
+
+ Another thing you might want to do is checking the spelling or
+meaning of some particular `tar' option, without resorting to this
+manual, for once you have carefully read it. GNU `tar' has a short
+help feature, triggerable through the `--help' option. By using this
+option, `tar' will print a usage message listing all available options
+on standard output, then exit successfully, without doing anything else
+and ignoring all other options. Even if this is only a brief summary,
+it may be several screens long. So, if you are not using some kind of
+scrollable window, you might prefer to use something like:
+
+ $ tar --help | less
+
+presuming, here, that you like using `less' for a pager. Other popular
+pagers are `more' and `pg'. If you know about some KEYWORD which
+interests you and do not want to read all the `--help' output, another
+common idiom is doing:
+
+ tar --help | grep KEYWORD
+
+for getting only the pertinent lines. Notice, however, that some `tar'
+options have long description lines and the above command will list
+only the first of them.
+
+ The exact look of the option summary displayed by `tar --help' is
+configurable. *Note Configuring Help Summary::, for a detailed
+description.
+
+ If you only wish to check the spelling of an option, running `tar
+--usage' may be a better choice. This will display a terse list of
+`tar' option without accompanying explanations.
+
+ The short help output is quite succinct, and you might have to get
+back to the full documentation for precise points. If you are reading
+this paragraph, you already have the `tar' manual in some form. This
+manual is available in a variety of forms from
+`http://www.gnu.org/software/tar/manual'. It may be printed out of the
+GNU `tar' distribution, provided you have TeX already installed
+somewhere, and a laser printer around. Just configure the
+distribution, execute the command `make dvi', then print `doc/tar.dvi'
+the usual way (contact your local guru to know how). If GNU `tar' has
+been conveniently installed at your place, this manual is also
+available in interactive, hypertextual form as an Info file. Just call
+`info tar' or, if you do not have the `info' program handy, use the
+Info reader provided within GNU Emacs, calling `tar' from the main Info
+menu.
+
+ There is currently no `man' page for GNU `tar'. If you observe such
+a `man' page on the system you are running, either it does not belong
+to GNU `tar', or it has not been produced by GNU. Some package
+maintainers convert `tar --help' output to a man page, using
+`help2man'. In any case, please bear in mind that the authoritative
+source of information about GNU `tar' is this Texinfo documentation.
+
+ ---------- Footnotes ----------
+
+ (1) There are plans to merge the `cpio' and `tar' packages into a
+single one which would be called `paxutils'. So, who knows if, one of
+this days, the `--version' would not output `tar (GNU paxutils) 3.2'
+
+
+File: tar.info, Node: defaults, Next: verbose, Prev: help, Up: tar invocation
+
+3.6 Obtaining GNU `tar' default values
+======================================
+
+GNU `tar' has some predefined defaults that are used when you do not
+explicitly specify another values. To obtain a list of such defaults,
+use `--show-defaults' option. This will output the values in the form
+of `tar' command line options:
+
+ tar --show-defaults
+ --format=gnu -f- -b20 --quoting-style=escape
+ --rmt-command=/etc/rmt --rsh-command=/usr/bin/rsh
+
+Notice, that this option outputs only one line. The example output
+above has been split to fit page boundaries.
+
+The above output shows that this version of GNU `tar' defaults to using
+`gnu' archive format (*note Formats::), it uses standard output as the
+archive, if no `--file' option has been given (*note file tutorial::),
+the default blocking factor is 20 (*note Blocking Factor::). It also
+shows the default locations where `tar' will look for `rmt' and `rsh'
+binaries.
+
+
+File: tar.info, Node: verbose, Next: interactive, Prev: defaults, Up: tar invocation
+
+3.7 Checking `tar' progress
+===========================
+
+Typically, `tar' performs most operations without reporting any
+information to the user except error messages. When using `tar' with
+many options, particularly ones with complicated or
+difficult-to-predict behavior, it is possible to make serious mistakes.
+`tar' provides several options that make observing `tar' easier. These
+options cause `tar' to print information as it progresses in its job,
+and you might want to use them just for being more careful about what
+is going on, or merely for entertaining yourself. If you have
+encountered a problem when operating on an archive, however, you may
+need more information than just an error message in order to solve the
+problem. The following options can be helpful diagnostic tools.
+
+ Normally, the `--list' (`-t') command to list an archive prints just
+the file names (one per line) and the other commands are silent. When
+used with most operations, the `--verbose' (`-v') option causes `tar'
+to print the name of each file or archive member as it is processed.
+This and the other options which make `tar' print status information
+can be useful in monitoring `tar'.
+
+ With `--create' or `--extract', `--verbose' used once just prints
+the names of the files or members as they are processed. Using it
+twice causes `tar' to print a longer listing (*Note verbose member
+listing::, for the description) for each member. Since `--list'
+already prints the names of the members, `--verbose' used once with
+`--list' causes `tar' to print an `ls -l' type listing of the files in
+the archive. The following examples both extract members with long
+list output:
+
+ $ tar --extract --file=archive.tar --verbose --verbose
+ $ tar xvvf archive.tar
+
+ Verbose output appears on the standard output except when an archive
+is being written to the standard output, as with `tar --create --file=-
+--verbose' (`tar cfv -', or even `tar cv'--if the installer let
+standard output be the default archive). In that case `tar' writes
+verbose output to the standard error stream.
+
+ If `--index-file=FILE' is specified, `tar' sends verbose output to
+FILE rather than to standard output or standard error.
+
+ The `--totals' option causes `tar' to print on the standard error
+the total amount of bytes transferred when processing an archive. When
+creating or appending to an archive, this option prints the number of
+bytes written to the archive and the average speed at which they have
+been written, e.g.:
+
+ $ tar -c -f archive.tar --totals /home
+ Total bytes written: 7924664320 (7.4GiB, 85MiB/s)
+
+ When reading an archive, this option displays the number of bytes
+read:
+
+ $ tar -x -f archive.tar --totals
+ Total bytes read: 7924664320 (7.4GiB, 95MiB/s)
+
+ Finally, when deleting from an archive, the `--totals' option
+displays both numbers plus number of bytes removed from the archive:
+
+ $ tar --delete -f foo.tar --totals --wildcards '*~'
+ Total bytes read: 9543680 (9.2MiB, 201MiB/s)
+ Total bytes written: 3829760 (3.7MiB, 81MiB/s)
+ Total bytes deleted: 1474048
+
+ You can also obtain this information on request. When `--totals' is
+used with an argument, this argument is interpreted as a symbolic name
+of a signal, upon delivery of which the statistics is to be printed:
+
+`--totals=SIGNO'
+ Print statistics upon delivery of signal SIGNO. Valid arguments
+ are: `SIGHUP', `SIGQUIT', `SIGINT', `SIGUSR1' and `SIGUSR2'.
+ Shortened names without `SIG' prefix are also accepted.
+
+ Both forms of `--totals' option can be used simultaneously. Thus,
+`tar -x --totals --totals=USR1' instructs `tar' to extract all members
+from its default archive and print statistics after finishing the
+extraction, as well as when receiving signal `SIGUSR1'.
+
+ The `--checkpoint' option prints an occasional message as `tar'
+reads or writes the archive. It is designed for those who don't need
+the more detailed (and voluminous) output of `--block-number' (`-R'),
+but do want visual confirmation that `tar' is actually making forward
+progress. By default it prints a message each 10 records read or
+written. This can be changed by giving it a numeric argument after an
+equal sign:
+
+ $ tar -c --checkpoint=1000 /var
+ tar: Write checkpoint 1000
+ tar: Write checkpoint 2000
+ tar: Write checkpoint 3000
+
+ This example shows the default checkpoint message used by `tar'. If
+you place a dot immediately after the equal sign, it will print a `.'
+at each checkpoint. For example:
+
+ $ tar -c --checkpoint=.1000 /var
+ ...
+
+ The `--show-omitted-dirs' option, when reading an archive--with
+`--list' or `--extract', for example--causes a message to be printed
+for each directory in the archive which is skipped. This happens
+regardless of the reason for skipping: the directory might not have
+been named on the command line (implicitly or explicitly), it might be
+excluded by the use of the `--exclude=PATTERN' option, or some other
+reason.
+
+ If `--block-number' (`-R') is used, `tar' prints, along with every
+message it would normally produce, the block number within the archive
+where the message was triggered. Also, supplementary messages are
+triggered when reading blocks full of NULs, or when hitting end of file
+on the archive. As of now, if the archive if properly terminated with
+a NUL block, the reading of the file may stop before end of file is
+met, so the position of end of file will not usually show when
+`--block-number' (`-R') is used. Note that GNU `tar' drains the
+archive before exiting when reading the archive from a pipe.
+
+ This option is especially useful when reading damaged archives, since
+it helps pinpoint the damaged sections. It can also be used with
+`--list' (`-t') when listing a file-system backup tape, allowing you to
+choose among several backup tapes when retrieving a file later, in
+favor of the tape where the file appears earliest (closest to the front
+of the tape). *Note backup::.
+
+
+File: tar.info, Node: interactive, Prev: verbose, Up: tar invocation
+
+3.8 Asking for Confirmation During Operations
+=============================================
+
+Typically, `tar' carries out a command without stopping for further
+instructions. In some situations however, you may want to exclude some
+files and archive members from the operation (for instance if disk or
+storage space is tight). You can do this by excluding certain files
+automatically (*note Choosing::), or by performing an operation
+interactively, using the `--interactive' (`-w') option. `tar' also
+accepts `--confirmation' for this option.
+
+ When the `--interactive' (`-w') option is specified, before reading,
+writing, or deleting files, `tar' first prints a message for each such
+file, telling what operation it intends to take, then asks for
+confirmation on the terminal. The actions which require confirmation
+include adding a file to the archive, extracting a file from the
+archive, deleting a file from the archive, and deleting a file from
+disk. To confirm the action, you must type a line of input beginning
+with `y'. If your input line begins with anything other than `y',
+`tar' skips that file.
+
+ If `tar' is reading the archive from the standard input, `tar' opens
+the file `/dev/tty' to support the interactive communications.
+
+ Verbose output is normally sent to standard output, separate from
+other error messages. However, if the archive is produced directly on
+standard output, then verbose output is mixed with errors on `stderr'.
+Producing the archive on standard output may be used as a way to avoid
+using disk space, when the archive is soon to be consumed by another
+process reading it, say. Some people felt the need of producing an
+archive on stdout, still willing to segregate between verbose output
+and error output. A possible approach would be using a named pipe to
+receive the archive, and having the consumer process to read from that
+named pipe. This has the advantage of letting standard output free to
+receive verbose output, all separate from errors.
+
+
+File: tar.info, Node: operations, Next: Backups, Prev: tar invocation, Up: Top
+
+4 GNU `tar' Operations
+**********************
+
+* Menu:
+
+* Basic tar::
+* Advanced tar::
+* create options::
+* extract options::
+* backup::
+* Applications::
+* looking ahead::
+
+
+File: tar.info, Node: Basic tar, Next: Advanced tar, Up: operations
+
+4.1 Basic GNU `tar' Operations
+==============================
+
+The basic `tar' operations, `--create' (`-c'), `--list' (`-t') and
+`--extract' (`--get', `-x'), are currently presented and described in
+the tutorial chapter of this manual. This section provides some
+complementary notes for these operations.
+
+`--create'
+`-c'
+ Creating an empty archive would have some kind of elegance. One
+ can initialize an empty archive and later use `--append' (`-r')
+ for adding all members. Some applications would not welcome
+ making an exception in the way of adding the first archive member.
+ On the other hand, many people reported that it is dangerously
+ too easy for `tar' to destroy a magnetic tape with an empty
+ archive(1). The two most common errors are:
+
+ 1. Mistakingly using `create' instead of `extract', when the
+ intent was to extract the full contents of an archive. This
+ error is likely: keys `c' and `x' are right next to each
+ other on the QWERTY keyboard. Instead of being unpacked, the
+ archive then gets wholly destroyed. When users speak about
+ "exploding" an archive, they usually mean something else :-).
+
+ 2. Forgetting the argument to `file', when the intent was to
+ create an archive with a single file in it. This error is
+ likely because a tired user can easily add the `f' key to the
+ cluster of option letters, by the mere force of habit,
+ without realizing the full consequence of doing so. The
+ usual consequence is that the single file, which was meant to
+ be saved, is rather destroyed.
+
+ So, recognizing the likelihood and the catastrophic nature of these
+ errors, GNU `tar' now takes some distance from elegance, and
+ cowardly refuses to create an archive when `--create' option is
+ given, there are no arguments besides options, and `--files-from'
+ (`-T') option is _not_ used. To get around the cautiousness of
+ GNU `tar' and nevertheless create an archive with nothing in it,
+ one may still use, as the value for the `--files-from' option, a
+ file with no names in it, as shown in the following commands:
+
+ tar --create --file=empty-archive.tar --files-from=/dev/null
+ tar cfT empty-archive.tar /dev/null
+
+`--extract'
+`--get'
+`-x'
+ A socket is stored, within a GNU `tar' archive, as a pipe.
+
+``--list' (`-t')'
+ GNU `tar' now shows dates as `1996-08-30', while it used to show
+ them as `Aug 30 1996'. Preferably, people should get used to ISO
+ 8601 dates. Local American dates should be made available again
+ with full date localization support, once ready. In the meantime,
+ programs not being localizable for dates should prefer
+ international dates, that's really the way to go.
+
+ Look up `http://www.cl.cam.ac.uk/~mgk25/iso-time.html' if you are
+ curious, it contains a detailed explanation of the ISO 8601
+ standard.
+
+
+ ---------- Footnotes ----------
+
+ (1) This is well described in `Unix-haters Handbook', by Simson
+Garfinkel, Daniel Weise & Steven Strassmann, IDG Books, ISBN
+1-56884-203-1.
+
+
+File: tar.info, Node: Advanced tar, Next: create options, Prev: Basic tar, Up: operations
+
+4.2 Advanced GNU `tar' Operations
+=================================
+
+Now that you have learned the basics of using GNU `tar', you may want
+to learn about further ways in which `tar' can help you.
+
+ This chapter presents five, more advanced operations which you
+probably won't use on a daily basis, but which serve more specialized
+functions. We also explain the different styles of options and why you
+might want to use one or another, or a combination of them in your `tar'
+commands. Additionally, this chapter includes options which allow you
+to define the output from `tar' more carefully, and provide help and
+error correction in special circumstances.
+
+* Menu:
+
+* Operations::
+* append::
+* update::
+* concatenate::
+* delete::
+* compare::
+
+
+File: tar.info, Node: Operations, Next: append, Up: Advanced tar
+
+4.2.1 The Five Advanced `tar' Operations
+----------------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+In the last chapter, you learned about the first three operations to
+`tar'. This chapter presents the remaining five operations to `tar':
+`--append', `--update', `--concatenate', `--delete', and `--compare'.
+
+ You are not likely to use these operations as frequently as those
+covered in the last chapter; however, since they perform specialized
+functions, they are quite useful when you do need to use them. We will
+give examples using the same directory and files that you created in
+the last chapter. As you may recall, the directory is called
+`practice', the files are `jazz', `blues', `folk', `rock', and the two
+archive files you created are `collection.tar' and `music.tar'.
+
+ We will also use the archive files `afiles.tar' and `bfiles.tar'.
+The archive `afiles.tar' contains the members `apple', `angst', and
+`aspic'; `bfiles.tar' contains the members `./birds', `baboon', and
+`./box'.
+
+ Unless we state otherwise, all practicing you do and examples you
+follow in this chapter will take place in the `practice' directory that
+you created in the previous chapter; see *note prepare for examples::.
+(Below in this section, we will remind you of the state of the examples
+where the last chapter left them.)
+
+ The five operations that we will cover in this chapter are:
+
+`--append'
+`-r'
+ Add new entries to an archive that already exists.
+
+`--update'
+`-r'
+ Add more recent copies of archive members to the end of an
+ archive, if they exist.
+
+`--concatenate'
+`--catenate'
+`-A'
+ Add one or more pre-existing archives to the end of another
+ archive.
+
+`--delete'
+ Delete items from an archive (does not work on tapes).
+
+`--compare'
+`--diff'
+`-d'
+ Compare archive members to their counterparts in the file system.
+
+
+File: tar.info, Node: append, Next: update, Prev: Operations, Up: Advanced tar
+
+4.2.2 How to Add Files to Existing Archives: `--append'
+-------------------------------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+If you want to add files to an existing archive, you don't need to
+create a new archive; you can use `--append' (`-r'). The archive must
+already exist in order to use `--append'. (A related operation is the
+`--update' operation; you can use this to add newer versions of archive
+members to an existing archive. To learn how to do this with
+`--update', *note update::.)
+
+ If you use `--append' to add a file that has the same name as an
+archive member to an archive containing that archive member, then the
+old member is not deleted. What does happen, however, is somewhat
+complex. `tar' _allows_ you to have infinite number of files with the
+same name. Some operations treat these same-named members no
+differently than any other set of archive members: for example, if you
+view an archive with `--list' (`-t'), you will see all of those members
+listed, with their data modification times, owners, etc.
+
+ Other operations don't deal with these members as perfectly as you
+might prefer; if you were to use `--extract' to extract the archive,
+only the most recently added copy of a member with the same name as four
+other members would end up in the working directory. This is because
+`--extract' extracts an archive in the order the members appeared in
+the archive; the most recently archived members will be extracted last.
+Additionally, an extracted member will _replace_ a file of the same
+name which existed in the directory already, and `tar' will not prompt
+you about this(1). Thus, only the most recently archived member will
+end up being extracted, as it will replace the one extracted before it,
+and so on.
+
+ There exists a special option that allows you to get around this
+behavior and extract (or list) only a particular copy of the file.
+This is `--occurrence' option. If you run `tar' with this option, it
+will extract only the first copy of the file. You may also give this
+option an argument specifying the number of copy to be extracted.
+Thus, for example if the archive `archive.tar' contained three copies
+of file `myfile', then the command
+
+ tar --extract --file archive.tar --occurrence=2 myfile
+
+would extract only the second copy. *Note --occurrence: Option
+Summary, for the description of `--occurrence' option.
+
+ If you want to replace an archive member, use `--delete' to delete
+the member you want to remove from the archive, , and then use
+`--append' to add the member you want to be in the archive. Note that
+you can not change the order of the archive; the most recently added
+member will still appear last. In this sense, you cannot truly
+"replace" one member with another. (Replacing one member with another
+will not work on certain types of media, such as tapes; see *note
+delete:: and *note Media::, for more information.)
+
+* Menu:
+
+* appending files:: Appending Files to an Archive
+* multiple::
+
+ ---------- Footnotes ----------
+
+ (1) Unless you give it `--keep-old-files' option, or the disk copy
+is newer than the the one in the archive and you invoke `tar' with
+`--keep-newer-files' option
+
+
+File: tar.info, Node: appending files, Next: multiple, Up: append
+
+4.2.2.1 Appending Files to an Archive
+.....................................
+
+ _(This message will disappear, once this node revised.)_
+
+The simplest way to add a file to an already existing archive is the
+`--append' (`-r') operation, which writes specified files into the
+archive whether or not they are already among the archived files.
+
+ When you use `--append', you _must_ specify file name arguments, as
+there is no default. If you specify a file that already exists in the
+archive, another copy of the file will be added to the end of the
+archive. As with other operations, the member names of the newly added
+files will be exactly the same as their names given on the command
+line. The `--verbose' (`-v') option will print out the names of the
+files as they are written into the archive.
+
+ `--append' cannot be performed on some tape drives, unfortunately,
+due to deficiencies in the formats those tape drives use. The archive
+must be a valid `tar' archive, or else the results of using this
+operation will be unpredictable. *Note Media::.
+
+ To demonstrate using `--append' to add a file to an archive, create
+a file called `rock' in the `practice' directory. Make sure you are in
+the `practice' directory. Then, run the following `tar' command to add
+`rock' to `collection.tar':
+
+ $ tar --append --file=collection.tar rock
+
+If you now use the `--list' (`-t') operation, you will see that `rock'
+has been added to the archive:
+
+ $ tar --list --file=collection.tar
+ -rw-r--r-- me user 28 1996-10-18 16:31 jazz
+ -rw-r--r-- me user 21 1996-09-23 16:44 blues
+ -rw-r--r-- me user 20 1996-09-23 16:44 folk
+ -rw-r--r-- me user 20 1996-09-23 16:44 rock
+
+
+File: tar.info, Node: multiple, Prev: appending files, Up: append
+
+4.2.2.2 Multiple Members with the Same Name
+...........................................
+
+You can use `--append' (`-r') to add copies of files which have been
+updated since the archive was created. (However, we do not recommend
+doing this since there is another `tar' option called `--update'; *Note
+update::, for more information. We describe this use of `--append'
+here for the sake of completeness.) When you extract the archive, the
+older version will be effectively lost. This works because files are
+extracted from an archive in the order in which they were archived.
+Thus, when the archive is extracted, a file archived later in time will
+replace a file of the same name which was archived earlier, even though
+the older version of the file will remain in the archive unless you
+delete all versions of the file.
+
+ Supposing you change the file `blues' and then append the changed
+version to `collection.tar'. As you saw above, the original `blues' is
+in the archive `collection.tar'. If you change the file and append the
+new version of the file to the archive, there will be two copies in the
+archive. When you extract the archive, the older version of the file
+will be extracted first, and then replaced by the newer version when it
+is extracted.
+
+ You can append the new, changed copy of the file `blues' to the
+archive in this way:
+
+ $ tar --append --verbose --file=collection.tar blues
+ blues
+
+Because you specified the `--verbose' option, `tar' has printed the
+name of the file being appended as it was acted on. Now list the
+contents of the archive:
+
+ $ tar --list --verbose --file=collection.tar
+ -rw-r--r-- me user 28 1996-10-18 16:31 jazz
+ -rw-r--r-- me user 21 1996-09-23 16:44 blues
+ -rw-r--r-- me user 20 1996-09-23 16:44 folk
+ -rw-r--r-- me user 20 1996-09-23 16:44 rock
+ -rw-r--r-- me user 58 1996-10-24 18:30 blues
+
+The newest version of `blues' is now at the end of the archive (note
+the different creation dates and file sizes). If you extract the
+archive, the older version of the file `blues' will be replaced by the
+newer version. You can confirm this by extracting the archive and
+running `ls' on the directory.
+
+ If you wish to extract the first occurrence of the file `blues' from
+the archive, use `--occurrence' option, as shown in the following
+example:
+
+ $ tar --extract -vv --occurrence --file=collection.tar blues
+ -rw-r--r-- me user 21 1996-09-23 16:44 blues
+
+ *Note Writing::, for more information on `--extract' and *Note
+-occurrence: Option Summary, for the description of `--occurrence'
+option.
+
+
+File: tar.info, Node: update, Next: concatenate, Prev: append, Up: Advanced tar
+
+4.2.3 Updating an Archive
+-------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+In the previous section, you learned how to use `--append' to add a
+file to an existing archive. A related operation is `--update' (`-u').
+The `--update' operation updates a `tar' archive by comparing the date
+of the specified archive members against the date of the file with the
+same name. If the file has been modified more recently than the
+archive member, then the newer version of the file is added to the
+archive (as with `--append').
+
+ Unfortunately, you cannot use `--update' with magnetic tape drives.
+The operation will fail.
+
+ Both `--update' and `--append' work by adding to the end of the
+archive. When you extract a file from the archive, only the version
+stored last will wind up in the file system, unless you use the
+`--backup' option. *Note multiple::, for a detailed discussion.
+
+* Menu:
+
+* how to update::
+
+
+File: tar.info, Node: how to update, Up: update
+
+4.2.3.1 How to Update an Archive Using `--update'
+.................................................
+
+You must use file name arguments with the `--update' (`-u') operation.
+If you don't specify any files, `tar' won't act on any files and won't
+tell you that it didn't do anything (which may end up confusing you).
+
+ To see the `--update' option at work, create a new file,
+`classical', in your practice directory, and some extra text to the
+file `blues', using any text editor. Then invoke `tar' with the
+`update' operation and the `--verbose' (`-v') option specified, using
+the names of all the files in the practice directory as file name
+arguments:
+
+ $ tar --update -v -f collection.tar blues folk rock classical
+ blues
+ classical
+ $
+
+Because we have specified verbose mode, `tar' prints out the names of
+the files it is working on, which in this case are the names of the
+files that needed to be updated. If you run `tar --list' and look at
+the archive, you will see `blues' and `classical' at its end. There
+will be a total of two versions of the member `blues'; the one at the
+end will be newer and larger, since you added text before updating it.
+
+ (The reason `tar' does not overwrite the older file when updating it
+is because writing to the middle of a section of tape is a difficult
+process. Tapes are not designed to go backward. *Note Media::, for
+more information about tapes.
+
+ `--update' (`-u') is not suitable for performing backups for two
+reasons: it does not change directory content entries, and it lengthens
+the archive every time it is used. The GNU `tar' options intended
+specifically for backups are more efficient. If you need to run
+backups, please consult *note Backups::.
+
+
+File: tar.info, Node: concatenate, Next: delete, Prev: update, Up: Advanced tar
+
+4.2.4 Combining Archives with `--concatenate'
+---------------------------------------------
+
+Sometimes it may be convenient to add a second archive onto the end of
+an archive rather than adding individual files to the archive. To add
+one or more archives to the end of another archive, you should use the
+`--concatenate' (`--catenate', `-A') operation.
+
+ To use `--concatenate', give the first archive with `--file' option
+and name the rest of archives to be concatenated on the command line.
+The members, and their member names, will be copied verbatim from those
+archives to the first one. (1) The new, concatenated archive will be
+called by the same name as the one given with the `--file' option. As
+usual, if you omit `--file', `tar' will use the value of the environment
+variable `TAPE', or, if this has not been set, the default archive name.
+
+ To demonstrate how `--concatenate' works, create two small archives
+called `bluesrock.tar' and `folkjazz.tar', using the relevant files
+from `practice':
+
+ $ tar -cvf bluesrock.tar blues rock
+ blues
+ rock
+ $ tar -cvf folkjazz.tar folk jazz
+ folk
+ jazz
+
+If you like, You can run `tar --list' to make sure the archives contain
+what they are supposed to:
+
+ $ tar -tvf bluesrock.tar
+ -rw-r--r-- melissa user 105 1997-01-21 19:42 blues
+ -rw-r--r-- melissa user 33 1997-01-20 15:34 rock
+ $ tar -tvf jazzfolk.tar
+ -rw-r--r-- melissa user 20 1996-09-23 16:44 folk
+ -rw-r--r-- melissa user 65 1997-01-30 14:15 jazz
+
+ We can concatenate these two archives with `tar':
+
+ $ cd ..
+ $ tar --concatenate --file=bluesrock.tar jazzfolk.tar
+
+ If you now list the contents of the `bluesrock.tar', you will see
+that now it also contains the archive members of `jazzfolk.tar':
+
+ $ tar --list --file=bluesrock.tar
+ blues
+ rock
+ folk
+ jazz
+
+ When you use `--concatenate', the source and target archives must
+already exist and must have been created using compatible format
+parameters. Notice, that `tar' does not check whether the archives it
+concatenates have compatible formats, it does not even check if the
+files are really tar archives.
+
+ Like `--append' (`-r'), this operation cannot be performed on some
+tape drives, due to deficiencies in the formats those tape drives use.
+
+ It may seem more intuitive to you to want or try to use `cat' to
+concatenate two archives instead of using the `--concatenate'
+operation; after all, `cat' is the utility for combining files.
+
+ However, `tar' archives incorporate an end-of-file marker which must
+be removed if the concatenated archives are to be read properly as one
+archive. `--concatenate' removes the end-of-archive marker from the
+target archive before each new archive is appended. If you use `cat'
+to combine the archives, the result will not be a valid `tar' format
+archive. If you need to retrieve files from an archive that was added
+to using the `cat' utility, use the `--ignore-zeros' (`-i') option.
+*Note Ignore Zeros::, for further information on dealing with archives
+improperly combined using the `cat' shell utility.
+
+ ---------- Footnotes ----------
+
+ (1) This can cause multiple members to have the same name, for
+information on how this affects reading the archive, *note multiple::.
+
+
+File: tar.info, Node: delete, Next: compare, Prev: concatenate, Up: Advanced tar
+
+4.2.5 Removing Archive Members Using `--delete'
+-----------------------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+You can remove members from an archive by using the `--delete' option.
+Specify the name of the archive with `--file' (`-f') and then specify
+the names of the members to be deleted; if you list no member names,
+nothing will be deleted. The `--verbose' option will cause `tar' to
+print the names of the members as they are deleted. As with
+`--extract', you must give the exact member names when using `tar
+--delete'. `--delete' will remove all versions of the named file from
+the archive. The `--delete' operation can run very slowly.
+
+ Unlike other operations, `--delete' has no short form.
+
+ This operation will rewrite the archive. You can only use
+`--delete' on an archive if the archive device allows you to write to
+any point on the media, such as a disk; because of this, it does not
+work on magnetic tapes. Do not try to delete an archive member from a
+magnetic tape; the action will not succeed, and you will be likely to
+scramble the archive and damage your tape. There is no safe way
+(except by completely re-writing the archive) to delete files from most
+kinds of magnetic tape. *Note Media::.
+
+ To delete all versions of the file `blues' from the archive
+`collection.tar' in the `practice' directory, make sure you are in that
+directory, and then,
+
+ $ tar --list --file=collection.tar
+ blues
+ folk
+ jazz
+ rock
+ $ tar --delete --file=collection.tar blues
+ $ tar --list --file=collection.tar
+ folk
+ jazz
+ rock
+ $
+
+ The `--delete' option has been reported to work properly when `tar'
+acts as a filter from `stdin' to `stdout'.
+
+
+File: tar.info, Node: compare, Prev: delete, Up: Advanced tar
+
+4.2.6 Comparing Archive Members with the File System
+----------------------------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+The `--compare' (`-d'), or `--diff' operation compares specified
+archive members against files with the same names, and then reports
+differences in file size, mode, owner, modification date and contents.
+You should _only_ specify archive member names, not file names. If you
+do not name any members, then `tar' will compare the entire archive.
+If a file is represented in the archive but does not exist in the file
+system, `tar' reports a difference.
+
+ You have to specify the record size of the archive when modifying an
+archive with a non-default record size.
+
+ `tar' ignores files in the file system that do not have
+corresponding members in the archive.
+
+ The following example compares the archive members `rock', `blues'
+and `funk' in the archive `bluesrock.tar' with files of the same name
+in the file system. (Note that there is no file, `funk'; `tar' will
+report an error message.)
+
+ $ tar --compare --file=bluesrock.tar rock blues funk
+ rock
+ blues
+ tar: funk not found in archive
+
+ The spirit behind the `--compare' (`--diff', `-d') option is to
+check whether the archive represents the current state of files on
+disk, more than validating the integrity of the archive media. For
+this later goal, *Note verify::.
+
+
+File: tar.info, Node: create options, Next: extract options, Prev: Advanced tar, Up: operations
+
+4.3 Options Used by `--create'
+==============================
+
+The previous chapter described the basics of how to use `--create'
+(`-c') to create an archive from a set of files. *Note create::. This
+section described advanced options to be used with `--create'.
+
+* Menu:
+
+* override:: Overriding File Metadata.
+* Ignore Failed Read::
+
+
+File: tar.info, Node: override, Next: Ignore Failed Read, Up: create options
+
+4.3.1 Overriding File Metadata
+------------------------------
+
+As described above, a `tar' archive keeps, for each member it contains,
+its "metadata", such as modification time, mode and ownership of the
+file. GNU `tar' allows to replace these data with other values when
+adding files to the archive. The options described in this section
+affect creation of archives of any type. For POSIX archives, see also
+*note PAX keywords::, for additional ways of controlling metadata,
+stored in the archive.
+
+`--mode=PERMISSIONS'
+ When adding files to an archive, `tar' will use PERMISSIONS for
+ the archive members, rather than the permissions from the files.
+ PERMISSIONS can be specified either as an octal number or as
+ symbolic permissions, like with `chmod' (*Note Permissions:
+ (fileutils)File permissions. This reference also has useful
+ information for those not being overly familiar with the UNIX
+ permission system). Using latter syntax allows for more
+ flexibility. For example, the value `a+rw' adds read and write
+ permissions for everybody, while retaining executable bits on
+ directories or on any other file already marked as executable:
+
+ $ tar -c -f archive.tar --mode='a+rw' .
+
+`--mtime=DATE'
+ When adding files to an archive, `tar' will use DATE as the
+ modification time of members when creating archives, instead of
+ their actual modification times. The argument DATE can be either
+ a textual date representation in almost arbitrary format (*note
+ Date input formats::) or a name of the existing file, starting
+ with `/' or `.'. In the latter case, the modification time of
+ that file will be used.
+
+ The following example will set the modification date to 00:00:00
+ UTC, January 1, 1970:
+
+ $ tar -c -f archive.tar --mtime='1970-01-01' .
+
+ When used with `--verbose' (*note verbose tutorial::) GNU `tar'
+ will try to convert the specified date back to its textual
+ representation and compare it with the one given with `--mtime'
+ options. If the two dates differ, `tar' will print a warning
+ saying what date it will use. This is to help user ensure he is
+ using the right date.
+
+ For example:
+
+ $ tar -c -f archive.tar -v --mtime=yesterday .
+ tar: Option --mtime: Treating date `yesterday' as 2006-06-20
+ 13:06:29.152478
+ ...
+
+`--owner=USER'
+ Specifies that `tar' should use USER as the owner of members when
+ creating archives, instead of the user associated with the source
+ file. The argument USER can be either an existing user symbolic
+ name, or a decimal numeric user ID.
+
+ There is no value indicating a missing number, and `0' usually
+ means `root'. Some people like to force `0' as the value to offer
+ in their distributions for the owner of files, because the `root'
+ user is anonymous anyway, so that might as well be the owner of
+ anonymous archives. For example:
+
+ $ tar -c -f archive.tar --owner=0 .
+ # Or:
+ $ tar -c -f archive.tar --owner=root .
+
+`--group=GROUP'
+ Files added to the `tar' archive will have a group ID of GROUP,
+ rather than the group from the source file. The argument GROUP
+ can be either an existing group symbolic name, or a decimal
+ numeric group ID.
+
+
+File: tar.info, Node: Ignore Failed Read, Prev: override, Up: create options
+
+4.3.2 Ignore Fail Read
+----------------------
+
+`--ignore-failed-read'
+ Do not exit with nonzero on unreadable files or directories.
+
+
+File: tar.info, Node: extract options, Next: backup, Prev: create options, Up: operations
+
+4.4 Options Used by `--extract'
+===============================
+
+ _(This message will disappear, once this node revised.)_
+
+The previous chapter showed how to use `--extract' to extract an
+archive into the file system. Various options cause `tar' to extract
+more information than just file contents, such as the owner, the
+permissions, the modification date, and so forth. This section
+presents options to be used with `--extract' when certain special
+considerations arise. You may review the information presented in
+*note extract:: for more basic information about the `--extract'
+operation.
+
+* Menu:
+
+* Reading:: Options to Help Read Archives
+* Writing:: Changing How `tar' Writes Files
+* Scarce:: Coping with Scarce Resources
+
+
+File: tar.info, Node: Reading, Next: Writing, Up: extract options
+
+4.4.1 Options to Help Read Archives
+-----------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+Normally, `tar' will request data in full record increments from an
+archive storage device. If the device cannot return a full record,
+`tar' will report an error. However, some devices do not always return
+full records, or do not require the last record of an archive to be
+padded out to the next record boundary. To keep reading until you
+obtain a full record, or to accept an incomplete record if it contains
+an end-of-archive marker, specify the `--read-full-records' (`-B')
+option in conjunction with the `--extract' or `--list' operations.
+*Note Blocking::.
+
+ The `--read-full-records' (`-B') option is turned on by default when
+`tar' reads an archive from standard input, or from a remote machine.
+This is because on BSD Unix systems, attempting to read a pipe returns
+however much happens to be in the pipe, even if it is less than was
+requested. If this option were not enabled, `tar' would fail as soon
+as it read an incomplete record from the pipe.
+
+ If you're not sure of the blocking factor of an archive, you can
+read the archive by specifying `--read-full-records' (`-B') and
+`--blocking-factor=512-SIZE' (`-b 512-SIZE'), using a blocking factor
+larger than what the archive uses. This lets you avoid having to
+determine the blocking factor of an archive. *Note Blocking Factor::.
+
+* Menu:
+
+* read full records::
+* Ignore Zeros::
+
+
+File: tar.info, Node: read full records, Next: Ignore Zeros, Up: Reading
+
+Reading Full Records
+....................
+
+`--read-full-records'
+
+`-B'
+ Use in conjunction with `--extract' (`--get', `-x') to read an
+ archive which contains incomplete records, or one which has a
+ blocking factor less than the one specified.
+
+
+File: tar.info, Node: Ignore Zeros, Prev: read full records, Up: Reading
+
+Ignoring Blocks of Zeros
+........................
+
+Normally, `tar' stops reading when it encounters a block of zeros
+between file entries (which usually indicates the end of the archive).
+`--ignore-zeros' (`-i') allows `tar' to completely read an archive
+which contains a block of zeros before the end (i.e., a damaged
+archive, or one that was created by concatenating several archives
+together).
+
+ The `--ignore-zeros' (`-i') option is turned off by default because
+many versions of `tar' write garbage after the end-of-archive entry,
+since that part of the media is never supposed to be read. GNU `tar'
+does not write after the end of an archive, but seeks to maintain
+compatibility among archiving utilities.
+
+`--ignore-zeros'
+`-i'
+ To ignore blocks of zeros (i.e., end-of-archive entries) which may
+ be encountered while reading an archive. Use in conjunction with
+ `--extract' or `--list'.
+
+
+File: tar.info, Node: Writing, Next: Scarce, Prev: Reading, Up: extract options
+
+4.4.2 Changing How `tar' Writes Files
+-------------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+* Menu:
+
+* Dealing with Old Files::
+* Overwrite Old Files::
+* Keep Old Files::
+* Keep Newer Files::
+* Unlink First::
+* Recursive Unlink::
+* Data Modification Times::
+* Setting Access Permissions::
+* Directory Modification Times and Permissions::
+* Writing to Standard Output::
+* Writing to an External Program::
+* remove files::
+
+
+File: tar.info, Node: Dealing with Old Files, Next: Overwrite Old Files, Up: Writing
+
+Options Controlling the Overwriting of Existing Files
+.....................................................
+
+When extracting files, if `tar' discovers that the extracted file
+already exists, it normally replaces the file by removing it before
+extracting it, to prevent confusion in the presence of hard or symbolic
+links. (If the existing file is a symbolic link, it is removed, not
+followed.) However, if a directory cannot be removed because it is
+nonempty, `tar' normally overwrites its metadata (ownership,
+permission, etc.). The `--overwrite-dir' option enables this default
+behavior. To be more cautious and preserve the metadata of such a
+directory, use the `--no-overwrite-dir' option.
+
+ To be even more cautious and prevent existing files from being
+replaced, use the `--keep-old-files' (`-k') option. It causes `tar' to
+refuse to replace or update a file that already exists, i.e., a file
+with the same name as an archive member prevents extraction of that
+archive member. Instead, it reports an error.
+
+ To be more aggressive about altering existing files, use the
+`--overwrite' option. It causes `tar' to overwrite existing files and
+to follow existing symbolic links when extracting.
+
+ Some people argue that GNU `tar' should not hesitate to overwrite
+files with other files when extracting. When extracting a `tar'
+archive, they expect to see a faithful copy of the state of the file
+system when the archive was created. It is debatable that this would
+always be a proper behavior. For example, suppose one has an archive
+in which `usr/local' is a link to `usr/local2'. Since then, maybe the
+site removed the link and renamed the whole hierarchy from
+`/usr/local2' to `/usr/local'. Such things happen all the time. I
+guess it would not be welcome at all that GNU `tar' removes the whole
+hierarchy just to make room for the link to be reinstated (unless it
+_also_ simultaneously restores the full `/usr/local2', of course!) GNU
+`tar' is indeed able to remove a whole hierarchy to reestablish a
+symbolic link, for example, but _only if_ `--recursive-unlink' is
+specified to allow this behavior. In any case, single files are
+silently removed.
+
+ Finally, the `--unlink-first' (`-U') option can improve performance
+in some cases by causing `tar' to remove files unconditionally before
+extracting them.
+
+
+File: tar.info, Node: Overwrite Old Files, Next: Keep Old Files, Prev: Dealing with Old Files, Up: Writing
+
+Overwrite Old Files
+...................
+
+`--overwrite'
+ Overwrite existing files and directory metadata when extracting
+ files from an archive.
+
+ This causes `tar' to write extracted files into the file system
+ without regard to the files already on the system; i.e., files
+ with the same names as archive members are overwritten when the
+ archive is extracted. It also causes `tar' to extract the
+ ownership, permissions, and time stamps onto any preexisting files
+ or directories. If the name of a corresponding file name is a
+ symbolic link, the file pointed to by the symbolic link will be
+ overwritten instead of the symbolic link itself (if this is
+ possible). Moreover, special devices, empty directories and even
+ symbolic links are automatically removed if they are in the way of
+ extraction.
+
+ Be careful when using the `--overwrite' option, particularly when
+ combined with the `--absolute-names' (`-P') option, as this
+ combination can change the contents, ownership or permissions of
+ any file on your system. Also, many systems do not take kindly to
+ overwriting files that are currently being executed.
+
+`--overwrite-dir'
+ Overwrite the metadata of directories when extracting files from an
+ archive, but remove other files before extracting.
+
+
+File: tar.info, Node: Keep Old Files, Next: Keep Newer Files, Prev: Overwrite Old Files, Up: Writing
+
+Keep Old Files
+..............
+
+`--keep-old-files'
+`-k'
+ Do not replace existing files from archive. The
+ `--keep-old-files' (`-k') option prevents `tar' from replacing
+ existing files with files with the same name from the archive. The
+ `--keep-old-files' option is meaningless with `--list' (`-t').
+ Prevents `tar' from replacing files in the file system during
+ extraction.
+
+
+File: tar.info, Node: Keep Newer Files, Next: Unlink First, Prev: Keep Old Files, Up: Writing
+
+Keep Newer Files
+................
+
+`--keep-newer-files'
+ Do not replace existing files that are newer than their archive
+ copies. This option is meaningless with `--list' (`-t').
+
+
+File: tar.info, Node: Unlink First, Next: Recursive Unlink, Prev: Keep Newer Files, Up: Writing
+
+Unlink First
+............
+
+`--unlink-first'
+`-U'
+ Remove files before extracting over them. This can make `tar' run
+ a bit faster if you know in advance that the extracted files all
+ need to be removed. Normally this option slows `tar' down
+ slightly, so it is disabled by default.
+
+
+File: tar.info, Node: Recursive Unlink, Next: Data Modification Times, Prev: Unlink First, Up: Writing
+
+Recursive Unlink
+................
+
+`--recursive-unlink'
+ When this option is specified, try removing files and directory
+ hierarchies before extracting over them. _This is a dangerous
+ option!_
+
+ If you specify the `--recursive-unlink' option, `tar' removes
+_anything_ that keeps you from extracting a file as far as current
+permissions will allow it. This could include removal of the contents
+of a full directory hierarchy.
+
+
+File: tar.info, Node: Data Modification Times, Next: Setting Access Permissions, Prev: Recursive Unlink, Up: Writing
+
+Setting Data Modification Times
+...............................
+
+Normally, `tar' sets the data modification times of extracted files to
+the corresponding times recorded for the files in the archive, but
+limits the permissions of extracted files by the current `umask'
+setting.
+
+ To set the data modification times of extracted files to the time
+when the files were extracted, use the `--touch' (`-m') option in
+conjunction with `--extract' (`--get', `-x').
+
+`--touch'
+`-m'
+ Sets the data modification time of extracted archive members to
+ the time they were extracted, not the time recorded for them in
+ the archive. Use in conjunction with `--extract' (`--get', `-x').
+
+
+File: tar.info, Node: Setting Access Permissions, Next: Directory Modification Times and Permissions, Prev: Data Modification Times, Up: Writing
+
+Setting Access Permissions
+..........................
+
+To set the modes (access permissions) of extracted files to those
+recorded for those files in the archive, use `--same-permissions' in
+conjunction with the `--extract' (`--get', `-x') operation.
+
+`--preserve-permissions'
+`--same-permissions'
+`-p'
+ Set modes of extracted archive members to those recorded in the
+ archive, instead of current umask settings. Use in conjunction
+ with `--extract' (`--get', `-x').
+
+
+File: tar.info, Node: Directory Modification Times and Permissions, Next: Writing to Standard Output, Prev: Setting Access Permissions, Up: Writing
+
+Directory Modification Times and Permissions
+............................................
+
+After successfully extracting a file member, GNU `tar' normally
+restores its permissions and modification times, as described in the
+previous sections. This cannot be done for directories, because after
+extracting a directory `tar' will almost certainly extract files into
+that directory and this will cause the directory modification time to
+be updated. Moreover, restoring that directory permissions may not
+permit file creation within it. Thus, restoring directory permissions
+and modification times must be delayed at least until all files have
+been extracted into that directory. GNU `tar' restores directories
+using the following approach.
+
+ The extracted directories are created with the mode specified in the
+archive, as modified by the umask of the user, which gives sufficient
+permissions to allow file creation. The meta-information about the
+directory is recorded in the temporary list of directories. When
+preparing to extract next archive member, GNU `tar' checks if the
+directory prefix of this file contains the remembered directory. If it
+does not, the program assumes that all files have been extracted into
+that directory, restores its modification time and permissions and
+removes its entry from the internal list. This approach allows to
+correctly restore directory meta-information in the majority of cases,
+while keeping memory requirements sufficiently small. It is based on
+the fact, that most `tar' archives use the predefined order of members:
+first the directory, then all the files and subdirectories in that
+directory.
+
+ However, this is not always true. The most important exception are
+incremental archives (*note Incremental Dumps::). The member order in
+an incremental archive is reversed: first all directory members are
+stored, followed by other (non-directory) members. So, when extracting
+from incremental archives, GNU `tar' alters the above procedure. It
+remembers all restored directories, and restores their meta-data only
+after the entire archive has been processed. Notice, that you do not
+need to specify any special options for that, as GNU `tar'
+automatically detects archives in incremental format.
+
+ There may be cases, when such processing is required for normal
+archives too. Consider the following example:
+
+ $ tar --no-recursion -cvf archive \
+ foo foo/file1 bar bar/file foo/file2
+ foo/
+ foo/file1
+ bar/
+ bar/file
+ foo/file2
+
+ During the normal operation, after encountering `bar' GNU `tar' will
+assume that all files from the directory `foo' were already extracted
+and will therefore restore its timestamp and permission bits. However,
+after extracting `foo/file2' the directory timestamp will be offset
+again.
+
+ To correctly restore directory meta-information in such cases, use
+`delay-directory-restore' command line option:
+
+`--delay-directory-restore'
+ Delays restoring of the modification times and permissions of
+ extracted directories until the end of extraction. This way,
+ correct meta-information is restored even if the archive has
+ unusual member ordering.
+
+`--no-delay-directory-restore'
+ Cancel the effect of the previous `--delay-directory-restore'.
+ Use this option if you have used `--delay-directory-restore' in
+ `TAR_OPTIONS' variable (*note TAR_OPTIONS::) and wish to
+ temporarily disable it.
+
+
+File: tar.info, Node: Writing to Standard Output, Next: Writing to an External Program, Prev: Directory Modification Times and Permissions, Up: Writing
+
+Writing to Standard Output
+..........................
+
+To write the extracted files to the standard output, instead of
+creating the files on the file system, use `--to-stdout' (`-O') in
+conjunction with `--extract' (`--get', `-x'). This option is useful if
+you are extracting files to send them through a pipe, and do not need to
+preserve them in the file system. If you extract multiple members,
+they appear on standard output concatenated, in the order they are
+found in the archive.
+
+`--to-stdout'
+`-O'
+ Writes files to the standard output. Use only in conjunction with
+ `--extract' (`--get', `-x'). When this option is used, instead of
+ creating the files specified, `tar' writes the contents of the
+ files extracted to its standard output. This may be useful if you
+ are only extracting the files in order to send them through a
+ pipe. This option is meaningless with `--list' (`-t').
+
+ This can be useful, for example, if you have a tar archive containing
+a big file and don't want to store the file on disk before processing
+it. You can use a command like this:
+
+ tar -xOzf foo.tgz bigfile | process
+
+ or even like this if you want to process the concatenation of the
+files:
+
+ tar -xOzf foo.tgz bigfile1 bigfile2 | process
+
+ However, `--to-command' may be more convenient for use with multiple
+files. See the next section.
+
+
+File: tar.info, Node: Writing to an External Program, Next: remove files, Prev: Writing to Standard Output, Up: Writing
+
+Writing to an External Program
+..............................
+
+You can instruct `tar' to send the contents of each extracted file to
+the standard input of an external program:
+
+`--to-command=COMMAND'
+ Extract files and pipe their contents to the standard input of
+ COMMAND. When this option is used, instead of creating the files
+ specified, `tar' invokes COMMAND and pipes the contents of the
+ files to its standard output. COMMAND may contain command line
+ arguments. The program is executed via `sh -c'. Notice, that
+ COMMAND is executed once for each regular file extracted.
+ Non-regular files (directories, etc.) are ignored when this option
+ is used.
+
+ The command can obtain the information about the file it processes
+from the following environment variables:
+
+TAR_FILETYPE
+ Type of the file. It is a single letter with the following meaning:
+
+ f Regular file
+ d Directory
+ l Symbolic link
+ h Hard link
+ b Block device
+ c Character device
+
+ Currently only regular files are supported.
+
+TAR_MODE
+ File mode, an octal number.
+
+TAR_FILENAME
+ The name of the file.
+
+TAR_REALNAME
+ Name of the file as stored in the archive.
+
+TAR_UNAME
+ Name of the file owner.
+
+TAR_GNAME
+ Name of the file owner group.
+
+TAR_ATIME
+ Time of last access. It is a decimal number, representing seconds
+ since the epoch. If the archive provides times with nanosecond
+ precision, the nanoseconds are appended to the timestamp after a
+ decimal point.
+
+TAR_MTIME
+ Time of last modification.
+
+TAR_CTIME
+ Time of last status change.
+
+TAR_SIZE
+ Size of the file.
+
+TAR_UID
+ UID of the file owner.
+
+TAR_GID
+ GID of the file owner.
+
+ In addition to these variables, `TAR_VERSION' contains the GNU `tar'
+version number.
+
+ If COMMAND exits with a non-0 status, `tar' will print an error
+message similar to the following:
+
+ tar: 2345: Child returned status 1
+
+ Here, `2345' is the PID of the finished process.
+
+ If this behavior is not wanted, use `--ignore-command-error':
+
+`--ignore-command-error'
+ Ignore exit codes of subprocesses. Notice that if the program
+ exits on signal or otherwise terminates abnormally, the error
+ message will be printed even if this option is used.
+
+`--no-ignore-command-error'
+ Cancel the effect of any previous `--ignore-command-error' option.
+ This option is useful if you have set `--ignore-command-error' in
+ `TAR_OPTIONS' (*note TAR_OPTIONS::) and wish to temporarily cancel
+ it.
+
+
+File: tar.info, Node: remove files, Prev: Writing to an External Program, Up: Writing
+
+Removing Files
+..............
+
+`--remove-files'
+ Remove files after adding them to the archive.
+
+
+File: tar.info, Node: Scarce, Prev: Writing, Up: extract options
+
+4.4.3 Coping with Scarce Resources
+----------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+* Menu:
+
+* Starting File::
+* Same Order::
+
+
+File: tar.info, Node: Starting File, Next: Same Order, Up: Scarce
+
+Starting File
+.............
+
+`--starting-file=NAME'
+`-K NAME'
+ Starts an operation in the middle of an archive. Use in
+ conjunction with `--extract' (`--get', `-x') or `--list' (`-t').
+
+ If a previous attempt to extract files failed due to lack of disk
+space, you can use `--starting-file=NAME' (`-K NAME') to start
+extracting only after member NAME of the archive. This assumes, of
+course, that there is now free space, or that you are now extracting
+into a different file system. (You could also choose to suspend `tar',
+remove unnecessary files from the file system, and then restart the
+same `tar' operation. In this case, `--starting-file' is not necessary.
+*Note Incremental Dumps::, *Note interactive::, and *note exclude::.)
+
+
+File: tar.info, Node: Same Order, Prev: Starting File, Up: Scarce
+
+Same Order
+..........
+
+`--same-order'
+`--preserve-order'
+`-s'
+ To process large lists of file names on machines with small
+ amounts of memory. Use in conjunction with `--compare' (`--diff',
+ `-d'), `--list' (`-t') or `--extract' (`--get', `-x').
+
+ The `--same-order' (`--preserve-order', `-s') option tells `tar'
+that the list of file names to be listed or extracted is sorted in the
+same order as the files in the archive. This allows a large list of
+names to be used, even on a small machine that would not otherwise be
+able to hold all the names in memory at the same time. Such a sorted
+list can easily be created by running `tar -t' on the archive and
+editing its output.
+
+ This option is probably never needed on modern computer systems.
+
+
+File: tar.info, Node: backup, Next: Applications, Prev: extract options, Up: operations
+
+4.5 Backup options
+==================
+
+GNU `tar' offers options for making backups of files before writing new
+versions. These options control the details of these backups. They
+may apply to the archive itself before it is created or rewritten, as
+well as individual extracted members. Other GNU programs (`cp',
+`install', `ln', and `mv', for example) offer similar options.
+
+ Backup options may prove unexpectedly useful when extracting archives
+containing many members having identical name, or when extracting
+archives on systems having file name limitations, making different
+members appear has having similar names through the side-effect of name
+truncation. (This is true only if we have a good scheme for truncated
+backup names, which I'm not sure at all: I suspect work is needed in
+this area.) When any existing file is backed up before being
+overwritten by extraction, then clashing files are automatically be
+renamed to be unique, and the true name is kept for only the last file
+of a series of clashing files. By using verbose mode, users may track
+exactly what happens.
+
+ At the detail level, some decisions are still experimental, and may
+change in the future, we are waiting comments from our users. So,
+please do not learn to depend blindly on the details of the backup
+features. For example, currently, directories themselves are never
+renamed through using these options, so, extracting a file over a
+directory still has good chances to fail. Also, backup options apply
+to created archives, not only to extracted members. For created
+archives, backups will not be attempted when the archive is a block or
+character device, or when it refers to a remote file.
+
+ For the sake of simplicity and efficiency, backups are made by
+renaming old files prior to creation or extraction, and not by copying.
+The original name is restored if the file creation fails. If a
+failure occurs after a partial extraction of a file, both the backup
+and the partially extracted file are kept.
+
+`--backup[=METHOD]'
+ Back up files that are about to be overwritten or removed.
+ Without this option, the original versions are destroyed.
+
+ Use METHOD to determine the type of backups made. If METHOD is
+ not specified, use the value of the `VERSION_CONTROL' environment
+ variable. And if `VERSION_CONTROL' is not set, use the `existing'
+ method.
+
+ This option corresponds to the Emacs variable `version-control';
+ the same values for METHOD are accepted as in Emacs. This option
+ also allows more descriptive names. The valid METHODs are:
+
+ `t'
+ `numbered'
+ Always make numbered backups.
+
+ `nil'
+ `existing'
+ Make numbered backups of files that already have them, simple
+ backups of the others.
+
+ `never'
+ `simple'
+ Always make simple backups.
+
+
+`--suffix=SUFFIX'
+ Append SUFFIX to each backup file made with `--backup'. If this
+ option is not specified, the value of the `SIMPLE_BACKUP_SUFFIX'
+ environment variable is used. And if `SIMPLE_BACKUP_SUFFIX' is not
+ set, the default is `~', just as in Emacs.
+
+
+
+File: tar.info, Node: Applications, Next: looking ahead, Prev: backup, Up: operations
+
+4.6 Notable `tar' Usages
+========================
+
+ _(This message will disappear, once this node revised.)_
+
+You can easily use archive files to transport a group of files from one
+system to another: put all relevant files into an archive on one
+computer system, transfer the archive to another system, and extract
+the contents there. The basic transfer medium might be magnetic tape,
+Internet FTP, or even electronic mail (though you must encode the
+archive with `uuencode' in order to transport it properly by mail).
+Both machines do not have to use the same operating system, as long as
+they both support the `tar' program.
+
+ For example, here is how you might copy a directory's contents from
+one disk to another, while preserving the dates, modes, owners and
+link-structure of all the files therein. In this case, the transfer
+medium is a "pipe", which is one a Unix redirection mechanism:
+
+ $ (cd sourcedir; tar -cf - .) | (cd targetdir; tar -xf -)
+
+You can avoid subshells by using `-C' option:
+
+ $ tar -C sourcedir -cf - . | tar -C targetdir -xf -
+
+The command also works using short option forms:
+
+ $ (cd sourcedir; tar --create --file=- . ) \
+ | (cd targetdir; tar --extract --file=-)
+ # Or:
+ $ tar --directory sourcedir --create --file=- . ) \
+ | tar --directory targetdir --extract --file=-
+
+This is one of the easiest methods to transfer a `tar' archive.
+
+
+File: tar.info, Node: looking ahead, Prev: Applications, Up: operations
+
+4.7 Looking Ahead: The Rest of this Manual
+==========================================
+
+You have now seen how to use all eight of the operations available to
+`tar', and a number of the possible options. The next chapter explains
+how to choose and change file and archive names, how to use files to
+store names of other files which you can then call as arguments to
+`tar' (this can help you save time if you expect to archive the same
+list of files a number of times), and so forth.
+
+ If there are too many files to conveniently list on the command line,
+you can list the names in a file, and `tar' will read that file. *Note
+files::.
+
+ There are various ways of causing `tar' to skip over some files, and
+not archive them. *Note Choosing::.
+
+
+File: tar.info, Node: Backups, Next: Choosing, Prev: operations, Up: Top
+
+5 Performing Backups and Restoring Files
+****************************************
+
+ _(This message will disappear, once this node revised.)_
+
+GNU `tar' is distributed along with the scripts which the Free Software
+Foundation uses for performing backups. There is no corresponding
+scripts available yet for doing restoration of files. Even if there is
+a good chance those scripts may be satisfying to you, they are not the
+only scripts or methods available for doing backups and restore. You
+may well create your own, or use more sophisticated packages dedicated
+to that purpose.
+
+ Some users are enthusiastic about `Amanda' (The Advanced Maryland
+Automatic Network Disk Archiver), a backup system developed by James da
+Silva `jds@cs.umd.edu' and available on many Unix systems. This is
+free software, and it is available at these places:
+
+ http://www.cs.umd.edu/projects/amanda/amanda.html
+ ftp://ftp.cs.umd.edu/pub/amanda
+
+ This chapter documents both the provided shell scripts and `tar'
+options which are more specific to usage as a backup tool.
+
+ To "back up" a file system means to create archives that contain all
+the files in that file system. Those archives can then be used to
+restore any or all of those files (for instance if a disk crashes or a
+file is accidentally deleted). File system "backups" are also called
+"dumps".
+
+* Menu:
+
+* Full Dumps:: Using `tar' to Perform Full Dumps
+* Incremental Dumps:: Using `tar' to Perform Incremental Dumps
+* Backup Levels:: Levels of Backups
+* Backup Parameters:: Setting Parameters for Backups and Restoration
+* Scripted Backups:: Using the Backup Scripts
+* Scripted Restoration:: Using the Restore Script
+
+
+File: tar.info, Node: Full Dumps, Next: Incremental Dumps, Up: Backups
+
+5.1 Using `tar' to Perform Full Dumps
+=====================================
+
+ _(This message will disappear, once this node revised.)_
+
+Full dumps should only be made when no other people or programs are
+modifying files in the file system. If files are modified while `tar'
+is making the backup, they may not be stored properly in the archive,
+in which case you won't be able to restore them if you have to. (Files
+not being modified are written with no trouble, and do not corrupt the
+entire archive.)
+
+ You will want to use the `--label=ARCHIVE-LABEL' (`-V
+ARCHIVE-LABEL') option to give the archive a volume label, so you can
+tell what this archive is even if the label falls off the tape, or
+anything like that.
+
+ Unless the file system you are dumping is guaranteed to fit on one
+volume, you will need to use the `--multi-volume' (`-M') option. Make
+sure you have enough tapes on hand to complete the backup.
+
+ If you want to dump each file system separately you will need to use
+the `--one-file-system' option to prevent `tar' from crossing file
+system boundaries when storing (sub)directories.
+
+ The `--incremental' (`-G') (*note Incremental Dumps::) option is not
+needed, since this is a complete copy of everything in the file system,
+and a full restore from this backup would only be done onto a completely
+empty disk.
+
+ Unless you are in a hurry, and trust the `tar' program (and your
+tapes), it is a good idea to use the `--verify' (`-W') option, to make
+sure your files really made it onto the dump properly. This will also
+detect cases where the file was modified while (or just after) it was
+being archived. Not all media (notably cartridge tapes) are capable of
+being verified, unfortunately.
+
+
+File: tar.info, Node: Incremental Dumps, Next: Backup Levels, Prev: Full Dumps, Up: Backups
+
+5.2 Using `tar' to Perform Incremental Dumps
+============================================
+
+"Incremental backup" is a special form of GNU `tar' archive that stores
+additional metadata so that exact state of the file system can be
+restored when extracting the archive.
+
+ GNU `tar' currently offers two options for handling incremental
+backups: `--listed-incremental=SNAPSHOT-FILE' (`-g SNAPSHOT-FILE') and
+`--incremental' (`-G').
+
+ The option `--listed-incremental' instructs tar to operate on an
+incremental archive with additional metadata stored in a standalone
+file, called a "snapshot file". The purpose of this file is to help
+determine which files have been changed, added or deleted since the
+last backup, so that the next incremental backup will contain only
+modified files. The name of the snapshot file is given as an argument
+to the option:
+
+`--listed-incremental=FILE'
+`-g FILE'
+ Handle incremental backups with snapshot data in FILE.
+
+ To create an incremental backup, you would use
+`--listed-incremental' together with `--create' (*note create::). For
+example:
+
+ $ tar --create \
+ --file=archive.1.tar \
+ --listed-incremental=/var/log/usr.snar \
+ /usr
+
+ This will create in `archive.1.tar' an incremental backup of the
+`/usr' file system, storing additional metadata in the file
+`/var/log/usr.snar'. If this file does not exist, it will be created.
+The created archive will then be a "level 0 backup"; please see the
+next section for more on backup levels.
+
+ Otherwise, if the file `/var/log/usr.snar' exists, it determines
+which files are modified. In this case only these files will be stored
+in the archive. Suppose, for example, that after running the above
+command, you delete file `/usr/doc/old' and create directory
+`/usr/local/db' with the following contents:
+
+ $ ls /usr/local/db
+ /usr/local/db/data
+ /usr/local/db/index
+
+ Some time later you create another incremental backup. You will
+then see:
+
+ $ tar --create \
+ --file=archive.2.tar \
+ --listed-incremental=/var/log/usr.snar \
+ /usr
+ tar: usr/local/db: Directory is new
+ usr/local/db/
+ usr/local/db/data
+ usr/local/db/index
+
+The created archive `archive.2.tar' will contain only these three
+members. This archive is called a "level 1 backup". Notice that
+`/var/log/usr.snar' will be updated with the new data, so if you plan
+to create more `level 1' backups, it is necessary to create a working
+copy of the snapshot file before running `tar'. The above example will
+then be modified as follows:
+
+ $ cp /var/log/usr.snar /var/log/usr.snar-1
+ $ tar --create \
+ --file=archive.2.tar \
+ --listed-incremental=/var/log/usr.snar-1 \
+ /usr
+
+ Incremental dumps depend crucially on time stamps, so the results are
+unreliable if you modify a file's time stamps during dumping (e.g.,
+with the `--atime-preserve=replace' option), or if you set the clock
+backwards.
+
+ Metadata stored in snapshot files include device numbers, which,
+obviously is supposed to be a non-volatile value. However, it turns
+out that NFS devices have undependable values when an automounter gets
+in the picture. This can lead to a great deal of spurious redumping in
+incremental dumps, so it is somewhat useless to compare two NFS devices
+numbers over time. The solution implemented currently is to considers
+all NFS devices as being equal when it comes to comparing directories;
+this is fairly gross, but there does not seem to be a better way to go.
+
+ Note that incremental archives use `tar' extensions and may not be
+readable by non-GNU versions of the `tar' program.
+
+ To extract from the incremental dumps, use `--listed-incremental'
+together with `--extract' option (*note extracting files::). In this
+case, `tar' does not need to access snapshot file, since all the data
+necessary for extraction are stored in the archive itself. So, when
+extracting, you can give whatever argument to `--listed-incremental',
+the usual practice is to use `--listed-incremental=/dev/null'.
+Alternatively, you can use `--incremental', which needs no arguments.
+In general, `--incremental' (`-G') can be used as a shortcut for
+`--listed-incremental' when listing or extracting incremental backups
+(for more information, regarding this option, *note incremental-op::).
+
+ When extracting from the incremental backup GNU `tar' attempts to
+restore the exact state the file system had when the archive was
+created. In particular, it will _delete_ those files in the file
+system that did not exist in their directories when the archive was
+created. If you have created several levels of incremental files, then
+in order to restore the exact contents the file system had when the
+last level was created, you will need to restore from all backups in
+turn. Continuing our example, to restore the state of `/usr' file
+system, one would do(1):
+
+ $ tar --extract \
+ --listed-incremental=/dev/null \
+ --file archive.1.tar
+ $ tar --extract \
+ --listed-incremental=/dev/null \
+ --file archive.2.tar
+
+ To list the contents of an incremental archive, use `--list' (*note
+list::), as usual. To obtain more information about the archive, use
+`--listed-incremental' or `--incremental' combined with two `--verbose'
+options(2):
+
+ tar --list --incremental --verbose --verbose archive.tar
+
+ This command will print, for each directory in the archive, the list
+of files in that directory at the time the archive was created. This
+information is put out in a format which is both human-readable and
+unambiguous for a program: each file name is printed as
+
+ X FILE
+
+where X is a letter describing the status of the file: `Y' if the file
+is present in the archive, `N' if the file is not included in the
+archive, or a `D' if the file is a directory (and is included in the
+archive). *Note Dumpdir::, for the detailed description of dumpdirs
+and status codes. Each such line is terminated by a newline character.
+The last line is followed by an additional newline to indicate the end
+of the data.
+
+ The option `--incremental' (`-G') gives the same behavior as
+`--listed-incremental' when used with `--list' and `--extract' options.
+When used with `--create' option, it creates an incremental archive
+without creating snapshot file. Thus, it is impossible to create
+several levels of incremental backups with `--incremental' option.
+
+ ---------- Footnotes ----------
+
+ (1) Notice, that since both archives were created without `-P'
+option (*note absolute::), these commands should be run from the root
+file system.
+
+ (2) Two `--verbose' options were selected to avoid breaking usual
+verbose listing output (`--list --verbose') when using in scripts.
+
+ Versions of GNU `tar' up to 1.15.1 used to dump verbatim binary
+contents of the DUMPDIR header (with terminating nulls) when
+`--incremental' or `--listed-incremental' option was given, no matter
+what the verbosity level. This behavior, and, especially, the binary
+output it produced were considered inconvenient and were changed in
+version 1.16
+
+
+File: tar.info, Node: Backup Levels, Next: Backup Parameters, Prev: Incremental Dumps, Up: Backups
+
+5.3 Levels of Backups
+=====================
+
+An archive containing all the files in the file system is called a
+"full backup" or "full dump". You could insure your data by creating a
+full dump every day. This strategy, however, would waste a substantial
+amount of archive media and user time, as unchanged files are daily
+re-archived.
+
+ It is more efficient to do a full dump only occasionally. To back up
+files between full dumps, you can use "incremental dumps". A "level
+one" dump archives all the files that have changed since the last full
+dump.
+
+ A typical dump strategy would be to perform a full dump once a week,
+and a level one dump once a day. This means some versions of files
+will in fact be archived more than once, but this dump strategy makes
+it possible to restore a file system to within one day of accuracy by
+only extracting two archives--the last weekly (full) dump and the last
+daily (level one) dump. The only information lost would be in files
+changed or created since the last daily backup. (Doing dumps more than
+once a day is usually not worth the trouble).
+
+ GNU `tar' comes with scripts you can use to do full and level-one
+(actually, even level-two and so on) dumps. Using scripts (shell
+programs) to perform backups and restoration is a convenient and
+reliable alternative to typing out file name lists and `tar' commands
+by hand.
+
+ Before you use these scripts, you need to edit the file
+`backup-specs', which specifies parameters used by the backup scripts
+and by the restore script. This file is usually located in
+`/etc/backup' directory. *Note Backup Parameters::, for its detailed
+description. Once the backup parameters are set, you can perform
+backups or restoration by running the appropriate script.
+
+ The name of the backup script is `backup'. The name of the restore
+script is `restore'. The following sections describe their use in
+detail.
+
+ _Please Note:_ The backup and restoration scripts are designed to be
+used together. While it is possible to restore files by hand from an
+archive which was created using a backup script, and to create an
+archive by hand which could then be extracted using the restore script,
+it is easier to use the scripts. *Note Incremental Dumps::, before
+making such an attempt.
+
+
+File: tar.info, Node: Backup Parameters, Next: Scripted Backups, Prev: Backup Levels, Up: Backups
+
+5.4 Setting Parameters for Backups and Restoration
+==================================================
+
+The file `backup-specs' specifies backup parameters for the backup and
+restoration scripts provided with `tar'. You must edit `backup-specs'
+to fit your system configuration and schedule before using these
+scripts.
+
+ Syntactically, `backup-specs' is a shell script, containing mainly
+variable assignments. However, any valid shell construct is allowed in
+this file. Particularly, you may wish to define functions within that
+script (e.g., see `RESTORE_BEGIN' below). For more information about
+shell script syntax, please refer to the definition of the Shell
+Command Language
+(http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#ta
+g_02). See also *note Bash Features: (bashref)Top.
+
+ The shell variables controlling behavior of `backup' and `restore'
+are described in the following subsections.
+
+* Menu:
+
+* General-Purpose Variables::
+* Magnetic Tape Control::
+* User Hooks::
+* backup-specs example:: An Example Text of `Backup-specs'
+
+
+File: tar.info, Node: General-Purpose Variables, Next: Magnetic Tape Control, Up: Backup Parameters
+
+5.4.1 General-Purpose Variables
+-------------------------------
+
+ -- Backup variable: ADMINISTRATOR
+ The user name of the backup administrator. `Backup' scripts sends
+ a backup report to this address.
+
+ -- Backup variable: BACKUP_HOUR
+ The hour at which the backups are done. This can be a number from
+ 0 to 23, or the time specification in form HOURS:MINUTES, or the
+ string `now'.
+
+ This variable is used by `backup'. Its value may be overridden
+ using `--time' option (*note Scripted Backups::).
+
+ -- Backup variable: TAPE_FILE
+ The device `tar' writes the archive to. If TAPE_FILE is a remote
+ archive (*note remote-dev::), backup script will suppose that your
+ `mt' is able to access remote devices. If RSH (*note RSH::) is
+ set, `--rsh-command' option will be added to invocations of `mt'.
+
+ -- Backup variable: BLOCKING
+ The blocking factor `tar' will use when writing the dump archive.
+ *Note Blocking Factor::.
+
+ -- Backup variable: BACKUP_DIRS
+ A list of file systems to be dumped (for `backup'), or restored
+ (for `restore'). You can include any directory name in the list
+ -- subdirectories on that file system will be included, regardless
+ of how they may look to other networked machines. Subdirectories
+ on other file systems will be ignored.
+
+ The host name specifies which host to run `tar' on, and should
+ normally be the host that actually contains the file system.
+ However, the host machine must have GNU `tar' installed, and must
+ be able to access the directory containing the backup scripts and
+ their support files using the same file name that is used on the
+ machine where the scripts are run (i.e., what `pwd' will print
+ when in that directory on that machine). If the host that contains
+ the file system does not have this capability, you can specify
+ another host as long as it can access the file system through NFS.
+
+ If the list of file systems is very long you may wish to put it in
+ a separate file. This file is usually named `/etc/backup/dirs',
+ but this name may be overridden in `backup-specs' using `DIRLIST'
+ variable.
+
+ -- Backup variable: DIRLIST
+ The name of the file that contains a list of file systems to backup
+ or restore. By default it is `/etc/backup/dirs'.
+
+ -- Backup variable: BACKUP_FILES
+ A list of individual files to be dumped (for `backup'), or restored
+ (for `restore'). These should be accessible from the machine on
+ which the backup script is run.
+
+ If the list of file systems is very long you may wish to store it
+ in a separate file. This file is usually named
+ `/etc/backup/files', but this name may be overridden in
+ `backup-specs' using `FILELIST' variable.
+
+ -- Backup variable: FILELIST
+ The name of the file that contains a list of individual files to
+ backup or restore. By default it is `/etc/backup/files'.
+
+ -- Backup variable: MT
+ Full file name of `mt' binary.
+
+ -- Backup variable: RSH
+ Full file name of `rsh' binary or its equivalent. You may wish to
+ set it to `ssh', to improve security. In this case you will have
+ to use public key authentication.
+
+ -- Backup variable: RSH_COMMAND
+ Full file name of `rsh' binary on remote machines. This will be
+ passed via `--rsh-command' option to the remote invocation of GNU
+ `tar'.
+
+ -- Backup variable: VOLNO_FILE
+ Name of temporary file to hold volume numbers. This needs to be
+ accessible by all the machines which have file systems to be
+ dumped.
+
+ -- Backup variable: XLIST
+ Name of "exclude file list". An "exclude file list" is a file
+ located on the remote machine and containing the list of files to
+ be excluded from the backup. Exclude file lists are searched in
+ /etc/tar-backup directory. A common use for exclude file lists is
+ to exclude files containing security-sensitive information (e.g.,
+ `/etc/shadow' from backups).
+
+ This variable affects only `backup'.
+
+ -- Backup variable: SLEEP_TIME
+ Time to sleep between dumps of any two successive file systems
+
+ This variable affects only `backup'.
+
+ -- Backup variable: DUMP_REMIND_SCRIPT
+ Script to be run when it's time to insert a new tape in for the
+ next volume. Administrators may want to tailor this script for
+ their site. If this variable isn't set, GNU `tar' will display
+ its built-in prompt, and will expect confirmation from the
+ console. For the description of the default prompt, see *note
+ change volume prompt::.
+
+
+ -- Backup variable: SLEEP_MESSAGE
+ Message to display on the terminal while waiting for dump time.
+ Usually this will just be some literal text.
+
+ -- Backup variable: TAR
+ Full file name of the GNU `tar' executable. If this is not set,
+ backup scripts will search `tar' in the current shell path.
+
+
+File: tar.info, Node: Magnetic Tape Control, Next: User Hooks, Prev: General-Purpose Variables, Up: Backup Parameters
+
+5.4.2 Magnetic Tape Control
+---------------------------
+
+Backup scripts access tape device using special "hook functions".
+These functions take a single argument - the name of the tape device.
+Their names are kept in the following variables:
+
+ -- Backup variable: MT_BEGIN
+ The name of "begin" function. This function is called before
+ accessing the drive. By default it retensions the tape:
+
+ MT_BEGIN=mt_begin
+
+ mt_begin() {
+ mt -f "$1" retension
+ }
+
+ -- Backup variable: MT_REWIND
+ The name of "rewind" function. The default definition is as
+ follows:
+
+ MT_REWIND=mt_rewind
+
+ mt_rewind() {
+ mt -f "$1" rewind
+ }
+
+
+ -- Backup variable: MT_OFFLINE
+ The name of the function switching the tape off line. By default
+ it is defined as follows:
+
+ MT_OFFLINE=mt_offline
+
+ mt_offline() {
+ mt -f "$1" offl
+ }
+
+ -- Backup variable: MT_STATUS
+ The name of the function used to obtain the status of the archive
+ device, including error count. Default definition:
+
+ MT_STATUS=mt_status
+
+ mt_status() {
+ mt -f "$1" status
+ }
+
+
+File: tar.info, Node: User Hooks, Next: backup-specs example, Prev: Magnetic Tape Control, Up: Backup Parameters
+
+5.4.3 User Hooks
+----------------
+
+"User hooks" are shell functions executed before and after each `tar'
+invocation. Thus, there are "backup hooks", which are executed before
+and after dumping each file system, and "restore hooks", executed
+before and after restoring a file system. Each user hook is a shell
+function taking four arguments:
+
+ -- User Hook Function: hook LEVEL HOST FS FSNAME
+ Its arguments are:
+
+ LEVEL
+ Current backup or restore level.
+
+ HOST
+ Name or IP address of the host machine being dumped or
+ restored.
+
+ FS
+ Full file name of the file system being dumped or restored.
+
+ FSNAME
+ File system name with directory separators replaced with
+ colons. This is useful, e.g., for creating unique files.
+
+ Following variables keep the names of user hook functions
+
+ -- Backup variable: DUMP_BEGIN
+ Dump begin function. It is executed before dumping the file
+ system.
+
+ -- Backup variable: DUMP_END
+ Executed after dumping the file system.
+
+ -- Backup variable: RESTORE_BEGIN
+ Executed before restoring the file system.
+
+ -- Backup variable: RESTORE_END
+ Executed after restoring the file system.
+
+
+File: tar.info, Node: backup-specs example, Prev: User Hooks, Up: Backup Parameters
+
+5.4.4 An Example Text of `Backup-specs'
+---------------------------------------
+
+The following is an example of `backup-specs':
+
+ # site-specific parameters for file system backup.
+
+ ADMINISTRATOR=friedman
+ BACKUP_HOUR=1
+ TAPE_FILE=/dev/nrsmt0
+
+ # Use `ssh' instead of the less secure `rsh'
+ RSH=/usr/bin/ssh
+ RSH_COMMAND=/usr/bin/ssh
+
+ # Override MT_STATUS function:
+ my_status() {
+ mts -t $TAPE_FILE
+ }
+ MT_STATUS=my_status
+
+ # Disable MT_OFFLINE function
+ MT_OFFLINE=:
+
+ BLOCKING=124
+ BACKUP_DIRS="
+ albert:/fs/fsf
+ apple-gunkies:/gd
+ albert:/fs/gd2
+ albert:/fs/gp
+ geech:/usr/jla
+ churchy:/usr/roland
+ albert:/
+ albert:/usr
+ apple-gunkies:/
+ apple-gunkies:/usr
+ gnu:/hack
+ gnu:/u
+ apple-gunkies:/com/mailer/gnu
+ apple-gunkies:/com/archive/gnu"
+
+ BACKUP_FILES="/com/mailer/aliases /com/mailer/league*[a-z]"
+
+
+File: tar.info, Node: Scripted Backups, Next: Scripted Restoration, Prev: Backup Parameters, Up: Backups
+
+5.5 Using the Backup Scripts
+============================
+
+The syntax for running a backup script is:
+
+ backup --level=LEVEL --time=TIME
+
+ The `level' option requests the dump level. Thus, to produce a full
+dump, specify `--level=0' (this is the default, so `--level' may be
+omitted if its value is `0'). (1)
+
+ The `--time' option determines when should the backup be run. TIME
+may take three forms:
+
+HH:MM
+ The dump must be run at HH hours MM minutes.
+
+HH
+ The dump must be run at HH hours
+
+now
+ The dump must be run immediately.
+
+ You should start a script with a tape or disk mounted. Once you
+start a script, it prompts you for new tapes or disks as it needs them.
+Media volumes don't have to correspond to archive files -- a
+multi-volume archive can be started in the middle of a tape that
+already contains the end of another multi-volume archive. The
+`restore' script prompts for media by its archive volume, so to avoid
+an error message you should keep track of which tape (or disk) contains
+which volume of the archive (*note Scripted Restoration::).
+
+ The backup scripts write two files on the file system. The first is
+a record file in `/etc/tar-backup/', which is used by the scripts to
+store and retrieve information about which files were dumped. This
+file is not meant to be read by humans, and should not be deleted by
+them. *Note Snapshot Files::, for a more detailed explanation of this
+file.
+
+ The second file is a log file containing the names of the file
+systems and files dumped, what time the backup was made, and any error
+messages that were generated, as well as how much space was left in the
+media volume after the last volume of the archive was written. You
+should check this log file after every backup. The file name is
+`log-MM-DD-YYYY-level-N', where MM-DD-YYYY represents current date, and
+N represents current dump level number.
+
+ The script also prints the name of each system being dumped to the
+standard output.
+
+ Following is the full list of options accepted by `backup' script:
+
+`-l LEVEL'
+`--level=LEVEL'
+ Do backup level LEVEL (default 0).
+
+`-f'
+`--force'
+ Force backup even if today's log file already exists.
+
+`-v[LEVEL]'
+`--verbose[=LEVEL]'
+ Set verbosity level. The higher the level is, the more debugging
+ information will be output during execution. Default LEVEL is
+ 100, which means the highest debugging level.
+
+`-t START-TIME'
+`--time=START-TIME'
+ Wait till TIME, then do backup.
+
+`-h'
+`--help'
+ Display short help message and exit.
+
+`-V'
+`--version'
+ Display information about the program's name, version, origin and
+ legal status, all on standard output, and then exit successfully.
+
+ ---------- Footnotes ----------
+
+ (1) For backward compatibility, the `backup' will also try to deduce
+the requested dump level from the name of the script itself. If the
+name consists of a string `level-' followed by a single decimal digit,
+that digit is taken as the dump level number. Thus, you may create a
+link from `backup' to `level-1' and then run `level-1' whenever you
+need to create a level one dump.
+
+
+File: tar.info, Node: Scripted Restoration, Prev: Scripted Backups, Up: Backups
+
+5.6 Using the Restore Script
+============================
+
+To restore files that were archived using a scripted backup, use the
+`restore' script. Its usage is quite straightforward. In the simplest
+form, invoke `restore --all', it will then restore all the file systems
+and files specified in `backup-specs' (*note BACKUP_DIRS:
+General-Purpose Variables.).
+
+ You may select the file systems (and/or files) to restore by giving
+`restore' list of "patterns" in its command line. For example, running
+
+ restore 'albert:*'
+
+will restore all file systems on the machine `albert'. A more
+complicated example:
+
+ restore 'albert:*' '*:/var'
+
+This command will restore all file systems on the machine `albert' as
+well as `/var' file system on all machines.
+
+ By default `restore' will start restoring files from the lowest
+available dump level (usually zero) and will continue through all
+available dump levels. There may be situations where such a thorough
+restore is not necessary. For example, you may wish to restore only
+files from the recent level one backup. To do so, use `--level'
+option, as shown in the example below:
+
+ restore --level=1
+
+ The full list of options accepted by `restore' follows:
+
+`-a'
+`--all'
+ Restore all file systems and files specified in `backup-specs'
+
+`-l LEVEL'
+`--level=LEVEL'
+ Start restoring from the given backup level, instead of the
+ default 0.
+
+`-v[LEVEL]'
+`--verbose[=LEVEL]'
+ Set verbosity level. The higher the level is, the more debugging
+ information will be output during execution. Default LEVEL is
+ 100, which means the highest debugging level.
+
+`-h'
+`--help'
+ Display short help message and exit.
+
+`-V'
+`--version'
+ Display information about the program's name, version, origin and
+ legal status, all on standard output, and then exit successfully.
+
+ You should start the restore script with the media containing the
+first volume of the archive mounted. The script will prompt for other
+volumes as they are needed. If the archive is on tape, you don't need
+to rewind the tape to to its beginning--if the tape head is positioned
+past the beginning of the archive, the script will rewind the tape as
+needed. *Note Tape Positioning::, for a discussion of tape positioning.
+
+ *Warning:* The script will delete files from the active file
+ system if they were not in the file system when the archive was
+ made.
+
+ *Note Incremental Dumps::, for an explanation of how the script makes
+that determination.
+
+
+File: tar.info, Node: Choosing, Next: Date input formats, Prev: Backups, Up: Top
+
+6 Choosing Files and Names for `tar'
+************************************
+
+ _(This message will disappear, once this node revised.)_
+
+Certain options to `tar' enable you to specify a name for your archive.
+Other options let you decide which files to include or exclude from
+the archive, based on when or whether files were modified, whether the
+file names do or don't match specified patterns, or whether files are
+in specified directories.
+
+ This chapter discusses these options in detail.
+
+* Menu:
+
+* file:: Choosing the Archive's Name
+* Selecting Archive Members::
+* files:: Reading Names from a File
+* exclude:: Excluding Some Files
+* wildcards:: Wildcards Patterns and Matching
+* quoting styles:: Ways of Quoting Special Characters in Names
+* transform:: Modifying File and Member Names
+* after:: Operating Only on New Files
+* recurse:: Descending into Directories
+* one:: Crossing File System Boundaries
+
+
+File: tar.info, Node: file, Next: Selecting Archive Members, Up: Choosing
+
+6.1 Choosing and Naming Archive Files
+=====================================
+
+ _(This message will disappear, once this node revised.)_
+
+By default, `tar' uses an archive file name that was compiled when it
+was built on the system; usually this name refers to some physical tape
+drive on the machine. However, the person who installed `tar' on the
+system may not have set the default to a meaningful value as far as
+most users are concerned. As a result, you will usually want to tell
+`tar' where to find (or create) the archive. The `--file=ARCHIVE-NAME'
+(`-f ARCHIVE-NAME') option allows you to either specify or name a file
+to use as the archive instead of the default archive file location.
+
+`--file=ARCHIVE-NAME'
+`-f ARCHIVE-NAME'
+ Name the archive to create or operate on. Use in conjunction with
+ any operation.
+
+ For example, in this `tar' command,
+
+ $ tar -cvf collection.tar blues folk jazz
+
+`collection.tar' is the name of the archive. It must directly follow
+the `-f' option, since whatever directly follows `-f' _will_ end up
+naming the archive. If you neglect to specify an archive name, you may
+end up overwriting a file in the working directory with the archive you
+create since `tar' will use this file's name for the archive name.
+
+ An archive can be saved as a file in the file system, sent through a
+pipe or over a network, or written to an I/O device such as a tape,
+floppy disk, or CD write drive.
+
+ If you do not name the archive, `tar' uses the value of the
+environment variable `TAPE' as the file name for the archive. If that
+is not available, `tar' uses a default, compiled-in archive name,
+usually that for tape unit zero (i.e., `/dev/tu00').
+
+ If you use `-' as an ARCHIVE-NAME, `tar' reads the archive from
+standard input (when listing or extracting files), or writes it to
+standard output (when creating an archive). If you use `-' as an
+ARCHIVE-NAME when modifying an archive, `tar' reads the original
+archive from its standard input and writes the entire new archive to
+its standard output.
+
+ The following example is a convenient way of copying directory
+hierarchy from `sourcedir' to `targetdir'.
+
+ $ (cd sourcedir; tar -cf - .) | (cd targetdir; tar -xpf -)
+
+ The `-C' option allows to avoid using subshells:
+
+ $ tar -C sourcedir -cf - . | tar -C targetdir -xpf -
+
+ In both examples above, the leftmost `tar' invocation archives the
+contents of `sourcedir' to the standard output, while the rightmost one
+reads this archive from its standard input and extracts it. The `-p'
+option tells it to restore permissions of the extracted files.
+
+ To specify an archive file on a device attached to a remote machine,
+use the following:
+
+ --file=HOSTNAME:/DEV/FILE-NAME
+
+`tar' will complete the remote connection, if possible, and prompt you
+for a username and password. If you use
+`--file=@HOSTNAME:/DEV/FILE-NAME', `tar' will complete the remote
+connection, if possible, using your username as the username on the
+remote machine.
+
+ If the archive file name includes a colon (`:'), then it is assumed
+to be a file on another machine. If the archive file is
+`USER@HOST:FILE', then FILE is used on the host HOST. The remote host
+is accessed using the `rsh' program, with a username of USER. If the
+username is omitted (along with the `@' sign), then your user name will
+be used. (This is the normal `rsh' behavior.) It is necessary for the
+remote machine, in addition to permitting your `rsh' access, to have
+the `rmt' program installed (This command is included in the GNU `tar'
+distribution and by default is installed under `PREFIX/libexec/rmt',
+were PREFIX means your installation prefix). If you need to use a file
+whose name includes a colon, then the remote tape drive behavior can be
+inhibited by using the `--force-local' option.
+
+ When the archive is being created to `/dev/null', GNU `tar' tries to
+minimize input and output operations. The Amanda backup system, when
+used with GNU `tar', has an initial sizing pass which uses this feature.
+
+
+File: tar.info, Node: Selecting Archive Members, Next: files, Prev: file, Up: Choosing
+
+6.2 Selecting Archive Members
+=============================
+
+"File Name arguments" specify which files in the file system `tar'
+operates on, when creating or adding to an archive, or which archive
+members `tar' operates on, when reading or deleting from an archive.
+*Note Operations::.
+
+ To specify file names, you can include them as the last arguments on
+the command line, as follows:
+ tar OPERATION [OPTION1 OPTION2 ...] [FILE NAME-1 FILE NAME-2 ...]
+
+ If a file name begins with dash (`-'), precede it with `--add-file'
+option to prevent it from being treated as an option.
+
+ By default GNU `tar' attempts to "unquote" each file or member name,
+replacing "escape sequences" according to the following table:
+
+Escape Replaced with
+-----------------------------------------------------------
+\a Audible bell (ASCII 7)
+\b Backspace (ASCII 8)
+\f Form feed (ASCII 12)
+\n New line (ASCII 10)
+\r Carriage return (ASCII 13)
+\t Horizontal tabulation (ASCII 9)
+\v Vertical tabulation (ASCII 11)
+\? ASCII 127
+\N ASCII N (N should be an octal number
+ of up to 3 digits)
+
+ A backslash followed by any other symbol is retained.
+
+ This default behavior is controlled by the following command line
+option:
+
+`--unquote'
+ Enable unquoting input file or member names (default).
+
+`--no-unquote'
+ Disable unquoting input file or member names.
+
+ If you specify a directory name as a file name argument, all the
+files in that directory are operated on by `tar'.
+
+ If you do not specify files, `tar' behavior differs depending on the
+operation mode as described below:
+
+ When `tar' is invoked with `--create' (`-c'), `tar' will stop
+immediately, reporting the following:
+
+ $ tar cf a.tar
+ tar: Cowardly refusing to create an empty archive
+ Try `tar --help' or `tar --usage' for more information.
+
+ If you specify either `--list' (`-t') or `--extract' (`--get',
+`-x'), `tar' operates on all the archive members in the archive.
+
+ If run with `--diff' option, tar will compare the archive with the
+contents of the current working directory.
+
+ If you specify any other operation, `tar' does nothing.
+
+ By default, `tar' takes file names from the command line. However,
+there are other ways to specify file or member names, or to modify the
+manner in which `tar' selects the files or members upon which to
+operate. In general, these methods work both for specifying the names
+of files and archive members.
+
+
+File: tar.info, Node: files, Next: exclude, Prev: Selecting Archive Members, Up: Choosing
+
+6.3 Reading Names from a File
+=============================
+
+Instead of giving the names of files or archive members on the command
+line, you can put the names into a file, and then use the
+`--files-from=FILE-OF-NAMES' (`-T FILE-OF-NAMES') option to `tar'.
+Give the name of the file which contains the list of files to include
+as the argument to `--files-from'. In the list, the file names should
+be separated by newlines. You will frequently use this option when you
+have generated the list of files to archive with the `find' utility.
+
+`--files-from=FILE-NAME'
+`-T FILE-NAME'
+ Get names to extract or create from file FILE-NAME.
+
+ If you give a single dash as a file name for `--files-from', (i.e.,
+you specify either `--files-from=-' or `-T -'), then the file names are
+read from standard input.
+
+ Unless you are running `tar' with `--create', you can not use both
+`--files-from=-' and `--file=-' (`-f -') in the same command.
+
+ Any number of `-T' options can be given in the command line.
+
+ The following example shows how to use `find' to generate a list of
+files smaller than 400K in length and put that list into a file called
+`small-files'. You can then use the `-T' option to `tar' to specify
+the files from that file, `small-files', to create the archive
+`little.tgz'. (The `-z' option to `tar' compresses the archive with
+`gzip'; *note gzip:: for more information.)
+
+ $ find . -size -400 -print > small-files
+ $ tar -c -v -z -T small-files -f little.tgz
+
+In the file list given by `-T' option, any file name beginning with `-'
+character is considered a `tar' option and is processed accordingly.(1)
+For example, the common use of this feature is to change to another
+directory by specifying `-C' option:
+
+ $ cat list
+ -C/etc
+ passwd
+ hosts
+ -C/lib
+ libc.a
+ $ tar -c -f foo.tar --files-from list
+
+In this example, `tar' will first switch to `/etc' directory and add
+files `passwd' and `hosts' to the archive. Then it will change to
+`/lib' directory and will archive the file `libc.a'. Thus, the
+resulting archive `foo.tar' will contain:
+
+ $ tar tf foo.tar
+ passwd
+ hosts
+ libc.a
+
+
+ Notice that the option parsing algorithm used with `-T' is stricter
+than the one used by shell. Namely, when specifying option arguments,
+you should observe the following rules:
+
+ * When using short (single-letter) option form, its argument must
+ immediately follow the option letter, without any intervening
+ whitespace. For example: `-Cdir'.
+
+ * When using long option form, the option argument must be separated
+ from the option by a single equal sign. No whitespace is allowed
+ on any side of the equal sign. For example: `--directory=dir'.
+
+ * For both short and long option forms, the option argument can be
+ given on the next line after the option name, e.g.:
+
+ --directory
+ dir
+
+ and
+
+ -C
+ dir
+
+ If you happen to have a file whose name starts with `-', precede it
+with `--add-file' option to prevent it from being recognized as an
+option. For example: `--add-file=--my-file'.
+
+* Menu:
+
+* nul::
+
+ ---------- Footnotes ----------
+
+ (1) Versions of GNU `tar' up to 1.15.1 recognized only `-C' option
+in file lists, and only if the option and its argument occupied two
+consecutive lines.
+
+
+File: tar.info, Node: nul, Up: files
+
+6.3.1 `NUL' Terminated File Names
+---------------------------------
+
+The `--null' option causes `--files-from=FILE-OF-NAMES' (`-T
+FILE-OF-NAMES') to read file names terminated by a `NUL' instead of a
+newline, so files whose names contain newlines can be archived using
+`--files-from'.
+
+`--null'
+ Only consider `NUL' terminated file names, instead of files that
+ terminate in a newline.
+
+ The `--null' option is just like the one in GNU `xargs' and `cpio',
+and is useful with the `-print0' predicate of GNU `find'. In `tar',
+`--null' also disables special handling for file names that begin with
+dash.
+
+ This example shows how to use `find' to generate a list of files
+larger than 800K in length and put that list into a file called
+`long-files'. The `-print0' option to `find' is just like `-print',
+except that it separates files with a `NUL' rather than with a newline.
+You can then run `tar' with both the `--null' and `-T' options to
+specify that `tar' get the files from that file, `long-files', to
+create the archive `big.tgz'. The `--null' option to `tar' will cause
+`tar' to recognize the `NUL' separator between files.
+
+ $ find . -size +800 -print0 > long-files
+ $ tar -c -v --null --files-from=long-files --file=big.tar
+
+
+File: tar.info, Node: exclude, Next: wildcards, Prev: files, Up: Choosing
+
+6.4 Excluding Some Files
+========================
+
+ _(This message will disappear, once this node revised.)_
+
+To avoid operating on files whose names match a particular pattern, use
+the `--exclude' or `--exclude-from' options.
+
+`--exclude=PATTERN'
+ Causes `tar' to ignore files that match the PATTERN.
+
+ The `--exclude=PATTERN' option prevents any file or member whose
+name matches the shell wildcard (PATTERN) from being operated on. For
+example, to create an archive with all the contents of the directory
+`src' except for files whose names end in `.o', use the command `tar
+-cf src.tar --exclude='*.o' src'.
+
+ You may give multiple `--exclude' options.
+
+`--exclude-from=FILE'
+`-X FILE'
+ Causes `tar' to ignore files that match the patterns listed in
+ FILE.
+
+ Use the `--exclude-from' option to read a list of patterns, one per
+line, from FILE; `tar' will ignore files matching those patterns. Thus
+if `tar' is called as `tar -c -X foo .' and the file `foo' contains a
+single line `*.o', no files whose names end in `.o' will be added to
+the archive.
+
+ When creating an archive, the `--exclude-caches' option family
+causes `tar' to exclude all directories that contain a "cache directory
+tag". A cache directory tag is a short file with the well-known name
+`CACHEDIR.TAG' and having a standard header specified in
+`http://www.brynosaurus.com/cachedir/spec.html'. Various applications
+write cache directory tags into directories they use to hold
+regenerable, non-precious data, so that such data can be more easily
+excluded from backups.
+
+ There are three `exclude-caches' option, providing a different
+exclusion semantics:
+
+`--exclude-caches'
+ Do not archive the contents of the directory, but archive the
+ directory itself and the `CACHEDIR.TAG' file.
+
+`--exclude-caches-under'
+ Do not archive the contents of the directory, nor the
+ `CACHEDIR.TAG' file, archive only the directory itself.
+
+`--exclude-caches-all'
+ Omit directories containing `CACHEDIR.TAG' file entirely.
+
+ Another option family, `--exclude-tag', provides a generalization of
+this concept. It takes a single argument, a file name to look for.
+Any directory that contains this file will be excluded from the dump.
+Similarly to `exclude-caches', there are three options in this option
+family:
+
+`--exclude-tag=FILE'
+ Do not dump the contents of the directory, but dump the directory
+ itself and the FILE.
+
+`--exclude-tag-under=FILE'
+ Do not dump the contents of the directory, nor the FILE, archive
+ only the directory itself.
+
+`--exclude-tag-all=FILE'
+ Omit directories containing FILE file entirely.
+
+ Multiple `--exclude-tag*' options can be given.
+
+ For example, given this directory:
+
+ $ find dir
+ dir
+ dir/blues
+ dir/jazz
+ dir/folk
+ dir/folk/tagfile
+ dir/folk/sanjuan
+ dir/folk/trote
+
+ The `--exclude-tag' will produce the following:
+
+ $ tar -cf archive.tar --exclude-tag=tagfile -v dir
+ dir/
+ dir/blues
+ dir/jazz
+ dir/folk/
+ tar: dir/folk/: contains a cache directory tag tagfile;
+ contents not dumped
+ dir/folk/tagfile
+
+ Both the `dir/folk' directory and its tagfile are preserved in the
+archive, however the rest of files in this directory are not.
+
+ Now, using the `--exclude-tag-under' option will exclude `tagfile'
+from the dump, while still preserving the directory itself, as shown in
+this example:
+
+ $ tar -cf archive.tar --exclude-tag-under=tagfile -v dir
+ dir/
+ dir/blues
+ dir/jazz
+ dir/folk/
+ ./tar: dir/folk/: contains a cache directory tag tagfile;
+ contents not dumped
+
+ Finally, using `--exclude-tag-all' omits the `dir/folk' directory
+entirely:
+
+ $ tar -cf archive.tar --exclude-tag-all=tagfile -v dir
+ dir/
+ dir/blues
+ dir/jazz
+ ./tar: dir/folk/: contains a cache directory tag tagfile;
+ directory not dumped
+
+* Menu:
+
+* problems with exclude::
+
+
+File: tar.info, Node: problems with exclude, Up: exclude
+
+Problems with Using the `exclude' Options
+-----------------------------------------
+
+Some users find `exclude' options confusing. Here are some common
+pitfalls:
+
+ * The main operating mode of `tar' does not act on a file name
+ explicitly listed on the command line, if one of its file name
+ components is excluded. In the example above, if you create an
+ archive and exclude files that end with `*.o', but explicitly name
+ the file `dir.o/foo' after all the options have been listed,
+ `dir.o/foo' will be excluded from the archive.
+
+ * You can sometimes confuse the meanings of `--exclude' and
+ `--exclude-from'. Be careful: use `--exclude' when files to be
+ excluded are given as a pattern on the command line. Use
+ `--exclude-from' to introduce the name of a file which contains a
+ list of patterns, one per line; each of these patterns can exclude
+ zero, one, or many files.
+
+ * When you use `--exclude=PATTERN', be sure to quote the PATTERN
+ parameter, so GNU `tar' sees wildcard characters like `*'. If you
+ do not do this, the shell might expand the `*' itself using files
+ at hand, so `tar' might receive a list of files instead of one
+ pattern, or none at all, making the command somewhat illegal.
+ This might not correspond to what you want.
+
+ For example, write:
+
+ $ tar -c -f ARCHIVE.TAR --exclude '*.o' DIRECTORY
+
+ rather than:
+
+ # _Wrong!_
+ $ tar -c -f ARCHIVE.TAR --exclude *.o DIRECTORY
+
+ * You must use use shell syntax, or globbing, rather than `regexp'
+ syntax, when using exclude options in `tar'. If you try to use
+ `regexp' syntax to describe files to be excluded, your command
+ might fail.
+
+ * In earlier versions of `tar', what is now the `--exclude-from'
+ option was called `--exclude' instead. Now, `--exclude' applies
+ to patterns listed on the command line and `--exclude-from'
+ applies to patterns listed in a file.
+
+
+
+File: tar.info, Node: wildcards, Next: quoting styles, Prev: exclude, Up: Choosing
+
+6.5 Wildcards Patterns and Matching
+===================================
+
+"Globbing" is the operation by which "wildcard" characters, `*' or `?'
+for example, are replaced and expanded into all existing files matching
+the given pattern. GNU `tar' can use wildcard patterns for matching
+(or globbing) archive members when extracting from or listing an
+archive. Wildcard patterns are also used for verifying volume labels
+of `tar' archives. This section has the purpose of explaining wildcard
+syntax for `tar'.
+
+ A PATTERN should be written according to shell syntax, using wildcard
+characters to effect globbing. Most characters in the pattern stand
+for themselves in the matched string, and case is significant: `a' will
+match only `a', and not `A'. The character `?' in the pattern matches
+any single character in the matched string. The character `*' in the
+pattern matches zero, one, or more single characters in the matched
+string. The character `\' says to take the following character of the
+pattern _literally_; it is useful when one needs to match the `?', `*',
+`[' or `\' characters, themselves.
+
+ The character `[', up to the matching `]', introduces a character
+class. A "character class" is a list of acceptable characters for the
+next single character of the matched string. For example, `[abcde]'
+would match any of the first five letters of the alphabet. Note that
+within a character class, all of the "special characters" listed above
+other than `\' lose their special meaning; for example, `[-\\[*?]]'
+would match any of the characters, `-', `\', `[', `*', `?', or `]'.
+(Due to parsing constraints, the characters `-' and `]' must either
+come _first_ or _last_ in a character class.)
+
+ If the first character of the class after the opening `[' is `!' or
+`^', then the meaning of the class is reversed. Rather than listing
+character to match, it lists those characters which are _forbidden_ as
+the next single character of the matched string.
+
+ Other characters of the class stand for themselves. The special
+construction `[A-E]', using an hyphen between two letters, is meant to
+represent all characters between A and E, inclusive.
+
+ Periods (`.') or forward slashes (`/') are not considered special
+for wildcard matches. However, if a pattern completely matches a
+directory prefix of a matched string, then it matches the full matched
+string: thus, excluding a directory also excludes all the files beneath
+it.
+
+* Menu:
+
+* controlling pattern-matching::
+
+
+File: tar.info, Node: controlling pattern-matching, Up: wildcards
+
+Controlling Pattern-Matching
+----------------------------
+
+For the purposes of this section, we call "exclusion members" all
+member names obtained while processing `--exclude' and `--exclude-from'
+options, and "inclusion members" those member names that were given in
+the command line or read from the file specified with `--files-from'
+option.
+
+ These two pairs of member lists are used in the following operations:
+`--diff', `--extract', `--list', `--update'.
+
+ There are no inclusion members in create mode (`--create' and
+`--append'), since in this mode the names obtained from the command
+line refer to _files_, not archive members.
+
+ By default, inclusion members are compared with archive members
+literally (1) and exclusion members are treated as globbing patterns.
+For example:
+
+ $ tar tf foo.tar
+ a.c
+ b.c
+ a.txt
+ [remarks]
+ # Member names are used verbatim:
+ $ tar -xf foo.tar -v '[remarks]'
+ [remarks]
+ # Exclude member names are globbed:
+ $ tar -xf foo.tar -v --exclude '*.c'
+ a.txt
+ [remarks]
+
+ This behavior can be altered by using the following options:
+
+`--wildcards'
+ Treat all member names as wildcards.
+
+`--no-wildcards'
+ Treat all member names as literal strings.
+
+ Thus, to extract files whose names end in `.c', you can use:
+
+ $ tar -xf foo.tar -v --wildcards '*.c'
+ a.c
+ b.c
+
+Notice quoting of the pattern to prevent the shell from interpreting it.
+
+ The effect of `--wildcards' option is canceled by `--no-wildcards'.
+This can be used to pass part of the command line arguments verbatim
+and other part as globbing patterns. For example, the following
+invocation:
+
+ $ tar -xf foo.tar --wildcards '*.txt' --no-wildcards '[remarks]'
+
+instructs `tar' to extract from `foo.tar' all files whose names end in
+`.txt' and the file named `[remarks]'.
+
+ Normally, a pattern matches a name if an initial subsequence of the
+name's components matches the pattern, where `*', `?', and `[...]' are
+the usual shell wildcards, `\' escapes wildcards, and wildcards can
+match `/'.
+
+ Other than optionally stripping leading `/' from names (*note
+absolute::), patterns and names are used as-is. For example, trailing
+`/' is not trimmed from a user-specified name before deciding whether
+to exclude it.
+
+ However, this matching procedure can be altered by the options listed
+below. These options accumulate. For example:
+
+ --ignore-case --exclude='makefile' --no-ignore-case ---exclude='readme'
+
+ignores case when excluding `makefile', but not when excluding `readme'.
+
+`--anchored'
+`--no-anchored'
+ If anchored, a pattern must match an initial subsequence of the
+ name's components. Otherwise, the pattern can match any
+ subsequence. Default is `--no-anchored' for exclusion members and
+ `--anchored' inclusion members.
+
+`--ignore-case'
+`--no-ignore-case'
+ When ignoring case, upper-case patterns match lower-case names and
+ vice versa. When not ignoring case (the default), matching is
+ case-sensitive.
+
+`--wildcards-match-slash'
+`--no-wildcards-match-slash'
+ When wildcards match slash (the default for exclusion members), a
+ wildcard like `*' in the pattern can match a `/' in the name.
+ Otherwise, `/' is matched only by `/'.
+
+
+ The `--recursion' and `--no-recursion' options (*note recurse::)
+also affect how member patterns are interpreted. If recursion is in
+effect, a pattern matches a name if it matches any of the name's parent
+directories.
+
+ The following table summarizes pattern-matching default values:
+
+Members Default settings
+--------------------------------------------------------------------------
+Inclusion `--no-wildcards --anchored
+ --no-wildcards-match-slash'
+Exclusion `--wildcards --no-anchored
+ --wildcards-match-slash'
+
+ ---------- Footnotes ----------
+
+ (1) Notice that earlier GNU `tar' versions used globbing for
+inclusion members, which contradicted to UNIX98 specification and was
+not documented. *Note Changes::, for more information on this and other
+changes.
+
+
+File: tar.info, Node: quoting styles, Next: transform, Prev: wildcards, Up: Choosing
+
+6.6 Quoting Member Names
+========================
+
+When displaying member names, `tar' takes care to avoid ambiguities
+caused by certain characters. This is called "name quoting". The
+characters in question are:
+
+ * Non-printable control characters:
+
+ Character ASCII Character name
+ ---------------------------------------------------------------
+ \a 7 Audible bell
+ \b 8 Backspace
+ \f 12 Form feed
+ \n 10 New line
+ \r 13 Carriage return
+ \t 9 Horizontal tabulation
+ \v 11 Vertical tabulation
+
+ * Space (ASCII 32)
+
+ * Single and double quotes (`'' and `"')
+
+ * Backslash (`\')
+
+ The exact way `tar' uses to quote these characters depends on the
+"quoting style". The default quoting style, called "escape" (see
+below), uses backslash notation to represent control characters, space
+and backslash. Using this quoting style, control characters are
+represented as listed in column `Character' in the above table, a space
+is printed as `\ ' and a backslash as `\\'.
+
+ GNU `tar' offers seven distinct quoting styles, which can be selected
+using `--quoting-style' option:
+
+`--quoting-style=STYLE'
+ Sets quoting style. Valid values for STYLE argument are: literal,
+ shell, shell-always, c, escape, locale, clocale.
+
+ These styles are described in detail below. To illustrate their
+effect, we will use an imaginary tar archive `arch.tar' containing the
+following members:
+
+ # 1. Contains horizontal tabulation character.
+ a tab
+ # 2. Contains newline character
+ a
+ newline
+ # 3. Contains a space
+ a space
+ # 4. Contains double quotes
+ a"double"quote
+ # 5. Contains single quotes
+ a'single'quote
+ # 6. Contains a backslash character:
+ a\backslash
+
+ Here is how usual `ls' command would have listed them, if they had
+existed in the current working directory:
+
+ $ ls
+ a\ttab
+ a\nnewline
+ a\ space
+ a"double"quote
+ a'single'quote
+ a\\backslash
+
+ Quoting styles:
+
+`literal'
+ No quoting, display each character as is:
+
+ $ tar tf arch.tar --quoting-style=literal
+ ./
+ ./a space
+ ./a'single'quote
+ ./a"double"quote
+ ./a\backslash
+ ./a tab
+ ./a
+ newline
+
+`shell'
+ Display characters the same way Bourne shell does: control
+ characters, except `\t' and `\n', are printed using backslash
+ escapes, `\t' and `\n' are printed as is, and a single quote is
+ printed as `\''. If a name contains any quoted characters, it is
+ enclosed in single quotes. In particular, if a name contains
+ single quotes, it is printed as several single-quoted strings:
+
+ $ tar tf arch.tar --quoting-style=shell
+ ./
+ './a space'
+ './a'\''single'\''quote'
+ './a"double"quote'
+ './a\backslash'
+ './a tab'
+ './a
+ newline'
+
+`shell-always'
+ Same as `shell', but the names are always enclosed in single
+ quotes:
+
+ $ tar tf arch.tar --quoting-style=shell-always
+ './'
+ './a space'
+ './a'\''single'\''quote'
+ './a"double"quote'
+ './a\backslash'
+ './a tab'
+ './a
+ newline'
+
+`c'
+ Use the notation of the C programming language. All names are
+ enclosed in double quotes. Control characters are quoted using
+ backslash notations, double quotes are represented as `\"',
+ backslash characters are represented as `\\'. Single quotes and
+ spaces are not quoted:
+
+ $ tar tf arch.tar --quoting-style=c
+ "./"
+ "./a space"
+ "./a'single'quote"
+ "./a\"double\"quote"
+ "./a\\backslash"
+ "./a\ttab"
+ "./a\nnewline"
+
+`escape'
+ Control characters are printed using backslash notation, a space is
+ printed as `\ ' and a backslash as `\\'. This is the default
+ quoting style, unless it was changed when configured the package.
+
+ $ tar tf arch.tar --quoting-style=escape
+ ./
+ ./a space
+ ./a'single'quote
+ ./a"double"quote
+ ./a\\backslash
+ ./a\ttab
+ ./a\nnewline
+
+`locale'
+ Control characters, single quote and backslash are printed using
+ backslash notation. All names are quoted using left and right
+ quotation marks, appropriate to the current locale. If it does not
+ define quotation marks, use ``' as left and `'' as right quotation
+ marks. Any occurrences of the right quotation mark in a name are
+ escaped with `\', for example:
+
+ For example:
+
+ $ tar tf arch.tar --quoting-style=locale
+ `./'
+ `./a space'
+ `./a\'single\'quote'
+ `./a"double"quote'
+ `./a\\backslash'
+ `./a\ttab'
+ `./a\nnewline'
+
+`clocale'
+ Same as `locale', but `"' is used for both left and right
+ quotation marks, if not provided by the currently selected locale:
+
+ $ tar tf arch.tar --quoting-style=clocale
+ "./"
+ "./a space"
+ "./a'single'quote"
+ "./a\"double\"quote"
+ "./a\\backslash"
+ "./a\ttab"
+ "./a\nnewline"
+
+ You can specify which characters should be quoted in addition to
+those implied by the current quoting style:
+
+`--quote-chars=STRING'
+ Always quote characters from STRING, even if the selected quoting
+ style would not quote them.
+
+ For example, using `escape' quoting (compare with the usual escape
+listing above):
+
+ $ tar tf arch.tar --quoting-style=escape --quote-chars=' "'
+ ./
+ ./a\ space
+ ./a'single'quote
+ ./a\"double\"quote
+ ./a\\backslash
+ ./a\ttab
+ ./a\nnewline
+
+ To disable quoting of such additional characters, use the following
+option:
+
+`--no-quote-chars=STRING'
+ Remove characters listed in STRING from the list of quoted
+ characters set by the previous `--quote-chars' option.
+
+ This option is particularly useful if you have added `--quote-chars'
+to your `TAR_OPTIONS' (*note TAR_OPTIONS::) and wish to disable it for
+the current invocation.
+
+ Note, that `--no-quote-chars' does _not_ disable those characters
+that are quoted by default in the selected quoting style.
+
+
+File: tar.info, Node: transform, Next: after, Prev: quoting styles, Up: Choosing
+
+6.7 Modifying File and Member Names
+===================================
+
+`Tar' archives contain detailed information about files stored in them
+and full file names are part of that information. When storing file to
+an archive, its file name is recorded in the archive along with the
+actual file contents. When restoring from an archive, a file is
+created on disk with exactly the same name as that stored in the
+archive. In the majority of cases this is the desired behavior of a
+file archiver. However, there are some cases when it is not.
+
+ First of all, it is often unsafe to extract archive members with
+absolute file names or those that begin with a `../'. GNU `tar' takes
+special precautions when extracting such names and provides a special
+option for handling them, which is described in *note absolute::.
+
+ Secondly, you may wish to extract file names without some leading
+directory components, or with otherwise modified names. In other cases
+it is desirable to store files under differing names in the archive.
+
+ GNU `tar' provides two options for these needs.
+
+`--strip-components=NUMBER'
+ Strip given NUMBER of leading components from file names before
+ extraction.
+
+ For example, suppose you have archived whole `/usr' hierarchy to a
+tar archive named `usr.tar'. Among other files, this archive contains
+`usr/include/stdlib.h', which you wish to extract to the current
+working directory. To do so, you type:
+
+ $ tar -xf usr.tar --strip=2 usr/include/stdlib.h
+
+ The option `--strip=2' instructs `tar' to strip the two leading
+components (`usr/' and `include/') off the file name.
+
+ If you add to the above invocation `--verbose' (`-v') option, you
+will note that the verbose listing still contains the full file name,
+with the two removed components still in place. This can be
+inconvenient, so `tar' provides a special option for altering this
+behavior:
+
+`--show-transformed-names'
+ Display file or member names with all requested transformations
+ applied.
+
+For example:
+
+ $ tar -xf usr.tar -v --strip=2 usr/include/stdlib.h
+ usr/include/stdlib.h
+ $ tar -xf usr.tar -v --strip=2 --show-transformed usr/include/stdlib.h
+ stdlib.h
+
+ Notice that in both cases the file is `stdlib.h' extracted to the
+current working directory, `--show-transformed-names' affects only the
+way its name is displayed.
+
+ This option is especially useful for verifying whether the invocation
+will have the desired effect. Thus, before running
+
+ $ tar -x --strip=N
+
+it is often advisable to run
+
+ $ tar -t -v --show-transformed --strip=N
+
+to make sure the command will produce the intended results.
+
+ In case you need to apply more complex modifications to the file
+name, GNU `tar' provides a general-purpose transformation option:
+
+`--transform=EXPRESSION'
+ Modify file names using supplied EXPRESSION.
+
+The EXPRESSION is a `sed'-like replace expression of the form:
+
+ s/REGEXP/REPLACE/[FLAGS]
+
+where REGEXP is a "regular expression", REPLACE is a replacement for
+each file name part that matches REGEXP. Both REGEXP and REPLACE are
+described in detail in *note The "s" Command: (sed)The "s" Command.
+
+ Supported FLAGS are:
+
+`g'
+ Apply the replacement to _all_ matches to the REGEXP, not just the
+ first.
+
+`i'
+ Use case-insensitive matching
+
+`x'
+ REGEXP is an "extended regular expression" (*note Extended regular
+ expressions: (sed)Extended regexps.).
+
+`NUMBER'
+ Only replace the NUMBERth match of the REGEXP.
+
+ Note: the POSIX standard does not specify what should happen when
+ you mix the `g' and NUMBER modifiers. GNU `tar' follows the GNU
+ `sed' implementation in this regard, so the interaction is defined
+ to be: ignore matches before the NUMBERth, and then match and
+ replace all matches from the NUMBERth on.
+
+
+ Any delimiter can be used in lieue of `/', the only requirement being
+that it be used consistently throughout the expression. For example,
+the following two expressions are equivalent:
+
+ s/one/two/
+ s,one,two,
+
+ Changing delimiters is often useful when the REGEX contains slashes.
+For example, it is more convenient to write `s,/,-,' than `s/\//-/'.
+
+ Here are several examples of `--transform' usage:
+
+ 1. Extract `usr/' hierarchy into `usr/local/':
+
+ $ tar --transform='s,usr/,usr/local/,' -x -f arch.tar
+
+ 2. Strip two leading directory components (equivalent to
+ `--strip-components=2'):
+
+ $ tar --transform='s,/*[^/]*/[^/]*/,,' -x -f arch.tar
+
+ 3. Prepend `/prefix/' to each file name:
+
+ $ tar --transform 's,^,/prefix/,' -x -f arch.tar
+
+ 4. Convert each file name to lower case:
+
+ $ tar --transform 's/.*/\L&/' -x -f arch.tar
+
+
+ Unlike `--strip-components', `--transform' can be used in any GNU
+`tar' operation mode. For example, the following command adds files to
+the archive while replacing the leading `usr/' component with `var/':
+
+ $ tar -cf arch.tar --transform='s,^usr/,var/,' /
+
+ To test `--transform' effect we suggest using
+`--show-transformed-names' option:
+
+ $ tar -cf arch.tar --transform='s,^usr/,var/,' \
+ --verbose --show-transformed-names /
+
+ If both `--strip-components' and `--transform' are used together,
+then `--transform' is applied first, and the required number of
+components is then stripped from its result.
+
+
+File: tar.info, Node: after, Next: recurse, Prev: transform, Up: Choosing
+
+6.8 Operating Only on New Files
+===============================
+
+ _(This message will disappear, once this node revised.)_
+
+The `--after-date=DATE' (`--newer=DATE', `-N DATE') option causes `tar'
+to only work on files whose data modification or status change times
+are newer than the DATE given. If DATE starts with `/' or `.', it is
+taken to be a file name; the data modification time of that file is
+used as the date. If you use this option when creating or appending to
+an archive, the archive will only include new files. If you use
+`--after-date' when extracting an archive, `tar' will only extract
+files newer than the DATE you specify.
+
+ If you only want `tar' to make the date comparison based on
+modification of the file's data (rather than status changes), then use
+the `--newer-mtime=DATE' option.
+
+ You may use these options with any operation. Note that these
+options differ from the `--update' (`-u') operation in that they allow
+you to specify a particular date against which `tar' can compare when
+deciding whether or not to archive the files.
+
+`--after-date=DATE'
+`--newer=DATE'
+`-N DATE'
+ Only store files newer than DATE.
+
+ Acts on files only if their data modification or status change
+ times are later than DATE. Use in conjunction with any operation.
+
+ If DATE starts with `/' or `.', it is taken to be a file name; the
+ data modification time of that file is used as the date.
+
+`--newer-mtime=DATE'
+ Acts like `--after-date', but only looks at data modification
+ times.
+
+ These options limit `tar' to operate only on files which have been
+modified after the date specified. A file's status is considered to
+have changed if its contents have been modified, or if its owner,
+permissions, and so forth, have been changed. (For more information on
+how to specify a date, see *note Date input formats::; remember that the
+entire date argument must be quoted if it contains any spaces.)
+
+ Gurus would say that `--after-date' tests both the data modification
+time (`mtime', the time the contents of the file were last modified)
+and the status change time (`ctime', the time the file's status was
+last changed: owner, permissions, etc.) fields, while `--newer-mtime'
+tests only the `mtime' field.
+
+ To be precise, `--after-date' checks _both_ `mtime' and `ctime' and
+processes the file if either one is more recent than DATE, while
+`--newer-mtime' only checks `mtime' and disregards `ctime'. Neither
+does it use `atime' (the last time the contents of the file were looked
+at).
+
+ Date specifiers can have embedded spaces. Because of this, you may
+need to quote date arguments to keep the shell from parsing them as
+separate arguments. For example, the following command will add to the
+archive all the files modified less than two days ago:
+
+ $ tar -cf foo.tar --newer-mtime '2 days ago'
+
+ When any of these options is used with the option `--verbose' (*note
+verbose tutorial::) GNU `tar' will try to convert the specified date
+back to its textual representation and compare that with the one given
+with the option. If the two dates differ, `tar' will print a warning
+saying what date it will use. This is to help user ensure he is using
+the right date. For example:
+
+ $ tar -c -f archive.tar --after-date='10 days ago' .
+ tar: Option --after-date: Treating date `10 days ago' as 2006-06-11
+ 13:19:37.232434
+
+ *Please Note:* `--after-date' and `--newer-mtime' should not be
+ used for incremental backups. *Note Incremental Dumps::, for
+ proper way of creating incremental backups.
+
+
+File: tar.info, Node: recurse, Next: one, Prev: after, Up: Choosing
+
+6.9 Descending into Directories
+===============================
+
+ _(This message will disappear, once this node revised.)_
+
+Usually, `tar' will recursively explore all directories (either those
+given on the command line or through the `--files-from' option) for the
+various files they contain. However, you may not always want `tar' to
+act this way.
+
+ The `--no-recursion' option inhibits `tar''s recursive descent into
+specified directories. If you specify `--no-recursion', you can use
+the `find' utility for hunting through levels of directories to
+construct a list of file names which you could then pass to `tar'.
+`find' allows you to be more selective when choosing which files to
+archive; see *note files::, for more information on using `find' with
+`tar', or look.
+
+`--no-recursion'
+ Prevents `tar' from recursively descending directories.
+
+`--recursion'
+ Requires `tar' to recursively descend directories. This is the
+ default.
+
+ When you use `--no-recursion', GNU `tar' grabs directory entries
+themselves, but does not descend on them recursively. Many people use
+`find' for locating files they want to back up, and since `tar'
+_usually_ recursively descends on directories, they have to use the
+`-not -type d' test in their `find' invocation (*note Type:
+(find)Type.), as they usually do not want all the files in a directory.
+They then use the `--files-from' option to archive the files located
+via `find'.
+
+ The problem when restoring files archived in this manner is that the
+directories themselves are not in the archive; so the
+`--same-permissions' (`--preserve-permissions', `-p') option does not
+affect them--while users might really like it to. Specifying
+`--no-recursion' is a way to tell `tar' to grab only the directory
+entries given to it, adding no new files on its own. To summarize, if
+you use `find' to create a list of files to be stored in an archive,
+use it as follows:
+
+ $ find DIR TESTS | \
+ tar -cf ARCHIVE -T - --no-recursion
+
+ The `--no-recursion' option also applies when extracting: it causes
+`tar' to extract only the matched directory entries, not the files
+under those directories.
+
+ The `--no-recursion' option also affects how globbing patterns are
+interpreted (*note controlling pattern-matching::).
+
+ The `--no-recursion' and `--recursion' options apply to later
+options and operands, and can be overridden by later occurrences of
+`--no-recursion' and `--recursion'. For example:
+
+ $ tar -cf jams.tar --no-recursion grape --recursion grape/concord
+
+creates an archive with one entry for `grape', and the recursive
+contents of `grape/concord', but no entries under `grape' other than
+`grape/concord'.
+
+
+File: tar.info, Node: one, Prev: recurse, Up: Choosing
+
+6.10 Crossing File System Boundaries
+====================================
+
+ _(This message will disappear, once this node revised.)_
+
+`tar' will normally automatically cross file system boundaries in order
+to archive files which are part of a directory tree. You can change
+this behavior by running `tar' and specifying `--one-file-system'.
+This option only affects files that are archived because they are in a
+directory that is being archived; `tar' will still archive files
+explicitly named on the command line or through `--files-from',
+regardless of where they reside.
+
+`--one-file-system'
+ Prevents `tar' from crossing file system boundaries when
+ archiving. Use in conjunction with any write operation.
+
+ The `--one-file-system' option causes `tar' to modify its normal
+behavior in archiving the contents of directories. If a file in a
+directory is not on the same file system as the directory itself, then
+`tar' will not archive that file. If the file is a directory itself,
+`tar' will not archive anything beneath it; in other words, `tar' will
+not cross mount points.
+
+ This option is useful for making full or incremental archival
+backups of a file system. If this option is used in conjunction with
+`--verbose' (`-v'), files that are excluded are mentioned by name on
+the standard error.
+
+* Menu:
+
+* directory:: Changing Directory
+* absolute:: Absolute File Names
+
+
+File: tar.info, Node: directory, Next: absolute, Up: one
+
+6.10.1 Changing the Working Directory
+-------------------------------------
+
+To change the working directory in the middle of a list of file names,
+either on the command line or in a file specified using `--files-from'
+(`-T'), use `--directory' (`-C'). This will change the working
+directory to the specified directory after that point in the list.
+
+`--directory=DIRECTORY'
+`-C DIRECTORY'
+ Changes the working directory in the middle of a command line.
+
+ For example,
+
+ $ tar -c -f jams.tar grape prune -C food cherry
+
+will place the files `grape' and `prune' from the current directory
+into the archive `jams.tar', followed by the file `cherry' from the
+directory `food'. This option is especially useful when you have
+several widely separated files that you want to store in the same
+archive.
+
+ Note that the file `cherry' is recorded in the archive under the
+precise name `cherry', _not_ `food/cherry'. Thus, the archive will
+contain three files that all appear to have come from the same
+directory; if the archive is extracted with plain `tar --extract', all
+three files will be written in the current directory.
+
+ Contrast this with the command,
+
+ $ tar -c -f jams.tar grape prune -C food red/cherry
+
+which records the third file in the archive under the name `red/cherry'
+so that, if the archive is extracted using `tar --extract', the third
+file will be written in a subdirectory named `orange-colored'.
+
+ You can use the `--directory' option to make the archive independent
+of the original name of the directory holding the files. The following
+command places the files `/etc/passwd', `/etc/hosts', and `/lib/libc.a'
+into the archive `foo.tar':
+
+ $ tar -c -f foo.tar -C /etc passwd hosts -C /lib libc.a
+
+However, the names of the archive members will be exactly what they were
+on the command line: `passwd', `hosts', and `libc.a'. They will not
+appear to be related by file name to the original directories where
+those files were located.
+
+ Note that `--directory' options are interpreted consecutively. If
+`--directory' specifies a relative file name, it is interpreted
+relative to the then current directory, which might not be the same as
+the original current working directory of `tar', due to a previous
+`--directory' option.
+
+ When using `--files-from' (*note files::), you can put various `tar'
+options (including `-C') in the file list. Notice, however, that in
+this case the option and its argument may not be separated by
+whitespace. If you use short option, its argument must either follow
+the option letter immediately, without any intervening whitespace, or
+occupy the next line. Otherwise, if you use long option, separate its
+argument by an equal sign.
+
+ For instance, the file list for the above example will be:
+
+ -C/etc
+ passwd
+ hosts
+ --directory=/lib
+ libc.a
+
+To use it, you would invoke `tar' as follows:
+
+ $ tar -c -f foo.tar --files-from list
+
+ The interpretation of `--directory' is disabled by `--null' option.
+
+
+File: tar.info, Node: absolute, Prev: directory, Up: one
+
+6.10.2 Absolute File Names
+--------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+`--absolute-names'
+`-P'
+ Do not strip leading slashes from file names, and permit file names
+ containing a `..' file name component.
+
+ By default, GNU `tar' drops a leading `/' on input or output, and
+complains about file names containing a `..' component. This option
+turns off this behavior.
+
+ When `tar' extracts archive members from an archive, it strips any
+leading slashes (`/') from the member name. This causes absolute
+member names in the archive to be treated as relative file names. This
+allows you to have such members extracted wherever you want, instead of
+being restricted to extracting the member in the exact directory named
+in the archive. For example, if the archive member has the name
+`/etc/passwd', `tar' will extract it as if the name were really
+`etc/passwd'.
+
+ File names containing `..' can cause problems when extracting, so
+`tar' normally warns you about such files when creating an archive, and
+rejects attempts to extracts such files.
+
+ Other `tar' programs do not do this. As a result, if you create an
+archive whose member names start with a slash, they will be difficult
+for other people with a non-GNU `tar' program to use. Therefore, GNU
+`tar' also strips leading slashes from member names when putting
+members into the archive. For example, if you ask `tar' to add the file
+`/bin/ls' to an archive, it will do so, but the member name will be
+`bin/ls'.(1)
+
+ If you use the `--absolute-names' (`-P') option, `tar' will do none
+of these transformations.
+
+ To archive or extract files relative to the root directory, specify
+the `--absolute-names' (`-P') option.
+
+ Normally, `tar' acts on files relative to the working
+directory--ignoring superior directory names when archiving, and
+ignoring leading slashes when extracting.
+
+ When you specify `--absolute-names' (`-P'), `tar' stores file names
+including all superior directory names, and preserves leading slashes.
+If you only invoked `tar' from the root directory you would never need
+the `--absolute-names' option, but using this option may be more
+convenient than switching to root.
+
+`--absolute-names'
+ Preserves full file names (including superior directory names) when
+ archiving files. Preserves leading slash when extracting files.
+
+
+ `tar' prints out a message about removing the `/' from file names.
+This message appears once per GNU `tar' invocation. It represents
+something which ought to be told; ignoring what it means can cause very
+serious surprises, later.
+
+ Some people, nevertheless, do not want to see this message. Wanting
+to play really dangerously, one may of course redirect `tar' standard
+error to the sink. For example, under `sh':
+
+ $ tar -c -f archive.tar /home 2> /dev/null
+
+Another solution, both nicer and simpler, would be to change to the `/'
+directory first, and then avoid absolute notation. For example:
+
+ $ (cd / && tar -c -f archive.tar home)
+ # or:
+ $ tar -c -f archive.tar -C / home
+
+ ---------- Footnotes ----------
+
+ (1) A side effect of this is that when `--create' is used with
+`--verbose' the resulting output is not, generally speaking, the same
+as the one you'd get running `tar --list' command. This may be
+important if you use some scripts for comparing both outputs. *Note
+listing member and file names::, for the information on how to handle
+this case.
+
+
+File: tar.info, Node: Date input formats, Next: Formats, Prev: Choosing, Up: Top
+
+7 Date input formats
+********************
+
+First, a quote:
+
+ Our units of temporal measurement, from seconds on up to months,
+ are so complicated, asymmetrical and disjunctive so as to make
+ coherent mental reckoning in time all but impossible. Indeed, had
+ some tyrannical god contrived to enslave our minds to time, to
+ make it all but impossible for us to escape subjection to sodden
+ routines and unpleasant surprises, he could hardly have done
+ better than handing down our present system. It is like a set of
+ trapezoidal building blocks, with no vertical or horizontal
+ surfaces, like a language in which the simplest thought demands
+ ornate constructions, useless particles and lengthy
+ circumlocutions. Unlike the more successful patterns of language
+ and science, which enable us to face experience boldly or at least
+ level-headedly, our system of temporal calculation silently and
+ persistently encourages our terror of time.
+
+ ... It is as though architects had to measure length in feet,
+ width in meters and height in ells; as though basic instruction
+ manuals demanded a knowledge of five different languages. It is
+ no wonder then that we often look into our own immediate past or
+ future, last Tuesday or a week from Sunday, with feelings of
+ helpless confusion. ...
+
+ -- Robert Grudin, `Time and the Art of Living'.
+
+ This section describes the textual date representations that GNU
+programs accept. These are the strings you, as a user, can supply as
+arguments to the various programs. The C interface (via the `get_date'
+function) is not described here.
+
+* Menu:
+
+* General date syntax:: Common rules.
+* Calendar date items:: 19 Dec 1994.
+* Time of day items:: 9:20pm.
+* Time zone items:: EST, PDT, GMT.
+* Day of week items:: Monday and others.
+* Relative items in date strings:: next tuesday, 2 years ago.
+* Pure numbers in date strings:: 19931219, 1440.
+* Seconds since the Epoch:: @1078100502.
+* Specifying time zone rules:: TZ="America/New_York", TZ="UTC0".
+* Authors of get_date:: Bellovin, Eggert, Salz, Berets, et al.
+
+
+File: tar.info, Node: General date syntax, Next: Calendar date items, Up: Date input formats
+
+7.1 General date syntax
+=======================
+
+A "date" is a string, possibly empty, containing many items separated
+by whitespace. The whitespace may be omitted when no ambiguity arises.
+The empty string means the beginning of today (i.e., midnight). Order
+of the items is immaterial. A date string may contain many flavors of
+items:
+
+ * calendar date items
+
+ * time of day items
+
+ * time zone items
+
+ * day of the week items
+
+ * relative items
+
+ * pure numbers.
+
+We describe each of these item types in turn, below.
+
+ A few ordinal numbers may be written out in words in some contexts.
+This is most useful for specifying day of the week items or relative
+items (see below). Among the most commonly used ordinal numbers, the
+word `last' stands for -1, `this' stands for 0, and `first' and `next'
+both stand for 1. Because the word `second' stands for the unit of
+time there is no way to write the ordinal number 2, but for convenience
+`third' stands for 3, `fourth' for 4, `fifth' for 5, `sixth' for 6,
+`seventh' for 7, `eighth' for 8, `ninth' for 9, `tenth' for 10,
+`eleventh' for 11 and `twelfth' for 12.
+
+ When a month is written this way, it is still considered to be
+written numerically, instead of being "spelled in full"; this changes
+the allowed strings.
+
+ In the current implementation, only English is supported for words
+and abbreviations like `AM', `DST', `EST', `first', `January',
+`Sunday', `tomorrow', and `year'.
+
+ The output of the `date' command is not always acceptable as a date
+string, not only because of the language problem, but also because
+there is no standard meaning for time zone items like `IST'. When using
+`date' to generate a date string intended to be parsed later, specify a
+date format that is independent of language and that does not use time
+zone items other than `UTC' and `Z'. Here are some ways to do this:
+
+ $ LC_ALL=C TZ=UTC0 date
+ Mon Mar 1 00:21:42 UTC 2004
+ $ TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ'
+ 2004-03-01 00:21:42Z
+ $ date --iso-8601=ns | tr T ' ' # --iso-8601 is a GNU extension.
+ 2004-02-29 16:21:42,692722128-0800
+ $ date --rfc-2822 # a GNU extension
+ Sun, 29 Feb 2004 16:21:42 -0800
+ $ date +'%Y-%m-%d %H:%M:%S %z' # %z is a GNU extension.
+ 2004-02-29 16:21:42 -0800
+ $ date +'@%s.%N' # %s and %N are GNU extensions.
+ @1078100502.692722128
+
+ Alphabetic case is completely ignored in dates. Comments may be
+introduced between round parentheses, as long as included parentheses
+are properly nested. Hyphens not followed by a digit are currently
+ignored. Leading zeros on numbers are ignored.
+
+ Invalid dates like `2005-02-29' or times like `24:00' are rejected.
+In the typical case of a host that does not support leap seconds, a
+time like `23:59:60' is rejected even if it corresponds to a valid leap
+second.
+
+
+File: tar.info, Node: Calendar date items, Next: Time of day items, Prev: General date syntax, Up: Date input formats
+
+7.2 Calendar date items
+=======================
+
+A "calendar date item" specifies a day of the year. It is specified
+differently, depending on whether the month is specified numerically or
+literally. All these strings specify the same calendar date:
+
+ 1972-09-24 # ISO 8601.
+ 72-9-24 # Assume 19xx for 69 through 99,
+ # 20xx for 00 through 68.
+ 72-09-24 # Leading zeros are ignored.
+ 9/24/72 # Common U.S. writing.
+ 24 September 1972
+ 24 Sept 72 # September has a special abbreviation.
+ 24 Sep 72 # Three-letter abbreviations always allowed.
+ Sep 24, 1972
+ 24-sep-72
+ 24sep72
+
+ The year can also be omitted. In this case, the last specified year
+is used, or the current year if none. For example:
+
+ 9/24
+ sep 24
+
+ Here are the rules.
+
+ For numeric months, the ISO 8601 format `YEAR-MONTH-DAY' is allowed,
+where YEAR is any positive number, MONTH is a number between 01 and 12,
+and DAY is a number between 01 and 31. A leading zero must be present
+if a number is less than ten. If YEAR is 68 or smaller, then 2000 is
+added to it; otherwise, if YEAR is less than 100, then 1900 is added to
+it. The construct `MONTH/DAY/YEAR', popular in the United States, is
+accepted. Also `MONTH/DAY', omitting the year.
+
+ Literal months may be spelled out in full: `January', `February',
+`March', `April', `May', `June', `July', `August', `September',
+`October', `November' or `December'. Literal months may be abbreviated
+to their first three letters, possibly followed by an abbreviating dot.
+It is also permitted to write `Sept' instead of `September'.
+
+ When months are written literally, the calendar date may be given as
+any of the following:
+
+ DAY MONTH YEAR
+ DAY MONTH
+ MONTH DAY YEAR
+ DAY-MONTH-YEAR
+
+ Or, omitting the year:
+
+ MONTH DAY
+
+
+File: tar.info, Node: Time of day items, Next: Time zone items, Prev: Calendar date items, Up: Date input formats
+
+7.3 Time of day items
+=====================
+
+A "time of day item" in date strings specifies the time on a given day.
+Here are some examples, all of which represent the same time:
+
+ 20:02:00.000000
+ 20:02
+ 8:02pm
+ 20:02-0500 # In EST (U.S. Eastern Standard Time).
+
+ More generally, the time of day may be given as
+`HOUR:MINUTE:SECOND', where HOUR is a number between 0 and 23, MINUTE
+is a number between 0 and 59, and SECOND is a number between 0 and 59
+possibly followed by `.' or `,' and a fraction containing one or more
+digits. Alternatively, `:SECOND' can be omitted, in which case it is
+taken to be zero. On the rare hosts that support leap seconds, SECOND
+may be 60.
+
+ If the time is followed by `am' or `pm' (or `a.m.' or `p.m.'), HOUR
+is restricted to run from 1 to 12, and `:MINUTE' may be omitted (taken
+to be zero). `am' indicates the first half of the day, `pm' indicates
+the second half of the day. In this notation, 12 is the predecessor of
+1: midnight is `12am' while noon is `12pm'. (This is the zero-oriented
+interpretation of `12am' and `12pm', as opposed to the old tradition
+derived from Latin which uses `12m' for noon and `12pm' for midnight.)
+
+ The time may alternatively be followed by a time zone correction,
+expressed as `SHHMM', where S is `+' or `-', HH is a number of zone
+hours and MM is a number of zone minutes. You can also separate HH
+from MM with a colon. When a time zone correction is given this way, it
+forces interpretation of the time relative to Coordinated Universal
+Time (UTC), overriding any previous specification for the time zone or
+the local time zone. For example, `+0530' and `+05:30' both stand for
+the time zone 5.5 hours ahead of UTC (e.g., India). The MINUTE part of
+the time of day may not be elided when a time zone correction is used.
+This is the best way to specify a time zone correction by fractional
+parts of an hour.
+
+ Either `am'/`pm' or a time zone correction may be specified, but not
+both.
+
+
+File: tar.info, Node: Time zone items, Next: Day of week items, Prev: Time of day items, Up: Date input formats
+
+7.4 Time zone items
+===================
+
+A "time zone item" specifies an international time zone, indicated by a
+small set of letters, e.g., `UTC' or `Z' for Coordinated Universal
+Time. Any included periods are ignored. By following a
+non-daylight-saving time zone by the string `DST' in a separate word
+(that is, separated by some white space), the corresponding daylight
+saving time zone may be specified. Alternatively, a
+non-daylight-saving time zone can be followed by a time zone
+correction, to add the two values. This is normally done only for
+`UTC'; for example, `UTC+05:30' is equivalent to `+05:30'.
+
+ Time zone items other than `UTC' and `Z' are obsolescent and are not
+recommended, because they are ambiguous; for example, `EST' has a
+different meaning in Australia than in the United States. Instead,
+it's better to use unambiguous numeric time zone corrections like
+`-0500', as described in the previous section.
+
+ If neither a time zone item nor a time zone correction is supplied,
+time stamps are interpreted using the rules of the default time zone
+(*note Specifying time zone rules::).
+
+
+File: tar.info, Node: Day of week items, Next: Relative items in date strings, Prev: Time zone items, Up: Date input formats
+
+7.5 Day of week items
+=====================
+
+The explicit mention of a day of the week will forward the date (only
+if necessary) to reach that day of the week in the future.
+
+ Days of the week may be spelled out in full: `Sunday', `Monday',
+`Tuesday', `Wednesday', `Thursday', `Friday' or `Saturday'. Days may
+be abbreviated to their first three letters, optionally followed by a
+period. The special abbreviations `Tues' for `Tuesday', `Wednes' for
+`Wednesday' and `Thur' or `Thurs' for `Thursday' are also allowed.
+
+ A number may precede a day of the week item to move forward
+supplementary weeks. It is best used in expression like `third
+monday'. In this context, `last DAY' or `next DAY' is also acceptable;
+they move one week before or after the day that DAY by itself would
+represent.
+
+ A comma following a day of the week item is ignored.
+
+
+File: tar.info, Node: Relative items in date strings, Next: Pure numbers in date strings, Prev: Day of week items, Up: Date input formats
+
+7.6 Relative items in date strings
+==================================
+
+"Relative items" adjust a date (or the current date if none) forward or
+backward. The effects of relative items accumulate. Here are some
+examples:
+
+ 1 year
+ 1 year ago
+ 3 years
+ 2 days
+
+ The unit of time displacement may be selected by the string `year'
+or `month' for moving by whole years or months. These are fuzzy units,
+as years and months are not all of equal duration. More precise units
+are `fortnight' which is worth 14 days, `week' worth 7 days, `day'
+worth 24 hours, `hour' worth 60 minutes, `minute' or `min' worth 60
+seconds, and `second' or `sec' worth one second. An `s' suffix on
+these units is accepted and ignored.
+
+ The unit of time may be preceded by a multiplier, given as an
+optionally signed number. Unsigned numbers are taken as positively
+signed. No number at all implies 1 for a multiplier. Following a
+relative item by the string `ago' is equivalent to preceding the unit
+by a multiplier with value -1.
+
+ The string `tomorrow' is worth one day in the future (equivalent to
+`day'), the string `yesterday' is worth one day in the past (equivalent
+to `day ago').
+
+ The strings `now' or `today' are relative items corresponding to
+zero-valued time displacement, these strings come from the fact a
+zero-valued time displacement represents the current time when not
+otherwise changed by previous items. They may be used to stress other
+items, like in `12:00 today'. The string `this' also has the meaning
+of a zero-valued time displacement, but is preferred in date strings
+like `this thursday'.
+
+ When a relative item causes the resulting date to cross a boundary
+where the clocks were adjusted, typically for daylight saving time, the
+resulting date and time are adjusted accordingly.
+
+ The fuzz in units can cause problems with relative items. For
+example, `2003-07-31 -1 month' might evaluate to 2003-07-01, because
+2003-06-31 is an invalid date. To determine the previous month more
+reliably, you can ask for the month before the 15th of the current
+month. For example:
+
+ $ date -R
+ Thu, 31 Jul 2003 13:02:39 -0700
+ $ date --date='-1 month' +'Last month was %B?'
+ Last month was July?
+ $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
+ Last month was June!
+
+ Also, take care when manipulating dates around clock changes such as
+daylight saving leaps. In a few cases these have added or subtracted
+as much as 24 hours from the clock, so it is often wise to adopt
+universal time by setting the `TZ' environment variable to `UTC0'
+before embarking on calendrical calculations.
+
+
+File: tar.info, Node: Pure numbers in date strings, Next: Seconds since the Epoch, Prev: Relative items in date strings, Up: Date input formats
+
+7.7 Pure numbers in date strings
+================================
+
+The precise interpretation of a pure decimal number depends on the
+context in the date string.
+
+ If the decimal number is of the form YYYYMMDD and no other calendar
+date item (*note Calendar date items::) appears before it in the date
+string, then YYYY is read as the year, MM as the month number and DD as
+the day of the month, for the specified calendar date.
+
+ If the decimal number is of the form HHMM and no other time of day
+item appears before it in the date string, then HH is read as the hour
+of the day and MM as the minute of the hour, for the specified time of
+day. MM can also be omitted.
+
+ If both a calendar date and a time of day appear to the left of a
+number in the date string, but no relative item, then the number
+overrides the year.
+
+
+File: tar.info, Node: Seconds since the Epoch, Next: Specifying time zone rules, Prev: Pure numbers in date strings, Up: Date input formats
+
+7.8 Seconds since the Epoch
+===========================
+
+If you precede a number with `@', it represents an internal time stamp
+as a count of seconds. The number can contain an internal decimal
+point (either `.' or `,'); any excess precision not supported by the
+internal representation is truncated toward minus infinity. Such a
+number cannot be combined with any other date item, as it specifies a
+complete time stamp.
+
+ Internally, computer times are represented as a count of seconds
+since an epoch--a well-defined point of time. On GNU and POSIX
+systems, the epoch is 1970-01-01 00:00:00 UTC, so `@0' represents this
+time, `@1' represents 1970-01-01 00:00:01 UTC, and so forth. GNU and
+most other POSIX-compliant systems support such times as an extension
+to POSIX, using negative counts, so that `@-1' represents 1969-12-31
+23:59:59 UTC.
+
+ Traditional Unix systems count seconds with 32-bit two's-complement
+integers and can represent times from 1901-12-13 20:45:52 through
+2038-01-19 03:14:07 UTC. More modern systems use 64-bit counts of
+seconds with nanosecond subcounts, and can represent all the times in
+the known lifetime of the universe to a resolution of 1 nanosecond.
+
+ On most hosts, these counts ignore the presence of leap seconds.
+For example, on most hosts `@915148799' represents 1998-12-31 23:59:59
+UTC, `@915148800' represents 1999-01-01 00:00:00 UTC, and there is no
+way to represent the intervening leap second 1998-12-31 23:59:60 UTC.
+
+
+File: tar.info, Node: Specifying time zone rules, Next: Authors of get_date, Prev: Seconds since the Epoch, Up: Date input formats
+
+7.9 Specifying time zone rules
+==============================
+
+Normally, dates are interpreted using the rules of the current time
+zone, which in turn are specified by the `TZ' environment variable, or
+by a system default if `TZ' is not set. To specify a different set of
+default time zone rules that apply just to one date, start the date
+with a string of the form `TZ="RULE"'. The two quote characters (`"')
+must be present in the date, and any quotes or backslashes within RULE
+must be escaped by a backslash.
+
+ For example, with the GNU `date' command you can answer the question
+"What time is it in New York when a Paris clock shows 6:30am on October
+31, 2004?" by using a date beginning with `TZ="Europe/Paris"' as shown
+in the following shell transcript:
+
+ $ export TZ="America/New_York"
+ $ date --date='TZ="Europe/Paris" 2004-10-31 06:30'
+ Sun Oct 31 01:30:00 EDT 2004
+
+ In this example, the `--date' operand begins with its own `TZ'
+setting, so the rest of that operand is processed according to
+`Europe/Paris' rules, treating the string `2004-10-31 06:30' as if it
+were in Paris. However, since the output of the `date' command is
+processed according to the overall time zone rules, it uses New York
+time. (Paris was normally six hours ahead of New York in 2004, but
+this example refers to a brief Halloween period when the gap was five
+hours.)
+
+ A `TZ' value is a rule that typically names a location in the `tz'
+database (http://www.twinsun.com/tz/tz-link.htm). A recent catalog of
+location names appears in the TWiki Date and Time Gateway
+(http://twiki.org/cgi-bin/xtra/tzdate). A few non-GNU hosts require a
+colon before a location name in a `TZ' setting, e.g.,
+`TZ=":America/New_York"'.
+
+ The `tz' database includes a wide variety of locations ranging from
+`Arctic/Longyearbyen' to `Antarctica/South_Pole', but if you are at sea
+and have your own private time zone, or if you are using a non-GNU host
+that does not support the `tz' database, you may need to use a POSIX
+rule instead. Simple POSIX rules like `UTC0' specify a time zone
+without daylight saving time; other rules can specify simple daylight
+saving regimes. *Note Specifying the Time Zone with `TZ': (libc)TZ
+Variable.
+
+
+File: tar.info, Node: Authors of get_date, Prev: Specifying time zone rules, Up: Date input formats
+
+7.10 Authors of `get_date'
+==========================
+
+`get_date' was originally implemented by Steven M. Bellovin
+(<smb@research.att.com>) while at the University of North Carolina at
+Chapel Hill. The code was later tweaked by a couple of people on
+Usenet, then completely overhauled by Rich $alz (<rsalz@bbn.com>) and
+Jim Berets (<jberets@bbn.com>) in August, 1990. Various revisions for
+the GNU system were made by David MacKenzie, Jim Meyering, Paul Eggert
+and others.
+
+ This chapter was originally produced by Franc,ois Pinard
+(<pinard@iro.umontreal.ca>) from the `getdate.y' source code, and then
+edited by K. Berry (<kb@cs.umb.edu>).
+
+
+File: tar.info, Node: Formats, Next: Media, Prev: Date input formats, Up: Top
+
+8 Controlling the Archive Format
+********************************
+
+Due to historical reasons, there are several formats of tar archives.
+All of them are based on the same principles, but have some subtle
+differences that often make them incompatible with each other.
+
+ GNU tar is able to create and handle archives in a variety of
+formats. The most frequently used formats are (in alphabetical order):
+
+gnu
+ Format used by GNU `tar' versions up to 1.13.25. This format
+ derived from an early POSIX standard, adding some improvements
+ such as sparse file handling and incremental archives.
+ Unfortunately these features were implemented in a way
+ incompatible with other archive formats.
+
+ Archives in `gnu' format are able to hold file names of unlimited
+ length.
+
+oldgnu
+ Format used by GNU `tar' of versions prior to 1.12.
+
+v7
+ Archive format, compatible with the V7 implementation of tar. This
+ format imposes a number of limitations. The most important of them
+ are:
+
+ 1. The maximum length of a file name is limited to 99 characters.
+
+ 2. The maximum length of a symbolic link is limited to 99
+ characters.
+
+ 3. It is impossible to store special files (block and character
+ devices, fifos etc.)
+
+ 4. Maximum value of user or group ID is limited to 2097151
+ (7777777 octal)
+
+ 5. V7 archives do not contain symbolic ownership information
+ (user and group name of the file owner).
+
+ This format has traditionally been used by Automake when producing
+ Makefiles. This practice will change in the future, in the
+ meantime, however this means that projects containing file names
+ more than 99 characters long will not be able to use GNU `tar'
+ 1.17 and Automake prior to 1.9.
+
+ustar
+ Archive format defined by POSIX.1-1988 specification. It stores
+ symbolic ownership information. It is also able to store special
+ files. However, it imposes several restrictions as well:
+
+ 1. The maximum length of a file name is limited to 256
+ characters, provided that the file name can be split at a
+ directory separator in two parts, first of them being at most
+ 155 bytes long. So, in most cases the maximum file name
+ length will be shorter than 256 characters.
+
+ 2. The maximum length of a symbolic link name is limited to 100
+ characters.
+
+ 3. Maximum size of a file the archive is able to accommodate is
+ 8GB
+
+ 4. Maximum value of UID/GID is 2097151.
+
+ 5. Maximum number of bits in device major and minor numbers is
+ 21.
+
+star
+ Format used by Jo"rg Schilling `star' implementation. GNU `tar'
+ is able to read `star' archives but currently does not produce
+ them.
+
+posix
+ Archive format defined by POSIX.1-2001 specification. This is the
+ most flexible and feature-rich format. It does not impose any
+ restrictions on file sizes or file name lengths. This format is
+ quite recent, so not all tar implementations are able to handle it
+ properly. However, this format is designed in such a way that any
+ tar implementation able to read `ustar' archives will be able to
+ read most `posix' archives as well, with the only exception that
+ any additional information (such as long file names etc.) will in
+ such case be extracted as plain text files along with the files it
+ refers to.
+
+ This archive format will be the default format for future versions
+ of GNU `tar'.
+
+
+ The following table summarizes the limitations of each of these
+formats:
+
+Format UID File Size File Name Devn
+--------------------------------------------------------------------
+gnu 1.8e19 Unlimited Unlimited 63
+oldgnu 1.8e19 Unlimited Unlimited 63
+v7 2097151 8GB 99 n/a
+ustar 2097151 8GB 256 21
+posix Unlimited Unlimited Unlimited Unlimited
+
+ The default format for GNU `tar' is defined at compilation time.
+You may check it by running `tar --help', and examining the last lines
+of its output. Usually, GNU `tar' is configured to create archives in
+`gnu' format, however, future version will switch to `posix'.
+
+* Menu:
+
+* Compression:: Using Less Space through Compression
+* Attributes:: Handling File Attributes
+* Portability:: Making `tar' Archives More Portable
+* cpio:: Comparison of `tar' and `cpio'
+
+
+File: tar.info, Node: Compression, Next: Attributes, Up: Formats
+
+8.1 Using Less Space through Compression
+========================================
+
+* Menu:
+
+* gzip:: Creating and Reading Compressed Archives
+* sparse:: Archiving Sparse Files
+
+
+File: tar.info, Node: gzip, Next: sparse, Up: Compression
+
+8.1.1 Creating and Reading Compressed Archives
+----------------------------------------------
+
+GNU `tar' is able to create and read compressed archives. It supports
+`gzip' and `bzip2' compression programs. For backward compatibility,
+it also supports `compress' command, although we strongly recommend
+against using it, since there is a patent covering the algorithm it
+uses and you could be sued for patent infringement merely by running
+`compress'! Besides, it is less effective than `gzip' and `bzip2'.
+
+ Creating a compressed archive is simple: you just specify a
+"compression option" along with the usual archive creation commands.
+The compression option is `-z' (`--gzip') to create a `gzip' compressed
+archive, `-j' (`--bzip2') to create a `bzip2' compressed archive, and
+`-Z' (`--compress') to use `compress' program. For example:
+
+ $ tar cfz archive.tar.gz .
+
+ Reading compressed archive is even simpler: you don't need to specify
+any additional options as GNU `tar' recognizes its format
+automatically. Thus, the following commands will list and extract the
+archive created in previous example:
+
+ # List the compressed archive
+ $ tar tf archive.tar.gz
+ # Extract the compressed archive
+ $ tar xf archive.tar.gz
+
+ The only case when you have to specify a decompression option while
+reading the archive is when reading from a pipe or from a tape drive
+that does not support random access. However, in this case GNU `tar'
+will indicate which option you should use. For example:
+
+ $ cat archive.tar.gz | tar tf -
+ tar: Archive is compressed. Use -z option
+ tar: Error is not recoverable: exiting now
+
+ If you see such diagnostics, just add the suggested option to the
+invocation of GNU `tar':
+
+ $ cat archive.tar.gz | tar tfz -
+
+ Notice also, that there are several restrictions on operations on
+compressed archives. First of all, compressed archives cannot be
+modified, i.e., you cannot update (`--update' (`-u')) them or delete
+(`--delete') members from them. Likewise, you cannot append another
+`tar' archive to a compressed archive using `--append' (`-r')).
+Secondly, multi-volume archives cannot be compressed.
+
+ The following table summarizes compression options used by GNU `tar'.
+
+`-z'
+`--gzip'
+`--ungzip'
+ Filter the archive through `gzip'.
+
+ You can use `--gzip' and `--gunzip' on physical devices (tape
+ drives, etc.) and remote files as well as on normal files; data to
+ or from such devices or remote files is reblocked by another copy
+ of the `tar' program to enforce the specified (or default) record
+ size. The default compression parameters are used; if you need to
+ override them, set `GZIP' environment variable, e.g.:
+
+ $ GZIP=--best tar cfz archive.tar.gz subdir
+
+ Another way would be to avoid the `--gzip' (`--gunzip',
+ `--ungzip', `-z') option and run `gzip' explicitly:
+
+ $ tar cf - subdir | gzip --best -c - > archive.tar.gz
+
+ About corrupted compressed archives: `gzip''ed files have no
+ redundancy, for maximum compression. The adaptive nature of the
+ compression scheme means that the compression tables are implicitly
+ spread all over the archive. If you lose a few blocks, the dynamic
+ construction of the compression tables becomes unsynchronized, and
+ there is little chance that you could recover later in the archive.
+
+ There are pending suggestions for having a per-volume or per-file
+ compression in GNU `tar'. This would allow for viewing the
+ contents without decompression, and for resynchronizing
+ decompression at every volume or file, in case of corrupted
+ archives. Doing so, we might lose some compressibility. But this
+ would have make recovering easier. So, there are pros and cons.
+ We'll see!
+
+`-j'
+`--bzip2'
+ Filter the archive through `bzip2'. Otherwise like `--gzip'.
+
+`-Z'
+`--compress'
+`--uncompress'
+ Filter the archive through `compress'. Otherwise like `--gzip'.
+
+ The GNU Project recommends you not use `compress', because there
+ is a patent covering the algorithm it uses. You could be sued for
+ patent infringement merely by running `compress'.
+
+`--use-compress-program=PROG'
+ Use external compression program PROG. Use this option if you
+ have a compression program that GNU `tar' does not support. There
+ are two requirements to which PROG should comply:
+
+ First, when called without options, it should read data from
+ standard input, compress it and output it on standard output.
+
+ Secondly, if called with `-d' argument, it should do exactly the
+ opposite, i.e., read the compressed data from the standard input
+ and produce uncompressed data on the standard output.
+
+ The `--use-compress-program' option, in particular, lets you
+implement your own filters, not necessarily dealing with
+compression/decompression. For example, suppose you wish to implement
+PGP encryption on top of compression, using `gpg' (*note gpg:
+(gpg)Top.). The following script does that:
+
+ #! /bin/sh
+ case $1 in
+ -d) gpg --decrypt - | gzip -d -c;;
+ '') gzip -c | gpg -s ;;
+ *) echo "Unknown option $1">&2; exit 1;;
+ esac
+
+ Suppose you name it `gpgz' and save it somewhere in your `PATH'.
+Then the following command will create a compressed archive signed with
+your private key:
+
+ $ tar -cf foo.tar.gpgz --use-compress=gpgz .
+
+Likewise, the following command will list its contents:
+
+ $ tar -tf foo.tar.gpgz --use-compress=gpgz .
+
+
+File: tar.info, Node: sparse, Prev: gzip, Up: Compression
+
+8.1.2 Archiving Sparse Files
+----------------------------
+
+Files in the file system occasionally have "holes". A "hole" in a file
+is a section of the file's contents which was never written. The
+contents of a hole reads as all zeros. On many operating systems,
+actual disk storage is not allocated for holes, but they are counted in
+the length of the file. If you archive such a file, `tar' could create
+an archive longer than the original. To have `tar' attempt to
+recognize the holes in a file, use `--sparse' (`-S'). When you use
+this option, then, for any file using less disk space than would be
+expected from its length, `tar' searches the file for consecutive
+stretches of zeros. It then records in the archive for the file where
+the consecutive stretches of zeros are, and only archives the "real
+contents" of the file. On extraction (using `--sparse' is not needed
+on extraction) any such files have holes created wherever the
+continuous stretches of zeros were found. Thus, if you use `--sparse',
+`tar' archives won't take more space than the original.
+
+`-S'
+`--sparse'
+ This option instructs `tar' to test each file for sparseness
+ before attempting to archive it. If the file is found to be
+ sparse it is treated specially, thus allowing to decrease the
+ amount of space used by its image in the archive.
+
+ This option is meaningful only when creating or updating archives.
+ It has no effect on extraction.
+
+ Consider using `--sparse' when performing file system backups, to
+avoid archiving the expanded forms of files stored sparsely in the
+system.
+
+ Even if your system has no sparse files currently, some may be
+created in the future. If you use `--sparse' while making file system
+backups as a matter of course, you can be assured the archive will
+never take more space on the media than the files take on disk
+(otherwise, archiving a disk filled with sparse files might take
+hundreds of tapes). *Note Incremental Dumps::.
+
+ However, be aware that `--sparse' option presents a serious
+drawback. Namely, in order to determine if the file is sparse `tar'
+has to read it before trying to archive it, so in total the file is
+read *twice*. So, always bear in mind that the time needed to process
+all files with this option is roughly twice the time needed to archive
+them without it.
+
+ When using `POSIX' archive format, GNU `tar' is able to store sparse
+files using in three distinct ways, called "sparse formats". A sparse
+format is identified by its "number", consisting, as usual of two
+decimal numbers, delimited by a dot. By default, format `1.0' is used.
+If, for some reason, you wish to use an earlier format, you can select
+it using `--sparse-version' option.
+
+`--sparse-version=VERSION'
+ Select the format to store sparse files in. Valid VERSION values
+ are: `0.0', `0.1' and `1.0'. *Note Sparse Formats::, for a
+ detailed description of each format.
+
+ Using `--sparse-format' option implies `--sparse'.
+
+
+File: tar.info, Node: Attributes, Next: Portability, Prev: Compression, Up: Formats
+
+8.2 Handling File Attributes
+============================
+
+ _(This message will disappear, once this node revised.)_
+
+When `tar' reads files, it updates their access times. To avoid this,
+use the `--atime-preserve[=METHOD]' option, which can either reset the
+access time retroactively or avoid changing it in the first place.
+
+ Handling of file attributes
+
+`--atime-preserve'
+`--atime-preserve=replace'
+`--atime-preserve=system'
+ Preserve the access times of files that are read. This works only
+ for files that you own, unless you have superuser privileges.
+
+ `--atime-preserve=replace' works on most systems, but it also
+ restores the data modification time and updates the status change
+ time. Hence it doesn't interact with incremental dumps nicely
+ (*note Incremental Dumps::), and it can set access or data
+ modification times incorrectly if other programs access the file
+ while `tar' is running.
+
+ `--atime-preserve=system' avoids changing the access time in the
+ first place, if the operating system supports this.
+ Unfortunately, this may or may not work on any given operating
+ system or file system. If `tar' knows for sure it won't work, it
+ complains right away.
+
+ Currently `--atime-preserve' with no operand defaults to
+ `--atime-preserve=replace', but this is intended to change to
+ `--atime-preserve=system' when the latter is better-supported.
+
+`-m'
+`--touch'
+ Do not extract data modification time.
+
+ When this option is used, `tar' leaves the data modification times
+ of the files it extracts as the times when the files were
+ extracted, instead of setting it to the times recorded in the
+ archive.
+
+ This option is meaningless with `--list' (`-t').
+
+`--same-owner'
+ Create extracted files with the same ownership they have in the
+ archive.
+
+ This is the default behavior for the superuser, so this option is
+ meaningful only for non-root users, when `tar' is executed on
+ those systems able to give files away. This is considered as a
+ security flaw by many people, at least because it makes quite
+ difficult to correctly account users for the disk space they
+ occupy. Also, the `suid' or `sgid' attributes of files are easily
+ and silently lost when files are given away.
+
+ When writing an archive, `tar' writes the user ID and user name
+ separately. If it can't find a user name (because the user ID is
+ not in `/etc/passwd'), then it does not write one. When restoring,
+ it tries to look the name (if one was written) up in
+ `/etc/passwd'. If it fails, then it uses the user ID stored in
+ the archive instead.
+
+`--no-same-owner'
+`-o'
+ Do not attempt to restore ownership when extracting. This is the
+ default behavior for ordinary users, so this option has an effect
+ only for the superuser.
+
+`--numeric-owner'
+ The `--numeric-owner' option allows (ANSI) archives to be written
+ without user/group name information or such information to be
+ ignored when extracting. It effectively disables the generation
+ and/or use of user/group name information. This option forces
+ extraction using the numeric ids from the archive, ignoring the
+ names.
+
+ This is useful in certain circumstances, when restoring a backup
+ from an emergency floppy with different passwd/group files for
+ example. It is otherwise impossible to extract files with the
+ right ownerships if the password file in use during the extraction
+ does not match the one belonging to the file system(s) being
+ extracted. This occurs, for example, if you are restoring your
+ files after a major crash and had booted from an emergency floppy
+ with no password file or put your disk into another machine to do
+ the restore.
+
+ The numeric ids are _always_ saved into `tar' archives. The
+ identifying names are added at create time when provided by the
+ system, unless `--old-archive' (`-o') is used. Numeric ids could
+ be used when moving archives between a collection of machines using
+ a centralized management for attribution of numeric ids to users
+ and groups. This is often made through using the NIS capabilities.
+
+ When making a `tar' file for distribution to other sites, it is
+ sometimes cleaner to use a single owner for all files in the
+ distribution, and nicer to specify the write permission bits of the
+ files as stored in the archive independently of their actual value
+ on the file system. The way to prepare a clean distribution is
+ usually to have some Makefile rule creating a directory, copying
+ all needed files in that directory, then setting ownership and
+ permissions as wanted (there are a lot of possible schemes), and
+ only then making a `tar' archive out of this directory, before
+ cleaning everything out. Of course, we could add a lot of options
+ to GNU `tar' for fine tuning permissions and ownership. This is
+ not the good way, I think. GNU `tar' is already crowded with
+ options and moreover, the approach just explained gives you a
+ great deal of control already.
+
+`-p'
+`--same-permissions'
+`--preserve-permissions'
+ Extract all protection information.
+
+ This option causes `tar' to set the modes (access permissions) of
+ extracted files exactly as recorded in the archive. If this option
+ is not used, the current `umask' setting limits the permissions on
+ extracted files. This option is by default enabled when `tar' is
+ executed by a superuser.
+
+ This option is meaningless with `--list' (`-t').
+
+`--preserve'
+ Same as both `--same-permissions' and `--same-order'.
+
+ The `--preserve' option has no equivalent short option name. It
+ is equivalent to `--same-permissions' plus `--same-order'.
+
+
diff --git a/doc/tar.info-2 b/doc/tar.info-2
new file mode 100644
index 0000000..7da7165
--- /dev/null
+++ b/doc/tar.info-2
@@ -0,0 +1,4783 @@
+This is tar.info, produced by makeinfo version 4.8 from tar.texi.
+
+ This manual is for GNU `tar' (version 1.17, 8 June 2007), which
+creates and extracts files from archives.
+
+ Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003,
+2004, 2005, 2006, 2007 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.1 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, with the Front-Cover Texts
+ being "A GNU Manual," and with the Back-Cover Texts as in (a)
+ below. A copy of the license is included in the section entitled
+ "GNU Free Documentation License".
+
+ (a) The FSF's Back-Cover Text is: "You are free to copy and modify
+ this GNU Manual. Buying copies from GNU Press supports the FSF in
+ developing GNU and promoting software freedom."
+
+INFO-DIR-SECTION Archiving
+START-INFO-DIR-ENTRY
+* Tar: (tar). Making tape (or disk) archives.
+END-INFO-DIR-ENTRY
+
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* tar: (tar)tar invocation. Invoking GNU `tar'.
+END-INFO-DIR-ENTRY
+
+
+File: tar.info, Node: Portability, Next: cpio, Prev: Attributes, Up: Formats
+
+8.3 Making `tar' Archives More Portable
+=======================================
+
+Creating a `tar' archive on a particular system that is meant to be
+useful later on many other machines and with other versions of `tar' is
+more challenging than you might think. `tar' archive formats have been
+evolving since the first versions of Unix. Many such formats are
+around, and are not always compatible with each other. This section
+discusses a few problems, and gives some advice about making `tar'
+archives more portable.
+
+ One golden rule is simplicity. For example, limit your `tar'
+archives to contain only regular files and directories, avoiding other
+kind of special files. Do not attempt to save sparse files or
+contiguous files as such. Let's discuss a few more problems, in turn.
+
+* Menu:
+
+* Portable Names:: Portable Names
+* dereference:: Symbolic Links
+* old:: Old V7 Archives
+* ustar:: Ustar Archives
+* gnu:: GNU and old GNU format archives.
+* posix:: POSIX archives
+* Checksumming:: Checksumming Problems
+* Large or Negative Values:: Large files, negative time stamps, etc.
+* Other Tars:: How to Extract GNU-Specific Data Using
+ Other `tar' Implementations
+
+
+File: tar.info, Node: Portable Names, Next: dereference, Up: Portability
+
+8.3.1 Portable Names
+--------------------
+
+Use portable file and member names. A name is portable if it contains
+only ASCII letters and digits, `/', `.', `_', and `-'; it cannot be
+empty, start with `-' or `//', or contain `/-'. Avoid deep directory
+nesting. For portability to old Unix hosts, limit your file name
+components to 14 characters or less.
+
+ If you intend to have your `tar' archives to be read under MSDOS,
+you should not rely on case distinction for file names, and you might
+use the GNU `doschk' program for helping you further diagnosing illegal
+MSDOS names, which are even more limited than System V's.
+
+
+File: tar.info, Node: dereference, Next: old, Prev: Portable Names, Up: Portability
+
+8.3.2 Symbolic Links
+--------------------
+
+Normally, when `tar' archives a symbolic link, it writes a block to the
+archive naming the target of the link. In that way, the `tar' archive
+is a faithful record of the file system contents. `--dereference'
+(`-h') is used with `--create' (`-c'), and causes `tar' to archive the
+files symbolic links point to, instead of the links themselves. When
+this option is used, when `tar' encounters a symbolic link, it will
+archive the linked-to file, instead of simply recording the presence of
+a symbolic link.
+
+ The name under which the file is stored in the file system is not
+recorded in the archive. To record both the symbolic link name and the
+file name in the system, archive the file under both names. If all
+links were recorded automatically by `tar', an extracted file might be
+linked to a file name that no longer exists in the file system.
+
+ If a linked-to file is encountered again by `tar' while creating the
+same archive, an entire second copy of it will be stored. (This
+_might_ be considered a bug.)
+
+ So, for portable archives, do not archive symbolic links as such,
+and use `--dereference' (`-h'): many systems do not support symbolic
+links, and moreover, your distribution might be unusable if it contains
+unresolved symbolic links.
+
+
+File: tar.info, Node: old, Next: ustar, Prev: dereference, Up: Portability
+
+8.3.3 Old V7 Archives
+---------------------
+
+Certain old versions of `tar' cannot handle additional information
+recorded by newer `tar' programs. To create an archive in V7 format
+(not ANSI), which can be read by these old versions, specify the
+`--format=v7' option in conjunction with the `--create' (`-c') (`tar'
+also accepts `--portability' or `--old-archive' for this option). When
+you specify it, `tar' leaves out information about directories, pipes,
+fifos, contiguous files, and device files, and specifies file ownership
+by group and user IDs instead of group and user names.
+
+ When updating an archive, do not use `--format=v7' unless the
+archive was created using this option.
+
+ In most cases, a _new_ format archive can be read by an _old_ `tar'
+program without serious trouble, so this option should seldom be
+needed. On the other hand, most modern `tar's are able to read old
+format archives, so it might be safer for you to always use
+`--format=v7' for your distributions. Notice, however, that `ustar'
+format is a better alternative, as it is free from many of `v7''s
+drawbacks.
+
+
+File: tar.info, Node: ustar, Next: gnu, Prev: old, Up: Portability
+
+8.3.4 Ustar Archive Format
+--------------------------
+
+Archive format defined by POSIX.1-1988 specification is called `ustar'.
+Although it is more flexible than the V7 format, it still has many
+restrictions (*Note ustar: Formats, for the detailed description of
+`ustar' format). Along with V7 format, `ustar' format is a good choice
+for archives intended to be read with other implementations of `tar'.
+
+ To create archive in `ustar' format, use `--format=ustar' option in
+conjunction with the `--create' (`-c').
+
+
+File: tar.info, Node: gnu, Next: posix, Prev: ustar, Up: Portability
+
+8.3.5 GNU and old GNU `tar' format
+----------------------------------
+
+GNU `tar' was based on an early draft of the POSIX 1003.1 `ustar'
+standard. GNU extensions to `tar', such as the support for file names
+longer than 100 characters, use portions of the `tar' header record
+which were specified in that POSIX draft as unused. Subsequent changes
+in POSIX have allocated the same parts of the header record for other
+purposes. As a result, GNU `tar' format is incompatible with the
+current POSIX specification, and with `tar' programs that follow it.
+
+ In the majority of cases, `tar' will be configured to create this
+format by default. This will change in future releases, since we plan
+to make `POSIX' format the default.
+
+ To force creation a GNU `tar' archive, use option `--format=gnu'.
+
+
+File: tar.info, Node: posix, Next: Checksumming, Prev: gnu, Up: Portability
+
+8.3.6 GNU `tar' and POSIX `tar'
+-------------------------------
+
+Starting from version 1.14 GNU `tar' features full support for
+POSIX.1-2001 archives.
+
+ A POSIX conformant archive will be created if `tar' was given
+`--format=posix' (`--format=pax') option. No special option is
+required to read and extract from a POSIX archive.
+
+* Menu:
+
+* PAX keywords:: Controlling Extended Header Keywords.
+
+
+File: tar.info, Node: PAX keywords, Up: posix
+
+8.3.6.1 Controlling Extended Header Keywords
+............................................
+
+`--pax-option=KEYWORD-LIST'
+ Handle keywords in PAX extended headers. This option is
+ equivalent to `-o' option of the `pax' utility.
+
+ KEYWORD-LIST is a comma-separated list of keyword options, each
+keyword option taking one of the following forms:
+
+`delete=PATTERN'
+ When used with one of archive-creation commands, this option
+ instructs `tar' to omit from extended header records that it
+ produces any keywords matching the string PATTERN.
+
+ When used in extract or list mode, this option instructs tar to
+ ignore any keywords matching the given PATTERN in the extended
+ header records. In both cases, matching is performed using the
+ pattern matching notation described in POSIX 1003.2, 3.13 (*note
+ wildcards::). For example:
+
+ --pax-option delete=security.*
+
+ would suppress security-related information.
+
+`exthdr.name=STRING'
+ This keyword allows user control over the name that is written
+ into the ustar header blocks for the extended headers. The name
+ is obtained from STRING after making the following substitutions:
+
+ Meta-character Replaced By
+ --------------------------------------------------------
+ %d The directory name of the file,
+ equivalent to the result of the
+ `dirname' utility on the translated
+ file name.
+ %f The name of the file with the
+ directory information stripped,
+ equivalent to the result of the
+ `basename' utility on the translated
+ file name.
+ %p The process ID of the `tar' process.
+ %% A `%' character.
+
+ Any other `%' characters in STRING produce undefined results.
+
+ If no option `exthdr.name=string' is specified, `tar' will use the
+ following default value:
+
+ %d/PaxHeaders.%p/%f
+
+`globexthdr.name=STRING'
+ This keyword allows user control over the name that is written into
+ the ustar header blocks for global extended header records. The
+ name is obtained from the contents of STRING, after making the
+ following substitutions:
+
+ Meta-character Replaced By
+ --------------------------------------------------------
+ %n An integer that represents the
+ sequence number of the global
+ extended header record in the
+ archive, starting at 1.
+ %p The process ID of the `tar' process.
+ %% A `%' character.
+
+ Any other `%' characters in STRING produce undefined results.
+
+ If no option `globexthdr.name=string' is specified, `tar' will use
+ the following default value:
+
+ $TMPDIR/GlobalHead.%p.%n
+
+ where `$TMPDIR' represents the value of the TMPDIR environment
+ variable. If TMPDIR is not set, `tar' uses `/tmp'.
+
+`KEYWORD=VALUE'
+ When used with one of archive-creation commands, these
+ keyword/value pairs will be included at the beginning of the
+ archive in a global extended header record. When used with one of
+ archive-reading commands, `tar' will behave as if it has
+ encountered these keyword/value pairs at the beginning of the
+ archive in a global extended header record.
+
+`KEYWORD:=VALUE'
+ When used with one of archive-creation commands, these
+ keyword/value pairs will be included as records at the beginning
+ of an extended header for each file. This is effectively
+ equivalent to KEYWORD=VALUE form except that it creates no global
+ extended header records.
+
+ When used with one of archive-reading commands, `tar' will behave
+ as if these keyword/value pairs were included as records at the
+ end of each extended header; thus, they will override any global or
+ file-specific extended header record keywords of the same names.
+ For example, in the command:
+
+ tar --format=posix --create \
+ --file archive --pax-option gname:=user .
+
+ the group name will be forced to a new value for all files stored
+ in the archive.
+
+
+File: tar.info, Node: Checksumming, Next: Large or Negative Values, Prev: posix, Up: Portability
+
+8.3.7 Checksumming Problems
+---------------------------
+
+SunOS and HP-UX `tar' fail to accept archives created using GNU `tar'
+and containing non-ASCII file names, that is, file names having
+characters with the eight bit set, because they use signed checksums,
+while GNU `tar' uses unsigned checksums while creating archives, as per
+POSIX standards. On reading, GNU `tar' computes both checksums and
+accept any. It is somewhat worrying that a lot of people may go around
+doing backup of their files using faulty (or at least non-standard)
+software, not learning about it until it's time to restore their
+missing files with an incompatible file extractor, or vice versa.
+
+ GNU `tar' compute checksums both ways, and accept any on read, so
+GNU tar can read Sun tapes even with their wrong checksums. GNU `tar'
+produces the standard checksum, however, raising incompatibilities with
+Sun. That is to say, GNU `tar' has not been modified to _produce_
+incorrect archives to be read by buggy `tar''s. I've been told that
+more recent Sun `tar' now read standard archives, so maybe Sun did a
+similar patch, after all?
+
+ The story seems to be that when Sun first imported `tar' sources on
+their system, they recompiled it without realizing that the checksums
+were computed differently, because of a change in the default signing
+of `char''s in their compiler. So they started computing checksums
+wrongly. When they later realized their mistake, they merely decided
+to stay compatible with it, and with themselves afterwards.
+Presumably, but I do not really know, HP-UX has chosen that their `tar'
+archives to be compatible with Sun's. The current standards do not
+favor Sun `tar' format. In any case, it now falls on the shoulders of
+SunOS and HP-UX users to get a `tar' able to read the good archives
+they receive.
+
+
+File: tar.info, Node: Large or Negative Values, Next: Other Tars, Prev: Checksumming, Up: Portability
+
+8.3.8 Large or Negative Values
+------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+The above sections suggest to use `oldest possible' archive format if
+in doubt. However, sometimes it is not possible. If you attempt to
+archive a file whose metadata cannot be represented using required
+format, GNU `tar' will print error message and ignore such a file. You
+will than have to switch to a format that is able to handle such
+values. The format summary table (*note Formats::) will help you to do
+so.
+
+ In particular, when trying to archive files larger than 8GB or with
+timestamps not in the range 1970-01-01 00:00:00 through 2242-03-16
+12:56:31 UTC, you will have to chose between GNU and POSIX archive
+formats. When considering which format to choose, bear in mind that
+the GNU format uses two's-complement base-256 notation to store values
+that do not fit into standard ustar range. Such archives can generally
+be read only by a GNU `tar' implementation. Moreover, they sometimes
+cannot be correctly restored on another hosts even by GNU `tar'. For
+example, using two's complement representation for negative time stamps
+that assumes a signed 32-bit `time_t' generates archives that are not
+portable to hosts with differing `time_t' representations.
+
+ On the other hand, POSIX archives, generally speaking, can be
+extracted by any tar implementation that understands older ustar
+format. The only exception are files larger than 8GB.
+
+
+File: tar.info, Node: Other Tars, Prev: Large or Negative Values, Up: Portability
+
+8.3.9 How to Extract GNU-Specific Data Using Other `tar' Implementations
+------------------------------------------------------------------------
+
+In previous sections you became acquainted with various quirks
+necessary to make your archives portable. Sometimes you may need to
+extract archives containing GNU-specific members using some third-party
+`tar' implementation or an older version of GNU `tar'. Of course your
+best bet is to have GNU `tar' installed, but if it is for some reason
+impossible, this section will explain how to cope without it.
+
+ When we speak about "GNU-specific" members we mean two classes of
+them: members split between the volumes of a multi-volume archive and
+sparse members. You will be able to always recover such members if the
+archive is in PAX format. In addition split members can be recovered
+from archives in old GNU format. The following subsections describe
+the required procedures in detail.
+
+* Menu:
+
+* Split Recovery:: Members Split Between Volumes
+* Sparse Recovery:: Sparse Members
+
+
+File: tar.info, Node: Split Recovery, Next: Sparse Recovery, Up: Other Tars
+
+8.3.9.1 Extracting Members Split Between Volumes
+................................................
+
+If a member is split between several volumes of an old GNU format
+archive most third party `tar' implementation will fail to extract it.
+To extract it, use `tarcat' program (*note Tarcat::). This program is
+available from GNU `tar' home page
+(http://www.gnu.org/software/tar/utils/tarcat.html). It concatenates
+several archive volumes into a single valid archive. For example, if
+you have three volumes named from `vol-1.tar' to `vol-3.tar', you can
+do the following to extract them using a third-party `tar':
+
+ $ tarcat vol-1.tar vol-2.tar vol-3.tar | tar xf -
+
+ You could use this approach for most (although not all) PAX format
+archives as well. However, extracting split members from a PAX archive
+is a much easier task, because PAX volumes are constructed in such a
+way that each part of a split member is extracted to a different file
+by `tar' implementations that are not aware of GNU extensions. More
+specifically, the very first part retains its original name, and all
+subsequent parts are named using the pattern:
+
+ %d/GNUFileParts.%p/%f.%n
+
+where symbols preceeded by `%' are "macro characters" that have the
+following meaning:
+
+Meta-character Replaced By
+------------------------------------------------------------
+%d The directory name of the file,
+ equivalent to the result of the
+ `dirname' utility on its full name.
+%f The file name of the file, equivalent
+ to the result of the `basename' utility
+ on its full name.
+%p The process ID of the `tar' process that
+ created the archive.
+%n Ordinal number of this particular part.
+
+ For example, if the file `var/longfile' was split during archive
+creation between three volumes, and the creator `tar' process had
+process ID `27962', then the member names will be:
+
+ var/longfile
+ var/GNUFileParts.27962/longfile.1
+ var/GNUFileParts.27962/longfile.2
+
+ When you extract your archive using a third-party `tar', these files
+will be created on your disk, and the only thing you will need to do to
+restore your file in its original form is concatenate them in the
+proper order, for example:
+
+ $ cd var
+ $ cat GNUFileParts.27962/longfile.1 \
+ GNUFileParts.27962/longfile.2 >> longfile
+ $ rm -f GNUFileParts.27962
+
+ Notice, that if the `tar' implementation you use supports PAX format
+archives, it will probably emit warnings about unknown keywords during
+extraction. They will look like this:
+
+ Tar file too small
+ Unknown extended header keyword 'GNU.volume.filename' ignored.
+ Unknown extended header keyword 'GNU.volume.size' ignored.
+ Unknown extended header keyword 'GNU.volume.offset' ignored.
+
+You can safely ignore these warnings.
+
+ If your `tar' implementation is not PAX-aware, you will get more
+warnings and more files generated on your disk, e.g.:
+
+ $ tar xf vol-1.tar
+ var/PaxHeaders.27962/longfile: Unknown file type 'x', extracted as
+ normal file
+ Unexpected EOF in archive
+ $ tar xf vol-2.tar
+ tmp/GlobalHead.27962.1: Unknown file type 'g', extracted as normal file
+ GNUFileParts.27962/PaxHeaders.27962/sparsefile.1: Unknown file type
+ 'x', extracted as normal file
+
+ Ignore these warnings. The `PaxHeaders.*' directories created will
+contain files with "extended header keywords" describing the extracted
+files. You can delete them, unless they describe sparse members. Read
+further to learn more about them.
+
+
+File: tar.info, Node: Sparse Recovery, Prev: Split Recovery, Up: Other Tars
+
+8.3.9.2 Extracting Sparse Members
+.................................
+
+Any `tar' implementation will be able to extract sparse members from a
+PAX archive. However, the extracted files will be "condensed", i.e.,
+any zero blocks will be removed from them. When we restore such a
+condensed file to its original form, by adding zero blocks (or "holes")
+back to their original locations, we call this process "expanding" a
+compressed sparse file.
+
+ To expand a file, you will need a simple auxiliary program called
+`xsparse'. It is available in source form from GNU `tar' home page
+(http://www.gnu.org/software/tar/utils/xsparse.html).
+
+ Let's begin with archive members in "sparse format version 1.0"(1),
+which are the easiest to expand. The condensed file will contain both
+file map and file data, so no additional data will be needed to restore
+it. If the original file name was `DIR/NAME', then the condensed file
+will be named `DIR/GNUSparseFile.N/NAME', where N is a decimal
+number(2).
+
+ To expand a version 1.0 file, run `xsparse' as follows:
+
+ $ xsparse `cond-file'
+
+where `cond-file' is the name of the condensed file. The utility will
+deduce the name for the resulting expanded file using the following
+algorithm:
+
+ 1. If `cond-file' does not contain any directories, `../cond-file'
+ will be used;
+
+ 2. If `cond-file' has the form `DIR/T/NAME', where both T and NAME
+ are simple names, with no `/' characters in them, the output file
+ name will be `DIR/NAME'.
+
+ 3. Otherwise, if `cond-file' has the form `DIR/NAME', the output file
+ name will be `NAME'.
+
+ In the unlikely case when this algorithm does not suit your needs,
+you can explicitly specify output file name as a second argument to the
+command:
+
+ $ xsparse `cond-file' `out-file'
+
+ It is often a good idea to run `xsparse' in "dry run" mode first.
+In this mode, the command does not actually expand the file, but
+verbosely lists all actions it would be taking to do so. The dry run
+mode is enabled by `-n' command line argument:
+
+ $ xsparse -n /home/gray/GNUSparseFile.6058/sparsefile
+ Reading v.1.0 sparse map
+ Expanding file `/home/gray/GNUSparseFile.6058/sparsefile' to
+ `/home/gray/sparsefile'
+ Finished dry run
+
+ To actually expand the file, you would run:
+
+ $ xsparse /home/gray/GNUSparseFile.6058/sparsefile
+
+The program behaves the same way all UNIX utilities do: it will keep
+quiet unless it has simething important to tell you (e.g. an error
+condition or something). If you wish it to produce verbose output,
+similar to that from the dry run mode, use `-v' option:
+
+ $ xsparse -v /home/gray/GNUSparseFile.6058/sparsefile
+ Reading v.1.0 sparse map
+ Expanding file `/home/gray/GNUSparseFile.6058/sparsefile' to
+ `/home/gray/sparsefile'
+ Done
+
+ Additionally, if your `tar' implementation has extracted the
+"extended headers" for this file, you can instruct `xstar' to use them
+in order to verify the integrity of the expanded file. The option `-x'
+sets the name of the extended header file to use. Continuing our
+example:
+
+ $ xsparse -v -x /home/gray/PaxHeaders.6058/sparsefile \
+ /home/gray/GNUSparseFile.6058/sparsefile
+ Reading extended header file
+ Found variable GNU.sparse.major = 1
+ Found variable GNU.sparse.minor = 0
+ Found variable GNU.sparse.name = sparsefile
+ Found variable GNU.sparse.realsize = 217481216
+ Reading v.1.0 sparse map
+ Expanding file `/home/gray/GNUSparseFile.6058/sparsefile' to
+ `/home/gray/sparsefile'
+ Done
+
+ An "extended header" is a special `tar' archive header that precedes
+an archive member and contains a set of "variables", describing the
+member properties that cannot be stored in the standard `ustar' header.
+While optional for expanding sparse version 1.0 members, the use of
+extended headers is mandatory when expanding sparse members in older
+sparse formats: v.0.0 and v.0.1 (The sparse formats are described in
+detail in *note Sparse Formats::.) So, for these formats, the question
+is: how to obtain extended headers from the archive?
+
+ If you use a `tar' implementation that does not support PAX format,
+extended headers for each member will be extracted as a separate file.
+If we represent the member name as `DIR/NAME', then the extended header
+file will be named `DIR/PaxHeaders.N/NAME', where N is an integer
+number.
+
+ Things become more difficult if your `tar' implementation does
+support PAX headers, because in this case you will have to manually
+extract the headers. We recommend the following algorithm:
+
+ 1. Consult the documentation of your `tar' implementation for an
+ option that prints "block numbers" along with the archive listing
+ (analogous to GNU `tar''s `-R' option). For example, `star' has
+ `-block-number'.
+
+ 2. Obtain verbose listing using the `block number' option, and find
+ block numbers of the sparse member in question and the member
+ immediately following it. For example, running `star' on our
+ archive we obtain:
+
+ $ star -t -v -block-number -f arc.tar
+ ...
+ star: Unknown extended header keyword 'GNU.sparse.size' ignored.
+ star: Unknown extended header keyword 'GNU.sparse.numblocks' ignored.
+ star: Unknown extended header keyword 'GNU.sparse.name' ignored.
+ star: Unknown extended header keyword 'GNU.sparse.map' ignored.
+ block 56: 425984 -rw-r--r-- gray/users Jun 25 14:46 2006 GNUSparseFile.28124/sparsefile
+ block 897: 65391 -rw-r--r-- gray/users Jun 24 20:06 2006 README
+ ...
+
+ (as usual, ignore the warnings about unknown keywords.)
+
+ 3. Let SIZE be the size of the sparse member, BS be its block number
+ and BN be the block number of the next member. Compute:
+
+ N = BS - BN - SIZE/512 - 2
+
+ This number gives the size of the extended header part in tar
+ "blocks". In our example, this formula gives: `897 - 56 - 425984
+ / 512 - 2 = 7'.
+
+ 4. Use `dd' to extract the headers:
+
+ dd if=ARCHIVE of=HNAME bs=512 skip=BS count=N
+
+ where ARCHIVE is the archive name, HNAME is a name of the file to
+ store the extended header in, BS and N are computed in previous
+ steps.
+
+ In our example, this command will be
+
+ $ dd if=arc.tar of=xhdr bs=512 skip=56 count=7
+
+ Finally, you can expand the condensed file, using the obtained
+header:
+
+ $ xsparse -v -x xhdr GNUSparseFile.6058/sparsefile
+ Reading extended header file
+ Found variable GNU.sparse.size = 217481216
+ Found variable GNU.sparse.numblocks = 208
+ Found variable GNU.sparse.name = sparsefile
+ Found variable GNU.sparse.map = 0,2048,1050624,2048,...
+ Expanding file `GNUSparseFile.28124/sparsefile' to `sparsefile'
+ Done
+
+ ---------- Footnotes ----------
+
+ (1) *Note PAX 1::.
+
+ (2) technically speaking, N is a "process ID" of the `tar' process
+which created the archive (*note PAX keywords::).
+
+
+File: tar.info, Node: cpio, Prev: Portability, Up: Formats
+
+8.4 Comparison of `tar' and `cpio'
+==================================
+
+ _(This message will disappear, once this node revised.)_
+
+The `cpio' archive formats, like `tar', do have maximum file name
+lengths. The binary and old ASCII formats have a maximum file length
+of 256, and the new ASCII and CRC ASCII formats have a max file length
+of 1024. GNU `cpio' can read and write archives with arbitrary file
+name lengths, but other `cpio' implementations may crash unexplainedly
+trying to read them.
+
+ `tar' handles symbolic links in the form in which it comes in BSD;
+`cpio' doesn't handle symbolic links in the form in which it comes in
+System V prior to SVR4, and some vendors may have added symlinks to
+their system without enhancing `cpio' to know about them. Others may
+have enhanced it in a way other than the way I did it at Sun, and which
+was adopted by AT&T (and which is, I think, also present in the `cpio'
+that Berkeley picked up from AT&T and put into a later BSD release--I
+think I gave them my changes).
+
+ (SVR4 does some funny stuff with `tar'; basically, its `cpio' can
+handle `tar' format input, and write it on output, and it probably
+handles symbolic links. They may not have bothered doing anything to
+enhance `tar' as a result.)
+
+ `cpio' handles special files; traditional `tar' doesn't.
+
+ `tar' comes with V7, System III, System V, and BSD source; `cpio'
+comes only with System III, System V, and later BSD (4.3-tahoe and
+later).
+
+ `tar''s way of handling multiple hard links to a file can handle
+file systems that support 32-bit inumbers (e.g., the BSD file system);
+`cpio's way requires you to play some games (in its "binary" format,
+i-numbers are only 16 bits, and in its "portable ASCII" format, they're
+18 bits--it would have to play games with the "file system ID" field of
+the header to make sure that the file system ID/i-number pairs of
+different files were always different), and I don't know which `cpio's,
+if any, play those games. Those that don't might get confused and
+think two files are the same file when they're not, and make hard links
+between them.
+
+ `tar's way of handling multiple hard links to a file places only one
+copy of the link on the tape, but the name attached to that copy is the
+_only_ one you can use to retrieve the file; `cpio's way puts one copy
+for every link, but you can retrieve it using any of the names.
+
+ What type of check sum (if any) is used, and how is this
+ calculated.
+
+ See the attached manual pages for `tar' and `cpio' format. `tar'
+uses a checksum which is the sum of all the bytes in the `tar' header
+for a file; `cpio' uses no checksum.
+
+ If anyone knows why `cpio' was made when `tar' was present at the
+ unix scene,
+
+ It wasn't. `cpio' first showed up in PWB/UNIX 1.0; no
+generally-available version of UNIX had `tar' at the time. I don't
+know whether any version that was generally available _within AT&T_ had
+`tar', or, if so, whether the people within AT&T who did `cpio' knew
+about it.
+
+ On restore, if there is a corruption on a tape `tar' will stop at
+that point, while `cpio' will skip over it and try to restore the rest
+of the files.
+
+ The main difference is just in the command syntax and header format.
+
+ `tar' is a little more tape-oriented in that everything is blocked
+to start on a record boundary.
+
+ Is there any differences between the ability to recover crashed
+ archives between the two of them. (Is there any chance of
+ recovering crashed archives at all.)
+
+ Theoretically it should be easier under `tar' since the blocking
+lets you find a header with some variation of `dd skip=NN'. However,
+modern `cpio''s and variations have an option to just search for the
+next file header after an error with a reasonable chance of resyncing.
+However, lots of tape driver software won't allow you to continue past
+a media error which should be the only reason for getting out of sync
+unless a file changed sizes while you were writing the archive.
+
+ If anyone knows why `cpio' was made when `tar' was present at the
+ unix scene, please tell me about this too.
+
+ Probably because it is more media efficient (by not blocking
+everything and using only the space needed for the headers where `tar'
+always uses 512 bytes per file header) and it knows how to archive
+special files.
+
+ You might want to look at the freely available alternatives. The
+major ones are `afio', GNU `tar', and `pax', each of which have their
+own extensions with some backwards compatibility.
+
+ Sparse files were `tar'red as sparse files (which you can easily
+test, because the resulting archive gets smaller, and GNU `cpio' can no
+longer read it).
+
+
+File: tar.info, Node: Media, Next: Changes, Prev: Formats, Up: Top
+
+9 Tapes and Other Archive Media
+*******************************
+
+ _(This message will disappear, once this node revised.)_
+
+A few special cases about tape handling warrant more detailed
+description. These special cases are discussed below.
+
+ Many complexities surround the use of `tar' on tape drives. Since
+the creation and manipulation of archives located on magnetic tape was
+the original purpose of `tar', it contains many features making such
+manipulation easier.
+
+ Archives are usually written on dismountable media--tape cartridges,
+mag tapes, or floppy disks.
+
+ The amount of data a tape or disk holds depends not only on its size,
+but also on how it is formatted. A 2400 foot long reel of mag tape
+holds 40 megabytes of data when formatted at 1600 bits per inch. The
+physically smaller EXABYTE tape cartridge holds 2.3 gigabytes.
+
+ Magnetic media are re-usable--once the archive on a tape is no longer
+needed, the archive can be erased and the tape or disk used over.
+Media quality does deteriorate with use, however. Most tapes or disks
+should be discarded when they begin to produce data errors. EXABYTE
+tape cartridges should be discarded when they generate an "error count"
+(number of non-usable bits) of more than 10k.
+
+ Magnetic media are written and erased using magnetic fields, and
+should be protected from such fields to avoid damage to stored data.
+Sticking a floppy disk to a filing cabinet using a magnet is probably
+not a good idea.
+
+* Menu:
+
+* Device:: Device selection and switching
+* Remote Tape Server::
+* Common Problems and Solutions::
+* Blocking:: Blocking
+* Many:: Many archives on one tape
+* Using Multiple Tapes:: Using Multiple Tapes
+* label:: Including a Label in the Archive
+* verify::
+* Write Protection::
+
+
+File: tar.info, Node: Device, Next: Remote Tape Server, Up: Media
+
+9.1 Device Selection and Switching
+==================================
+
+ _(This message will disappear, once this node revised.)_
+
+`-f [HOSTNAME:]FILE'
+`--file=[HOSTNAME:]FILE'
+ Use archive file or device FILE on HOSTNAME.
+
+ This option is used to specify the file name of the archive `tar'
+works on.
+
+ If the file name is `-', `tar' reads the archive from standard input
+(when listing or extracting), or writes it to standard output (when
+creating). If the `-' file name is given when updating an archive,
+`tar' will read the original archive from its standard input, and will
+write the entire new archive to its standard output.
+
+ If the file name contains a `:', it is interpreted as `hostname:file
+name'. If the HOSTNAME contains an "at" sign (`@'), it is treated as
+`user@hostname:file name'. In either case, `tar' will invoke the
+command `rsh' (or `remsh') to start up an `/usr/libexec/rmt' on the
+remote machine. If you give an alternate login name, it will be given
+to the `rsh'. Naturally, the remote machine must have an executable
+`/usr/libexec/rmt'. This program is free software from the University
+of California, and a copy of the source code can be found with the
+sources for `tar'; it's compiled and installed by default. The exact
+path to this utility is determined when configuring the package. It is
+`PREFIX/libexec/rmt', where PREFIX stands for your installation prefix.
+This location may also be overridden at runtime by using
+`rmt-command=COMMAND' option (*Note --rmt-command: Option Summary, for
+detailed description of this option. *Note Remote Tape Server::, for
+the description of `rmt' command).
+
+ If this option is not given, but the environment variable `TAPE' is
+set, its value is used; otherwise, old versions of `tar' used a default
+archive name (which was picked when `tar' was compiled). The default
+is normally set up to be the "first" tape drive or other transportable
+I/O medium on the system.
+
+ Starting with version 1.11.5, GNU `tar' uses standard input and
+standard output as the default device, and I will not try anymore
+supporting automatic device detection at installation time. This was
+failing really in too many cases, it was hopeless. This is now
+completely left to the installer to override standard input and
+standard output for default device, if this seems preferable. Further,
+I think _most_ actual usages of `tar' are done with pipes or disks, not
+really tapes, cartridges or diskettes.
+
+ Some users think that using standard input and output is running
+after trouble. This could lead to a nasty surprise on your screen if
+you forget to specify an output file name--especially if you are going
+through a network or terminal server capable of buffering large amounts
+of output. We had so many bug reports in that area of configuring
+default tapes automatically, and so many contradicting requests, that
+we finally consider the problem to be portably intractable. We could
+of course use something like `/dev/tape' as a default, but this is
+_also_ running after various kind of trouble, going from hung processes
+to accidental destruction of real tapes. After having seen all this
+mess, using standard input and output as a default really sounds like
+the only clean choice left, and a very useful one too.
+
+ GNU `tar' reads and writes archive in records, I suspect this is the
+main reason why block devices are preferred over character devices.
+Most probably, block devices are more efficient too. The installer
+could also check for `DEFTAPE' in `<sys/mtio.h>'.
+
+`--force-local'
+ Archive file is local even if it contains a colon.
+
+`--rsh-command=COMMAND'
+ Use remote COMMAND instead of `rsh'. This option exists so that
+ people who use something other than the standard `rsh' (e.g., a
+ Kerberized `rsh') can access a remote device.
+
+ When this command is not used, the shell command found when the
+ `tar' program was installed is used instead. This is the first
+ found of `/usr/ucb/rsh', `/usr/bin/remsh', `/usr/bin/rsh',
+ `/usr/bsd/rsh' or `/usr/bin/nsh'. The installer may have
+ overridden this by defining the environment variable `RSH' _at
+ installation time_.
+
+`-[0-7][lmh]'
+ Specify drive and density.
+
+`-M'
+`--multi-volume'
+ Create/list/extract multi-volume archive.
+
+ This option causes `tar' to write a "multi-volume" archive--one
+ that may be larger than will fit on the medium used to hold it.
+ *Note Multi-Volume Archives::.
+
+`-L NUM'
+`--tape-length=NUM'
+ Change tape after writing NUM x 1024 bytes.
+
+ This option might be useful when your tape drivers do not properly
+ detect end of physical tapes. By being slightly conservative on
+ the maximum tape length, you might avoid the problem entirely.
+
+`-F FILE'
+`--info-script=FILE'
+`--new-volume-script=FILE'
+ Execute `file' at end of each tape. This implies `--multi-volume'
+ (`-M'). *Note info-script::, for a detailed description of this
+ option.
+
+
+File: tar.info, Node: Remote Tape Server, Next: Common Problems and Solutions, Prev: Device, Up: Media
+
+9.2 The Remote Tape Server
+==========================
+
+In order to access the tape drive on a remote machine, `tar' uses the
+remote tape server written at the University of California at Berkeley.
+The remote tape server must be installed as `PREFIX/libexec/rmt' on
+any machine whose tape drive you want to use. `tar' calls `rmt' by
+running an `rsh' or `remsh' to the remote machine, optionally using a
+different login name if one is supplied.
+
+ A copy of the source for the remote tape server is provided. It is
+Copyright (C) 1983 by the Regents of the University of California, but
+can be freely distributed. It is compiled and installed by default.
+
+ Unless you use the `--absolute-names' (`-P') option, GNU `tar' will
+not allow you to create an archive that contains absolute file names (a
+file name beginning with `/'.) If you try, `tar' will automatically
+remove the leading `/' from the file names it stores in the archive.
+It will also type a warning message telling you what it is doing.
+
+ When reading an archive that was created with a different `tar'
+program, GNU `tar' automatically extracts entries in the archive which
+have absolute file names as if the file names were not absolute. This
+is an important feature. A visitor here once gave a `tar' tape to an
+operator to restore; the operator used Sun `tar' instead of GNU `tar',
+and the result was that it replaced large portions of our `/bin' and
+friends with versions from the tape; needless to say, we were unhappy
+about having to recover the file system from backup tapes.
+
+ For example, if the archive contained a file `/usr/bin/computoy',
+GNU `tar' would extract the file to `usr/bin/computoy', relative to the
+current directory. If you want to extract the files in an archive to
+the same absolute names that they had when the archive was created, you
+should do a `cd /' before extracting the files from the archive, or you
+should either use the `--absolute-names' option, or use the command
+`tar -C / ...'.
+
+ Some versions of Unix (Ultrix 3.1 is known to have this problem),
+can claim that a short write near the end of a tape succeeded, when it
+actually failed. This will result in the -M option not working
+correctly. The best workaround at the moment is to use a significantly
+larger blocking factor than the default 20.
+
+ In order to update an archive, `tar' must be able to backspace the
+archive in order to reread or rewrite a record that was just read (or
+written). This is currently possible only on two kinds of files: normal
+disk files (or any other file that can be backspaced with `lseek'), and
+industry-standard 9-track magnetic tape (or any other kind of tape that
+can be backspaced with the `MTIOCTOP' `ioctl'.
+
+ This means that the `--append', `--concatenate', and `--delete'
+commands will not work on any other kind of file. Some media simply
+cannot be backspaced, which means these commands and options will never
+be able to work on them. These non-backspacing media include pipes and
+cartridge tape drives.
+
+ Some other media can be backspaced, and `tar' will work on them once
+`tar' is modified to do so.
+
+ Archives created with the `--multi-volume', `--label', and
+`--incremental' (`-G') options may not be readable by other version of
+`tar'. In particular, restoring a file that was split over a volume
+boundary will require some careful work with `dd', if it can be done at
+all. Other versions of `tar' may also create an empty file whose name
+is that of the volume header. Some versions of `tar' may create normal
+files instead of directories archived with the `--incremental' (`-G')
+option.
+
+
+File: tar.info, Node: Common Problems and Solutions, Next: Blocking, Prev: Remote Tape Server, Up: Media
+
+9.3 Some Common Problems and their Solutions
+============================================
+
+errors from system:
+permission denied
+no such file or directory
+not owner
+
+errors from `tar':
+directory checksum error
+header format error
+
+errors from media/system:
+i/o error
+device busy
+
+
+File: tar.info, Node: Blocking, Next: Many, Prev: Common Problems and Solutions, Up: Media
+
+9.4 Blocking
+============
+
+ _(This message will disappear, once this node revised.)_
+
+"Block" and "record" terminology is rather confused, and it is also
+confusing to the expert reader. On the other hand, readers who are new
+to the field have a fresh mind, and they may safely skip the next two
+paragraphs, as the remainder of this manual uses those two terms in a
+quite consistent way.
+
+ John Gilmore, the writer of the public domain `tar' from which GNU
+`tar' was originally derived, wrote (June 1995):
+
+ The nomenclature of tape drives comes from IBM, where I believe
+ they were invented for the IBM 650 or so. On IBM mainframes, what
+ is recorded on tape are tape blocks. The logical organization of
+ data is into records. There are various ways of putting records
+ into blocks, including `F' (fixed sized records), `V' (variable
+ sized records), `FB' (fixed blocked: fixed size records, N to a
+ block), `VB' (variable size records, N to a block), `VSB'
+ (variable spanned blocked: variable sized records that can occupy
+ more than one block), etc. The `JCL' `DD RECFORM=' parameter
+ specified this to the operating system.
+
+ The Unix man page on `tar' was totally confused about this. When
+ I wrote `PD TAR', I used the historically correct terminology
+ (`tar' writes data records, which are grouped into blocks). It
+ appears that the bogus terminology made it into POSIX (no surprise
+ here), and now Franc,ois has migrated that terminology back into
+ the source code too.
+
+ The term "physical block" means the basic transfer chunk from or to
+a device, after which reading or writing may stop without anything
+being lost. In this manual, the term "block" usually refers to a disk
+physical block, _assuming_ that each disk block is 512 bytes in length.
+It is true that some disk devices have different physical blocks, but
+`tar' ignore these differences in its own format, which is meant to be
+portable, so a `tar' block is always 512 bytes in length, and "block"
+always mean a `tar' block. The term "logical block" often represents
+the basic chunk of allocation of many disk blocks as a single entity,
+which the operating system treats somewhat atomically; this concept is
+only barely used in GNU `tar'.
+
+ The term "physical record" is another way to speak of a physical
+block, those two terms are somewhat interchangeable. In this manual,
+the term "record" usually refers to a tape physical block, _assuming_
+that the `tar' archive is kept on magnetic tape. It is true that
+archives may be put on disk or used with pipes, but nevertheless, `tar'
+tries to read and write the archive one "record" at a time, whatever
+the medium in use. One record is made up of an integral number of
+blocks, and this operation of putting many disk blocks into a single
+tape block is called "reblocking", or more simply, "blocking". The
+term "logical record" refers to the logical organization of many
+characters into something meaningful to the application. The term
+"unit record" describes a small set of characters which are transmitted
+whole to or by the application, and often refers to a line of text.
+Those two last terms are unrelated to what we call a "record" in GNU
+`tar'.
+
+ When writing to tapes, `tar' writes the contents of the archive in
+chunks known as "records". To change the default blocking factor, use
+the `--blocking-factor=512-SIZE' (`-b 512-SIZE') option. Each record
+will then be composed of 512-SIZE blocks. (Each `tar' block is 512
+bytes. *Note Standard::.) Each file written to the archive uses at
+least one full record. As a result, using a larger record size can
+result in more wasted space for small files. On the other hand, a
+larger record size can often be read and written much more efficiently.
+
+ Further complicating the problem is that some tape drives ignore the
+blocking entirely. For these, a larger record size can still improve
+performance (because the software layers above the tape drive still
+honor the blocking), but not as dramatically as on tape drives that
+honor blocking.
+
+ When reading an archive, `tar' can usually figure out the record
+size on itself. When this is the case, and a non-standard record size
+was used when the archive was created, `tar' will print a message about
+a non-standard blocking factor, and then operate normally. On some
+tape devices, however, `tar' cannot figure out the record size itself.
+On most of those, you can specify a blocking factor (with
+`--blocking-factor') larger than the actual blocking factor, and then
+use the `--read-full-records' (`-B') option. (If you specify a
+blocking factor with `--blocking-factor' and don't use the
+`--read-full-records' option, then `tar' will not attempt to figure out
+the recording size itself.) On some devices, you must always specify
+the record size exactly with `--blocking-factor' when reading, because
+`tar' cannot figure it out. In any case, use `--list' (`-t') before
+doing any extractions to see whether `tar' is reading the archive
+correctly.
+
+ `tar' blocks are all fixed size (512 bytes), and its scheme for
+putting them into records is to put a whole number of them (one or
+more) into each record. `tar' records are all the same size; at the
+end of the file there's a block containing all zeros, which is how you
+tell that the remainder of the last record(s) are garbage.
+
+ In a standard `tar' file (no options), the block size is 512 and the
+record size is 10240, for a blocking factor of 20. What the
+`--blocking-factor' option does is sets the blocking factor, changing
+the record size while leaving the block size at 512 bytes. 20 was fine
+for ancient 800 or 1600 bpi reel-to-reel tape drives; most tape drives
+these days prefer much bigger records in order to stream and not waste
+tape. When writing tapes for myself, some tend to use a factor of the
+order of 2048, say, giving a record size of around one megabyte.
+
+ If you use a blocking factor larger than 20, older `tar' programs
+might not be able to read the archive, so we recommend this as a limit
+to use in practice. GNU `tar', however, will support arbitrarily large
+record sizes, limited only by the amount of virtual memory or the
+physical characteristics of the tape device.
+
+* Menu:
+
+* Format Variations:: Format Variations
+* Blocking Factor:: The Blocking Factor of an Archive
+
+
+File: tar.info, Node: Format Variations, Next: Blocking Factor, Up: Blocking
+
+9.4.1 Format Variations
+-----------------------
+
+ _(This message will disappear, once this node revised.)_
+
+Format parameters specify how an archive is written on the archive
+media. The best choice of format parameters will vary depending on the
+type and number of files being archived, and on the media used to store
+the archive.
+
+ To specify format parameters when accessing or creating an archive,
+you can use the options described in the following sections. If you do
+not specify any format parameters, `tar' uses default parameters. You
+cannot modify a compressed archive. If you create an archive with the
+`--blocking-factor' option specified (*note Blocking Factor::), you
+must specify that blocking-factor when operating on the archive. *Note
+Formats::, for other examples of format parameter considerations.
+
+
+File: tar.info, Node: Blocking Factor, Prev: Format Variations, Up: Blocking
+
+9.4.2 The Blocking Factor of an Archive
+---------------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+The data in an archive is grouped into blocks, which are 512 bytes.
+Blocks are read and written in whole number multiples called "records".
+The number of blocks in a record (i.e., the size of a record in units
+of 512 bytes) is called the "blocking factor". The
+`--blocking-factor=512-SIZE' (`-b 512-SIZE') option specifies the
+blocking factor of an archive. The default blocking factor is
+typically 20 (i.e., 10240 bytes), but can be specified at installation.
+To find out the blocking factor of an existing archive, use `tar
+--list --file=ARCHIVE-NAME'. This may not work on some devices.
+
+ Records are separated by gaps, which waste space on the archive
+media. If you are archiving on magnetic tape, using a larger blocking
+factor (and therefore larger records) provides faster throughput and
+allows you to fit more data on a tape (because there are fewer gaps).
+If you are archiving on cartridge, a very large blocking factor (say
+126 or more) greatly increases performance. A smaller blocking factor,
+on the other hand, may be useful when archiving small files, to avoid
+archiving lots of nulls as `tar' fills out the archive to the end of
+the record. In general, the ideal record size depends on the size of
+the inter-record gaps on the tape you are using, and the average size
+of the files you are archiving. *Note create::, for information on
+writing archives.
+
+ Archives with blocking factors larger than 20 cannot be read by very
+old versions of `tar', or by some newer versions of `tar' running on
+old machines with small address spaces. With GNU `tar', the blocking
+factor of an archive is limited only by the maximum record size of the
+device containing the archive, or by the amount of available virtual
+memory.
+
+ Also, on some systems, not using adequate blocking factors, as
+sometimes imposed by the device drivers, may yield unexpected
+diagnostics. For example, this has been reported:
+
+ Cannot write to /dev/dlt: Invalid argument
+
+In such cases, it sometimes happen that the `tar' bundled by the system
+is aware of block size idiosyncrasies, while GNU `tar' requires an
+explicit specification for the block size, which it cannot guess. This
+yields some people to consider GNU `tar' is misbehaving, because by
+comparison, `the bundle `tar' works OK'. Adding `-b 256', for example,
+might resolve the problem.
+
+ If you use a non-default blocking factor when you create an archive,
+you must specify the same blocking factor when you modify that archive.
+Some archive devices will also require you to specify the blocking
+factor when reading that archive, however this is not typically the
+case. Usually, you can use `--list' (`-t') without specifying a
+blocking factor--`tar' reports a non-default record size and then lists
+the archive members as it would normally. To extract files from an
+archive with a non-standard blocking factor (particularly if you're not
+sure what the blocking factor is), you can usually use the
+`--read-full-records' (`-B') option while specifying a blocking factor
+larger then the blocking factor of the archive (i.e., `tar --extract
+--read-full-records --blocking-factor=300'. *Note list::, for more
+information on the `--list' (`-t') operation. *Note Reading::, for a
+more detailed explanation of that option.
+
+`--blocking-factor=NUMBER'
+`-b NUMBER'
+ Specifies the blocking factor of an archive. Can be used with any
+ operation, but is usually not necessary with `--list' (`-t').
+
+ Device blocking
+
+`-b BLOCKS'
+`--blocking-factor=BLOCKS'
+ Set record size to BLOCKS * 512 bytes.
+
+ This option is used to specify a "blocking factor" for the archive.
+ When reading or writing the archive, `tar', will do reads and
+ writes of the archive in records of BLOCK*512 bytes. This is true
+ even when the archive is compressed. Some devices requires that
+ all write operations be a multiple of a certain size, and so, `tar'
+ pads the archive out to the next record boundary.
+
+ The default blocking factor is set when `tar' is compiled, and is
+ typically 20. Blocking factors larger than 20 cannot be read by
+ very old versions of `tar', or by some newer versions of `tar'
+ running on old machines with small address spaces.
+
+ With a magnetic tape, larger records give faster throughput and fit
+ more data on a tape (because there are fewer inter-record gaps).
+ If the archive is in a disk file or a pipe, you may want to specify
+ a smaller blocking factor, since a large one will result in a large
+ number of null bytes at the end of the archive.
+
+ When writing cartridge or other streaming tapes, a much larger
+ blocking factor (say 126 or more) will greatly increase
+ performance. However, you must specify the same blocking factor
+ when reading or updating the archive.
+
+ Apparently, Exabyte drives have a physical block size of 8K bytes.
+ If we choose our blocksize as a multiple of 8k bytes, then the
+ problem seems to disappear. Id est, we are using block size of
+ 112 right now, and we haven't had the problem since we switched...
+
+ With GNU `tar' the blocking factor is limited only by the maximum
+ record size of the device containing the archive, or by the amount
+ of available virtual memory.
+
+ However, deblocking or reblocking is virtually avoided in a special
+ case which often occurs in practice, but which requires all the
+ following conditions to be simultaneously true:
+ * the archive is subject to a compression option,
+
+ * the archive is not handled through standard input or output,
+ nor redirected nor piped,
+
+ * the archive is directly handled to a local disk, instead of
+ any special device,
+
+ * `--blocking-factor' is not explicitly specified on the `tar'
+ invocation.
+
+ If the output goes directly to a local disk, and not through
+ stdout, then the last write is not extended to a full record size.
+ Otherwise, reblocking occurs. Here are a few other remarks on this
+ topic:
+
+ * `gzip' will complain about trailing garbage if asked to
+ uncompress a compressed archive on tape, there is an option
+ to turn the message off, but it breaks the regularity of
+ simply having to use `PROG -d' for decompression. It would
+ be nice if gzip was silently ignoring any number of trailing
+ zeros. I'll ask Jean-loup Gailly, by sending a copy of this
+ message to him.
+
+ * `compress' does not show this problem, but as Jean-loup
+ pointed out to Michael, `compress -d' silently adds garbage
+ after the result of decompression, which tar ignores because
+ it already recognized its end-of-file indicator. So this bug
+ may be safely ignored.
+
+ * `gzip -d -q' will be silent about the trailing zeros indeed,
+ but will still return an exit status of 2 which tar reports
+ in turn. `tar' might ignore the exit status returned, but I
+ hate doing that, as it weakens the protection `tar' offers
+ users against other possible problems at decompression time.
+ If `gzip' was silently skipping trailing zeros _and_ also
+ avoiding setting the exit status in this innocuous case, that
+ would solve this situation.
+
+ * `tar' should become more solid at not stopping to read a pipe
+ at the first null block encountered. This inelegantly breaks
+ the pipe. `tar' should rather drain the pipe out before
+ exiting itself.
+
+`-i'
+`--ignore-zeros'
+ Ignore blocks of zeros in archive (means EOF).
+
+ The `--ignore-zeros' (`-i') option causes `tar' to ignore blocks
+ of zeros in the archive. Normally a block of zeros indicates the
+ end of the archive, but when reading a damaged archive, or one
+ which was created by concatenating several archives together, this
+ option allows `tar' to read the entire archive. This option is
+ not on by default because many versions of `tar' write garbage
+ after the zeroed blocks.
+
+ Note that this option causes `tar' to read to the end of the
+ archive file, which may sometimes avoid problems when multiple
+ files are stored on a single physical tape.
+
+`-B'
+`--read-full-records'
+ Reblock as we read (for reading 4.2BSD pipes).
+
+ If `--read-full-records' is used, `tar' will not panic if an
+ attempt to read a record from the archive does not return a full
+ record. Instead, `tar' will keep reading until it has obtained a
+ full record.
+
+ This option is turned on by default when `tar' is reading an
+ archive from standard input, or from a remote machine. This is
+ because on BSD Unix systems, a read of a pipe will return however
+ much happens to be in the pipe, even if it is less than `tar'
+ requested. If this option was not used, `tar' would fail as soon
+ as it read an incomplete record from the pipe.
+
+ This option is also useful with the commands for updating an
+ archive.
+
+
+ Tape blocking
+
+ When handling various tapes or cartridges, you have to take care of
+selecting a proper blocking, that is, the number of disk blocks you put
+together as a single tape block on the tape, without intervening tape
+gaps. A "tape gap" is a small landing area on the tape with no
+information on it, used for decelerating the tape to a full stop, and
+for later regaining the reading or writing speed. When the tape driver
+starts reading a record, the record has to be read whole without
+stopping, as a tape gap is needed to stop the tape motion without
+loosing information.
+
+ Using higher blocking (putting more disk blocks per tape block) will
+use the tape more efficiently as there will be less tape gaps. But
+reading such tapes may be more difficult for the system, as more memory
+will be required to receive at once the whole record. Further, if
+there is a reading error on a huge record, this is less likely that the
+system will succeed in recovering the information. So, blocking should
+not be too low, nor it should be too high. `tar' uses by default a
+blocking of 20 for historical reasons, and it does not really matter
+when reading or writing to disk. Current tape technology would easily
+accommodate higher blockings. Sun recommends a blocking of 126 for
+Exabytes and 96 for DATs. We were told that for some DLT drives, the
+blocking should be a multiple of 4Kb, preferably 64Kb (`-b 128') or 256
+for decent performance. Other manufacturers may use different
+recommendations for the same tapes. This might also depends of the
+buffering techniques used inside modern tape controllers. Some imposes
+a minimum blocking, or a maximum blocking. Others request blocking to
+be some exponent of two.
+
+ So, there is no fixed rule for blocking. But blocking at read time
+should ideally be the same as blocking used at write time. At one place
+I know, with a wide variety of equipment, they found it best to use a
+blocking of 32 to guarantee that their tapes are fully interchangeable.
+
+ I was also told that, for recycled tapes, prior erasure (by the same
+drive unit that will be used to create the archives) sometimes lowers
+the error rates observed at rewriting time.
+
+ I might also use `--number-blocks' instead of `--block-number', so
+`--block' will then expand to `--blocking-factor' unambiguously.
+
+
+File: tar.info, Node: Many, Next: Using Multiple Tapes, Prev: Blocking, Up: Media
+
+9.5 Many Archives on One Tape
+=============================
+
+Most tape devices have two entries in the `/dev' directory, or entries
+that come in pairs, which differ only in the minor number for this
+device. Let's take for example `/dev/tape', which often points to the
+only or usual tape device of a given system. There might be a
+corresponding `/dev/nrtape' or `/dev/ntape'. The simpler name is the
+_rewinding_ version of the device, while the name having `nr' in it is
+the _no rewinding_ version of the same device.
+
+ A rewinding tape device will bring back the tape to its beginning
+point automatically when this device is opened or closed. Since `tar'
+opens the archive file before using it and closes it afterwards, this
+means that a simple:
+
+ $ tar cf /dev/tape DIRECTORY
+
+will reposition the tape to its beginning both prior and after saving
+DIRECTORY contents to it, thus erasing prior tape contents and making
+it so that any subsequent write operation will destroy what has just
+been saved.
+
+ So, a rewinding device is normally meant to hold one and only one
+file. If you want to put more than one `tar' archive on a given tape,
+you will need to avoid using the rewinding version of the tape device.
+You will also have to pay special attention to tape positioning.
+Errors in positioning may overwrite the valuable data already on your
+tape. Many people, burnt by past experiences, will only use rewinding
+devices and limit themselves to one file per tape, precisely to avoid
+the risk of such errors. Be fully aware that writing at the wrong
+position on a tape loses all information past this point and most
+probably until the end of the tape, and this destroyed information
+_cannot_ be recovered.
+
+ To save DIRECTORY-1 as a first archive at the beginning of a tape,
+and leave that tape ready for a second archive, you should use:
+
+ $ mt -f /dev/nrtape rewind
+ $ tar cf /dev/nrtape DIRECTORY-1
+
+ "Tape marks" are special magnetic patterns written on the tape
+media, which are later recognizable by the reading hardware. These
+marks are used after each file, when there are many on a single tape.
+An empty file (that is to say, two tape marks in a row) signal the
+logical end of the tape, after which no file exist. Usually,
+non-rewinding tape device drivers will react to the close request issued
+by `tar' by first writing two tape marks after your archive, and by
+backspacing over one of these. So, if you remove the tape at that time
+from the tape drive, it is properly terminated. But if you write
+another file at the current position, the second tape mark will be
+erased by the new information, leaving only one tape mark between files.
+
+ So, you may now save DIRECTORY-2 as a second archive after the first
+on the same tape by issuing the command:
+
+ $ tar cf /dev/nrtape DIRECTORY-2
+
+and so on for all the archives you want to put on the same tape.
+
+ Another usual case is that you do not write all the archives the same
+day, and you need to remove and store the tape between two archive
+sessions. In general, you must remember how many files are already
+saved on your tape. Suppose your tape already has 16 files on it, and
+that you are ready to write the 17th. You have to take care of skipping
+the first 16 tape marks before saving DIRECTORY-17, say, by using these
+commands:
+
+ $ mt -f /dev/nrtape rewind
+ $ mt -f /dev/nrtape fsf 16
+ $ tar cf /dev/nrtape DIRECTORY-17
+
+ In all the previous examples, we put aside blocking considerations,
+but you should do the proper things for that as well. *Note Blocking::.
+
+* Menu:
+
+* Tape Positioning:: Tape Positions and Tape Marks
+* mt:: The `mt' Utility
+
+
+File: tar.info, Node: Tape Positioning, Next: mt, Up: Many
+
+9.5.1 Tape Positions and Tape Marks
+-----------------------------------
+
+ _(This message will disappear, once this node revised.)_
+
+Just as archives can store more than one file from the file system,
+tapes can store more than one archive file. To keep track of where
+archive files (or any other type of file stored on tape) begin and end,
+tape archive devices write magnetic "tape marks" on the archive media.
+Tape drives write one tape mark between files, two at the end of all
+the file entries.
+
+ If you think of data as a series of records "rrrr"'s, and tape marks
+as "*"'s, a tape might look like the following:
+
+ rrrr*rrrrrr*rrrrr*rr*rrrrr**-------------------------
+
+ Tape devices read and write tapes using a read/write "tape head"--a
+physical part of the device which can only access one point on the tape
+at a time. When you use `tar' to read or write archive data from a
+tape device, the device will begin reading or writing from wherever on
+the tape the tape head happens to be, regardless of which archive or
+what part of the archive the tape head is on. Before writing an
+archive, you should make sure that no data on the tape will be
+overwritten (unless it is no longer needed). Before reading an
+archive, you should make sure the tape head is at the beginning of the
+archive you want to read. You can do it manually via `mt' utility
+(*note mt::). The `restore' script does that automatically (*note
+Scripted Restoration::).
+
+ If you want to add new archive file entries to a tape, you should
+advance the tape to the end of the existing file entries, backspace
+over the last tape mark, and write the new archive file. If you were
+to add two archives to the example above, the tape might look like the
+following:
+
+ rrrr*rrrrrr*rrrrr*rr*rrrrr*rrr*rrrr**----------------
+
+
+File: tar.info, Node: mt, Prev: Tape Positioning, Up: Many
+
+9.5.2 The `mt' Utility
+----------------------
+
+ _(This message will disappear, once this node revised.)_
+
+*Note Blocking Factor::.
+
+ You can use the `mt' utility to advance or rewind a tape past a
+specified number of archive files on the tape. This will allow you to
+move to the beginning of an archive before extracting or reading it, or
+to the end of all the archives before writing a new one.
+
+ The syntax of the `mt' command is:
+
+ mt [-f TAPENAME] OPERATION [NUMBER]
+
+ where TAPENAME is the name of the tape device, NUMBER is the number
+of times an operation is performed (with a default of one), and
+OPERATION is one of the following:
+
+`eof'
+`weof'
+ Writes NUMBER tape marks at the current position on the tape.
+
+`fsf'
+ Moves tape position forward NUMBER files.
+
+`bsf'
+ Moves tape position back NUMBER files.
+
+`rewind'
+ Rewinds the tape. (Ignores NUMBER).
+
+`offline'
+`rewoff1'
+ Rewinds the tape and takes the tape device off-line. (Ignores
+ NUMBER).
+
+`status'
+ Prints status information about the tape unit.
+
+
+ If you don't specify a TAPENAME, `mt' uses the environment variable
+`TAPE'; if `TAPE' is not set, `mt' will use the default device
+specified in your `sys/mtio.h' file (`DEFTAPE' variable). If this is
+not defined, the program will display a descriptive error message and
+exit with code 1.
+
+ `mt' returns a 0 exit status when the operation(s) were successful,
+1 if the command was unrecognized, and 2 if an operation failed.
+
+
+File: tar.info, Node: Using Multiple Tapes, Next: label, Prev: Many, Up: Media
+
+9.6 Using Multiple Tapes
+========================
+
+Often you might want to write a large archive, one larger than will fit
+on the actual tape you are using. In such a case, you can run multiple
+`tar' commands, but this can be inconvenient, particularly if you are
+using options like `--exclude=PATTERN' or dumping entire file systems.
+Therefore, `tar' provides a special mode for creating multi-volume
+archives.
+
+ "Multi-volume" archive is a single `tar' archive, stored on several
+media volumes of fixed size. Although in this section we will often
+call `volume' a "tape", there is absolutely no requirement for
+multi-volume archives to be stored on tapes. Instead, they can use
+whatever media type the user finds convenient, they can even be located
+on files.
+
+ When creating a multi-volume archive, GNU `tar' continues to fill
+current volume until it runs out of space, then it switches to next
+volume (usually the operator is queried to replace the tape on this
+point), and continues working on the new volume. This operation
+continues until all requested files are dumped. If GNU `tar' detects
+end of media while dumping a file, such a file is archived in split
+form. Some very big files can even be split across several volumes.
+
+ Each volume is itself a valid GNU `tar' archive, so it can be read
+without any special options. Consequently any file member residing
+entirely on one volume can be extracted or otherwise operated upon
+without needing the other volume. Sure enough, to extract a split
+member you would need all volumes its parts reside on.
+
+ Multi-volume archives suffer from several limitations. In
+particular, they cannot be compressed.
+
+ GNU `tar' is able to create multi-volume archives of two formats
+(*note Formats::): `GNU' and `POSIX'.
+
+* Menu:
+
+* Multi-Volume Archives:: Archives Longer than One Tape or Disk
+* Tape Files:: Tape Files
+* Tarcat:: Concatenate Volumes into a Single Archive
+
+
+File: tar.info, Node: Multi-Volume Archives, Next: Tape Files, Up: Using Multiple Tapes
+
+9.6.1 Archives Longer than One Tape or Disk
+-------------------------------------------
+
+To create an archive that is larger than will fit on a single unit of
+the media, use the `--multi-volume' (`-M') option in conjunction with
+the `--create' option (*note create::). A "multi-volume" archive can
+be manipulated like any other archive (provided the `--multi-volume'
+option is specified), but is stored on more than one tape or disk.
+
+ When you specify `--multi-volume', `tar' does not report an error
+when it comes to the end of an archive volume (when reading), or the
+end of the media (when writing). Instead, it prompts you to load a new
+storage volume. If the archive is on a magnetic tape, you should
+change tapes when you see the prompt; if the archive is on a floppy
+disk, you should change disks; etc.
+
+`--multi-volume'
+`-M'
+ Creates a multi-volume archive, when used in conjunction with
+ `--create' (`-c'). To perform any other operation on a
+ multi-volume archive, specify `--multi-volume' in conjunction with
+ that operation. For example:
+
+ $ tar --create --multi-volume --file=/dev/tape FILES
+
+ The method `tar' uses to detect end of tape is not perfect, and
+fails on some operating systems or on some devices. If `tar' cannot
+detect the end of the tape itself, you can use `--tape-length' option
+to inform it about the capacity of the tape:
+
+`--tape-length=SIZE'
+`-L SIZE'
+ Set maximum length of a volume. The SIZE argument should then be
+ the usable size of the tape in units of 1024 bytes. This option
+ selects `--multi-volume' automatically. For example:
+
+ $ tar --create --tape-length=41943040 --file=/dev/tape FILES
+
+ When GNU `tar' comes to the end of a storage media, it asks you to
+change the volume. The built-in prompt for POSIX locale is(1):
+
+ Prepare volume #N for `ARCHIVE' and hit return:
+
+where N is the ordinal number of the volume to be created and ARCHIVE
+is archive file or device name.
+
+ When prompting for a new tape, `tar' accepts any of the following
+responses:
+
+`?'
+ Request `tar' to explain possible responses
+
+`q'
+ Request `tar' to exit immediately.
+
+`n FILE-NAME'
+ Request `tar' to write the next volume on the file FILE-NAME.
+
+`!'
+ Request `tar' to run a subshell. This option can be disabled by
+ giving `--restrict' command line option to `tar'(2).
+
+`y'
+ Request `tar' to begin writing the next volume.
+
+ (You should only type `y' after you have changed the tape; otherwise
+`tar' will write over the volume it just finished.)
+
+ The volume number used by `tar' in its tape-changing prompt can be
+changed; if you give the `--volno-file=FILE-OF-NUMBER' option, then
+FILE-OF-NUMBER should be an non-existing file to be created, or else, a
+file already containing a decimal number. That number will be used as
+the volume number of the first volume written. When `tar' is finished,
+it will rewrite the file with the now-current volume number. (This does
+not change the volume number written on a tape label, as per *note
+label::, it _only_ affects the number used in the prompt.)
+
+ If you want more elaborate behavior than this, you can write a
+special "new volume script", that will be responsible for changing the
+volume, and instruct `tar' to use it instead of its normal prompting
+procedure:
+
+`--info-script=SCRIPT-NAME'
+`--new-volume-script=SCRIPT-NAME'
+`-F SCRIPT-NAME'
+ Specify the full name of the volume script to use. The script can
+ be used to eject cassettes, or to broadcast messages such as
+ `Someone please come change my tape' when performing unattended
+ backups.
+
+ The SCRIPT-NAME is executed without any command line arguments. It
+inherits `tar''s shell environment. Additional data is passed to it
+via the following environment variables:
+
+`TAR_VERSION'
+ GNU `tar' version number.
+
+`TAR_ARCHIVE'
+ The name of the archive `tar' is processing.
+
+`TAR_VOLUME'
+ Ordinal number of the volume `tar' is about to start.
+
+`TAR_SUBCOMMAND'
+ Short option describing the operation `tar' is executing *Note
+ Operations::, for a complete list of subcommand options.
+
+`TAR_FORMAT'
+ Format of the archive being processed. *Note Formats::, for a
+ complete list of archive format names.
+
+`TAR_FD'
+ File descriptor which can be used to communicate the new volume
+ name to `tar'.
+
+ The volume script can instruct `tar' to use new archive name, by
+writing in to file descriptor `$TAR_FD' (see below for an example).
+
+ If the info script fails, `tar' exits; otherwise, it begins writing
+the next volume.
+
+ If you want `tar' to cycle through a series of files or tape drives,
+there are three approaches to choose from. First of all, you can give
+`tar' multiple `--file' options. In this case the specified files will
+be used, in sequence, as the successive volumes of the archive. Only
+when the first one in the sequence needs to be used again will `tar'
+prompt for a tape change (or run the info script). For example,
+suppose someone has two tape drives on a system named `/dev/tape0' and
+`/dev/tape1'. For having GNU `tar' to switch to the second drive when
+it needs to write the second tape, and then back to the first tape,
+etc., just do either of:
+
+ $ tar --create --multi-volume --file=/dev/tape0 --file=/dev/tape1 FILES
+ $ tar cMff /dev/tape0 /dev/tape1 FILES
+
+ The second method is to use the `n' response to the tape-change
+prompt.
+
+ Finally, the most flexible approach is to use a volume script, that
+writes new archive name to the file descriptor `$TAR_FD'. For example,
+the following volume script will create a series of archive files, named
+`ARCHIVE-VOL', where ARCHIVE is the name of the archive being created
+(as given by `--file' option) and VOL is the ordinal number of the
+archive being created:
+
+ #! /bin/sh
+ echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.
+
+ name=`expr $TAR_ARCHIVE : '\(.*\)-.*'`
+ case $TAR_SUBCOMMAND in
+ -c) ;;
+ -d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || exit 1
+ ;;
+ *) exit 1
+ esac
+
+ echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD
+
+ The same script cant be used while listing, comparing or extracting
+from the created archive. For example:
+
+ # Create a multi-volume archive:
+ $ tar -c -L1024 -f archive.tar -F new-volume .
+ # Extract from the created archive:
+ $ tar -x -f archive.tar -F new-volume .
+
+Notice, that the first command had to use `-L' option, since otherwise
+GNU `tar' will end up writing everything to file `archive.tar'.
+
+ You can read each individual volume of a multi-volume archive as if
+it were an archive by itself. For example, to list the contents of one
+volume, use `--list', without `--multi-volume' specified. To extract
+an archive member from one volume (assuming it is described that
+volume), use `--extract', again without `--multi-volume'.
+
+ If an archive member is split across volumes (i.e., its entry begins
+on one volume of the media and ends on another), you need to specify
+`--multi-volume' to extract it successfully. In this case, you should
+load the volume where the archive member starts, and use `tar --extract
+--multi-volume'--`tar' will prompt for later volumes as it needs them.
+*Note extracting archives::, for more information about extracting
+archives.
+
+ Multi-volume archives can be modified like any other archive. To add
+files to a multi-volume archive, you need to only mount the last volume
+of the archive media (and new volumes, if needed). For all other
+operations, you need to use the entire archive.
+
+ If a multi-volume archive was labeled using `--label=ARCHIVE-LABEL'
+(*note label::) when it was created, `tar' will not automatically label
+volumes which are added later. To label subsequent volumes, specify
+`--label=ARCHIVE-LABEL' again in conjunction with the `--append',
+`--update' or `--concatenate' operation.
+
+ Notice that multi-volume support is a GNU extension and the archives
+created in this mode should be read only using GNU `tar'. If you
+absolutely have to process such archives using a third-party `tar'
+implementation, read *note Split Recovery::.
+
+ ---------- Footnotes ----------
+
+ (1) If you run GNU `tar' under a different locale, the translation
+to the locale's language will be used.
+
+ (2) *Note --restrict::, for more information about this option
+
+
+File: tar.info, Node: Tape Files, Next: Tarcat, Prev: Multi-Volume Archives, Up: Using Multiple Tapes
+
+9.6.2 Tape Files
+----------------
+
+ _(This message will disappear, once this node revised.)_
+
+To give the archive a name which will be recorded in it, use the
+`--label=VOLUME-LABEL' (`-V VOLUME-LABEL') option. This will write a
+special block identifying VOLUME-LABEL as the name of the archive to
+the front of the archive which will be displayed when the archive is
+listed with `--list'. If you are creating a multi-volume archive with
+`--multi-volume' (*note Using Multiple Tapes::), then the volume label
+will have `Volume NNN' appended to the name you give, where NNN is the
+number of the volume of the archive. (If you use the
+`--label=VOLUME-LABEL') option when reading an archive, it checks to
+make sure the label on the tape matches the one you give. *Note label::.
+
+ When `tar' writes an archive to tape, it creates a single tape file.
+If multiple archives are written to the same tape, one after the
+other, they each get written as separate tape files. When extracting,
+it is necessary to position the tape at the right place before running
+`tar'. To do this, use the `mt' command. For more information on the
+`mt' command and on the organization of tapes into a sequence of tape
+files, see *note mt::.
+
+ People seem to often do:
+
+ --label="SOME-PREFIX `date +SOME-FORMAT`"
+
+ or such, for pushing a common date in all volumes or an archive set.
+
+
+File: tar.info, Node: Tarcat, Prev: Tape Files, Up: Using Multiple Tapes
+
+9.6.3 Concatenate Volumes into a Single Archive
+-----------------------------------------------
+
+Sometimes it is necessary to convert existing GNU `tar' multi-volume
+archive to a single `tar' archive. Simply concatenating all volumes
+into one will not work, since each volume carries an additional
+information at the beginning. GNU `tar' is shipped with the shell
+script `tarcat' designed for this purpose.
+
+ The script takes a list of files comprising a multi-volume archive
+and creates the resulting archive at the standard output. For example:
+
+ tarcat vol.1 vol.2 vol.3 | tar tf -
+
+ The script implements a simple heuristics to determine the format of
+the first volume file and to decide how to process the rest of the
+files. However, it makes no attempt to verify whether the files are
+given in order or even if they are valid `tar' archives. It uses `dd'
+and does not filter its standard error, so you will usually see lots of
+spurious messages.
+
+
+File: tar.info, Node: label, Next: verify, Prev: Using Multiple Tapes, Up: Media
+
+9.7 Including a Label in the Archive
+====================================
+
+ _(This message will disappear, once this node revised.)_
+
+To avoid problems caused by misplaced paper labels on the archive
+media, you can include a "label" entry--an archive member which
+contains the name of the archive--in the archive itself. Use the
+`--label=ARCHIVE-LABEL' (`-V ARCHIVE-LABEL') option in conjunction with
+the `--create' operation to include a label entry in the archive as it
+is being created.
+
+`--label=ARCHIVE-LABEL'
+`-V ARCHIVE-LABEL'
+ Includes an "archive-label" at the beginning of the archive when
+ the archive is being created, when used in conjunction with the
+ `--create' operation. Checks to make sure the archive label
+ matches the one specified (when used in conjunction with any other
+ operation.
+
+ If you create an archive using both `--label=ARCHIVE-LABEL' (`-V
+ARCHIVE-LABEL') and `--multi-volume' (`-M'), each volume of the archive
+will have an archive label of the form `ARCHIVE-LABEL Volume N', where
+N is 1 for the first volume, 2 for the next, and so on. *Note Using
+Multiple Tapes::, for information on creating multiple volume archives.
+
+ The volume label will be displayed by `--list' along with the file
+contents. If verbose display is requested, it will also be explicitly
+marked as in the example below:
+
+ $ tar --verbose --list --file=iamanarchive
+ V--------- 0 0 0 1992-03-07 12:01 iamalabel--Volume Header--
+ -rw-r--r-- ringo user 40 1990-05-21 13:30 iamafilename
+
+ However, `--list' option will cause listing entire contents of the
+archive, which may be undesirable (for example, if the archive is
+stored on a tape). You can request checking only the volume by
+specifying `--test-label' option. This option reads only the first
+block of an archive, so it can be used with slow storage devices. For
+example:
+
+ $ tar --test-label --file=iamanarchive
+ iamalabel
+
+ If `--test-label' is used with a single command line argument, `tar'
+compares the volume label with the argument. It exits with code 0 if
+the two strings match, and with code 2 otherwise. In this case no
+output is displayed. For example:
+
+ $ tar --test-label --file=iamanarchive 'iamalable'
+ => 0
+ $ tar --test-label --file=iamanarchive 'iamalable' alabel
+ => 1
+
+ If you request any operation, other than `--create', along with
+using `--label' option, `tar' will first check if the archive label
+matches the one specified and will refuse to proceed if it does not.
+Use this as a safety precaution to avoid accidentally overwriting
+existing archives. For example, if you wish to add files to `archive',
+presumably labeled with string `My volume', you will get:
+
+ $ tar -rf archive --label 'My volume' .
+ tar: Archive not labeled to match `My volume'
+
+in case its label does not match. This will work even if `archive' is
+not labeled at all.
+
+ Similarly, `tar' will refuse to list or extract the archive if its
+label doesn't match the ARCHIVE-LABEL specified. In those cases,
+ARCHIVE-LABEL argument is interpreted as a globbing-style pattern which
+must match the actual magnetic volume label. *Note exclude::, for a
+precise description of how match is attempted(1). If the switch
+`--multi-volume' (`-M') is being used, the volume label matcher will
+also suffix ARCHIVE-LABEL by ` Volume [1-9]*' if the initial match
+fails, before giving up. Since the volume numbering is automatically
+added in labels at creation time, it sounded logical to equally help
+the user taking care of it when the archive is being read.
+
+ The `--label' was once called `--volume', but is not available under
+that name anymore.
+
+ You can also use `--label' to get a common information on all tapes
+of a series. For having this information different in each series
+created through a single script used on a regular basis, just manage to
+get some date string as part of the label. For example:
+
+ $ tar cfMV /dev/tape "Daily backup for `date +%Y-%m-%d`"
+ $ tar --create --file=/dev/tape --multi-volume \
+ --volume="Daily backup for `date +%Y-%m-%d`"
+
+ Also note that each label has its own date and time, which
+corresponds to when GNU `tar' initially attempted to write it, often
+soon after the operator launches `tar' or types the carriage return
+telling that the next tape is ready. Comparing date labels does give
+an idea of tape throughput only if the delays for rewinding tapes and
+the operator switching them were negligible, which is usually not the
+case.
+
+ ---------- Footnotes ----------
+
+ (1) Previous versions of `tar' used full regular expression
+matching, or before that, only exact string matching, instead of
+wildcard matchers. We decided for the sake of simplicity to use a
+uniform matching device through `tar'.
+
+
+File: tar.info, Node: verify, Next: Write Protection, Prev: label, Up: Media
+
+9.8 Verifying Data as It is Stored
+==================================
+
+`-W'
+`--verify'
+ Attempt to verify the archive after writing.
+
+ This option causes `tar' to verify the archive after writing it.
+Each volume is checked after it is written, and any discrepancies are
+recorded on the standard error output.
+
+ Verification requires that the archive be on a back-space-able
+medium. This means pipes, some cartridge tape drives, and some other
+devices cannot be verified.
+
+ You can insure the accuracy of an archive by comparing files in the
+system with archive members. `tar' can compare an archive to the file
+system as the archive is being written, to verify a write operation, or
+can compare a previously written archive, to insure that it is up to
+date.
+
+ To check for discrepancies in an archive immediately after it is
+written, use the `--verify' (`-W') option in conjunction with the
+`--create' operation. When this option is specified, `tar' checks
+archive members against their counterparts in the file system, and
+reports discrepancies on the standard error.
+
+ To verify an archive, you must be able to read it from before the end
+of the last written entry. This option is useful for detecting data
+errors on some tapes. Archives written to pipes, some cartridge tape
+drives, and some other devices cannot be verified.
+
+ One can explicitly compare an already made archive with the file
+system by using the `--compare' (`--diff', `-d') option, instead of
+using the more automatic `--verify' option. *Note compare::.
+
+ Note that these two options have a slightly different intent. The
+`--compare' option checks how identical are the logical contents of some
+archive with what is on your disks, while the `--verify' option is
+really for checking if the physical contents agree and if the recording
+media itself is of dependable quality. So, for the `--verify'
+operation, `tar' tries to defeat all in-memory cache pertaining to the
+archive, while it lets the speed optimization undisturbed for the
+`--compare' option. If you nevertheless use `--compare' for media
+verification, you may have to defeat the in-memory cache yourself,
+maybe by opening and reclosing the door latch of your recording unit,
+forcing some doubt in your operating system about the fact this is
+really the same volume as the one just written or read.
+
+ The `--verify' option would not be necessary if drivers were indeed
+able to detect dependably all write failures. This sometimes require
+many magnetic heads, some able to read after the writes occurred. One
+would not say that drivers unable to detect all cases are necessarily
+flawed, as long as programming is concerned.
+
+ The `--verify' (`-W') option will not work in conjunction with the
+`--multi-volume' (`-M') option or the `--append' (`-r'), `--update'
+(`-u') and `--delete' operations. *Note Operations::, for more
+information on these operations.
+
+ Also, since `tar' normally strips leading `/' from file names (*note
+absolute::), a command like `tar --verify -cf /tmp/foo.tar /etc' will
+work as desired only if the working directory is `/', as `tar' uses the
+archive's relative member names (e.g., `etc/motd') when verifying the
+archive.
+
+
+File: tar.info, Node: Write Protection, Prev: verify, Up: Media
+
+9.9 Write Protection
+====================
+
+Almost all tapes and diskettes, and in a few rare cases, even disks can
+be "write protected", to protect data on them from being changed. Once
+an archive is written, you should write protect the media to prevent
+the archive from being accidentally overwritten or deleted. (This will
+protect the archive from being changed with a tape or floppy drive--it
+will not protect it from magnet fields or other physical hazards).
+
+ The write protection device itself is usually an integral part of the
+physical media, and can be a two position (write enabled/write
+disabled) switch, a notch which can be popped out or covered, a ring
+which can be removed from the center of a tape reel, or some other
+changeable feature.
+
+
+File: tar.info, Node: Changes, Next: Configuring Help Summary, Prev: Media, Up: Top
+
+Appendix A Changes
+******************
+
+This appendix lists some important user-visible changes between version
+GNU `tar' 1.17 and previous versions. An up-to-date version of this
+document is available at the GNU `tar' documentation page
+(http://www.gnu.org/software/tar/manual/changes.html).
+
+Use of globbing patterns when listing and extracting.
+ Previous versions of GNU tar assumed shell-style globbing when
+ extracting from or listing an archive. For example:
+
+ $ tar xf foo.tar '*.c'
+
+ would extract all files whose names end in `.c'. This behavior
+ was not documented and was incompatible with traditional tar
+ implementations. Therefore, starting from version 1.15.91, GNU tar
+ no longer uses globbing by default. For example, the above
+ invocation is now interpreted as a request to extract from the
+ archive the file named `*.c'.
+
+ To facilitate transition to the new behavior for those users who
+ got used to the previous incorrect one, `tar' will print a warning
+ if it finds out that a requested member was not found in the
+ archive and its name looks like a globbing pattern. For example:
+
+ $ tar xf foo.tar '*.c'
+ tar: Pattern matching characters used in file names. Please,
+ tar: use --wildcards to enable pattern matching, or --no-wildcards to
+ tar: suppress this warning.
+ tar: *.c: Not found in archive
+ tar: Error exit delayed from previous errors
+
+ To treat member names as globbing patterns, use -wildcards option.
+ If you want to tar to mimic the behavior of versions prior to
+ 1.15.91, add this option to your `TAR_OPTIONS' variable.
+
+ *Note wildcards::, for the detailed discussion of the use of
+ globbing patterns by GNU `tar'.
+
+Use of short option `-o'.
+ Earlier versions of GNU `tar' understood `-o' command line option
+ as a synonym for `--old-archive'.
+
+ GNU `tar' starting from version 1.13.90 understands this option as
+ a synonym for `--no-same-owner'. This is compatible with UNIX98
+ `tar' implementations.
+
+ However, to facilitate transition, `-o' option retains its old
+ semantics when it is used with one of archive-creation commands.
+ Users are encouraged to use `--format=oldgnu' instead.
+
+ It is especially important, since versions of GNU Automake up to
+ and including 1.8.4 invoke tar with this option to produce
+ distribution tarballs. *Note v7: Formats, for the detailed
+ discussion of this issue and its implications.
+
+ . *Note tar-v7: (automake)Options, for a description on how to
+ use various archive formats with `automake'.
+
+ Future versions of GNU `tar' will understand `-o' only as a
+ synonym for `--no-same-owner'.
+
+Use of short option `-l'
+ Earlier versions of GNU `tar' understood `-l' option as a synonym
+ for `--one-file-system'. Since such usage contradicted to UNIX98
+ specification and harmed compatibility with other implementation,
+ it was declared deprecated in version 1.14. However, to
+ facilitate transition to its new semantics, it was supported by
+ versions 1.15 and 1.15.90. The present use of `-l' as a short
+ variant of `--check-links' was introduced in version 1.15.91.
+
+Use of options `--portability' and `--old-archive'
+ These options are deprecated. Please use `--format=v7' instead.
+
+Use of option `--posix'
+ This option is deprecated. Please use `--format=posix' instead.
+
+
+File: tar.info, Node: Configuring Help Summary, Next: Tar Internals, Prev: Changes, Up: Top
+
+Appendix B Configuring Help Summary
+***********************************
+
+Running `tar --help' displays the short `tar' option summary (*note
+help::). This summary is organized by "groups" of semantically close
+options. The options within each group are printed in the following
+order: a short option, eventually followed by a list of corresponding
+long option names, followed by a short description of the option. For
+example, here is an excerpt from the actual `tar --help' output:
+
+
+ Main operation mode:
+
+ -A, --catenate, --concatenate append tar files to an archive
+ -c, --create create a new archive
+ -d, --diff, --compare find differences between archive and
+ file system
+ --delete delete from the archive
+
+ The exact visual representation of the help output is configurable
+via `ARGP_HELP_FMT' environment variable. The value of this variable is
+a comma-separated list of "format variable" assignments. There are two
+kinds of format variables. An "offset variable" keeps the offset of
+some part of help output text from the leftmost column on the screen. A
+"boolean" variable is a flag that toggles some output feature on or
+off. Depending on the type of the corresponding variable, there are two
+kinds of assignments:
+
+Offset assignment
+ The assignment to an offset variable has the following syntax:
+
+ VARIABLE=VALUE
+
+ where VARIABLE is the variable name, and VALUE is a numeric value
+ to be assigned to the variable.
+
+Boolean assignment
+ To assign `true' value to a variable, simply put this variable
+ name. To assign `false' value, prefix the variable name with
+ `no-'. For example:
+
+ # Assign `true' value:
+ dup-args
+ # Assign `false' value:
+ no-dup-args
+
+ Following variables are declared:
+
+ -- Help Output: boolean dup-args
+ If true, arguments for an option are shown with both short and long
+ options, even when a given option has both forms, for example:
+
+ -f ARCHIVE, --file=ARCHIVE use archive file or device ARCHIVE
+
+ If false, then if an option has both short and long forms, the
+ argument is only shown with the long one, for example:
+
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+
+ and a message indicating that the argument is applicable to both
+ forms is printed below the options. This message can be disabled
+ using `dup-args-note' (see below).
+
+ The default is false.
+
+ -- Help Output: boolean dup-args-note
+ If this variable is true, which is the default, the following
+ notice is displayed at the end of the help output:
+
+ Mandatory or optional arguments to long options are also
+ mandatory or optional for any corresponding short options.
+
+ Setting `no-dup-args-note' inhibits this message. Normally, only
+ one of variables `dup-args' or `dup-args-note' should be set.
+
+ -- Help Output: offset short-opt-col
+ Column in which short options start. Default is 2.
+
+ $ tar --help|grep ARCHIVE
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+ $ ARGP_HELP_FMT=short-opt-col=6 tar --help|grep ARCHIVE
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+
+ -- Help Output: offset long-opt-col
+ Column in which long options start. Default is 6. For example:
+
+ $ tar --help|grep ARCHIVE
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+ $ ARGP_HELP_FMT=long-opt-col=16 tar --help|grep ARCHIVE
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+
+ -- Help Output: offset doc-opt-col
+ Column in which "doc options" start. A doc option isn't actually
+ an option, but rather an arbitrary piece of documentation that is
+ displayed in much the same manner as the options. For example, in
+ the description of `--format' option:
+
+ -H, --format=FORMAT create archive of the given format.
+
+ FORMAT is one of the following:
+
+ gnu GNU tar 1.13.x format
+ oldgnu GNU format as per tar <= 1.12
+ pax POSIX 1003.1-2001 (pax) format
+ posix same as pax
+ ustar POSIX 1003.1-1988 (ustar) format
+ v7 old V7 tar format
+
+ the format names are doc options. Thus, if you set
+ `ARGP_HELP_FMT=doc-opt-col=6' the above part of the help output
+ will look as follows:
+
+ -H, --format=FORMAT create archive of the given format.
+
+ FORMAT is one of the following:
+
+ gnu GNU tar 1.13.x format
+ oldgnu GNU format as per tar <= 1.12
+ pax POSIX 1003.1-2001 (pax) format
+ posix same as pax
+ ustar POSIX 1003.1-1988 (ustar) format
+ v7 old V7 tar format
+
+ -- Help Output: offset opt-doc-col
+ Column in which option description starts. Default is 29.
+
+ $ tar --help|grep ARCHIVE
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+ $ ARGP_HELP_FMT=opt-doc-col=19 tar --help|grep ARCHIVE
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+ $ ARGP_HELP_FMT=opt-doc-col=9 tar --help|grep ARCHIVE
+ -f, --file=ARCHIVE
+ use archive file or device ARCHIVE
+
+ Notice, that the description starts on a separate line if
+ `opt-doc-col' value is too small.
+
+ -- Help Output: offset header-col
+ Column in which "group headers" are printed. A group header is a
+ descriptive text preceding an option group. For example, in the
+ following text:
+
+
+ Main operation mode:
+
+ -A, --catenate, --concatenate append tar files to
+ an archive
+ -c, --create create a new archive
+ `Main operation mode:' is the group header.
+
+ The default value is 1.
+
+ -- Help Output: offset usage-indent
+ Indentation of wrapped usage lines. Affects `--usage' output.
+ Default is 12.
+
+ -- Help Output: offset rmargin
+ Right margin of the text output. Used for wrapping.
+
+
+File: tar.info, Node: Tar Internals, Next: Genfile, Prev: Configuring Help Summary, Up: Top
+
+Appendix C Tar Internals
+************************
+
+* Menu:
+
+* Standard:: Basic Tar Format
+* Extensions:: GNU Extensions to the Archive Format
+* Sparse Formats:: Storing Sparse Files
+* Snapshot Files::
+* Dumpdir::
+
+
+File: tar.info, Node: Standard, Next: Extensions, Up: Tar Internals
+
+Basic Tar Format
+================
+
+ _(This message will disappear, once this node revised.)_
+
+While an archive may contain many files, the archive itself is a single
+ordinary file. Like any other file, an archive file can be written to
+a storage device such as a tape or disk, sent through a pipe or over a
+network, saved on the active file system, or even stored in another
+archive. An archive file is not easy to read or manipulate without
+using the `tar' utility or Tar mode in GNU Emacs.
+
+ Physically, an archive consists of a series of file entries
+terminated by an end-of-archive entry, which consists of two 512 blocks
+of zero bytes. A file entry usually describes one of the files in the
+archive (an "archive member"), and consists of a file header and the
+contents of the file. File headers contain file names and statistics,
+checksum information which `tar' uses to detect file corruption, and
+information about file types.
+
+ Archives are permitted to have more than one member with the same
+member name. One way this situation can occur is if more than one
+version of a file has been stored in the archive. For information
+about adding new versions of a file to an archive, see *note update::.
+
+ In addition to entries describing archive members, an archive may
+contain entries which `tar' itself uses to store information. *Note
+label::, for an example of such an archive entry.
+
+ A `tar' archive file contains a series of blocks. Each block
+contains `BLOCKSIZE' bytes. Although this format may be thought of as
+being on magnetic tape, other media are often used.
+
+ Each file archived is represented by a header block which describes
+the file, followed by zero or more blocks which give the contents of
+the file. At the end of the archive file there are two 512-byte blocks
+filled with binary zeros as an end-of-file marker. A reasonable system
+should write such end-of-file marker at the end of an archive, but must
+not assume that such a block exists when reading an archive. In
+particular GNU `tar' always issues a warning if it does not encounter
+it.
+
+ The blocks may be "blocked" for physical I/O operations. Each
+record of N blocks (where N is set by the `--blocking-factor=512-SIZE'
+(`-b 512-SIZE') option to `tar') is written with a single `write ()'
+operation. On magnetic tapes, the result of such a write is a single
+record. When writing an archive, the last record of blocks should be
+written at the full size, with blocks after the zero block containing
+all zeros. When reading an archive, a reasonable system should
+properly handle an archive whose last record is shorter than the rest,
+or which contains garbage records after a zero block.
+
+ The header block is defined in C as follows. In the GNU `tar'
+distribution, this is part of file `src/tar.h':
+
+
+ /* tar Header Block, from POSIX 1003.1-1990. */
+
+ /* POSIX header. */
+
+ struct posix_header
+ { /* byte offset */
+ char name[100]; /* 0 */
+ char mode[8]; /* 100 */
+ char uid[8]; /* 108 */
+ char gid[8]; /* 116 */
+ char size[12]; /* 124 */
+ char mtime[12]; /* 136 */
+ char chksum[8]; /* 148 */
+ char typeflag; /* 156 */
+ char linkname[100]; /* 157 */
+ char magic[6]; /* 257 */
+ char version[2]; /* 263 */
+ char uname[32]; /* 265 */
+ char gname[32]; /* 297 */
+ char devmajor[8]; /* 329 */
+ char devminor[8]; /* 337 */
+ char prefix[155]; /* 345 */
+ /* 500 */
+ };
+
+ #define TMAGIC "ustar" /* ustar and a null */
+ #define TMAGLEN 6
+ #define TVERSION "00" /* 00 and no null */
+ #define TVERSLEN 2
+
+ /* Values used in typeflag field. */
+ #define REGTYPE '0' /* regular file */
+ #define AREGTYPE '\0' /* regular file */
+ #define LNKTYPE '1' /* link */
+ #define SYMTYPE '2' /* reserved */
+ #define CHRTYPE '3' /* character special */
+ #define BLKTYPE '4' /* block special */
+ #define DIRTYPE '5' /* directory */
+ #define FIFOTYPE '6' /* FIFO special */
+ #define CONTTYPE '7' /* reserved */
+
+ #define XHDTYPE 'x' /* Extended header referring to the
+ next file in the archive */
+ #define XGLTYPE 'g' /* Global extended header */
+
+ /* Bits used in the mode field, values in octal. */
+ #define TSUID 04000 /* set UID on execution */
+ #define TSGID 02000 /* set GID on execution */
+ #define TSVTX 01000 /* reserved */
+ /* file permissions */
+ #define TUREAD 00400 /* read by owner */
+ #define TUWRITE 00200 /* write by owner */
+ #define TUEXEC 00100 /* execute/search by owner */
+ #define TGREAD 00040 /* read by group */
+ #define TGWRITE 00020 /* write by group */
+ #define TGEXEC 00010 /* execute/search by group */
+ #define TOREAD 00004 /* read by other */
+ #define TOWRITE 00002 /* write by other */
+ #define TOEXEC 00001 /* execute/search by other */
+
+ /* tar Header Block, GNU extensions. */
+
+ /* In GNU tar, SYMTYPE is for to symbolic links, and CONTTYPE is for
+ contiguous files, so maybe disobeying the `reserved' comment in POSIX
+ header description. I suspect these were meant to be used this way, and
+ should not have really been `reserved' in the published standards. */
+
+ /* *BEWARE* *BEWARE* *BEWARE* that the following information is still
+ boiling, and may change. Even if the OLDGNU format description should be
+ accurate, the so-called GNU format is not yet fully decided. It is
+ surely meant to use only extensions allowed by POSIX, but the sketch
+ below repeats some ugliness from the OLDGNU format, which should rather
+ go away. Sparse files should be saved in such a way that they do *not*
+ require two passes at archive creation time. Huge files get some POSIX
+ fields to overflow, alternate solutions have to be sought for this. */
+
+ /* Descriptor for a single file hole. */
+
+ struct sparse
+ { /* byte offset */
+ char offset[12]; /* 0 */
+ char numbytes[12]; /* 12 */
+ /* 24 */
+ };
+
+ /* Sparse files are not supported in POSIX ustar format. For sparse files
+ with a POSIX header, a GNU extra header is provided which holds overall
+ sparse information and a few sparse descriptors. When an old GNU header
+ replaces both the POSIX header and the GNU extra header, it holds some
+ sparse descriptors too. Whether POSIX or not, if more sparse descriptors
+ are still needed, they are put into as many successive sparse headers as
+ necessary. The following constants tell how many sparse descriptors fit
+ in each kind of header able to hold them. */
+
+ #define SPARSES_IN_EXTRA_HEADER 16
+ #define SPARSES_IN_OLDGNU_HEADER 4
+ #define SPARSES_IN_SPARSE_HEADER 21
+
+ /* Extension header for sparse files, used immediately after the GNU extra
+ header, and used only if all sparse information cannot fit into that
+ extra header. There might even be many such extension headers, one after
+ the other, until all sparse information has been recorded. */
+
+ struct sparse_header
+ { /* byte offset */
+ struct sparse sp[SPARSES_IN_SPARSE_HEADER];
+ /* 0 */
+ char isextended; /* 504 */
+ /* 505 */
+ };
+
+ /* The old GNU format header conflicts with POSIX format in such a way that
+ POSIX archives may fool old GNU tar's, and POSIX tar's might well be
+ fooled by old GNU tar archives. An old GNU format header uses the space
+ used by the prefix field in a POSIX header, and cumulates information
+ normally found in a GNU extra header. With an old GNU tar header, we
+ never see any POSIX header nor GNU extra header. Supplementary sparse
+ headers are allowed, however. */
+
+ struct oldgnu_header
+ { /* byte offset */
+ char unused_pad1[345]; /* 0 */
+ char atime[12]; /* 345 Incr. archive: atime of the file */
+ char ctime[12]; /* 357 Incr. archive: ctime of the file */
+ char offset[12]; /* 369 Multivolume archive: the offset of
+ the start of this volume */
+ char longnames[4]; /* 381 Not used */
+ char unused_pad2; /* 385 */
+ struct sparse sp[SPARSES_IN_OLDGNU_HEADER];
+ /* 386 */
+ char isextended; /* 482 Sparse file: Extension sparse header
+ follows */
+ char realsize[12]; /* 483 Sparse file: Real size*/
+ /* 495 */
+ };
+
+ /* OLDGNU_MAGIC uses both magic and version fields, which are contiguous.
+ Found in an archive, it indicates an old GNU header format, which will be
+ hopefully become obsolescent. With OLDGNU_MAGIC, uname and gname are
+ valid, though the header is not truly POSIX conforming. */
+ #define OLDGNU_MAGIC "ustar " /* 7 chars and a null */
+
+ /* The standards committee allows only capital A through capital Z for
+ user-defined expansion. Other letters in use include:
+
+ 'A' Solaris Access Control List
+ 'E' Solaris Extended Attribute File
+ 'I' Inode only, as in 'star'
+ 'N' Obsolete GNU tar, for file names that do not fit into the main header.
+ 'X' POSIX 1003.1-2001 eXtended (VU version) */
+
+ /* This is a dir entry that contains the names of files that were in the
+ dir at the time the dump was made. */
+ #define GNUTYPE_DUMPDIR 'D'
+
+ /* Identifies the *next* file on the tape as having a long linkname. */
+ #define GNUTYPE_LONGLINK 'K'
+
+ /* Identifies the *next* file on the tape as having a long name. */
+ #define GNUTYPE_LONGNAME 'L'
+
+ /* This is the continuation of a file that began on another volume. */
+ #define GNUTYPE_MULTIVOL 'M'
+
+ /* This is for sparse files. */
+ #define GNUTYPE_SPARSE 'S'
+
+ /* This file is a tape/volume header. Ignore it on extraction. */
+ #define GNUTYPE_VOLHDR 'V'
+
+ /* Solaris extended header */
+ #define SOLARIS_XHDTYPE 'X'
+
+ /* Jo"rg Schilling star header */
+
+ struct star_header
+ { /* byte offset */
+ char name[100]; /* 0 */
+ char mode[8]; /* 100 */
+ char uid[8]; /* 108 */
+ char gid[8]; /* 116 */
+ char size[12]; /* 124 */
+ char mtime[12]; /* 136 */
+ char chksum[8]; /* 148 */
+ char typeflag; /* 156 */
+ char linkname[100]; /* 157 */
+ char magic[6]; /* 257 */
+ char version[2]; /* 263 */
+ char uname[32]; /* 265 */
+ char gname[32]; /* 297 */
+ char devmajor[8]; /* 329 */
+ char devminor[8]; /* 337 */
+ char prefix[131]; /* 345 */
+ char atime[12]; /* 476 */
+ char ctime[12]; /* 488 */
+ /* 500 */
+ };
+
+ #define SPARSES_IN_STAR_HEADER 4
+ #define SPARSES_IN_STAR_EXT_HEADER 21
+
+ struct star_in_header
+ {
+ char fill[345]; /* 0 Everything that is before t_prefix */
+ char prefix[1]; /* 345 t_name prefix */
+ char fill2; /* 346 */
+ char fill3[8]; /* 347 */
+ char isextended; /* 355 */
+ struct sparse sp[SPARSES_IN_STAR_HEADER]; /* 356 */
+ char realsize[12]; /* 452 Actual size of the file */
+ char offset[12]; /* 464 Offset of multivolume contents */
+ char atime[12]; /* 476 */
+ char ctime[12]; /* 488 */
+ char mfill[8]; /* 500 */
+ char xmagic[4]; /* 508 "tar" */
+ };
+
+ struct star_ext_header
+ {
+ struct sparse sp[SPARSES_IN_STAR_EXT_HEADER];
+ char isextended;
+ };
+
+ All characters in header blocks are represented by using 8-bit
+characters in the local variant of ASCII. Each field within the
+structure is contiguous; that is, there is no padding used within the
+structure. Each character on the archive medium is stored contiguously.
+
+ Bytes representing the contents of files (after the header block of
+each file) are not translated in any way and are not constrained to
+represent characters in any character set. The `tar' format does not
+distinguish text files from binary files, and no translation of file
+contents is performed.
+
+ The `name', `linkname', `magic', `uname', and `gname' are
+null-terminated character strings. All other fields are zero-filled
+octal numbers in ASCII. Each numeric field of width W contains W minus
+1 digits, and a null.
+
+ The `name' field is the file name of the file, with directory names
+(if any) preceding the file name, separated by slashes.
+
+ The `mode' field provides nine bits specifying file permissions and
+three bits to specify the Set UID, Set GID, and Save Text ("sticky")
+modes. Values for these bits are defined above. When special
+permissions are required to create a file with a given mode, and the
+user restoring files from the archive does not hold such permissions,
+the mode bit(s) specifying those special permissions are ignored.
+Modes which are not supported by the operating system restoring files
+from the archive will be ignored. Unsupported modes should be faked up
+when creating or updating an archive; e.g., the group permission could
+be copied from the _other_ permission.
+
+ The `uid' and `gid' fields are the numeric user and group ID of the
+file owners, respectively. If the operating system does not support
+numeric user or group IDs, these fields should be ignored.
+
+ The `size' field is the size of the file in bytes; linked files are
+archived with this field specified as zero.
+
+ The `mtime' field is the data modification time of the file at the
+time it was archived. It is the ASCII representation of the octal
+value of the last time the file's contents were modified, represented
+as an integer number of seconds since January 1, 1970, 00:00
+Coordinated Universal Time.
+
+ The `chksum' field is the ASCII representation of the octal value of
+the simple sum of all bytes in the header block. Each 8-bit byte in
+the header is added to an unsigned integer, initialized to zero, the
+precision of which shall be no less than seventeen bits. When
+calculating the checksum, the `chksum' field is treated as if it were
+all blanks.
+
+ The `typeflag' field specifies the type of file archived. If a
+particular implementation does not recognize or permit the specified
+type, the file will be extracted as if it were a regular file. As this
+action occurs, `tar' issues a warning to the standard error.
+
+ The `atime' and `ctime' fields are used in making incremental
+backups; they store, respectively, the particular file's access and
+status change times.
+
+ The `offset' is used by the `--multi-volume' (`-M') option, when
+making a multi-volume archive. The offset is number of bytes into the
+file that we need to restart at to continue the file on the next tape,
+i.e., where we store the location that a continued file is continued at.
+
+ The following fields were added to deal with sparse files. A file
+is "sparse" if it takes in unallocated blocks which end up being
+represented as zeros, i.e., no useful data. A test to see if a file is
+sparse is to look at the number blocks allocated for it versus the
+number of characters in the file; if there are fewer blocks allocated
+for the file than would normally be allocated for a file of that size,
+then the file is sparse. This is the method `tar' uses to detect a
+sparse file, and once such a file is detected, it is treated
+differently from non-sparse files.
+
+ Sparse files are often `dbm' files, or other database-type files
+which have data at some points and emptiness in the greater part of the
+file. Such files can appear to be very large when an `ls -l' is done
+on them, when in truth, there may be a very small amount of important
+data contained in the file. It is thus undesirable to have `tar' think
+that it must back up this entire file, as great quantities of room are
+wasted on empty blocks, which can lead to running out of room on a tape
+far earlier than is necessary. Thus, sparse files are dealt with so
+that these empty blocks are not written to the tape. Instead, what is
+written to the tape is a description, of sorts, of the sparse file:
+where the holes are, how big the holes are, and how much data is found
+at the end of the hole. This way, the file takes up potentially far
+less room on the tape, and when the file is extracted later on, it will
+look exactly the way it looked beforehand. The following is a
+description of the fields used to handle a sparse file:
+
+ The `sp' is an array of `struct sparse'. Each `struct sparse'
+contains two 12-character strings which represent an offset into the
+file and a number of bytes to be written at that offset. The offset is
+absolute, and not relative to the offset in preceding array element.
+
+ The header can hold four of these `struct sparse' at the moment; if
+more are needed, they are not stored in the header.
+
+ The `isextended' flag is set when an `extended_header' is needed to
+deal with a file. Note that this means that this flag can only be set
+when dealing with a sparse file, and it is only set in the event that
+the description of the file will not fit in the allotted room for
+sparse structures in the header. In other words, an extended_header is
+needed.
+
+ The `extended_header' structure is used for sparse files which need
+more sparse structures than can fit in the header. The header can fit
+4 such structures; if more are needed, the flag `isextended' gets set
+and the next block is an `extended_header'.
+
+ Each `extended_header' structure contains an array of 21 sparse
+structures, along with a similar `isextended' flag that the header had.
+There can be an indeterminate number of such `extended_header's to
+describe a sparse file.
+
+`REGTYPE'
+`AREGTYPE'
+ These flags represent a regular file. In order to be compatible
+ with older versions of `tar', a `typeflag' value of `AREGTYPE'
+ should be silently recognized as a regular file. New archives
+ should be created using `REGTYPE'. Also, for backward
+ compatibility, `tar' treats a regular file whose name ends with a
+ slash as a directory.
+
+`LNKTYPE'
+ This flag represents a file linked to another file, of any type,
+ previously archived. Such files are identified in Unix by each
+ file having the same device and inode number. The linked-to name
+ is specified in the `linkname' field with a trailing null.
+
+`SYMTYPE'
+ This represents a symbolic link to another file. The linked-to
+ name is specified in the `linkname' field with a trailing null.
+
+`CHRTYPE'
+`BLKTYPE'
+ These represent character special files and block special files
+ respectively. In this case the `devmajor' and `devminor' fields
+ will contain the major and minor device numbers respectively.
+ Operating systems may map the device specifications to their own
+ local specification, or may ignore the entry.
+
+`DIRTYPE'
+ This flag specifies a directory or sub-directory. The directory
+ name in the `name' field should end with a slash. On systems where
+ disk allocation is performed on a directory basis, the `size' field
+ will contain the maximum number of bytes (which may be rounded to
+ the nearest disk block allocation unit) which the directory may
+ hold. A `size' field of zero indicates no such limiting. Systems
+ which do not support limiting in this manner should ignore the
+ `size' field.
+
+`FIFOTYPE'
+ This specifies a FIFO special file. Note that the archiving of a
+ FIFO file archives the existence of this file and not its contents.
+
+`CONTTYPE'
+ This specifies a contiguous file, which is the same as a normal
+ file except that, in operating systems which support it, all its
+ space is allocated contiguously on the disk. Operating systems
+ which do not allow contiguous allocation should silently treat this
+ type as a normal file.
+
+`A' ... `Z'
+ These are reserved for custom implementations. Some of these are
+ used in the GNU modified format, as described below.
+
+
+ Other values are reserved for specification in future revisions of
+the P1003 standard, and should not be used by any `tar' program.
+
+ The `magic' field indicates that this archive was output in the
+P1003 archive format. If this field contains `TMAGIC', the `uname' and
+`gname' fields will contain the ASCII representation of the owner and
+group of the file respectively. If found, the user and group IDs are
+used rather than the values in the `uid' and `gid' fields.
+
+ For references, see ISO/IEC 9945-1:1990 or IEEE Std 1003.1-1990,
+pages 169-173 (section 10.1) for `Archive/Interchange File Format'; and
+IEEE Std 1003.2-1992, pages 380-388 (section 4.48) and pages 936-940
+(section E.4.48) for `pax - Portable archive interchange'.
+
+
+File: tar.info, Node: Extensions, Next: Sparse Formats, Prev: Standard, Up: Tar Internals
+
+GNU Extensions to the Archive Format
+====================================
+
+ _(This message will disappear, once this node revised.)_
+
+The GNU format uses additional file types to describe new types of
+files in an archive. These are listed below.
+
+`GNUTYPE_DUMPDIR'
+`'D''
+ This represents a directory and a list of files created by the
+ `--incremental' (`-G') option. The `size' field gives the total
+ size of the associated list of files. Each file name is preceded
+ by either a `Y' (the file should be in this archive) or an `N'.
+ (The file is a directory, or is not stored in the archive.) Each
+ file name is terminated by a null. There is an additional null
+ after the last file name.
+
+`GNUTYPE_MULTIVOL'
+`'M''
+ This represents a file continued from another volume of a
+ multi-volume archive created with the `--multi-volume' (`-M')
+ option. The original type of the file is not given here. The
+ `size' field gives the maximum size of this piece of the file
+ (assuming the volume does not end before the file is written out).
+ The `offset' field gives the offset from the beginning of the
+ file where this part of the file begins. Thus `size' plus
+ `offset' should equal the original size of the file.
+
+`GNUTYPE_SPARSE'
+`'S''
+ This flag indicates that we are dealing with a sparse file. Note
+ that archiving a sparse file requires special operations to find
+ holes in the file, which mark the positions of these holes, along
+ with the number of bytes of data to be found after the hole.
+
+`GNUTYPE_VOLHDR'
+`'V''
+ This file type is used to mark the volume header that was given
+ with the `--label=ARCHIVE-LABEL' (`-V ARCHIVE-LABEL') option when
+ the archive was created. The `name' field contains the `name'
+ given after the `--label=ARCHIVE-LABEL' (`-V ARCHIVE-LABEL')
+ option. The `size' field is zero. Only the first file in each
+ volume of an archive should have this type.
+
+
+ You may have trouble reading a GNU format archive on a non-GNU
+system if the options `--incremental' (`-G'), `--multi-volume' (`-M'),
+`--sparse' (`-S'), or `--label=ARCHIVE-LABEL' (`-V ARCHIVE-LABEL') were
+used when writing the archive. In general, if `tar' does not use the
+GNU-added fields of the header, other versions of `tar' should be able
+to read the archive. Otherwise, the `tar' program will give an error,
+the most likely one being a checksum error.
+
+
+File: tar.info, Node: Sparse Formats, Next: Snapshot Files, Prev: Extensions, Up: Tar Internals
+
+Storing Sparse Files
+====================
+
+The notion of sparse file, and the ways of handling it from the point
+of view of GNU `tar' user have been described in detail in *note
+sparse::. This chapter describes the internal format GNU `tar' uses to
+store such files.
+
+ The support for sparse files in GNU `tar' has a long history. The
+earliest version featuring this support that I was able to find was
+1.09, released in November, 1990. The format introduced back then is
+called "old GNU" sparse format and in spite of the fact that its design
+contained many flaws, it was the only format GNU `tar' supported until
+version 1.14 (May, 2004), which introduced initial support for sparse
+archives in PAX archives (*note posix::). This format was not free
+from design flows, either and it was subsequently improved in versions
+1.15.2 (November, 2005) and 1.15.92 (June, 2006).
+
+ In addition to GNU sparse format, GNU `tar' is able to read and
+extract sparse files archived by `star'.
+
+ The following subsections describe each format in detail.
+
+* Menu:
+
+* Old GNU Format::
+* PAX 0:: PAX Format, Versions 0.0 and 0.1
+* PAX 1:: PAX Format, Version 1.0
+
+
+File: tar.info, Node: Old GNU Format, Next: PAX 0, Up: Sparse Formats
+
+C.0.1 Old GNU Format
+--------------------
+
+The format introduced some time around 1990 (v. 1.09). It was designed
+on top of standard `ustar' headers in such an unfortunate way that some
+of its fields overwrote fields required by POSIX.
+
+ An old GNU sparse header is designated by type `S'
+(`GNUTYPE_SPARSE') and has the following layout:
+
+Offset Size Name Data type Contents
+----------------------------------------------------------------------------
+0 345 N/A Not used.
+345 12 atime Number `atime' of the file.
+357 12 ctime Number `ctime' of the file .
+369 12 offset Number For multivolume archives:
+ the offset of the start of
+ this volume.
+381 4 N/A Not used.
+385 1 N/A Not used.
+386 96 sp `sparse_header'(4 entries) File map.
+482 1 isextended Bool `1' if an extension sparse
+ header follows, `0'
+ otherwise.
+483 12 realsize Number Real size of the file.
+
+ Each of `sparse_header' object at offset 386 describes a single data
+chunk. It has the following structure:
+
+Offset Size Data type Contents
+---------------------------------------------------------------------------
+0 12 Number Offset of the beginning of the chunk.
+12 12 Number Size of the chunk.
+
+ If the member contains more than four chunks, the `isextended' field
+of the header has the value `1' and the main header is followed by one
+or more "extension headers". Each such header has the following
+structure:
+
+Offset Size Name Data type Contents
+----------------------------------------------------------------------------
+0 21 sp `sparse_header' (21 entires) File map.
+504 1 isextended Bool `1' if an extension sparse
+ header follows, or `0'
+ otherwise.
+
+ A header with `isextended=0' ends the map.
+
+
+File: tar.info, Node: PAX 0, Next: PAX 1, Prev: Old GNU Format, Up: Sparse Formats
+
+C.0.2 PAX Format, Versions 0.0 and 0.1
+--------------------------------------
+
+There are two formats available in this branch. The version `0.0' is
+the initial version of sparse format used by `tar' versions
+1.14-1.15.1. The sparse file map is kept in extended (`x') PAX header
+variables:
+
+`GNU.sparse.size'
+ Real size of the stored file
+
+`GNU.sparse.numblocks'
+ Number of blocks in the sparse map
+
+`GNU.sparse.offset'
+ Offset of the data block
+
+`GNU.sparse.numbytes'
+ Size of the data block
+
+ The latter two variables repeat for each data block, so the overall
+structure is like this:
+
+ GNU.sparse.size=SIZE
+ GNU.sparse.numblocks=NUMBLOCKS
+ repeat NUMBLOCKS times
+ GNU.sparse.offset=OFFSET
+ GNU.sparse.numbytes=NUMBYTES
+ end repeat
+
+ This format presented the following two problems:
+
+ 1. Whereas the POSIX specification allows a variable to appear
+ multiple times in a header, it requires that only the last
+ occurrence be meaningful. Thus, multiple occurrences of
+ `GNU.sparse.offset' and `GNU.sparse.numbytes' are conflicting with
+ the POSIX specs.
+
+ 2. Attempting to extract such archives using a third-party `tar's
+ results in extraction of sparse files in _compressed form_. If
+ the `tar' implementation in question does not support POSIX
+ format, it will also extract a file containing extension header
+ attributes. This file can be used to expand the file to its
+ original state. However, posix-aware `tar's will usually ignore
+ the unknown variables, which makes restoring the file more
+ difficult. *Note Extraction of sparse members in v.0.0 format:
+ extracting sparse v.0.x, for the detailed description of how to
+ restore such members using non-GNU `tar's.
+
+ GNU `tar' 1.15.2 introduced sparse format version `0.1', which
+attempted to solve these problems. As its predecessor, this format
+stores sparse map in the extended POSIX header. It retains
+`GNU.sparse.size' and `GNU.sparse.numblocks' variables, but instead of
+`GNU.sparse.offset'/`GNU.sparse.numbytes' pairs it uses a single
+variable:
+
+`GNU.sparse.map'
+ Map of non-null data chunks. It is a string consisting of
+ comma-separated values "OFFSET,SIZE[,OFFSET-1,SIZE-1...]"
+
+ To address the 2nd problem, the `name' field in `ustar' is replaced
+with a special name, constructed using the following pattern:
+
+ %d/GNUSparseFile.%p/%f
+
+ The real name of the sparse file is stored in the variable
+`GNU.sparse.name'. Thus, those `tar' implementations that are not
+aware of GNU extensions will at least extract the files into separate
+directories, giving the user a possibility to expand it afterwards.
+*Note Extraction of sparse members in v.0.1 format: extracting sparse
+v.0.x, for the detailed description of how to restore such members
+using non-GNU `tar's.
+
+ The resulting `GNU.sparse.map' string can be _very_ long. Although
+POSIX does not impose any limit on the length of a `x' header variable,
+this possibly can confuse some tars.
+
+
+File: tar.info, Node: PAX 1, Prev: PAX 0, Up: Sparse Formats
+
+C.0.3 PAX Format, Version 1.0
+-----------------------------
+
+The version `1.0' of sparse format was introduced with GNU `tar'
+1.15.92. Its main objective was to make the resulting file extractable
+with little effort even by non-posix aware `tar' implementations.
+Starting from this version, the extended header preceding a sparse
+member always contains the following variables that identify the format
+being used:
+
+`GNU.sparse.major'
+ Major version
+
+`GNU.sparse.minor'
+ Minor version
+
+ The `name' field in `ustar' header contains a special name,
+constructed using the following pattern:
+
+ %d/GNUSparseFile.%p/%f
+
+ The real name of the sparse file is stored in the variable
+`GNU.sparse.name'. The real size of the file is stored in the variable
+`GNU.sparse.realsize'.
+
+ The sparse map itself is stored in the file data block, preceding
+the actual file data. It consists of a series of octal numbers of
+arbitrary length, delimited by newlines. The map is padded with nulls
+to the nearest block boundary.
+
+ The first number gives the number of entries in the map. Following
+are map entries, each one consisting of two numbers giving the offset
+and size of the data block it describes.
+
+ The format is designed in such a way that non-posix aware tars and
+tars not supporting `GNU.sparse.*' keywords will extract each sparse
+file in its condensed form with the file map prepended and will place it
+into a separate directory. Then, using a simple program it would be
+possible to expand the file to its original form even without GNU `tar'.
+*Note Sparse Recovery::, for the detailed information on how to extract
+sparse members without GNU `tar'.
+
+
+File: tar.info, Node: Snapshot Files, Next: Dumpdir, Prev: Sparse Formats, Up: Tar Internals
+
+Format of the Incremental Snapshot Files
+========================================
+
+A "snapshot file" (or "directory file") is created during incremental
+backups (*note Incremental Dumps::). It contains the status of the
+file system at the time of the dump and is used to determine which
+files were modified since the last backup.
+
+ GNU `tar' version 1.17 supports two snapshot file formats. The
+first format, called "format 0", is the one used by GNU `tar' versions
+up to 1.15.1. The second format, called "format 1" is an extended
+version of this format, that contains more metadata and allows for
+further extensions.
+
+ `Format 0' snapshot file begins with a line containing a decimal
+number that represents the UNIX timestamp of the beginning of the last
+archivation. This line is followed by directory metadata descriptions,
+one per line. Each description has the following format:
+
+ [NFS]DEV INODE NAME
+
+where optional NFS is a single plus character (`+') if this directory
+is located on an NFS-mounted partition, DEV and INODE are the device
+and inode numbers of the directory, and NAME is the directory name.
+
+ `Format 1' snapshot file begins with a line specifying the format of
+the file. This line has the following structure:
+
+ `GNU tar-'TAR-VERSION`-'INCR-FORMAT-VERSION
+
+where TAR-VERSION is the version of GNU `tar' implementation that
+created this snapshot, and INCR-FORMAT-VERSION is the version number of
+the snapshot format (in this case `1').
+
+ The following line contains two decimal numbers, representing the
+time of the last backup. First number is the number of seconds, the
+second one is the number of nanoseconds, since the beginning of the
+epoch.
+
+ Following lines contain directory metadata, one line per directory.
+The line format is:
+
+ [NFS]MTIME-SEC MTIME-NSEC DEV INODE NAME
+
+where MTIME-SEC and MTIME-NSEC represent the last modification time of
+this directory with nanosecond precision; NFS, DEV, INODE and NAME have
+the same meaning as with `format 0'.
+
+
+File: tar.info, Node: Dumpdir, Prev: Snapshot Files, Up: Tar Internals
+
+Dumpdir
+=======
+
+Incremental archives keep information about contents of each dumped
+directory in special data blocks called "dumpdirs".
+
+ Dumpdir is a sequence of entries of the following form:
+
+ C FILENAME \0
+
+where C is one of the "control codes" described below, FILENAME is the
+name of the file C operates upon, and `\0' represents a nul character
+(ASCII 0). The white space characters were added for readability, real
+dumpdirs do not contain them.
+
+ Each dumpdir ends with a single nul character.
+
+ The following table describes control codes and their meanings:
+
+`Y'
+ FILENAME is contained in the archive.
+
+`N'
+ FILENAME was present in the directory at the time the archive was
+ made, yet it was not dumped to the archive, because it had not
+ changed since the last backup.
+
+`D'
+ FILENAME is a directory.
+
+`R'
+ This code requests renaming of the FILENAME to the name specified
+ with the following `T' command.
+
+`T'
+ Specify target file name for `R' command (see below).
+
+`X'
+ Specify "temporary directory" name for a rename operation (see
+ below).
+
+ Codes `Y', `N' and `D' require FILENAME argument to be a relative
+file name to the directory this dumpdir describes, whereas codes `R',
+`T' and `X' require their argument to be an absolute file name.
+
+ The three codes `R', `T' and `X' specify a "renaming operation". In
+the simplest case it is:
+
+ R`source'\0T`dest'\0
+
+which means "rename file `source' to file `dest'".
+
+ However, there are cases that require using a "temporary directory".
+For example, consider the following scenario:
+
+ 1. Previous run dumped a directory `foo' which contained the
+ following three directories:
+
+ a
+ b
+ c
+
+ 2. They were renamed _cyclically_, so that:
+
+ `a' became `b'
+ `b' became `c'
+ `c' became `a'
+
+ 3. New incremental dump was made.
+
+ This case cannot be handled by three successive renames, since
+renaming `a' to `b' will destroy existing directory. To handle such
+case a temporary directory is required. GNU `tar' will create the
+following dumpdir (newlines have been added for readability):
+
+ Xfoo\0
+ Rfoo/a\0T\0
+ Rfoo/b\0Tfoo/c\0
+ Rfoo/c\0Tfoo/a\0
+ R\0Tfoo/a\0
+
+ The first command, `Xfoo\0', instructs the extractor to create a
+temporary directory in the directory `foo'. Second command,
+`Rfoo/aT\0', says "rename file `foo/a' to the temporary directory that
+has just been created" (empty file name after a command means use
+temporary directory). Third and fourth commands work as usual, and,
+finally, the last command, `R\0Tfoo/a\0' tells tar to rename the
+temporary directory to `foo/a'.
+
+ The exact placement of a dumpdir in the archive depends on the
+archive format (*note Formats::):
+
+ * PAX archives
+
+ In PAX archives, dumpdir is stored in the extended header of the
+ corresponding directory, in variable `GNU.dumpdir'.
+
+ * GNU and old GNU archives
+
+ These formats implement special header type `D', which is similar
+ to ustar header `5' (directory), except that it precedes a data
+ block containing the dumpdir.
+
+
+File: tar.info, Node: Genfile, Next: Free Software Needs Free Documentation, Prev: Tar Internals, Up: Top
+
+Appendix D Genfile
+******************
+
+This appendix describes `genfile', an auxiliary program used in the GNU
+tar testsuite. If you are not interested in developing GNU tar, skip
+this appendix.
+
+ Initially, `genfile' was used to generate data files for the
+testsuite, hence its name. However, new operation modes were being
+implemented as the testsuite grew more sophisticated, and now `genfile'
+is a multi-purpose instrument.
+
+ There are three basic operation modes:
+
+File Generation
+ This is the default mode. In this mode, `genfile' generates data
+ files.
+
+File Status
+ In this mode `genfile' displays status of specified files.
+
+Synchronous Execution.
+ In this mode `genfile' executes the given program with
+ `--checkpoint' option and executes a set of actions when specified
+ checkpoints are reached.
+
+* Menu:
+
+* Generate Mode:: File Generation Mode.
+* Status Mode:: File Status Mode.
+* Exec Mode:: Synchronous Execution mode.
+
+
+File: tar.info, Node: Generate Mode, Next: Status Mode, Up: Genfile
+
+D.1 Generate Mode
+=================
+
+In this mode `genfile' creates a data file for the test suite. The size
+of the file is given with the `--length' (`-l') option. By default the
+file contents is written to the standard output, this can be changed
+using `--file' (`-f') command line option. Thus, the following two
+commands are equivalent:
+
+ genfile --length 100 > outfile
+ genfile --length 100 --file outfile
+
+ If `--length' is not given, `genfile' will generate an empty
+(zero-length) file.
+
+ The command line option `--seek=N' istructs `genfile' to skip the
+given number of bytes (N) in the output file before writing to it. It
+is similar to the `seek=N' of the `dd' utility.
+
+ You can instruct `genfile' to create several files at one go, by
+giving it `--files-from' (`-T') option followed by a name of file
+containing a list of file names. Using dash (`-') instead of the file
+name causes `genfile' to read file list from the standard input. For
+example:
+
+ # Read file names from file `file.list'
+ genfile --files-from file.list
+ # Read file names from standard input
+ genfile --files-from -
+
+ The list file is supposed to contain one file name per line. To use
+file lists separated by ASCII NUL character, use `--null' (`-0')
+command line option:
+
+ genfile --null --files-from file.list
+
+ The default data pattern for filling the generated file consists of
+first 256 letters of ASCII code, repeated enough times to fill the
+entire file. This behavior can be changed with `--pattern' option. This
+option takes a mandatory argument, specifying pattern name to use.
+Currently two patterns are implemented:
+
+`--pattern=default'
+ The default pattern as described above.
+
+`--pattern=zero'
+ Fills the file with zeroes.
+
+ If no file name was given, the program exits with the code `0'.
+Otherwise, it exits with `0' only if it was able to create a file of
+the specified length.
+
+ Special option `--sparse' (`-s') instructs `genfile' to create a
+sparse file. Sparse files consist of "data fragments", separated by
+"holes" or blocks of zeros. On many operating systems, actual disk
+storage is not allocated for holes, but they are counted in the length
+of the file. To create a sparse file, `genfile' should know where to
+put data fragments, and what data to use to fill them. So, when
+`--sparse' is given the rest of the command line specifies a so-called
+"file map".
+
+ The file map consists of any number of "fragment descriptors". Each
+descriptor is composed of two values: a number, specifying fragment
+offset from the end of the previous fragment or, for the very first
+fragment, from the beginning of the file, and "contents string", i.e.,
+a string of characters, specifying the pattern to fill the fragment
+with. File offset can be suffixed with the following quantifiers:
+
+`k'
+`K'
+ The number is expressed in kilobytes.
+
+`m'
+`M'
+ The number is expressed in megabytes.
+
+`g'
+`G'
+ The number is expressed in gigabytes.
+
+ For each letter in contents string `genfile' will generate a "block"
+of data, filled with this letter and will write it to the fragment. The
+size of block is given by `--block-size' option. It defaults to 512.
+Thus, if the string consists of N characters, the resulting file
+fragment will contain `N*BLOCK-SIZE' of data.
+
+ Last fragment descriptor can have only file offset part. In this
+case `genfile' will create a hole at the end of the file up to the
+given offset.
+
+ For example, consider the following invocation:
+
+ genfile --sparse --file sparsefile 0 ABCD 1M EFGHI 2000K
+
+It will create 3101184-bytes long file of the following structure:
+
+Offset Length Contents
+0 4*512=2048 Four 512-byte blocks, filled
+ with letters `A', `B', `C' and
+ `D'.
+2048 1046528 Zero bytes
+1050624 5*512=2560 Five blocks, filled with letters
+ `E', `F', `G', `H', `I'.
+1053184 2048000 Zero bytes
+
+ The exit code of `genfile --status' command is `0' only if created
+file is actually sparse.
+
+
+File: tar.info, Node: Status Mode, Next: Exec Mode, Prev: Generate Mode, Up: Genfile
+
+D.2 Status Mode
+===============
+
+In status mode, `genfile' prints file system status for each file
+specified in the command line. This mode is toggled by `--stat' (`-S')
+command line option. An optional argument to this option specifies
+output "format": a comma-separated list of `struct stat' fields to be
+displayed. This list can contain following identifiers :
+
+name
+ The file name.
+
+dev
+st_dev
+ Device number in decimal.
+
+ino
+st_ino
+ Inode number.
+
+mode[.NUMBER]
+st_mode[.NUMBER]
+ File mode in octal. Optional NUMBER specifies octal mask to be
+ applied to the mode before outputting. For example, `--stat
+ mode.777' will preserve lower nine bits of it. Notice, that you
+ can use any punctuation character in place of `.'.
+
+nlink
+st_nlink
+ Number of hard links.
+
+uid
+st_uid
+ User ID of owner.
+
+gid
+st_gid
+ Group ID of owner.
+
+size
+st_size
+ File size in decimal.
+
+blksize
+st_blksize
+ The size in bytes of each file block.
+
+blocks
+st_blocks
+ Number of blocks allocated.
+
+atime
+st_atime
+ Time of last access.
+
+mtime
+st_mtime
+ Time of last modification
+
+ctime
+st_ctime
+ Time of last status change
+
+sparse
+ A boolean value indicating whether the file is `sparse'.
+
+ Modification times are displayed in UTC as UNIX timestamps, unless
+suffixed with `H' (for "human-readable"), as in `ctimeH', in which case
+usual `tar tv' output format is used.
+
+ The default output format is: `name,dev,ino,mode,
+nlink,uid,gid,size,blksize,blocks,atime,mtime,ctime'.
+
+ For example, the following command will display file names and
+corresponding times of last access for each file in the current working
+directory:
+
+ genfile --stat=name,atime *
+
+
+File: tar.info, Node: Exec Mode, Prev: Status Mode, Up: Genfile
+
+D.3 Exec Mode
+=============
+
+This mode is designed for testing the behavior of `paxutils' commands
+when some of the files change during archiving. It is an experimental
+mode.
+
+ The `Exec Mode' is toggled by `--run' command line option (or its
+alias `-r'). The argument to this option gives the command line to be
+executed. The actual command line is constructed by inserting
+`--checkpoint' option between the command name and its first argument
+(if any). Due to this, the argument to `--run' may not use traditional
+`tar' option syntax, i.e., the following is wrong:
+
+ # Wrong!
+ genfile --run 'tar cf foo bar'
+
+Use the following syntax instead:
+
+ genfile --run 'tar -cf foo bar'
+
+ The rest of command line after `--run' or its equivalent specifies
+checkpoint values and actions to be executed upon reaching them.
+Checkpoint values are introduced with `--checkpoint' command line
+option. Argument to this option is the number of checkpoint in decimal.
+
+ Any number of "actions" may be specified after a checkpoint.
+Available actions are
+
+`--cut FILE'
+`--truncate FILE'
+ Truncate FILE to the size specified by previous `--length' option
+ (or 0, if it is not given).
+
+`--append FILE'
+ Append data to FILE. The size of data and its pattern are given by
+ previous `--length' and `pattern' options.
+
+`--touch FILE'
+ Update the access and modification times of FILE. These timestamps
+ are changed to the current time, unless `--date' option was given,
+ in which case they are changed to the specified time. Argument to
+ `--date' option is a date specification in an almost arbitrary
+ format (*note Date input formats::).
+
+`--exec COMMAND'
+ Execute given shell command.
+
+
+ Option `--verbose' instructs `genfile' to print on standard output
+notifications about checkpoints being executed and to verbosely
+describe exit status of the command.
+
+ While the command is being executed its standard output remains
+connected to descriptor 1. All messages it prints to file descriptor 2,
+except checkpoint notifications, are forwarded to standard error.
+
+ `Genfile' exits with the exit status of the executed command.
+
+
+File: tar.info, Node: Free Software Needs Free Documentation, Next: Copying This Manual, Prev: Genfile, Up: Top
+
+Appendix E Free Software Needs Free Documentation
+*************************************************
+
+The biggest deficiency in the free software community today is not in
+the software--it is the lack of good free documentation that we can
+include with the free software. Many of our most important programs do
+not come with free reference manuals and free introductory texts.
+Documentation is an essential part of any software package; when an
+important free software package does not come with a free manual and a
+free tutorial, that is a major gap. We have many such gaps today.
+
+ Consider Perl, for instance. The tutorial manuals that people
+normally use are non-free. How did this come about? Because the
+authors of those manuals published them with restrictive terms--no
+copying, no modification, source files not available--which exclude
+them from the free software world.
+
+ That wasn't the first time this sort of thing happened, and it was
+far from the last. Many times we have heard a GNU user eagerly
+describe a manual that he is writing, his intended contribution to the
+community, only to learn that he had ruined everything by signing a
+publication contract to make it non-free.
+
+ Free documentation, like free software, is a matter of freedom, not
+price. The problem with the non-free manual is not that publishers
+charge a price for printed copies--that in itself is fine. (The Free
+Software Foundation sells printed copies of manuals, too.) The problem
+is the restrictions on the use of the manual. Free manuals are
+available in source code form, and give you permission to copy and
+modify. Non-free manuals do not allow this.
+
+ The criteria of freedom for a free manual are roughly the same as for
+free software. Redistribution (including the normal kinds of
+commercial redistribution) must be permitted, so that the manual can
+accompany every copy of the program, both on-line and on paper.
+
+ Permission for modification of the technical content is crucial too.
+When people modify the software, adding or changing features, if they
+are conscientious they will change the manual too--so they can provide
+accurate and clear documentation for the modified program. A manual
+that leaves you no choice but to write a new manual to document a
+changed version of the program is not really available to our community.
+
+ Some kinds of limits on the way modification is handled are
+acceptable. For example, requirements to preserve the original
+author's copyright notice, the distribution terms, or the list of
+authors, are ok. It is also no problem to require modified versions to
+include notice that they were modified. Even entire sections that may
+not be deleted or changed are acceptable, as long as they deal with
+nontechnical topics (like this one). These kinds of restrictions are
+acceptable because they don't obstruct the community's normal use of
+the manual.
+
+ However, it must be possible to modify all the _technical_ content
+of the manual, and then distribute the result in all the usual media,
+through all the usual channels. Otherwise, the restrictions obstruct
+the use of the manual, it is not free, and we need another manual to
+replace it.
+
+ Please spread the word about this issue. Our community continues to
+lose manuals to proprietary publishing. If we spread the word that
+free software needs free reference manuals and free tutorials, perhaps
+the next person who wants to contribute by writing documentation will
+realize, before it is too late, that only free manuals contribute to
+the free software community.
+
+ If you are writing documentation, please insist on publishing it
+under the GNU Free Documentation License or another free documentation
+license. Remember that this decision requires your approval--you don't
+have to let the publisher decide. Some commercial publishers will use
+a free license if you insist, but they will not propose the option; it
+is up to you to raise the issue and say firmly that this is what you
+want. If the publisher you are dealing with refuses, please try other
+publishers. If you're not sure whether a proposed license is free,
+write to <licensing@gnu.org>.
+
+ You can encourage commercial publishers to sell more free, copylefted
+manuals and tutorials by buying them, and particularly by buying copies
+from the publishers that paid for their writing or for major
+improvements. Meanwhile, try to avoid buying non-free documentation at
+all. Check the distribution terms of a manual before you buy it, and
+insist that whoever seeks your business must respect your freedom.
+Check the history of the book, and try reward the publishers that have
+paid or pay the authors to work on it.
+
+ The Free Software Foundation maintains a list of free documentation
+published by other publishers, at
+`http://www.fsf.org/doc/other-free-books.html'.
+
+
+File: tar.info, Node: Copying This Manual, Next: Index of Command Line Options, Prev: Free Software Needs Free Documentation, Up: Top
+
+Appendix F Copying This Manual
+******************************
+
+* Menu:
+
+* GNU Free Documentation License:: License for copying this manual
+
+
+File: tar.info, Node: GNU Free Documentation License, Up: Copying This Manual
+
+F.1 GNU Free Documentation License
+==================================
+
+ Version 1.2, November 2002
+
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 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.
+
+ 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 for under this License. Any other
+ attempt to copy, modify, sublicense or distribute the Document is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 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.
+
+F.1.1 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.2
+ 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: tar.info, Node: Index of Command Line Options, Next: Index, Prev: Copying This Manual, Up: Top
+
+Appendix G Index of Command Line Options
+****************************************
+
+This appendix contains an index of all GNU `tar' long command line
+options. The options are listed without the preceding double-dash. For
+a cross-reference of short command line options, *note Short Option
+Summary::.
+
+
+* Menu:
+
+* absolute-names: absolute. (line 8)
+* absolute-names, summary: Option Summary. (line 6)
+* add-file: files. (line 84)
+* after-date: after. (line 26)
+* after-date, summary: Option Summary. (line 12)
+* anchored: controlling pattern-matching.
+ (line 79)
+* anchored, summary: Option Summary. (line 15)
+* append: append. (line 8)
+* append, summary: Operation Summary. (line 6)
+* atime-preserve: Attributes. (line 14)
+* atime-preserve, summary: Option Summary. (line 19)
+* backup: backup. (line 41)
+* backup, summary: Option Summary. (line 65)
+* block-number: verbose. (line 111)
+* block-number, summary: Option Summary. (line 70)
+* blocking-factor: Blocking Factor. (line 8)
+* blocking-factor, summary: Option Summary. (line 76)
+* bzip2: gzip. (line 88)
+* bzip2, summary: Option Summary. (line 81)
+* catenate: concatenate. (line 6)
+* catenate, summary: Operation Summary. (line 10)
+* check-links, summary: Option Summary. (line 93)
+* checkpoint: verbose. (line 83)
+* checkpoint, summary: Option Summary. (line 86)
+* compare: compare. (line 8)
+* compare, summary: Operation Summary. (line 14)
+* compress: gzip. (line 92)
+* compress, summary: Option Summary. (line 100)
+* concatenate: concatenate. (line 6)
+* concatenate, summary: Operation Summary. (line 20)
+* confirmation, summary: Option Summary. (line 107)
+* create, additional options: create options. (line 6)
+* create, complementary notes: Basic tar. (line 11)
+* create, introduced: Creating the archive.
+ (line 6)
+* create, summary: Operation Summary. (line 25)
+* create, using with --verbose: create verbose. (line 6)
+* create, using with --verify: verify. (line 24)
+* delay-directory-restore: Directory Modification Times and Permissions.
+ (line 62)
+* delay-directory-restore, summary: Option Summary. (line 110)
+* delete: delete. (line 8)
+* delete, summary: Operation Summary. (line 29)
+* dereference: dereference. (line 6)
+* dereference, summary: Option Summary. (line 115)
+* diff, summary: Operation Summary. (line 33)
+* directory: directory. (line 11)
+* directory, summary: Option Summary. (line 121)
+* directory, using in --files-from argument: files. (line 60)
+* exclude: exclude. (line 11)
+* exclude, potential problems with: problems with exclude.
+ (line 6)
+* exclude, summary: Option Summary. (line 128)
+* exclude-caches: exclude. (line 45)
+* exclude-caches, summary: Option Summary. (line 137)
+* exclude-caches-all: exclude. (line 53)
+* exclude-caches-all, summary: Option Summary. (line 150)
+* exclude-caches-under: exclude. (line 49)
+* exclude-caches-under, summary: Option Summary. (line 144)
+* exclude-from: exclude. (line 22)
+* exclude-from, summary: Option Summary. (line 132)
+* exclude-tag: exclude. (line 62)
+* exclude-tag, summary: Option Summary. (line 154)
+* exclude-tag-all: exclude. (line 70)
+* exclude-tag-all, summary: Option Summary. (line 162)
+* exclude-tag-under: exclude. (line 66)
+* exclude-tag-under, summary: Option Summary. (line 158)
+* extract: extract. (line 8)
+* extract, additional options: extract options. (line 8)
+* extract, complementary notes: Basic tar. (line 48)
+* extract, summary: Operation Summary. (line 37)
+* extract, using with --listed-incremental: Incremental Dumps.
+ (line 93)
+* file, short description: file. (line 17)
+* file, summary: Option Summary. (line 166)
+* file, tutorial: file tutorial. (line 6)
+* files-from: files. (line 14)
+* files-from, summary: Option Summary. (line 172)
+* force-local, short description: Device. (line 70)
+* force-local, summary: Option Summary. (line 178)
+* format, summary: Option Summary. (line 183)
+* get, summary: Operation Summary. (line 42)
+* group: override. (line 73)
+* group, summary: Option Summary. (line 208)
+* gunzip, summary: Option Summary. (line 216)
+* gzip: gzip. (line 54)
+* gzip, summary: Option Summary. (line 216)
+* help: help tutorial. (line 6)
+* help, introduction: help. (line 26)
+* help, summary: Option Summary. (line 224)
+* ignore-case: controlling pattern-matching.
+ (line 86)
+* ignore-case, summary: Option Summary. (line 229)
+* ignore-command-error: Writing to an External Program.
+ (line 82)
+* ignore-command-error, summary: Option Summary. (line 233)
+* ignore-failed-read: Ignore Failed Read. (line 7)
+* ignore-failed-read, summary: Option Summary. (line 237)
+* ignore-zeros: Ignore Zeros. (line 6)
+* ignore-zeros, short description: Blocking Factor. (line 156)
+* ignore-zeros, summary: Option Summary. (line 241)
+* incremental, summary: Option Summary. (line 246)
+* incremental, using with --list: Incremental Dumps. (line 158)
+* index-file, summary: Option Summary. (line 253)
+* info-script: Multi-Volume Archives.
+ (line 80)
+* info-script, short description: Device. (line 104)
+* info-script, summary: Option Summary. (line 256)
+* interactive: interactive. (line 14)
+* interactive, summary: Option Summary. (line 264)
+* keep-newer-files: Keep Newer Files. (line 6)
+* keep-newer-files, summary: Option Summary. (line 271)
+* keep-old-files: Keep Old Files. (line 6)
+* keep-old-files, introduced: Dealing with Old Files.
+ (line 16)
+* keep-old-files, summary: Option Summary. (line 275)
+* label: label. (line 8)
+* label, summary: Option Summary. (line 280)
+* list: list. (line 6)
+* list, summary: Operation Summary. (line 46)
+* list, using with --incremental: Incremental Dumps. (line 158)
+* list, using with --listed-incremental: Incremental Dumps. (line 158)
+* list, using with --verbose: list. (line 30)
+* list, using with file name arguments: list. (line 68)
+* listed-incremental: Incremental Dumps. (line 14)
+* listed-incremental, summary: Option Summary. (line 287)
+* listed-incremental, using with --extract: Incremental Dumps.
+ (line 93)
+* listed-incremental, using with --list: Incremental Dumps. (line 158)
+* mode: override. (line 14)
+* mode, summary: Option Summary. (line 295)
+* mtime: override. (line 29)
+* mtime, summary: Option Summary. (line 301)
+* multi-volume: Multi-Volume Archives.
+ (line 6)
+* multi-volume, short description: Device. (line 88)
+* multi-volume, summary: Option Summary. (line 310)
+* new-volume-script: Multi-Volume Archives.
+ (line 80)
+* new-volume-script, short description: Device. (line 104)
+* new-volume-script, summary: Option Summary. (line 256)
+* newer: after. (line 26)
+* newer, summary: Option Summary. (line 318)
+* newer-mtime: after. (line 37)
+* newer-mtime, summary: Option Summary. (line 326)
+* no-anchored: controlling pattern-matching.
+ (line 79)
+* no-anchored, summary: Option Summary. (line 331)
+* no-delay-directory-restore: Directory Modification Times and Permissions.
+ (line 68)
+* no-delay-directory-restore, summary: Option Summary. (line 335)
+* no-ignore-case: controlling pattern-matching.
+ (line 86)
+* no-ignore-case, summary: Option Summary. (line 341)
+* no-ignore-command-error: Writing to an External Program.
+ (line 87)
+* no-ignore-command-error, summary: Option Summary. (line 344)
+* no-overwrite-dir, summary: Option Summary. (line 348)
+* no-quote-chars, summary: Option Summary. (line 352)
+* no-recursion: recurse. (line 13)
+* no-recursion, summary: Option Summary. (line 357)
+* no-same-owner: Attributes. (line 67)
+* no-same-owner, summary: Option Summary. (line 361)
+* no-same-permissions, summary: Option Summary. (line 367)
+* no-unquote: Selecting Archive Members.
+ (line 42)
+* no-unquote, summary: Option Summary. (line 372)
+* no-wildcards: controlling pattern-matching.
+ (line 41)
+* no-wildcards, summary: Option Summary. (line 376)
+* no-wildcards-match-slash: controlling pattern-matching.
+ (line 92)
+* no-wildcards-match-slash, summary: Option Summary. (line 379)
+* null: nul. (line 11)
+* null, summary: Option Summary. (line 382)
+* numeric-owner: Attributes. (line 73)
+* numeric-owner, summary: Option Summary. (line 388)
+* occurrence, summary: Option Summary. (line 405)
+* old-archive, summary: Option Summary. (line 419)
+* one-file-system: one. (line 16)
+* one-file-system, summary: Option Summary. (line 422)
+* overwrite: Overwrite Old Files. (line 6)
+* overwrite, introduced: Dealing with Old Files.
+ (line 22)
+* overwrite, summary: Option Summary. (line 427)
+* overwrite-dir: Overwrite Old Files. (line 28)
+* overwrite-dir, introduced: Dealing with Old Files.
+ (line 6)
+* overwrite-dir, summary: Option Summary. (line 431)
+* owner: override. (line 57)
+* owner, summary: Option Summary. (line 435)
+* pax-option: PAX keywords. (line 6)
+* pax-option, summary: Option Summary. (line 444)
+* portability, summary: Option Summary. (line 450)
+* posix, summary: Option Summary. (line 454)
+* preserve: Attributes. (line 126)
+* preserve, summary: Option Summary. (line 457)
+* preserve-order: Same Order. (line 6)
+* preserve-order, summary: Option Summary. (line 461)
+* preserve-permissions: Setting Access Permissions.
+ (line 10)
+* preserve-permissions, short description: Attributes. (line 113)
+* preserve-permissions, summary: Option Summary. (line 464)
+* quote-chars, summary: Option Summary. (line 474)
+* quoting-style: quoting styles. (line 39)
+* quoting-style, summary: Option Summary. (line 478)
+* read-full-records <1>: read full records. (line 6)
+* read-full-records: Reading. (line 8)
+* read-full-records, short description: Blocking Factor. (line 172)
+* read-full-records, summary: Option Summary. (line 485)
+* record-size, summary: Option Summary. (line 490)
+* recursion: recurse. (line 24)
+* recursion, summary: Option Summary. (line 494)
+* recursive-unlink: Recursive Unlink. (line 6)
+* recursive-unlink, summary: Option Summary. (line 498)
+* remove-files: remove files. (line 6)
+* remove-files, summary: Option Summary. (line 503)
+* restrict, summary: Option Summary. (line 507)
+* rmt-command, summary: Option Summary. (line 512)
+* rsh-command: Device. (line 73)
+* rsh-command, summary: Option Summary. (line 516)
+* same-order: Same Order. (line 6)
+* same-order, summary: Option Summary. (line 520)
+* same-owner: Attributes. (line 48)
+* same-owner, summary: Option Summary. (line 528)
+* same-permissions: Setting Access Permissions.
+ (line 10)
+* same-permissions, short description: Attributes. (line 113)
+* same-permissions, summary: Option Summary. (line 464)
+* seek, summary: Option Summary. (line 537)
+* show-defaults: defaults. (line 6)
+* show-defaults, summary: Option Summary. (line 544)
+* show-omitted-dirs: verbose. (line 103)
+* show-omitted-dirs, summary: Option Summary. (line 553)
+* show-stored-names: list. (line 60)
+* show-stored-names, summary: Option Summary. (line 557)
+* show-transformed-names: transform. (line 45)
+* show-transformed-names, summary: Option Summary. (line 557)
+* sparse: sparse. (line 22)
+* sparse, summary: Option Summary. (line 565)
+* sparse-version: sparse. (line 57)
+* sparse-version, summary: Option Summary. (line 570)
+* starting-file: Starting File. (line 6)
+* starting-file, summary: Option Summary. (line 575)
+* strip-components: transform. (line 25)
+* strip-components, summary: Option Summary. (line 581)
+* suffix: backup. (line 68)
+* suffix, summary: Option Summary. (line 590)
+* tape-length: Multi-Volume Archives.
+ (line 33)
+* tape-length, short description: Device. (line 96)
+* tape-length, summary: Option Summary. (line 596)
+* test-label: label. (line 37)
+* test-label, summary: Option Summary. (line 601)
+* to-command: Writing to an External Program.
+ (line 9)
+* to-command, summary: Option Summary. (line 605)
+* to-stdout: Writing to Standard Output.
+ (line 14)
+* to-stdout, summary: Option Summary. (line 609)
+* totals: verbose. (line 46)
+* totals, summary: Option Summary. (line 614)
+* touch <1>: Attributes. (line 37)
+* touch: Data Modification Times.
+ (line 15)
+* touch, summary: Option Summary. (line 619)
+* transform: transform. (line 74)
+* transform, summary: Option Summary. (line 625)
+* uncompress: gzip. (line 92)
+* uncompress, summary: Option Summary. (line 100)
+* ungzip: gzip. (line 54)
+* ungzip, summary: Option Summary. (line 216)
+* unlink-first: Unlink First. (line 6)
+* unlink-first, introduced: Dealing with Old Files.
+ (line 42)
+* unlink-first, summary: Option Summary. (line 644)
+* unquote: Selecting Archive Members.
+ (line 39)
+* unquote, summary: Option Summary. (line 650)
+* update: update. (line 8)
+* update, summary: Operation Summary. (line 50)
+* usage: help. (line 53)
+* use-compress-program: gzip. (line 101)
+* use-compress-program, summary: Option Summary. (line 654)
+* utc, summary: Option Summary. (line 658)
+* verbose: verbose. (line 18)
+* verbose, introduced: verbose tutorial. (line 6)
+* verbose, summary: Option Summary. (line 662)
+* verbose, using with --create: create verbose. (line 6)
+* verbose, using with --list: list. (line 30)
+* verify, short description: verify. (line 8)
+* verify, summary: Option Summary. (line 669)
+* verify, using with --create: verify. (line 24)
+* version: help. (line 6)
+* version, summary: Option Summary. (line 674)
+* volno-file: Multi-Volume Archives.
+ (line 71)
+* volno-file, summary: Option Summary. (line 679)
+* wildcards: controlling pattern-matching.
+ (line 38)
+* wildcards, summary: Option Summary. (line 684)
+* wildcards-match-slash: controlling pattern-matching.
+ (line 92)
+* wildcards-match-slash, summary: Option Summary. (line 688)
+
+
+File: tar.info, Node: Index, Prev: Index of Command Line Options, Up: Top
+
+Appendix H Index
+****************
+
+
+* Menu:
+
+* abbreviations for months: Calendar date items. (line 38)
+* absolute file names: Remote Tape Server. (line 17)
+* Adding archives to an archive: concatenate. (line 6)
+* Adding files to an Archive: appending files. (line 8)
+* ADMINISTRATOR: General-Purpose Variables.
+ (line 7)
+* Age, excluding files by: after. (line 8)
+* ago in date strings: Relative items in date strings.
+ (line 23)
+* am in date strings: Time of day items. (line 22)
+* Appending files to an Archive: appending files. (line 8)
+* archive: Definitions. (line 6)
+* Archive creation: file. (line 36)
+* archive member: Definitions. (line 15)
+* Archive Name: file. (line 8)
+* Archive, creation of: create. (line 8)
+* Archives, Appending files to: appending files. (line 8)
+* Archiving Directories: create dir. (line 6)
+* archiving files: Top. (line 24)
+* ARGP_HELP_FMT, environment variable: Configuring Help Summary.
+ (line 22)
+* authors of get_date: Authors of get_date. (line 6)
+* Avoiding recursion in directories: recurse. (line 8)
+* backup options: backup. (line 6)
+* backup suffix: backup. (line 68)
+* BACKUP_DIRS: General-Purpose Variables.
+ (line 29)
+* BACKUP_FILES: General-Purpose Variables.
+ (line 55)
+* BACKUP_HOUR: General-Purpose Variables.
+ (line 11)
+* backups: backup. (line 41)
+* beginning of time, for POSIX: Seconds since the Epoch.
+ (line 13)
+* Bellovin, Steven M.: Authors of get_date. (line 6)
+* Berets, Jim: Authors of get_date. (line 6)
+* Berry, K.: Authors of get_date. (line 14)
+* Block number where error occurred: verbose. (line 111)
+* BLOCKING: General-Purpose Variables.
+ (line 25)
+* blocking factor: Blocking Factor. (line 194)
+* Blocking Factor: Blocking Factor. (line 6)
+* Blocks per record: Blocking Factor. (line 6)
+* bug reports: Reports. (line 6)
+* Bytes per record: Blocking Factor. (line 6)
+* calendar date item: Calendar date items. (line 6)
+* case, ignored in dates: General date syntax. (line 64)
+* cat vs concatenate: concatenate. (line 63)
+* Changing directory mid-stream: directory. (line 6)
+* Character class, excluding characters from: wildcards. (line 34)
+* Choosing an archive file: file. (line 8)
+* comments, in dates: General date syntax. (line 64)
+* Compressed archives: gzip. (line 6)
+* concatenate vs cat: concatenate. (line 63)
+* Concatenating Archives: concatenate. (line 6)
+* corrupted archives <1>: gzip. (line 73)
+* corrupted archives: Full Dumps. (line 8)
+* Creation of the archive: create. (line 8)
+* DAT blocking: Blocking Factor. (line 204)
+* Data Modification time, excluding files by: after. (line 8)
+* Data modification times of extracted files: Data Modification Times.
+ (line 6)
+* date format, ISO 8601: Calendar date items. (line 30)
+* date input formats: Date input formats. (line 6)
+* day in date strings: Relative items in date strings.
+ (line 15)
+* day of week item: Day of week items. (line 6)
+* Deleting files from an archive: delete. (line 8)
+* Deleting from tape archives: delete. (line 19)
+* Descending directories, avoiding: recurse. (line 8)
+* Directories, Archiving: create dir. (line 6)
+* Directories, avoiding recursion: recurse. (line 8)
+* Directory, changing mid-stream: directory. (line 6)
+* DIRLIST: General-Purpose Variables.
+ (line 51)
+* displacement of dates: Relative items in date strings.
+ (line 6)
+* doc-opt-col: Configuring Help Summary.
+ (line 95)
+* Double-checking a write operation: verify. (line 6)
+* DUMP_BEGIN: User Hooks. (line 32)
+* DUMP_END: User Hooks. (line 36)
+* DUMP_REMIND_SCRIPT: General-Purpose Variables.
+ (line 102)
+* dumps, full: Full Dumps. (line 8)
+* dup-args: Configuring Help Summary.
+ (line 52)
+* dup-args-note: Configuring Help Summary.
+ (line 69)
+* Eggert, Paul: Authors of get_date. (line 6)
+* End-of-archive blocks, ignoring: Ignore Zeros. (line 6)
+* End-of-archive info script: Multi-Volume Archives.
+ (line 80)
+* entry: Naming tar Archives. (line 11)
+* epoch, for POSIX: Seconds since the Epoch.
+ (line 13)
+* Error message, block number of: verbose. (line 121)
+* Exabyte blocking: Blocking Factor. (line 204)
+* exclude: exclude. (line 14)
+* exclude-caches: exclude. (line 33)
+* exclude-from: exclude. (line 27)
+* exclude-tag: exclude. (line 56)
+* Excluding characters from a character class: wildcards. (line 34)
+* Excluding file by age: after. (line 8)
+* Excluding files by file system: exclude. (line 8)
+* Excluding files by name and pattern: exclude. (line 8)
+* Exec Mode, genfile: Exec Mode. (line 6)
+* existing backup method: backup. (line 59)
+* exit status: Synopsis. (line 67)
+* Extraction: extract. (line 8)
+* extraction: Definitions. (line 22)
+* FDL, GNU Free Documentation License: GNU Free Documentation License.
+ (line 6)
+* file archival: Top. (line 24)
+* File lists separated by NUL characters: Generate Mode. (line 33)
+* file name: Definitions. (line 15)
+* File Name arguments, alternatives: files. (line 6)
+* File name arguments, using --list with: list. (line 68)
+* File names, excluding files by: exclude. (line 8)
+* File names, terminated by NUL: nul. (line 6)
+* File names, using symbolic links: dereference. (line 6)
+* File system boundaries, not crossing: one. (line 6)
+* FILELIST: General-Purpose Variables.
+ (line 65)
+* first in date strings: General date syntax. (line 26)
+* Format Options: Format Variations. (line 6)
+* Format Parameters: Format Variations. (line 6)
+* Format, old style: old. (line 6)
+* fortnight in date strings: Relative items in date strings.
+ (line 15)
+* free documentation: Free Software Needs Free Documentation.
+ (line 6)
+* full dumps: Full Dumps. (line 8)
+* future time stamps: Large or Negative Values.
+ (line 6)
+* general date syntax: General date syntax. (line 6)
+* Generate Mode, genfile: Generate Mode. (line 6)
+* genfile: Genfile. (line 6)
+* genfile, create file: Generate Mode. (line 6)
+* genfile, creating sparse files: Generate Mode. (line 55)
+* genfile, generate mode: Generate Mode. (line 6)
+* genfile, reading a list of file names: Generate Mode. (line 22)
+* genfile, seeking to a given offset: Generate Mode. (line 18)
+* get_date: Date input formats. (line 6)
+* Getting program version number: help. (line 6)
+* GNU archive format: gnu. (line 6)
+* GNU.sparse.major, extended header variable: PAX 1. (line 14)
+* GNU.sparse.map, extended header variable: PAX 0. (line 60)
+* GNU.sparse.minor, extended header variable: PAX 1. (line 17)
+* GNU.sparse.name, extended header variable: PAX 0. (line 68)
+* GNU.sparse.name, extended header variable, in v.1.0: PAX 1. (line 24)
+* GNU.sparse.numblocks, extended header variable: PAX 0. (line 15)
+* GNU.sparse.numbytes, extended header variable: PAX 0. (line 21)
+* GNU.sparse.offset, extended header variable: PAX 0. (line 18)
+* GNU.sparse.realsize, extended header variable: PAX 1. (line 24)
+* GNU.sparse.size, extended header variable: PAX 0. (line 11)
+* gnupg, using with tar: gzip. (line 113)
+* gpg, using with tar: gzip. (line 113)
+* header-col: Configuring Help Summary.
+ (line 141)
+* hook: User Hooks. (line 13)
+* hour in date strings: Relative items in date strings.
+ (line 15)
+* Ignoring end-of-archive blocks: Ignore Zeros. (line 6)
+* Info script: Multi-Volume Archives.
+ (line 80)
+* Interactive operation: interactive. (line 6)
+* ISO 8601 date format: Calendar date items. (line 30)
+* items in date strings: General date syntax. (line 6)
+* Labeling an archive: label. (line 6)
+* Labeling multi-volume archives: label. (line 6)
+* Labels on the archive media: label. (line 6)
+* language, in dates: General date syntax. (line 40)
+* Large lists of file names on small machines: Same Order. (line 6)
+* large values: Large or Negative Values.
+ (line 6)
+* last DAY: Day of week items. (line 15)
+* last in date strings: General date syntax. (line 26)
+* Listing all tar options: help. (line 26)
+* listing member and file names: list. (line 41)
+* Listing volume label: label. (line 29)
+* Lists of file names: files. (line 6)
+* Local and remote archives: file. (line 73)
+* long-opt-col: Configuring Help Summary.
+ (line 87)
+* MacKenzie, David: Authors of get_date. (line 6)
+* member: Definitions. (line 15)
+* member name: Definitions. (line 15)
+* Members, replacing with other members: append. (line 49)
+* Meyering, Jim: Authors of get_date. (line 6)
+* Middle of the archive, starting in the: Starting File. (line 11)
+* midnight in date strings: Time of day items. (line 22)
+* minute in date strings: Relative items in date strings.
+ (line 15)
+* minutes, time zone correction by: Time of day items. (line 30)
+* Modes of extracted files: Setting Access Permissions.
+ (line 6)
+* Modification time, excluding files by: after. (line 8)
+* Modification times of extracted files: Data Modification Times.
+ (line 6)
+* month in date strings: Relative items in date strings.
+ (line 15)
+* month names in date strings: Calendar date items. (line 38)
+* months, written-out: General date syntax. (line 36)
+* MT: General-Purpose Variables.
+ (line 69)
+* MT_BEGIN: Magnetic Tape Control.
+ (line 11)
+* MT_OFFLINE: Magnetic Tape Control.
+ (line 32)
+* MT_REWIND: Magnetic Tape Control.
+ (line 21)
+* MT_STATUS: Magnetic Tape Control.
+ (line 42)
+* Multi-volume archives: Multi-Volume Archives.
+ (line 6)
+* Mutli-volume archives in PAX format, extracting using non-GNU tars: Split Recovery.
+ (line 17)
+* Mutli-volume archives, extracting using non-GNU tars: Split Recovery.
+ (line 6)
+* Naming an archive: file. (line 8)
+* negative time stamps: Large or Negative Values.
+ (line 6)
+* next DAY: Day of week items. (line 15)
+* next in date strings: General date syntax. (line 26)
+* noon in date strings: Time of day items. (line 22)
+* now in date strings: Relative items in date strings.
+ (line 33)
+* ntape device: Many. (line 6)
+* NUL terminated file names: nul. (line 6)
+* Number of blocks per record: Blocking Factor. (line 6)
+* Number of bytes per record: Blocking Factor. (line 6)
+* numbered backup method: backup. (line 55)
+* numbers, written-out: General date syntax. (line 26)
+* Obtaining help: help. (line 26)
+* Obtaining total status information: verbose. (line 46)
+* Old GNU archive format: gnu. (line 6)
+* Old GNU sparse format: Old GNU Format. (line 6)
+* Old style archives: old. (line 6)
+* Old style format: old. (line 6)
+* opt-doc-col: Configuring Help Summary.
+ (line 127)
+* option syntax, traditional: Old Options. (line 60)
+* Options when reading archives: Reading. (line 6)
+* Options, archive format specifying: Format Variations. (line 6)
+* Options, format specifying: Format Variations. (line 6)
+* ordinal numbers: General date syntax. (line 26)
+* Overwriting old files, prevention: Dealing with Old Files.
+ (line 16)
+* pattern, genfile: Generate Mode. (line 39)
+* PAX archive format: posix. (line 6)
+* Permissions of extracted files: Setting Access Permissions.
+ (line 6)
+* Pinard, F.: Authors of get_date. (line 14)
+* pm in date strings: Time of day items. (line 22)
+* POSIX archive format: posix. (line 6)
+* Progress information: verbose. (line 83)
+* Protecting old files: Dealing with Old Files.
+ (line 26)
+* pure numbers in date strings: Pure numbers in date strings.
+ (line 6)
+* Reading file names from a file: files. (line 6)
+* Reading incomplete records: Reading. (line 8)
+* Record Size: Blocking Factor. (line 6)
+* Records, incomplete: Reading. (line 8)
+* Recursion in directories, avoiding: recurse. (line 8)
+* relative items in date strings: Relative items in date strings.
+ (line 6)
+* Remote devices: file. (line 62)
+* remote tape drive: Remote Tape Server. (line 6)
+* Removing files from an archive: delete. (line 8)
+* Replacing members with other members: append. (line 49)
+* reporting bugs: Reports. (line 6)
+* RESTORE_BEGIN: User Hooks. (line 39)
+* RESTORE_END: User Hooks. (line 42)
+* Resurrecting files from an archive: extract. (line 8)
+* Retrieving files from an archive: extract. (line 8)
+* return status: Synopsis. (line 67)
+* rmargin: Configuring Help Summary.
+ (line 160)
+* rmt: Remote Tape Server. (line 6)
+* RSH: General-Purpose Variables.
+ (line 72)
+* RSH_COMMAND: General-Purpose Variables.
+ (line 77)
+* Running out of space: Scarce. (line 8)
+* Salz, Rich: Authors of get_date. (line 6)
+* short-opt-col: Configuring Help Summary.
+ (line 79)
+* simple backup method: backup. (line 64)
+* SIMPLE_BACKUP_SUFFIX: backup. (line 68)
+* SLEEP_MESSAGE: General-Purpose Variables.
+ (line 111)
+* SLEEP_TIME: General-Purpose Variables.
+ (line 97)
+* Small memory: Scarce. (line 8)
+* Sparse Files: sparse. (line 6)
+* sparse files v.0.0, extracting with non-GNU tars: Sparse Recovery.
+ (line 92)
+* sparse files v.0.1, extracting with non-GNU tars: Sparse Recovery.
+ (line 92)
+* sparse files v.1.0, extracting with non-GNU tars: Sparse Recovery.
+ (line 17)
+* Sparse files, creating using genfile: Generate Mode. (line 55)
+* sparse files, extracting with non-GNU tars: Sparse Recovery.
+ (line 6)
+* sparse formats: Sparse Formats. (line 6)
+* sparse formats, defined: sparse. (line 50)
+* sparse formats, Old GNU: Old GNU Format. (line 6)
+* sparse formats, v.0.0: PAX 0. (line 6)
+* sparse formats, v.0.1: PAX 0. (line 52)
+* sparse formats, v.1.0: PAX 1. (line 6)
+* sparse versions: Sparse Formats. (line 6)
+* Specifying archive members: Selecting Archive Members.
+ (line 6)
+* Specifying files to act on: Selecting Archive Members.
+ (line 6)
+* Standard input and output: file. (line 41)
+* Standard output, writing extracted files to: Writing to Standard Output.
+ (line 6)
+* Storing archives in compressed format: gzip. (line 6)
+* Symbolic link as file name: dereference. (line 6)
+* TAPE: file tutorial. (line 14)
+* tape blocking: Blocking Factor. (line 194)
+* tape marks: Many. (line 44)
+* tape positioning: Many. (line 26)
+* TAPE_FILE: General-Purpose Variables.
+ (line 19)
+* Tapes, using --delete and: delete. (line 19)
+* TAR: General-Purpose Variables.
+ (line 115)
+* tar: What tar Does. (line 6)
+* tar archive: Definitions. (line 6)
+* Tar archive formats: Formats. (line 6)
+* tar entry: Naming tar Archives. (line 11)
+* tar file: Naming tar Archives. (line 11)
+* tar to a remote device: file. (line 62)
+* tar to standard input and output: file. (line 41)
+* TAR_ARCHIVE, info script environment variable: Multi-Volume Archives.
+ (line 100)
+* TAR_ATIME, to-command environment: Writing to an External Program.
+ (line 49)
+* TAR_CTIME, to-command environment: Writing to an External Program.
+ (line 58)
+* TAR_FD, info script environment variable: Multi-Volume Archives.
+ (line 114)
+* TAR_FILENAME, to-command environment: Writing to an External Program.
+ (line 37)
+* TAR_FILETYPE, to-command environment: Writing to an External Program.
+ (line 22)
+* TAR_FORMAT, info script environment variable: Multi-Volume Archives.
+ (line 110)
+* TAR_GID, to-command environment: Writing to an External Program.
+ (line 67)
+* TAR_GNAME, to-command environment: Writing to an External Program.
+ (line 46)
+* TAR_MODE, to-command environment: Writing to an External Program.
+ (line 34)
+* TAR_MTIME, to-command environment: Writing to an External Program.
+ (line 55)
+* TAR_OPTIONS, environment variable: using tar options. (line 30)
+* TAR_REALNAME, to-command environment: Writing to an External Program.
+ (line 40)
+* TAR_SIZE, to-command environment: Writing to an External Program.
+ (line 61)
+* TAR_SUBCOMMAND, info script environment variable: Multi-Volume Archives.
+ (line 106)
+* TAR_UID, to-command environment: Writing to an External Program.
+ (line 64)
+* TAR_UNAME, to-command environment: Writing to an External Program.
+ (line 43)
+* TAR_VERSION, info script environment variable: Multi-Volume Archives.
+ (line 97)
+* TAR_VOLUME, info script environment variable: Multi-Volume Archives.
+ (line 103)
+* tarcat: Tarcat. (line 6)
+* this in date strings: Relative items in date strings.
+ (line 33)
+* time of day item: Time of day items. (line 6)
+* time zone correction: Time of day items. (line 30)
+* time zone item <1>: Time zone items. (line 6)
+* time zone item: General date syntax. (line 44)
+* today in date strings: Relative items in date strings.
+ (line 33)
+* tomorrow in date strings: Relative items in date strings.
+ (line 29)
+* TZ: Specifying time zone rules.
+ (line 6)
+* Ultrix 3.1 and write failure: Remote Tape Server. (line 40)
+* unpacking: Definitions. (line 22)
+* Updating an archive: update. (line 8)
+* usage-indent: Configuring Help Summary.
+ (line 156)
+* Using encrypted archives: gzip. (line 113)
+* ustar archive format: ustar. (line 6)
+* uuencode: Applications. (line 8)
+* v7 archive format: old. (line 6)
+* Verbose operation: verbose. (line 18)
+* Verifying a write operation: verify. (line 6)
+* Verifying the currency of an archive: compare. (line 6)
+* Version of the tar program: help. (line 6)
+* version-control Emacs variable: backup. (line 49)
+* VERSION_CONTROL: backup. (line 41)
+* volno file: Multi-Volume Archives.
+ (line 71)
+* VOLNO_FILE: General-Purpose Variables.
+ (line 82)
+* Volume label, listing: label. (line 29)
+* Volume number file: Multi-Volume Archives.
+ (line 71)
+* week in date strings: Relative items in date strings.
+ (line 15)
+* Where is the archive?: file. (line 8)
+* Working directory, specifying: directory. (line 6)
+* Writing extracted files to standard output: Writing to Standard Output.
+ (line 6)
+* Writing new archives: file. (line 36)
+* XLIST: General-Purpose Variables.
+ (line 87)
+* xsparse: Sparse Recovery. (line 13)
+* year in date strings: Relative items in date strings.
+ (line 15)
+* yesterday in date strings: Relative items in date strings.
+ (line 29)
+
+
diff --git a/doc/tar.texi b/doc/tar.texi
new file mode 100644
index 0000000..52b3725
--- /dev/null
+++ b/doc/tar.texi
@@ -0,0 +1,10958 @@
+\input texinfo @c -*-texinfo-*-
+@comment %**start of header
+@setfilename tar.info
+@include version.texi
+@settitle GNU tar @value{VERSION}
+@setchapternewpage odd
+
+@finalout
+
+@smallbook
+@c %**end of header
+
+@c Maintenance notes:
+@c 1. Pay attention to @FIXME{}s and @UNREVISED{}s
+@c 2. Before creating final variant:
+@c 2.1. Run `make check-options' to make sure all options are properly
+@c documented;
+@c 2.2. Run `make master-menu' (see comment before the master menu).
+
+@include rendition.texi
+@include value.texi
+
+@defcodeindex op
+
+@c Put everything in one index (arbitrarily chosen to be the concept index).
+@syncodeindex fn cp
+@syncodeindex ky cp
+@syncodeindex pg cp
+@syncodeindex vr cp
+
+@copying
+
+This manual is for @acronym{GNU} @command{tar} (version
+@value{VERSION}, @value{UPDATED}), which creates and extracts files
+from archives.
+
+Copyright @copyright{} 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
+2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below. A copy of the license
+is included in the section entitled "GNU Free Documentation License".
+
+(a) The FSF's Back-Cover Text is: ``You are free to copy and modify
+this GNU Manual. Buying copies from GNU Press supports the FSF in
+developing GNU and promoting software freedom.''
+@end quotation
+@end copying
+
+@dircategory Archiving
+@direntry
+* Tar: (tar). Making tape (or disk) archives.
+@end direntry
+
+@dircategory Individual utilities
+@direntry
+* tar: (tar)tar invocation. Invoking @GNUTAR{}.
+@end direntry
+
+@shorttitlepage @acronym{GNU} @command{tar}
+
+@titlepage
+@title @acronym{GNU} tar: an archiver tool
+@subtitle @value{RENDITION} @value{VERSION}, @value{UPDATED}
+@author John Gilmore, Jay Fenlason et al.
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@ifnottex
+@node Top
+@top @acronym{GNU} tar: an archiver tool
+
+@insertcopying
+
+@cindex file archival
+@cindex archiving files
+
+The first part of this master menu lists the major nodes in this Info
+document. The rest of the menu lists all the lower level nodes.
+@end ifnottex
+
+@c The master menu goes here.
+@c
+@c NOTE: To update it from within Emacs, make sure mastermenu.el is
+@c loaded and run texinfo-master-menu.
+@c To update it from the command line, run
+@c
+@c make master-menu
+
+@menu
+* Introduction::
+* Tutorial::
+* tar invocation::
+* operations::
+* Backups::
+* Choosing::
+* Date input formats::
+* Formats::
+* Media::
+
+Appendices
+
+* Changes::
+* Configuring Help Summary::
+* Tar Internals::
+* Genfile::
+* Free Software Needs Free Documentation::
+* Copying This Manual::
+* Index of Command Line Options::
+* Index::
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Book Contents:: What this Book Contains
+* Definitions:: Some Definitions
+* What tar Does:: What @command{tar} Does
+* Naming tar Archives:: How @command{tar} Archives are Named
+* Authors:: @GNUTAR{} Authors
+* Reports:: Reporting bugs or suggestions
+
+Tutorial Introduction to @command{tar}
+
+* assumptions::
+* stylistic conventions::
+* basic tar options:: Basic @command{tar} Operations and Options
+* frequent operations::
+* Two Frequent Options::
+* create:: How to Create Archives
+* list:: How to List Archives
+* extract:: How to Extract Members from an Archive
+* going further::
+
+Two Frequently Used Options
+
+* file tutorial::
+* verbose tutorial::
+* help tutorial::
+
+How to Create Archives
+
+* prepare for examples::
+* Creating the archive::
+* create verbose::
+* short create::
+* create dir::
+
+How to List Archives
+
+* list dir::
+
+How to Extract Members from an Archive
+
+* extracting archives::
+* extracting files::
+* extract dir::
+* extracting untrusted archives::
+* failing commands::
+
+Invoking @GNUTAR{}
+
+* Synopsis::
+* using tar options::
+* Styles::
+* All Options::
+* help::
+* defaults::
+* verbose::
+* interactive::
+
+The Three Option Styles
+
+* Long Options:: Long Option Style
+* Short Options:: Short Option Style
+* Old Options:: Old Option Style
+* Mixing:: Mixing Option Styles
+
+All @command{tar} Options
+
+* Operation Summary::
+* Option Summary::
+* Short Option Summary::
+
+@GNUTAR{} Operations
+
+* Basic tar::
+* Advanced tar::
+* create options::
+* extract options::
+* backup::
+* Applications::
+* looking ahead::
+
+Advanced @GNUTAR{} Operations
+
+* Operations::
+* append::
+* update::
+* concatenate::
+* delete::
+* compare::
+
+How to Add Files to Existing Archives: @option{--append}
+
+* appending files:: Appending Files to an Archive
+* multiple::
+
+Updating an Archive
+
+* how to update::
+
+Options Used by @option{--create}
+
+* override:: Overriding File Metadata.
+* Ignore Failed Read::
+
+Options Used by @option{--extract}
+
+* Reading:: Options to Help Read Archives
+* Writing:: Changing How @command{tar} Writes Files
+* Scarce:: Coping with Scarce Resources
+
+Options to Help Read Archives
+
+* read full records::
+* Ignore Zeros::
+
+Changing How @command{tar} Writes Files
+
+* Dealing with Old Files::
+* Overwrite Old Files::
+* Keep Old Files::
+* Keep Newer Files::
+* Unlink First::
+* Recursive Unlink::
+* Data Modification Times::
+* Setting Access Permissions::
+* Directory Modification Times and Permissions::
+* Writing to Standard Output::
+* Writing to an External Program::
+* remove files::
+
+Coping with Scarce Resources
+
+* Starting File::
+* Same Order::
+
+Performing Backups and Restoring Files
+
+* Full Dumps:: Using @command{tar} to Perform Full Dumps
+* Incremental Dumps:: Using @command{tar} to Perform Incremental Dumps
+* Backup Levels:: Levels of Backups
+* Backup Parameters:: Setting Parameters for Backups and Restoration
+* Scripted Backups:: Using the Backup Scripts
+* Scripted Restoration:: Using the Restore Script
+
+Setting Parameters for Backups and Restoration
+
+* General-Purpose Variables::
+* Magnetic Tape Control::
+* User Hooks::
+* backup-specs example:: An Example Text of @file{Backup-specs}
+
+Choosing Files and Names for @command{tar}
+
+* file:: Choosing the Archive's Name
+* Selecting Archive Members::
+* files:: Reading Names from a File
+* exclude:: Excluding Some Files
+* wildcards:: Wildcards Patterns and Matching
+* quoting styles:: Ways of Quoting Special Characters in Names
+* transform:: Modifying File and Member Names
+* after:: Operating Only on New Files
+* recurse:: Descending into Directories
+* one:: Crossing File System Boundaries
+
+Reading Names from a File
+
+* nul::
+
+Excluding Some Files
+
+* problems with exclude::
+
+Wildcards Patterns and Matching
+
+* controlling pattern-matching::
+
+Crossing File System Boundaries
+
+* directory:: Changing Directory
+* absolute:: Absolute File Names
+
+Date input formats
+
+* General date syntax:: Common rules.
+* Calendar date items:: 19 Dec 1994.
+* Time of day items:: 9:20pm.
+* Time zone items:: @sc{est}, @sc{pdt}, @sc{gmt}.
+* Day of week items:: Monday and others.
+* Relative items in date strings:: next tuesday, 2 years ago.
+* Pure numbers in date strings:: 19931219, 1440.
+* Seconds since the Epoch:: @@1078100502.
+* Specifying time zone rules:: TZ="America/New_York", TZ="UTC0".
+* Authors of get_date:: Bellovin, Eggert, Salz, Berets, et al.
+
+Controlling the Archive Format
+
+* Portability:: Making @command{tar} Archives More Portable
+* Compression:: Using Less Space through Compression
+* Attributes:: Handling File Attributes
+* cpio:: Comparison of @command{tar} and @command{cpio}
+
+Making @command{tar} Archives More Portable
+
+* Portable Names:: Portable Names
+* dereference:: Symbolic Links
+* old:: Old V7 Archives
+* ustar:: Ustar Archives
+* gnu:: GNU and old GNU format archives.
+* posix:: @acronym{POSIX} archives
+* Checksumming:: Checksumming Problems
+* Large or Negative Values:: Large files, negative time stamps, etc.
+* Other Tars:: How to Extract GNU-Specific Data Using
+ Other @command{tar} Implementations
+
+@GNUTAR{} and @acronym{POSIX} @command{tar}
+
+* PAX keywords:: Controlling Extended Header Keywords.
+
+How to Extract GNU-Specific Data Using Other @command{tar} Implementations
+
+* Split Recovery:: Members Split Between Volumes
+* Sparse Recovery:: Sparse Members
+
+Using Less Space through Compression
+
+* gzip:: Creating and Reading Compressed Archives
+* sparse:: Archiving Sparse Files
+
+Tapes and Other Archive Media
+
+* Device:: Device selection and switching
+* Remote Tape Server::
+* Common Problems and Solutions::
+* Blocking:: Blocking
+* Many:: Many archives on one tape
+* Using Multiple Tapes:: Using Multiple Tapes
+* label:: Including a Label in the Archive
+* verify::
+* Write Protection::
+
+Blocking
+
+* Format Variations:: Format Variations
+* Blocking Factor:: The Blocking Factor of an Archive
+
+Many Archives on One Tape
+
+* Tape Positioning:: Tape Positions and Tape Marks
+* mt:: The @command{mt} Utility
+
+Using Multiple Tapes
+
+* Multi-Volume Archives:: Archives Longer than One Tape or Disk
+* Tape Files:: Tape Files
+* Tarcat:: Concatenate Volumes into a Single Archive
+
+
+Tar Internals
+
+* Standard:: Basic Tar Format
+* Extensions:: @acronym{GNU} Extensions to the Archive Format
+* Sparse Formats:: Storing Sparse Files
+* Snapshot Files::
+* Dumpdir::
+
+Storing Sparse Files
+
+* Old GNU Format::
+* PAX 0:: PAX Format, Versions 0.0 and 0.1
+* PAX 1:: PAX Format, Version 1.0
+
+Genfile
+
+* Generate Mode:: File Generation Mode.
+* Status Mode:: File Status Mode.
+* Exec Mode:: Synchronous Execution mode.
+
+Copying This Manual
+
+* GNU Free Documentation License:: License for copying this manual
+
+@end detailmenu
+@end menu
+
+@node Introduction
+@chapter Introduction
+
+@GNUTAR{} creates
+and manipulates @dfn{archives} which are actually collections of
+many other files; the program provides users with an organized and
+systematic method for controlling a large amount of data.
+The name ``tar'' originally came from the phrase ``Tape ARchive'', but
+archives need not (and these days, typically do not) reside on tapes.
+
+@menu
+* Book Contents:: What this Book Contains
+* Definitions:: Some Definitions
+* What tar Does:: What @command{tar} Does
+* Naming tar Archives:: How @command{tar} Archives are Named
+* Authors:: @GNUTAR{} Authors
+* Reports:: Reporting bugs or suggestions
+@end menu
+
+@node Book Contents
+@section What this Book Contains
+
+The first part of this chapter introduces you to various terms that will
+recur throughout the book. It also tells you who has worked on @GNUTAR{}
+and its documentation, and where you should send bug reports
+or comments.
+
+The second chapter is a tutorial (@pxref{Tutorial}) which provides a
+gentle introduction for people who are new to using @command{tar}. It is
+meant to be self contained, not requiring any reading from subsequent
+chapters to make sense. It moves from topic to topic in a logical,
+progressive order, building on information already explained.
+
+Although the tutorial is paced and structured to allow beginners to
+learn how to use @command{tar}, it is not intended solely for beginners.
+The tutorial explains how to use the three most frequently used
+operations (@samp{create}, @samp{list}, and @samp{extract}) as well as
+two frequently used options (@samp{file} and @samp{verbose}). The other
+chapters do not refer to the tutorial frequently; however, if a section
+discusses something which is a complex variant of a basic concept, there
+may be a cross reference to that basic concept. (The entire book,
+including the tutorial, assumes that the reader understands some basic
+concepts of using a Unix-type operating system; @pxref{Tutorial}.)
+
+The third chapter presents the remaining five operations, and
+information about using @command{tar} options and option syntax.
+
+@FIXME{this sounds more like a @acronym{GNU} Project Manuals Concept [tm] more
+than the reality. should think about whether this makes sense to say
+here, or not.} The other chapters are meant to be used as a
+reference. Each chapter presents everything that needs to be said
+about a specific topic.
+
+One of the chapters (@pxref{Date input formats}) exists in its
+entirety in other @acronym{GNU} manuals, and is mostly self-contained.
+In addition, one section of this manual (@pxref{Standard}) contains a
+big quote which is taken directly from @command{tar} sources.
+
+In general, we give both long and short (abbreviated) option names
+at least once in each section where the relevant option is covered, so
+that novice readers will become familiar with both styles. (A few
+options have no short versions, and the relevant sections will
+indicate this.)
+
+@node Definitions
+@section Some Definitions
+
+@cindex archive
+@cindex tar archive
+The @command{tar} program is used to create and manipulate @command{tar}
+archives. An @dfn{archive} is a single file which contains the contents
+of many files, while still identifying the names of the files, their
+owner(s), and so forth. (In addition, archives record access
+permissions, user and group, size in bytes, and data modification time.
+Some archives also record the file names in each archived directory, as
+well as other file and directory information.) You can use @command{tar}
+to @dfn{create} a new archive in a specified directory.
+
+@cindex member
+@cindex archive member
+@cindex file name
+@cindex member name
+The files inside an archive are called @dfn{members}. Within this
+manual, we use the term @dfn{file} to refer only to files accessible in
+the normal ways (by @command{ls}, @command{cat}, and so forth), and the term
+@dfn{member} to refer only to the members of an archive. Similarly, a
+@dfn{file name} is the name of a file, as it resides in the file system,
+and a @dfn{member name} is the name of an archive member within the
+archive.
+
+@cindex extraction
+@cindex unpacking
+The term @dfn{extraction} refers to the process of copying an archive
+member (or multiple members) into a file in the file system. Extracting
+all the members of an archive is often called @dfn{extracting the
+archive}. The term @dfn{unpack} can also be used to refer to the
+extraction of many or all the members of an archive. Extracting an
+archive does not destroy the archive's structure, just as creating an
+archive does not destroy the copies of the files that exist outside of
+the archive. You may also @dfn{list} the members in a given archive
+(this is often thought of as ``printing'' them to the standard output,
+or the command line), or @dfn{append} members to a pre-existing archive.
+All of these operations can be performed using @command{tar}.
+
+@node What tar Does
+@section What @command{tar} Does
+
+@cindex tar
+The @command{tar} program provides the ability to create @command{tar}
+archives, as well as various other kinds of manipulation. For example,
+you can use @command{tar} on previously created archives to extract files,
+to store additional files, or to update or list files which were already
+stored.
+
+Initially, @command{tar} archives were used to store files conveniently on
+magnetic tape. The name @command{tar} comes from this use; it stands for
+@code{t}ape @code{ar}chiver. Despite the utility's name, @command{tar} can
+direct its output to available devices, files, or other programs (using
+pipes). @command{tar} may even access remote devices or files (as archives).
+
+You can use @command{tar} archives in many ways. We want to stress a few
+of them: storage, backup, and transportation.
+
+@FIXME{the following table entries need a bit of work.}
+@table @asis
+@item Storage
+Often, @command{tar} archives are used to store related files for
+convenient file transfer over a network. For example, the
+@acronym{GNU} Project distributes its software bundled into
+@command{tar} archives, so that all the files relating to a particular
+program (or set of related programs) can be transferred as a single
+unit.
+
+A magnetic tape can store several files in sequence. However, the tape
+has no names for these files; it only knows their relative position on
+the tape. One way to store several files on one tape and retain their
+names is by creating a @command{tar} archive. Even when the basic transfer
+mechanism can keep track of names, as FTP can, the nuisance of handling
+multiple files, directories, and multiple links makes @command{tar}
+archives useful.
+
+Archive files are also used for long-term storage. You can think of
+this as transportation from the present into the future. (It is a
+science-fiction idiom that you can move through time as well as in
+space; the idea here is that @command{tar} can be used to move archives in
+all dimensions, even time!)
+
+@item Backup
+Because the archive created by @command{tar} is capable of preserving
+file information and directory structure, @command{tar} is commonly
+used for performing full and incremental backups of disks. A backup
+puts a collection of files (possibly pertaining to many users and
+projects) together on a disk or a tape. This guards against
+accidental destruction of the information in those files.
+@GNUTAR{} has special features that allow it to be
+used to make incremental and full dumps of all the files in a
+file system.
+
+@item Transportation
+You can create an archive on one system, transfer it to another system,
+and extract the contents there. This allows you to transport a group of
+files from one system to another.
+@end table
+
+@node Naming tar Archives
+@section How @command{tar} Archives are Named
+
+Conventionally, @command{tar} archives are given names ending with
+@samp{.tar}. This is not necessary for @command{tar} to operate properly,
+but this manual follows that convention in order to accustom readers to
+it and to make examples more clear.
+
+@cindex tar file
+@cindex entry
+@cindex tar entry
+Often, people refer to @command{tar} archives as ``@command{tar} files,'' and
+archive members as ``files'' or ``entries''. For people familiar with
+the operation of @command{tar}, this causes no difficulty. However, in
+this manual, we consistently refer to ``archives'' and ``archive
+members'' to make learning to use @command{tar} easier for novice users.
+
+@node Authors
+@section @GNUTAR{} Authors
+
+@GNUTAR{} was originally written by John Gilmore,
+and modified by many people. The @acronym{GNU} enhancements were
+written by Jay Fenlason, then Joy Kendall, and the whole package has
+been further maintained by Thomas Bushnell, n/BSG, Fran@,{c}ois
+Pinard, Paul Eggert, and finally Sergey Poznyakoff with the help of
+numerous and kind users.
+
+We wish to stress that @command{tar} is a collective work, and owes much to
+all those people who reported problems, offered solutions and other
+insights, or shared their thoughts and suggestions. An impressive, yet
+partial list of those contributors can be found in the @file{THANKS}
+file from the @GNUTAR{} distribution.
+
+@FIXME{i want all of these names mentioned, Absolutely. BUT, i'm not
+sure i want to spell out the history in this detail, at least not for
+the printed book. i'm just not sure it needs to be said this way.
+i'll think about it.}
+
+@FIXME{History is more important, and surely more interesting, than
+actual names. Quoting names without history would be meaningless. FP}
+
+Jay Fenlason put together a draft of a @GNUTAR{}
+manual, borrowing notes from the original man page from John Gilmore.
+This was withdrawn in version 1.11. Thomas Bushnell, n/BSG and Amy
+Gorin worked on a tutorial and manual for @GNUTAR{}.
+Fran@,{c}ois Pinard put version 1.11.8 of the manual together by
+taking information from all these sources and merging them. Melissa
+Weisshaus finally edited and redesigned the book to create version
+1.12. The book for versions from 1.14 up to @value{VERSION} were edited
+by the current maintainer, Sergey Poznyakoff.
+
+For version 1.12, Daniel Hagerty contributed a great deal of technical
+consulting. In particular, he is the primary author of @ref{Backups}.
+
+In July, 2003 @GNUTAR{} was put on CVS at savannah.gnu.org
+(see @url{http://savannah.gnu.org/projects/tar}), and
+active development and maintenance work has started
+again. Currently @GNUTAR{} is being maintained by Paul Eggert, Sergey
+Poznyakoff and Jeff Bailey.
+
+Support for @acronym{POSIX} archives was added by Sergey Poznyakoff.
+
+@node Reports
+@section Reporting bugs or suggestions
+
+@cindex bug reports
+@cindex reporting bugs
+If you find problems or have suggestions about this program or manual,
+please report them to @file{bug-tar@@gnu.org}.
+
+When reporting a bug, please be sure to include as much detail as
+possible, in order to reproduce it. @FIXME{Be more specific, I'd
+like to make this node as detailed as 'Bug reporting' node in Emacs
+manual}.
+
+@node Tutorial
+@chapter Tutorial Introduction to @command{tar}
+
+This chapter guides you through some basic examples of three @command{tar}
+operations: @option{--create}, @option{--list}, and @option{--extract}. If
+you already know how to use some other version of @command{tar}, then you
+may not need to read this chapter. This chapter omits most complicated
+details about how @command{tar} works.
+
+@menu
+* assumptions::
+* stylistic conventions::
+* basic tar options:: Basic @command{tar} Operations and Options
+* frequent operations::
+* Two Frequent Options::
+* create:: How to Create Archives
+* list:: How to List Archives
+* extract:: How to Extract Members from an Archive
+* going further::
+@end menu
+
+@node assumptions
+@section Assumptions this Tutorial Makes
+
+This chapter is paced to allow beginners to learn about @command{tar}
+slowly. At the same time, we will try to cover all the basic aspects of
+these three operations. In order to accomplish both of these tasks, we
+have made certain assumptions about your knowledge before reading this
+manual, and the hardware you will be using:
+
+@itemize @bullet
+@item
+Before you start to work through this tutorial, you should understand
+what the terms ``archive'' and ``archive member'' mean
+(@pxref{Definitions}). In addition, you should understand something
+about how Unix-type operating systems work, and you should know how to
+use some basic utilities. For example, you should know how to create,
+list, copy, rename, edit, and delete files and directories; how to
+change between directories; and how to figure out where you are in the
+file system. You should have some basic understanding of directory
+structure and how files are named according to which directory they are
+in. You should understand concepts such as standard output and standard
+input, what various definitions of the term ``argument'' mean, and the
+differences between relative and absolute file names. @FIXME{and what
+else?}
+
+@item
+This manual assumes that you are working from your own home directory
+(unless we state otherwise). In this tutorial, you will create a
+directory to practice @command{tar} commands in. When we show file names,
+we will assume that those names are relative to your home directory.
+For example, my home directory is @file{/home/fsf/melissa}. All of
+my examples are in a subdirectory of the directory named by that file
+name; the subdirectory is called @file{practice}.
+
+@item
+In general, we show examples of archives which exist on (or can be
+written to, or worked with from) a directory on a hard disk. In most
+cases, you could write those archives to, or work with them on any other
+device, such as a tape drive. However, some of the later examples in
+the tutorial and next chapter will not work on tape drives.
+Additionally, working with tapes is much more complicated than working
+with hard disks. For these reasons, the tutorial does not cover working
+with tape drives. @xref{Media}, for complete information on using
+@command{tar} archives with tape drives.
+
+@FIXME{this is a cop out. need to add some simple tape drive info.}
+@end itemize
+
+@node stylistic conventions
+@section Stylistic Conventions
+
+In the examples, @samp{$} represents a typical shell prompt. It
+precedes lines you should type; to make this more clear, those lines are
+shown in @kbd{this font}, as opposed to lines which represent the
+computer's response; those lines are shown in @code{this font}, or
+sometimes @samp{like this}.
+
+@c When we have lines which are too long to be
+@c displayed in any other way, we will show them like this:
+
+@node basic tar options
+@section Basic @command{tar} Operations and Options
+
+@command{tar} can take a wide variety of arguments which specify and define
+the actions it will have on the particular set of files or the archive.
+The main types of arguments to @command{tar} fall into one of two classes:
+operations, and options.
+
+Some arguments fall into a class called @dfn{operations}; exactly one of
+these is both allowed and required for any instance of using @command{tar};
+you may @emph{not} specify more than one. People sometimes speak of
+@dfn{operating modes}. You are in a particular operating mode when you
+have specified the operation which specifies it; there are eight
+operations in total, and thus there are eight operating modes.
+
+The other arguments fall into the class known as @dfn{options}. You are
+not required to specify any options, and you are allowed to specify more
+than one at a time (depending on the way you are using @command{tar} at
+that time). Some options are used so frequently, and are so useful for
+helping you type commands more carefully that they are effectively
+``required''. We will discuss them in this chapter.
+
+You can write most of the @command{tar} operations and options in any
+of three forms: long (mnemonic) form, short form, and old style. Some
+of the operations and options have no short or ``old'' forms; however,
+the operations and options which we will cover in this tutorial have
+corresponding abbreviations. @FIXME{make sure this is still the case,
+at the end}We will indicate those abbreviations appropriately to get
+you used to seeing them. (Note that the ``old style'' option forms
+exist in @GNUTAR{} for compatibility with Unix
+@command{tar}. In this book we present a full discussion of this way
+of writing options and operations (@pxref{Old Options}), and we discuss
+the other two styles of writing options (@xref{Long Options}, and
+@pxref{Short Options}).
+
+In the examples and in the text of this tutorial, we usually use the
+long forms of operations and options; but the ``short'' forms produce
+the same result and can make typing long @command{tar} commands easier.
+For example, instead of typing
+
+@smallexample
+@kbd{tar --create --verbose --file=afiles.tar apple angst aspic}
+@end smallexample
+
+@noindent
+you can type
+@smallexample
+@kbd{tar -c -v -f afiles.tar apple angst aspic}
+@end smallexample
+
+@noindent
+or even
+@smallexample
+@kbd{tar -cvf afiles.tar apple angst aspic}
+@end smallexample
+
+@noindent
+For more information on option syntax, see @ref{Advanced tar}. In
+discussions in the text, when we name an option by its long form, we
+also give the corresponding short option in parentheses.
+
+The term, ``option'', can be confusing at times, since ``operations''
+are often lumped in with the actual, @emph{optional} ``options'' in certain
+general class statements. For example, we just talked about ``short and
+long forms of options and operations''. However, experienced @command{tar}
+users often refer to these by shorthand terms such as, ``short and long
+options''. This term assumes that the ``operations'' are included, also.
+Context will help you determine which definition of ``options'' to use.
+
+Similarly, the term ``command'' can be confusing, as it is often used in
+two different ways. People sometimes refer to @command{tar} ``commands''.
+A @command{tar} @dfn{command} is the entire command line of user input
+which tells @command{tar} what to do --- including the operation, options,
+and any arguments (file names, pipes, other commands, etc.). However,
+you will also sometimes hear the term ``the @command{tar} command''. When
+the word ``command'' is used specifically like this, a person is usually
+referring to the @command{tar} @emph{operation}, not the whole line.
+Again, use context to figure out which of the meanings the speaker
+intends.
+
+@node frequent operations
+@section The Three Most Frequently Used Operations
+
+Here are the three most frequently used operations (both short and long
+forms), as well as a brief description of their meanings. The rest of
+this chapter will cover how to use these operations in detail. We will
+present the rest of the operations in the next chapter.
+
+@table @option
+@item --create
+@itemx -c
+Create a new @command{tar} archive.
+@item --list
+@itemx -t
+List the contents of an archive.
+@item --extract
+@itemx -x
+Extract one or more members from an archive.
+@end table
+
+@node Two Frequent Options
+@section Two Frequently Used Options
+
+To understand how to run @command{tar} in the three operating modes listed
+previously, you also need to understand how to use two of the options to
+@command{tar}: @option{--file} (which takes an archive file as an argument)
+and @option{--verbose}. (You are usually not @emph{required} to specify
+either of these options when you run @command{tar}, but they can be very
+useful in making things more clear and helping you avoid errors.)
+
+@menu
+* file tutorial::
+* verbose tutorial::
+* help tutorial::
+@end menu
+
+@node file tutorial
+@unnumberedsubsec The @option{--file} Option
+
+@table @option
+@xopindex{file, tutorial}
+@item --file=@var{archive-name}
+@itemx -f @var{archive-name}
+Specify the name of an archive file.
+@end table
+
+You can specify an argument for the @option{--file=@var{archive-name}} (@option{-f @var{archive-name}}) option whenever you
+use @command{tar}; this option determines the name of the archive file
+that @command{tar} will work on.
+
+@vrindex TAPE
+If you don't specify this argument, then @command{tar} will examine
+the environment variable @env{TAPE}. If it is set, its value will be
+used as the archive name. Otherwise, @command{tar} will use the
+default archive, determined at the compile time. Usually it is
+standard output or some physical tape drive attached to your machine
+(you can verify what the default is by running @kbd{tar
+--show-defaults}, @pxref{defaults}). If there is no tape drive
+attached, or the default is not meaningful, then @command{tar} will
+print an error message. The error message might look roughly like one
+of the following:
+
+@smallexample
+tar: can't open /dev/rmt8 : No such device or address
+tar: can't open /dev/rsmt0 : I/O error
+@end smallexample
+
+@noindent
+To avoid confusion, we recommend that you always specify an archive file
+name by using @option{--file=@var{archive-name}} (@option{-f @var{archive-name}}) when writing your @command{tar} commands.
+For more information on using the @option{--file=@var{archive-name}} (@option{-f @var{archive-name}}) option, see
+@ref{file}.
+
+@node verbose tutorial
+@unnumberedsubsec The @option{--verbose} Option
+
+@table @option
+@xopindex{verbose, introduced}
+@item --verbose
+@itemx -v
+Show the files being worked on as @command{tar} is running.
+@end table
+
+@option{--verbose} (@option{-v}) shows details about the results of running
+@command{tar}. This can be especially useful when the results might not be
+obvious. For example, if you want to see the progress of @command{tar} as
+it writes files into the archive, you can use the @option{--verbose}
+option. In the beginning, you may find it useful to use
+@option{--verbose} at all times; when you are more accustomed to
+@command{tar}, you will likely want to use it at certain times but not at
+others. We will use @option{--verbose} at times to help make something
+clear, and we will give many examples both using and not using
+@option{--verbose} to show the differences.
+
+Each instance of @option{--verbose} on the command line increases the
+verbosity level by one, so if you need more details on the output,
+specify it twice.
+
+When reading archives (@option{--list}, @option{--extract},
+@option{--diff}), @command{tar} by default prints only the names of
+the members being extracted. Using @option{--verbose} will show a full,
+@command{ls} style member listing.
+
+In contrast, when writing archives (@option{--create}, @option{--append},
+@option{--update}), @command{tar} does not print file names by
+default. So, a single @option{--verbose} option shows the file names
+being added to the archive, while two @option{--verbose} options
+enable the full listing.
+
+For example, to create an archive in verbose mode:
+
+@smallexample
+$ @kbd{tar -cvf afiles.tar apple angst aspic}
+apple
+angst
+aspic
+@end smallexample
+
+@noindent
+Creating the same archive with the verbosity level 2 could give:
+
+@smallexample
+$ @kbd{tar -cvvf afiles.tar apple angst aspic}
+-rw-r--r-- gray/staff 62373 2006-06-09 12:06 apple
+-rw-r--r-- gray/staff 11481 2006-06-09 12:06 angst
+-rw-r--r-- gray/staff 23152 2006-06-09 12:06 aspic
+@end smallexample
+
+@noindent
+This works equally well using short or long forms of options. Using
+long forms, you would simply write out the mnemonic form of the option
+twice, like this:
+
+@smallexample
+$ @kbd{tar --create --verbose --verbose @dots{}}
+@end smallexample
+
+@noindent
+Note that you must double the hyphens properly each time.
+
+Later in the tutorial, we will give examples using @w{@option{--verbose
+--verbose}}.
+
+@anchor{verbose member listing}
+The full output consists of six fields:
+
+@itemize @bullet
+@item File type and permissions in symbolic form.
+These are displayed in the same format as the first column of
+@command{ls -l} output (@pxref{What information is listed,
+format=verbose, Verbose listing, fileutils, GNU file utilities}).
+
+@item Owner name and group separated by a slash character.
+If these data are not available (for example, when listing a @samp{v7} format
+archive), numeric @acronym{ID} values are printed instead.
+
+@item Size of the file, in bytes.
+
+@item File modification date in ISO 8601 format.
+
+@item File modification time.
+
+@item File name.
+If the name contains any special characters (white space, newlines,
+etc.) these are displayed in an unambiguous form using so called
+@dfn{quoting style}. For the detailed discussion of available styles
+and on how to use them, see @ref{quoting styles}.
+
+Depending on the file type, the name can be followed by some
+additional information, described in the following table:
+
+@table @samp
+@item -> @var{link-name}
+The file or archive member is a @dfn{symbolic link} and
+@var{link-name} is the name of file it links to.
+
+@item link to @var{link-name}
+The file or archive member is a @dfn{hard link} and @var{link-name} is
+the name of file it links to.
+
+@item --Long Link--
+The archive member is an old GNU format long link. You will normally
+not encounter this.
+
+@item --Long Name--
+The archive member is an old GNU format long name. You will normally
+not encounter this.
+
+@item --Volume Header--
+The archive member is a GNU @dfn{volume header} (@pxref{Tape Files}).
+
+@item --Continued at byte @var{n}--
+Encountered only at the beginning of a multi-volume archive
+(@pxref{Using Multiple Tapes}). This archive member is a continuation
+from the previous volume. The number @var{n} gives the offset where
+the original file was split.
+
+@item unknown file type @var{c}
+An archive member of unknown type. @var{c} is the type character from
+the archive header. If you encounter such a message, it means that
+either your archive contains proprietary member types @GNUTAR{} is not
+able to handle, or the archive is corrupted.
+@end table
+
+@end itemize
+
+For example, here is an archive listing containing most of the special
+suffixes explained above:
+
+@smallexample
+@group
+V--------- 0/0 1536 2006-06-09 13:07 MyVolume--Volume Header--
+-rw-r--r-- gray/staff 456783 2006-06-09 12:06 aspic--Continued at
+byte 32456--
+-rw-r--r-- gray/staff 62373 2006-06-09 12:06 apple
+lrwxrwxrwx gray/staff 0 2006-06-09 13:01 angst -> apple
+-rw-r--r-- gray/staff 35793 2006-06-09 12:06 blues
+hrw-r--r-- gray/staff 0 2006-06-09 12:06 music link to blues
+@end group
+@end smallexample
+
+@smallexample
+@end smallexample
+
+@node help tutorial
+@unnumberedsubsec Getting Help: Using the @option{--help} Option
+
+@table @option
+@opindex help
+@item --help
+
+The @option{--help} option to @command{tar} prints out a very brief list of
+all operations and option available for the current version of
+@command{tar} available on your system.
+@end table
+
+@node create
+@section How to Create Archives
+@UNREVISED
+
+@cindex Creation of the archive
+@cindex Archive, creation of
+One of the basic operations of @command{tar} is @option{--create} (@option{-c}), which
+you use to create a @command{tar} archive. We will explain
+@option{--create} first because, in order to learn about the other
+operations, you will find it useful to have an archive available to
+practice on.
+
+To make this easier, in this section you will first create a directory
+containing three files. Then, we will show you how to create an
+@emph{archive} (inside the new directory). Both the directory, and
+the archive are specifically for you to practice on. The rest of this
+chapter and the next chapter will show many examples using this
+directory and the files you will create: some of those files may be
+other directories and other archives.
+
+The three files you will archive in this example are called
+@file{blues}, @file{folk}, and @file{jazz}. The archive is called
+@file{collection.tar}.
+
+This section will proceed slowly, detailing how to use @option{--create}
+in @code{verbose} mode, and showing examples using both short and long
+forms. In the rest of the tutorial, and in the examples in the next
+chapter, we will proceed at a slightly quicker pace. This section
+moves more slowly to allow beginning users to understand how
+@command{tar} works.
+
+@menu
+* prepare for examples::
+* Creating the archive::
+* create verbose::
+* short create::
+* create dir::
+@end menu
+
+@node prepare for examples
+@subsection Preparing a Practice Directory for Examples
+
+To follow along with this and future examples, create a new directory
+called @file{practice} containing files called @file{blues}, @file{folk}
+and @file{jazz}. The files can contain any information you like:
+ideally, they should contain information which relates to their names,
+and be of different lengths. Our examples assume that @file{practice}
+is a subdirectory of your home directory.
+
+Now @command{cd} to the directory named @file{practice}; @file{practice}
+is now your @dfn{working directory}. (@emph{Please note}: Although
+the full file name of this directory is
+@file{/@var{homedir}/practice}, in our examples we will refer to
+this directory as @file{practice}; the @var{homedir} is presumed.
+
+In general, you should check that the files to be archived exist where
+you think they do (in the working directory) by running @command{ls}.
+Because you just created the directory and the files and have changed to
+that directory, you probably don't need to do that this time.
+
+It is very important to make sure there isn't already a file in the
+working directory with the archive name you intend to use (in this case,
+@samp{collection.tar}), or that you don't care about its contents.
+Whenever you use @samp{create}, @command{tar} will erase the current
+contents of the file named by @option{--file=@var{archive-name}} (@option{-f @var{archive-name}}) if it exists. @command{tar}
+will not tell you if you are about to overwrite an archive unless you
+specify an option which does this (@pxref{backup}, for the
+information on how to do so). To add files to an existing archive,
+you need to use a different option, such as @option{--append} (@option{-r}); see
+@ref{append} for information on how to do this.
+
+@node Creating the archive
+@subsection Creating the Archive
+
+@xopindex{create, introduced}
+To place the files @file{blues}, @file{folk}, and @file{jazz} into an
+archive named @file{collection.tar}, use the following command:
+
+@smallexample
+$ @kbd{tar --create --file=collection.tar blues folk jazz}
+@end smallexample
+
+The order of the arguments is not very important, @emph{when using long
+option forms}. You could also say:
+
+@smallexample
+$ @kbd{tar blues --create folk --file=collection.tar jazz}
+@end smallexample
+
+@noindent
+However, you can see that this order is harder to understand; this is
+why we will list the arguments in the order that makes the commands
+easiest to understand (and we encourage you to do the same when you use
+@command{tar}, to avoid errors).
+
+Note that the sequence
+@option{--file=@-collection.tar} is considered to be @emph{one} argument.
+If you substituted any other string of characters for
+@kbd{collection.tar}, then that string would become the name of the
+archive file you create.
+
+The order of the options becomes more important when you begin to use
+short forms. With short forms, if you type commands in the wrong order
+(even if you type them correctly in all other ways), you may end up with
+results you don't expect. For this reason, it is a good idea to get
+into the habit of typing options in the order that makes inherent sense.
+@xref{short create}, for more information on this.
+
+In this example, you type the command as shown above: @option{--create}
+is the operation which creates the new archive
+(@file{collection.tar}), and @option{--file} is the option which lets
+you give it the name you chose. The files, @file{blues}, @file{folk},
+and @file{jazz}, are now members of the archive, @file{collection.tar}
+(they are @dfn{file name arguments} to the @option{--create} operation.
+@xref{Choosing}, for the detailed discussion on these.) Now that they are
+in the archive, they are called @emph{archive members}, not files.
+(@pxref{Definitions,members}).
+
+When you create an archive, you @emph{must} specify which files you
+want placed in the archive. If you do not specify any archive
+members, @GNUTAR{} will complain.
+
+If you now list the contents of the working directory (@command{ls}), you will
+find the archive file listed as well as the files you saw previously:
+
+@smallexample
+blues folk jazz collection.tar
+@end smallexample
+
+@noindent
+Creating the archive @samp{collection.tar} did not destroy the copies of
+the files in the directory.
+
+Keep in mind that if you don't indicate an operation, @command{tar} will not
+run and will prompt you for one. If you don't name any files, @command{tar}
+will complain. You must have write access to the working directory,
+or else you will not be able to create an archive in that directory.
+
+@emph{Caution}: Do not attempt to use @option{--create} (@option{-c}) to add files to
+an existing archive; it will delete the archive and write a new one.
+Use @option{--append} (@option{-r}) instead. @xref{append}.
+
+@node create verbose
+@subsection Running @option{--create} with @option{--verbose}
+
+@xopindex{create, using with @option{--verbose}}
+@xopindex{verbose, using with @option{--create}}
+If you include the @option{--verbose} (@option{-v}) option on the command line,
+@command{tar} will list the files it is acting on as it is working. In
+verbose mode, the @code{create} example above would appear as:
+
+@smallexample
+$ @kbd{tar --create --verbose --file=collection.tar blues folk jazz}
+blues
+folk
+jazz
+@end smallexample
+
+This example is just like the example we showed which did not use
+@option{--verbose}, except that @command{tar} generated the remaining lines
+@iftex
+(note the different font styles).
+@end iftex
+@ifinfo
+.
+@end ifinfo
+
+In the rest of the examples in this chapter, we will frequently use
+@code{verbose} mode so we can show actions or @command{tar} responses that
+you would otherwise not see, and which are important for you to
+understand.
+
+@node short create
+@subsection Short Forms with @samp{create}
+
+As we said before, the @option{--create} (@option{-c}) operation is one of the most
+basic uses of @command{tar}, and you will use it countless times.
+Eventually, you will probably want to use abbreviated (or ``short'')
+forms of options. A full discussion of the three different forms that
+options can take appears in @ref{Styles}; for now, here is what the
+previous example (including the @option{--verbose} (@option{-v}) option) looks like
+using short option forms:
+
+@smallexample
+$ @kbd{tar -cvf collection.tar blues folk jazz}
+blues
+folk
+jazz
+@end smallexample
+
+@noindent
+As you can see, the system responds the same no matter whether you use
+long or short option forms.
+
+@FIXME{i don't like how this is worded:} One difference between using
+short and long option forms is that, although the exact placement of
+arguments following options is no more specific when using short forms,
+it is easier to become confused and make a mistake when using short
+forms. For example, suppose you attempted the above example in the
+following way:
+
+@smallexample
+$ @kbd{tar -cfv collection.tar blues folk jazz}
+@end smallexample
+
+@noindent
+In this case, @command{tar} will make an archive file called @file{v},
+containing the files @file{blues}, @file{folk}, and @file{jazz}, because
+the @samp{v} is the closest ``file name'' to the @option{-f} option, and
+is thus taken to be the chosen archive file name. @command{tar} will try
+to add a file called @file{collection.tar} to the @file{v} archive file;
+if the file @file{collection.tar} did not already exist, @command{tar} will
+report an error indicating that this file does not exist. If the file
+@file{collection.tar} does already exist (e.g., from a previous command
+you may have run), then @command{tar} will add this file to the archive.
+Because the @option{-v} option did not get registered, @command{tar} will not
+run under @samp{verbose} mode, and will not report its progress.
+
+The end result is that you may be quite confused about what happened,
+and possibly overwrite a file. To illustrate this further, we will show
+you how an example we showed previously would look using short forms.
+
+This example,
+
+@smallexample
+$ @kbd{tar blues --create folk --file=collection.tar jazz}
+@end smallexample
+
+@noindent
+is confusing as it is. When shown using short forms, however, it
+becomes much more so:
+
+@smallexample
+$ @kbd{tar blues -c folk -f collection.tar jazz}
+@end smallexample
+
+@noindent
+It would be very easy to put the wrong string of characters
+immediately following the @option{-f}, but doing that could sacrifice
+valuable data.
+
+For this reason, we recommend that you pay very careful attention to
+the order of options and placement of file and archive names,
+especially when using short option forms. Not having the option name
+written out mnemonically can affect how well you remember which option
+does what, and therefore where different names have to be placed.
+
+@node create dir
+@subsection Archiving Directories
+
+@cindex Archiving Directories
+@cindex Directories, Archiving
+You can archive a directory by specifying its directory name as a
+file name argument to @command{tar}. The files in the directory will be
+archived relative to the working directory, and the directory will be
+re-created along with its contents when the archive is extracted.
+
+To archive a directory, first move to its superior directory. If you
+have followed the previous instructions in this tutorial, you should
+type:
+
+@smallexample
+$ @kbd{cd ..}
+$
+@end smallexample
+
+@noindent
+This will put you into the directory which contains @file{practice},
+i.e., your home directory. Once in the superior directory, you can
+specify the subdirectory, @file{practice}, as a file name argument. To
+store @file{practice} in the new archive file @file{music.tar}, type:
+
+@smallexample
+$ @kbd{tar --create --verbose --file=music.tar practice}
+@end smallexample
+
+@noindent
+@command{tar} should output:
+
+@smallexample
+practice/
+practice/blues
+practice/folk
+practice/jazz
+practice/collection.tar
+@end smallexample
+
+Note that the archive thus created is not in the subdirectory
+@file{practice}, but rather in the current working directory---the
+directory from which @command{tar} was invoked. Before trying to archive a
+directory from its superior directory, you should make sure you have
+write access to the superior directory itself, not only the directory
+you are trying archive with @command{tar}. For example, you will probably
+not be able to store your home directory in an archive by invoking
+@command{tar} from the root directory; @xref{absolute}. (Note
+also that @file{collection.tar}, the original archive file, has itself
+been archived. @command{tar} will accept any file as a file to be
+archived, regardless of its content. When @file{music.tar} is
+extracted, the archive file @file{collection.tar} will be re-written
+into the file system).
+
+If you give @command{tar} a command such as
+
+@smallexample
+$ @kbd{tar --create --file=foo.tar .}
+@end smallexample
+
+@noindent
+@command{tar} will report @samp{tar: ./foo.tar is the archive; not
+dumped}. This happens because @command{tar} creates the archive
+@file{foo.tar} in the current directory before putting any files into
+it. Then, when @command{tar} attempts to add all the files in the
+directory @file{.} to the archive, it notices that the file
+@file{./foo.tar} is the same as the archive @file{foo.tar}, and skips
+it. (It makes no sense to put an archive into itself.) @GNUTAR{}
+will continue in this case, and create the archive
+normally, except for the exclusion of that one file. (@emph{Please
+note:} Other implementations of @command{tar} may not be so clever;
+they will enter an infinite loop when this happens, so you should not
+depend on this behavior unless you are certain you are running
+@GNUTAR{}. In general, it is wise to always place the archive outside
+of the directory being dumped.
+
+@node list
+@section How to List Archives
+
+@opindex list
+Frequently, you will find yourself wanting to determine exactly what a
+particular archive contains. You can use the @option{--list}
+(@option{-t}) operation to get the member names as they currently
+appear in the archive, as well as various attributes of the files at
+the time they were archived. For example, you can examine the archive
+@file{collection.tar} that you created in the last section with the
+command,
+
+@smallexample
+$ @kbd{tar --list --file=collection.tar}
+@end smallexample
+
+@noindent
+The output of @command{tar} would then be:
+
+@smallexample
+blues
+folk
+jazz
+@end smallexample
+
+@noindent
+The archive @file{bfiles.tar} would list as follows:
+
+@smallexample
+./birds
+baboon
+./box
+@end smallexample
+
+@noindent
+Be sure to use a @option{--file=@var{archive-name}} (@option{-f
+@var{archive-name}}) option just as with @option{--create}
+(@option{-c}) to specify the name of the archive.
+
+@xopindex{list, using with @option{--verbose}}
+@xopindex{verbose, using with @option{--list}}
+If you use the @option{--verbose} (@option{-v}) option with
+@option{--list}, then @command{tar} will print out a listing
+reminiscent of @w{@samp{ls -l}}, showing owner, file size, and so
+forth. This output is described in detail in @ref{verbose member listing}.
+
+If you had used @option{--verbose} (@option{-v}) mode, the example
+above would look like:
+
+@smallexample
+$ @kbd{tar --list --verbose --file=collection.tar folk}
+-rw-r--r-- myself user 62 1990-05-23 10:55 folk
+@end smallexample
+
+@cindex listing member and file names
+@anchor{listing member and file names}
+It is important to notice that the output of @kbd{tar --list
+--verbose} does not necessarily match that produced by @kbd{tar
+--create --verbose} while creating the archive. It is because
+@GNUTAR{}, unless told explicitly not to do so, removes some directory
+prefixes from file names before storing them in the archive
+(@xref{absolute}, for more information). In other
+words, in verbose mode @GNUTAR{} shows @dfn{file names} when creating
+an archive and @dfn{member names} when listing it. Consider this
+example:
+
+@smallexample
+@group
+$ @kbd{tar cfv archive /etc/mail}
+tar: Removing leading `/' from member names
+/etc/mail/
+/etc/mail/sendmail.cf
+/etc/mail/aliases
+$ @kbd{tar tf archive}
+etc/mail/
+etc/mail/sendmail.cf
+etc/mail/aliases
+@end group
+@end smallexample
+
+@opindex show-stored-names
+ This default behavior can sometimes be inconvenient. You can force
+@GNUTAR{} show member names when creating archive by supplying
+@option{--show-stored-names} option.
+
+@table @option
+@item --show-stored-names
+Print member (as opposed to @emph{file}) names when creating the archive.
+@end table
+
+@cindex File name arguments, using @option{--list} with
+@xopindex{list, using with file name arguments}
+You can specify one or more individual member names as arguments when
+using @samp{list}. In this case, @command{tar} will only list the
+names of members you identify. For example, @w{@kbd{tar --list
+--file=afiles.tar apple}} would only print @file{apple}.
+
+Because @command{tar} preserves file names, these must be specified as
+they appear in the archive (i.e., relative to the directory from which
+the archive was created). Therefore, it is essential when specifying
+member names to @command{tar} that you give the exact member names.
+For example, @w{@kbd{tar --list --file=bfiles.tar birds}} would produce an
+error message something like @samp{tar: birds: Not found in archive},
+because there is no member named @file{birds}, only one named
+@file{./birds}. While the names @file{birds} and @file{./birds} name
+the same file, @emph{member} names by default are compared verbatim.
+
+However, @w{@kbd{tar --list --file=bfiles.tar baboon}} would respond
+with @file{baboon}, because this exact member name is in the archive file
+@file{bfiles.tar}. If you are not sure of the exact file name,
+use @dfn{globbing patterns}, for example:
+
+@smallexample
+$ @kbd{tar --list --file=bfiles.tar --wildcards '*b*'}
+@end smallexample
+
+@noindent
+will list all members whose name contains @samp{b}. @xref{wildcards},
+for a detailed discussion of globbing patterns and related
+@command{tar} command line options.
+
+@menu
+* list dir::
+@end menu
+
+@node list dir
+@unnumberedsubsec Listing the Contents of a Stored Directory
+
+To get information about the contents of an archived directory,
+use the directory name as a file name argument in conjunction with
+@option{--list} (@option{-t}). To find out file attributes, include the
+@option{--verbose} (@option{-v}) option.
+
+For example, to find out about files in the directory @file{practice}, in
+the archive file @file{music.tar}, type:
+
+@smallexample
+$ @kbd{tar --list --verbose --file=music.tar practice}
+@end smallexample
+
+@command{tar} responds:
+
+@smallexample
+drwxrwxrwx myself user 0 1990-05-31 21:49 practice/
+-rw-r--r-- myself user 42 1990-05-21 13:29 practice/blues
+-rw-r--r-- myself user 62 1990-05-23 10:55 practice/folk
+-rw-r--r-- myself user 40 1990-05-21 13:30 practice/jazz
+-rw-r--r-- myself user 10240 1990-05-31 21:49 practice/collection.tar
+@end smallexample
+
+When you use a directory name as a file name argument, @command{tar} acts on
+all the files (including sub-directories) in that directory.
+
+@node extract
+@section How to Extract Members from an Archive
+@UNREVISED
+@cindex Extraction
+@cindex Retrieving files from an archive
+@cindex Resurrecting files from an archive
+
+@opindex extract
+Creating an archive is only half the job---there is no point in storing
+files in an archive if you can't retrieve them. The act of retrieving
+members from an archive so they can be used and manipulated as
+unarchived files again is called @dfn{extraction}. To extract files
+from an archive, use the @option{--extract} (@option{--get} or
+@option{-x}) operation. As with @option{--create}, specify the name
+of the archive with @option{--file} (@option{-f}) option. Extracting
+an archive does not modify the archive in any way; you can extract it
+multiple times if you want or need to.
+
+Using @option{--extract}, you can extract an entire archive, or specific
+files. The files can be directories containing other files, or not. As
+with @option{--create} (@option{-c}) and @option{--list} (@option{-t}), you may use the short or the
+long form of the operation without affecting the performance.
+
+@menu
+* extracting archives::
+* extracting files::
+* extract dir::
+* extracting untrusted archives::
+* failing commands::
+@end menu
+
+@node extracting archives
+@subsection Extracting an Entire Archive
+
+To extract an entire archive, specify the archive file name only, with
+no individual file names as arguments. For example,
+
+@smallexample
+$ @kbd{tar -xvf collection.tar}
+@end smallexample
+
+@noindent
+produces this:
+
+@smallexample
+-rw-r--r-- me user 28 1996-10-18 16:31 jazz
+-rw-r--r-- me user 21 1996-09-23 16:44 blues
+-rw-r--r-- me user 20 1996-09-23 16:44 folk
+@end smallexample
+
+@node extracting files
+@subsection Extracting Specific Files
+
+To extract specific archive members, give their exact member names as
+arguments, as printed by @option{--list} (@option{-t}). If you had
+mistakenly deleted one of the files you had placed in the archive
+@file{collection.tar} earlier (say, @file{blues}), you can extract it
+from the archive without changing the archive's structure. Its
+contents will be identical to the original file @file{blues} that you
+deleted.
+
+First, make sure you are in the @file{practice} directory, and list the
+files in the directory. Now, delete the file, @samp{blues}, and list
+the files in the directory again.
+
+You can now extract the member @file{blues} from the archive file
+@file{collection.tar} like this:
+
+@smallexample
+$ @kbd{tar --extract --file=collection.tar blues}
+@end smallexample
+
+@noindent
+If you list the files in the directory again, you will see that the file
+@file{blues} has been restored, with its original permissions, data
+modification times, and owner.@footnote{This is only accidentally
+true, but not in general. Whereas modification times are always
+restored, in most cases, one has to be root for restoring the owner,
+and use a special option for restoring permissions. Here, it just
+happens that the restoring user is also the owner of the archived
+members, and that the current @code{umask} is compatible with original
+permissions.} (These parameters will be identical to those which
+the file had when you originally placed it in the archive; any changes
+you may have made before deleting the file from the file system,
+however, will @emph{not} have been made to the archive member.) The
+archive file, @samp{collection.tar}, is the same as it was before you
+extracted @samp{blues}. You can confirm this by running @command{tar} with
+@option{--list} (@option{-t}).
+
+Remember that as with other operations, specifying the exact member
+name is important. @w{@kbd{tar --extract --file=bfiles.tar birds}}
+will fail, because there is no member named @file{birds}. To extract
+the member named @file{./birds}, you must specify @w{@kbd{tar
+--extract --file=bfiles.tar ./birds}}. If you don't remember the
+exact member names, use @option{--list} (@option{-t}) option
+(@pxref{list}). You can also extract those members that match a
+specific @dfn{globbing pattern}. For example, to extract from
+@file{bfiles.tar} all files that begin with @samp{b}, no matter their
+directory prefix, you could type:
+
+@smallexample
+$ @kbd{tar -x -f bfiles.tar --wildcards --no-anchored 'b*'}
+@end smallexample
+
+@noindent
+Here, @option{--wildcards} instructs @command{tar} to treat
+command line arguments as globbing patterns and @option{--no-anchored}
+informs it that the patterns apply to member names after any @samp{/}
+delimiter. The use of globbing patterns is discussed in detail in
+@xref{wildcards}.
+
+You can extract a file to standard output by combining the above options
+with the @option{--to-stdout} (@option{-O}) option (@pxref{Writing to Standard
+Output}).
+
+If you give the @option{--verbose} option, then @option{--extract}
+will print the names of the archive members as it extracts them.
+
+@node extract dir
+@subsection Extracting Files that are Directories
+
+Extracting directories which are members of an archive is similar to
+extracting other files. The main difference to be aware of is that if
+the extracted directory has the same name as any directory already in
+the working directory, then files in the extracted directory will be
+placed into the directory of the same name. Likewise, if there are
+files in the pre-existing directory with the same names as the members
+which you extract, the files from the extracted archive will replace
+the files already in the working directory (and possible
+subdirectories). This will happen regardless of whether or not the
+files in the working directory were more recent than those extracted
+(there exist, however, special options that alter this behavior
+@pxref{Writing}).
+
+However, if a file was stored with a directory name as part of its file
+name, and that directory does not exist under the working directory when
+the file is extracted, @command{tar} will create the directory.
+
+We can demonstrate how to use @option{--extract} to extract a directory
+file with an example. Change to the @file{practice} directory if you
+weren't there, and remove the files @file{folk} and @file{jazz}. Then,
+go back to the parent directory and extract the archive
+@file{music.tar}. You may either extract the entire archive, or you may
+extract only the files you just deleted. To extract the entire archive,
+don't give any file names as arguments after the archive name
+@file{music.tar}. To extract only the files you deleted, use the
+following command:
+
+@smallexample
+$ @kbd{tar -xvf music.tar practice/folk practice/jazz}
+practice/folk
+practice/jazz
+@end smallexample
+
+@noindent
+If you were to specify two @option{--verbose} (@option{-v}) options, @command{tar}
+would have displayed more detail about the extracted files, as shown
+in the example below:
+
+@smallexample
+$ @kbd{tar -xvvf music.tar practice/folk practice/jazz}
+-rw-r--r-- me user 28 1996-10-18 16:31 practice/jazz
+-rw-r--r-- me user 20 1996-09-23 16:44 practice/folk
+@end smallexample
+
+@noindent
+Because you created the directory with @file{practice} as part of the
+file names of each of the files by archiving the @file{practice}
+directory as @file{practice}, you must give @file{practice} as part
+of the file names when you extract those files from the archive.
+
+@node extracting untrusted archives
+@subsection Extracting Archives from Untrusted Sources
+
+Extracting files from archives can overwrite files that already exist.
+If you receive an archive from an untrusted source, you should make a
+new directory and extract into that directory, so that you don't have
+to worry about the extraction overwriting one of your existing files.
+For example, if @file{untrusted.tar} came from somewhere else on the
+Internet, and you don't necessarily trust its contents, you can
+extract it as follows:
+
+@smallexample
+$ @kbd{mkdir newdir}
+$ @kbd{cd newdir}
+$ @kbd{tar -xvf ../untrusted.tar}
+@end smallexample
+
+It is also a good practice to examine contents of the archive
+before extracting it, using @option{--list} (@option{-t}) option, possibly combined
+with @option{--verbose} (@option{-v}).
+
+@node failing commands
+@subsection Commands That Will Fail
+
+Here are some sample commands you might try which will not work, and why
+they won't work.
+
+If you try to use this command,
+
+@smallexample
+$ @kbd{tar -xvf music.tar folk jazz}
+@end smallexample
+
+@noindent
+you will get the following response:
+
+@smallexample
+tar: folk: Not found in archive
+tar: jazz: Not found in archive
+$
+@end smallexample
+
+@noindent
+This is because these files were not originally @emph{in} the parent
+directory @file{..}, where the archive is located; they were in the
+@file{practice} directory, and their file names reflect this:
+
+@smallexample
+$ @kbd{tar -tvf music.tar}
+practice/folk
+practice/jazz
+practice/rock
+@end smallexample
+
+@FIXME{make sure the above works when going through the examples in
+order...}
+
+@noindent
+Likewise, if you try to use this command,
+
+@smallexample
+$ @kbd{tar -tvf music.tar folk jazz}
+@end smallexample
+
+@noindent
+you would get a similar response. Members with those names are not in the
+archive. You must use the correct member names, or wildcards, in order
+to extract the files from the archive.
+
+If you have forgotten the correct names of the files in the archive,
+use @w{@kbd{tar --list --verbose}} to list them correctly.
+
+@FIXME{more examples, here? hag thinks it's a good idea.}
+
+@node going further
+@section Going Further Ahead in this Manual
+
+@FIXME{need to write up a node here about the things that are going to
+be in the rest of the manual.}
+
+@node tar invocation
+@chapter Invoking @GNUTAR{}
+@UNREVISED
+
+This chapter is about how one invokes the @GNUTAR{}
+command, from the command synopsis (@pxref{Synopsis}). There are
+numerous options, and many styles for writing them. One mandatory
+option specifies the operation @command{tar} should perform
+(@pxref{Operation Summary}), other options are meant to detail how
+this operation should be performed (@pxref{Option Summary}).
+Non-option arguments are not always interpreted the same way,
+depending on what the operation is.
+
+You will find in this chapter everything about option styles and rules for
+writing them (@pxref{Styles}). On the other hand, operations and options
+are fully described elsewhere, in other chapters. Here, you will find
+only synthetic descriptions for operations and options, together with
+pointers to other parts of the @command{tar} manual.
+
+Some options are so special they are fully described right in this
+chapter. They have the effect of inhibiting the normal operation of
+@command{tar} or else, they globally alter the amount of feedback the user
+receives about what is going on. These are the @option{--help} and
+@option{--version} (@pxref{help}), @option{--verbose} (@pxref{verbose})
+and @option{--interactive} options (@pxref{interactive}).
+
+@menu
+* Synopsis::
+* using tar options::
+* Styles::
+* All Options::
+* help::
+* defaults::
+* verbose::
+* interactive::
+@end menu
+
+@node Synopsis
+@section General Synopsis of @command{tar}
+
+The @GNUTAR{} program is invoked as either one of:
+
+@smallexample
+@kbd{tar @var{option}@dots{} [@var{name}]@dots{}}
+@kbd{tar @var{letter}@dots{} [@var{argument}]@dots{} [@var{option}]@dots{} [@var{name}]@dots{}}
+@end smallexample
+
+The second form is for when old options are being used.
+
+You can use @command{tar} to store files in an archive, to extract them from
+an archive, and to do other types of archive manipulation. The primary
+argument to @command{tar}, which is called the @dfn{operation}, specifies
+which action to take. The other arguments to @command{tar} are either
+@dfn{options}, which change the way @command{tar} performs an operation,
+or file names or archive members, which specify the files or members
+@command{tar} is to act on.
+
+You can actually type in arguments in any order, even if in this manual
+the options always precede the other arguments, to make examples easier
+to understand. Further, the option stating the main operation mode
+(the @command{tar} main command) is usually given first.
+
+Each @var{name} in the synopsis above is interpreted as an archive member
+name when the main command is one of @option{--compare}
+(@option{--diff}, @option{-d}), @option{--delete}, @option{--extract}
+(@option{--get}, @option{-x}), @option{--list} (@option{-t}) or
+@option{--update} (@option{-u}). When naming archive members, you
+must give the exact name of the member in the archive, as it is
+printed by @option{--list}. For @option{--append} (@option{-r}) and
+@option{--create} (@option{-c}), these @var{name} arguments specify
+the names of either files or directory hierarchies to place in the archive.
+These files or hierarchies should already exist in the file system,
+prior to the execution of the @command{tar} command.
+
+@command{tar} interprets relative file names as being relative to the
+working directory. @command{tar} will make all file names relative
+(by removing leading slashes when archiving or restoring files),
+unless you specify otherwise (using the @option{--absolute-names}
+option). @xref{absolute}, for more information about
+@option{--absolute-names}.
+
+If you give the name of a directory as either a file name or a member
+name, then @command{tar} acts recursively on all the files and directories
+beneath that directory. For example, the name @file{/} identifies all
+the files in the file system to @command{tar}.
+
+The distinction between file names and archive member names is especially
+important when shell globbing is used, and sometimes a source of confusion
+for newcomers. @xref{wildcards}, for more information about globbing.
+The problem is that shells may only glob using existing files in the
+file system. Only @command{tar} itself may glob on archive members, so when
+needed, you must ensure that wildcard characters reach @command{tar} without
+being interpreted by the shell first. Using a backslash before @samp{*}
+or @samp{?}, or putting the whole argument between quotes, is usually
+sufficient for this.
+
+Even if @var{name}s are often specified on the command line, they
+can also be read from a text file in the file system, using the
+@option{--files-from=@var{file-of-names}} (@option{-T @var{file-of-names}}) option.
+
+If you don't use any file name arguments, @option{--append} (@option{-r}),
+@option{--delete} and @option{--concatenate} (@option{--catenate},
+@option{-A}) will do nothing, while @option{--create} (@option{-c})
+will usually yield a diagnostic and inhibit @command{tar} execution.
+The other operations of @command{tar} (@option{--list},
+@option{--extract}, @option{--compare}, and @option{--update})
+will act on the entire contents of the archive.
+
+@cindex exit status
+@cindex return status
+Besides successful exits, @GNUTAR{} may fail for
+many reasons. Some reasons correspond to bad usage, that is, when the
+@command{tar} command is improperly written. Errors may be
+encountered later, while encountering an error processing the archive
+or the files. Some errors are recoverable, in which case the failure
+is delayed until @command{tar} has completed all its work. Some
+errors are such that it would not meaningful, or at least risky, to
+continue processing: @command{tar} then aborts processing immediately.
+All abnormal exits, whether immediate or delayed, should always be
+clearly diagnosed on @code{stderr}, after a line stating the nature of
+the error.
+
+Possible exit codes of @GNUTAR{} are summarized in the following
+table:
+
+@table @asis
+@item 0
+@samp{Successful termination}.
+
+@item 1
+@samp{Some files differ}. If tar was invoked with @option{--compare}
+(@option{--diff}, @option{-d}) command line option, this means that
+some files in the archive differ from their disk counterparts
+(@pxref{compare}). If tar was given @option{--create},
+@option{--append} or @option{--update} option, this exit code means
+that some files were changed while being archived and so the resulting
+archive does not contain the exact copy of the file set.
+
+@item 2
+@samp{Fatal error}. This means that some fatal, unrecoverable error
+occurred.
+@end table
+
+If @command{tar} has invoked a subprocess and that subprocess exited with a
+nonzero exit code, @command{tar} exits with that code as well.
+This can happen, for example, if @command{tar} was given some
+compression option (@pxref{gzip}) and the external compressor program
+failed. Another example is @command{rmt} failure during backup to the
+remote device (@pxref{Remote Tape Server}).
+
+@node using tar options
+@section Using @command{tar} Options
+
+@GNUTAR{} has a total of eight operating modes which
+allow you to perform a variety of tasks. You are required to choose
+one operating mode each time you employ the @command{tar} program by
+specifying one, and only one operation as an argument to the
+@command{tar} command (two lists of four operations each may be found
+at @ref{frequent operations} and @ref{Operations}). Depending on
+circumstances, you may also wish to customize how the chosen operating
+mode behaves. For example, you may wish to change the way the output
+looks, or the format of the files that you wish to archive may require
+you to do something special in order to make the archive look right.
+
+You can customize and control @command{tar}'s performance by running
+@command{tar} with one or more options (such as @option{--verbose}
+(@option{-v}), which we used in the tutorial). As we said in the
+tutorial, @dfn{options} are arguments to @command{tar} which are (as
+their name suggests) optional. Depending on the operating mode, you
+may specify one or more options. Different options will have different
+effects, but in general they all change details of the operation, such
+as archive format, archive name, or level of user interaction. Some
+options make sense with all operating modes, while others are
+meaningful only with particular modes. You will likely use some
+options frequently, while you will only use others infrequently, or
+not at all. (A full list of options is available in @pxref{All Options}.)
+
+@vrindex TAR_OPTIONS, environment variable
+@anchor{TAR_OPTIONS}
+The @env{TAR_OPTIONS} environment variable specifies default options to
+be placed in front of any explicit options. For example, if
+@code{TAR_OPTIONS} is @samp{-v --unlink-first}, @command{tar} behaves as
+if the two options @option{-v} and @option{--unlink-first} had been
+specified before any explicit options. Option specifications are
+separated by whitespace. A backslash escapes the next character, so it
+can be used to specify an option containing whitespace or a backslash.
+
+Note that @command{tar} options are case sensitive. For example, the
+options @option{-T} and @option{-t} are different; the first requires an
+argument for stating the name of a file providing a list of @var{name}s,
+while the second does not require an argument and is another way to
+write @option{--list} (@option{-t}).
+
+In addition to the eight operations, there are many options to
+@command{tar}, and three different styles for writing both: long (mnemonic)
+form, short form, and old style. These styles are discussed below.
+Both the options and the operations can be written in any of these three
+styles.
+
+@FIXME{menu at end of this node. need to think of an actual outline
+for this chapter; probably do that after stuff from chapter 4 is
+incorporated.}
+
+@node Styles
+@section The Three Option Styles
+
+There are three styles for writing operations and options to the command
+line invoking @command{tar}. The different styles were developed at
+different times during the history of @command{tar}. These styles will be
+presented below, from the most recent to the oldest.
+
+Some options must take an argument. (For example, @option{--file}
+(@option{-f})) takes the name of an archive file as an argument. If
+you do not supply an archive file name, @command{tar} will use a
+default, but this can be confusing; thus, we recommend that you always
+supply a specific archive file name.) Where you @emph{place} the
+arguments generally depends on which style of options you choose. We
+will detail specific information relevant to each option style in the
+sections on the different option styles, below. The differences are
+subtle, yet can often be very important; incorrect option placement
+can cause you to overwrite a number of important files. We urge you
+to note these differences, and only use the option style(s) which
+makes the most sense to you until you feel comfortable with the others.
+
+Some options @emph{may} take an argument. Such options may have at
+most long and short forms, they do not have old style equivalent. The
+rules for specifying an argument for such options are stricter than
+those for specifying mandatory arguments. Please, pay special
+attention to them.
+
+@menu
+* Long Options:: Long Option Style
+* Short Options:: Short Option Style
+* Old Options:: Old Option Style
+* Mixing:: Mixing Option Styles
+@end menu
+
+@node Long Options
+@subsection Long Option Style
+
+Each option has at least one @dfn{long} (or @dfn{mnemonic}) name starting with two
+dashes in a row, e.g., @option{--list}. The long names are more clear than
+their corresponding short or old names. It sometimes happens that a
+single long option has many different names which are
+synonymous, such as @option{--compare} and @option{--diff}. In addition,
+long option names can be given unique abbreviations. For example,
+@option{--cre} can be used in place of @option{--create} because there is no
+other long option which begins with @samp{cre}. (One way to find
+this out is by trying it and seeing what happens; if a particular
+abbreviation could represent more than one option, @command{tar} will tell
+you that that abbreviation is ambiguous and you'll know that that
+abbreviation won't work. You may also choose to run @samp{tar --help}
+to see a list of options. Be aware that if you run @command{tar} with a
+unique abbreviation for the long name of an option you didn't want to
+use, you are stuck; @command{tar} will perform the command as ordered.)
+
+Long options are meant to be obvious and easy to remember, and their
+meanings are generally easier to discern than those of their
+corresponding short options (see below). For example:
+
+@smallexample
+$ @kbd{tar --create --verbose --blocking-factor=20 --file=/dev/rmt0}
+@end smallexample
+
+@noindent
+gives a fairly good set of hints about what the command does, even
+for those not fully acquainted with @command{tar}.
+
+Long options which require arguments take those arguments
+immediately following the option name. There are two ways of
+specifying a mandatory argument. It can be separated from the
+option name either by an equal sign, or by any amount of
+white space characters. For example, the @option{--file} option (which
+tells the name of the @command{tar} archive) is given a file such as
+@file{archive.tar} as argument by using any of the following notations:
+@option{--file=archive.tar} or @option{--file archive.tar}.
+
+In contrast, optional arguments must always be introduced using
+an equal sign. For example, the @option{--backup} option takes
+an optional argument specifying backup type. It must be used
+as @option{--backup=@var{backup-type}}.
+
+@node Short Options
+@subsection Short Option Style
+
+Most options also have a @dfn{short option} name. Short options start with
+a single dash, and are followed by a single character, e.g., @option{-t}
+(which is equivalent to @option{--list}). The forms are absolutely
+identical in function; they are interchangeable.
+
+The short option names are faster to type than long option names.
+
+Short options which require arguments take their arguments immediately
+following the option, usually separated by white space. It is also
+possible to stick the argument right after the short option name, using
+no intervening space. For example, you might write @w{@option{-f
+archive.tar}} or @option{-farchive.tar} instead of using
+@option{--file=archive.tar}. Both @option{--file=@var{archive-name}} and
+@w{@option{-f @var{archive-name}}} denote the option which indicates a
+specific archive, here named @file{archive.tar}.
+
+Short options which take optional arguments take their arguments
+immediately following the option letter, @emph{without any intervening
+white space characters}.
+
+Short options' letters may be clumped together, but you are not
+required to do this (as compared to old options; see below). When
+short options are clumped as a set, use one (single) dash for them
+all, e.g., @w{@samp{@command{tar} -cvf}}. Only the last option in
+such a set is allowed to have an argument@footnote{Clustering many
+options, the last of which has an argument, is a rather opaque way to
+write options. Some wonder if @acronym{GNU} @code{getopt} should not
+even be made helpful enough for considering such usages as invalid.}.
+
+When the options are separated, the argument for each option which requires
+an argument directly follows that option, as is usual for Unix programs.
+For example:
+
+@smallexample
+$ @kbd{tar -c -v -b 20 -f /dev/rmt0}
+@end smallexample
+
+If you reorder short options' locations, be sure to move any arguments
+that belong to them. If you do not move the arguments properly, you may
+end up overwriting files.
+
+@node Old Options
+@subsection Old Option Style
+@UNREVISED
+
+Like short options, @dfn{old options} are single letters. However, old options
+must be written together as a single clumped set, without spaces separating
+them or dashes preceding them@footnote{Beware that if you precede options
+with a dash, you are announcing the short option style instead of the
+old option style; short options are decoded differently.}. This set
+of letters must be the first to appear on the command line, after the
+@command{tar} program name and some white space; old options cannot appear
+anywhere else. The letter of an old option is exactly the same letter as
+the corresponding short option. For example, the old option @samp{t} is
+the same as the short option @option{-t}, and consequently, the same as the
+long option @option{--list}. So for example, the command @w{@samp{tar
+cv}} specifies the option @option{-v} in addition to the operation @option{-c}.
+
+When options that need arguments are given together with the command,
+all the associated arguments follow, in the same order as the options.
+Thus, the example given previously could also be written in the old
+style as follows:
+
+@smallexample
+$ @kbd{tar cvbf 20 /dev/rmt0}
+@end smallexample
+
+@noindent
+Here, @samp{20} is the argument of @option{-b} and @samp{/dev/rmt0} is
+the argument of @option{-f}.
+
+On the other hand, this old style syntax makes it difficult to match
+option letters with their corresponding arguments, and is often
+confusing. In the command @w{@samp{tar cvbf 20 /dev/rmt0}}, for example,
+@samp{20} is the argument for @option{-b}, @samp{/dev/rmt0} is the
+argument for @option{-f}, and @option{-v} does not have a corresponding
+argument. Even using short options like in @w{@samp{tar -c -v -b 20 -f
+/dev/rmt0}} is clearer, putting all arguments next to the option they
+pertain to.
+
+If you want to reorder the letters in the old option argument, be
+sure to reorder any corresponding argument appropriately.
+
+This old way of writing @command{tar} options can surprise even experienced
+users. For example, the two commands:
+
+@smallexample
+@kbd{tar cfz archive.tar.gz file}
+@kbd{tar -cfz archive.tar.gz file}
+@end smallexample
+
+@noindent
+are quite different. The first example uses @file{archive.tar.gz} as
+the value for option @samp{f} and recognizes the option @samp{z}. The
+second example, however, uses @file{z} as the value for option
+@samp{f} --- probably not what was intended.
+
+Old options are kept for compatibility with old versions of @command{tar}.
+
+This second example could be corrected in many ways, among which the
+following are equivalent:
+
+@smallexample
+@kbd{tar -czf archive.tar.gz file}
+@kbd{tar -cf archive.tar.gz -z file}
+@kbd{tar cf archive.tar.gz -z file}
+@end smallexample
+
+@cindex option syntax, traditional
+As far as we know, all @command{tar} programs, @acronym{GNU} and
+non-@acronym{GNU}, support old options. @GNUTAR{}
+supports them not only for historical reasons, but also because many
+people are used to them. For compatibility with Unix @command{tar},
+the first argument is always treated as containing command and option
+letters even if it doesn't start with @samp{-}. Thus, @samp{tar c} is
+equivalent to @w{@samp{tar -c}:} both of them specify the
+@option{--create} (@option{-c}) command to create an archive.
+
+@node Mixing
+@subsection Mixing Option Styles
+
+All three styles may be intermixed in a single @command{tar} command,
+so long as the rules for each style are fully
+respected@footnote{Before @GNUTAR{} version 1.11.6,
+a bug prevented intermixing old style options with long options in
+some cases.}. Old style options and either of the modern styles of
+options may be mixed within a single @command{tar} command. However,
+old style options must be introduced as the first arguments only,
+following the rule for old options (old options must appear directly
+after the @command{tar} command and some white space). Modern options
+may be given only after all arguments to the old options have been
+collected. If this rule is not respected, a modern option might be
+falsely interpreted as the value of the argument to one of the old
+style options.
+
+For example, all the following commands are wholly equivalent, and
+illustrate the many combinations and orderings of option styles.
+
+@smallexample
+@kbd{tar --create --file=archive.tar}
+@kbd{tar --create -f archive.tar}
+@kbd{tar --create -farchive.tar}
+@kbd{tar --file=archive.tar --create}
+@kbd{tar --file=archive.tar -c}
+@kbd{tar -c --file=archive.tar}
+@kbd{tar -c -f archive.tar}
+@kbd{tar -c -farchive.tar}
+@kbd{tar -cf archive.tar}
+@kbd{tar -cfarchive.tar}
+@kbd{tar -f archive.tar --create}
+@kbd{tar -f archive.tar -c}
+@kbd{tar -farchive.tar --create}
+@kbd{tar -farchive.tar -c}
+@kbd{tar c --file=archive.tar}
+@kbd{tar c -f archive.tar}
+@kbd{tar c -farchive.tar}
+@kbd{tar cf archive.tar}
+@kbd{tar f archive.tar --create}
+@kbd{tar f archive.tar -c}
+@kbd{tar fc archive.tar}
+@end smallexample
+
+On the other hand, the following commands are @emph{not} equivalent to
+the previous set:
+
+@smallexample
+@kbd{tar -f -c archive.tar}
+@kbd{tar -fc archive.tar}
+@kbd{tar -fcarchive.tar}
+@kbd{tar -farchive.tarc}
+@kbd{tar cfarchive.tar}
+@end smallexample
+
+@noindent
+These last examples mean something completely different from what the
+user intended (judging based on the example in the previous set which
+uses long options, whose intent is therefore very clear). The first
+four specify that the @command{tar} archive would be a file named
+@option{-c}, @samp{c}, @samp{carchive.tar} or @samp{archive.tarc},
+respectively. The first two examples also specify a single non-option,
+@var{name} argument having the value @samp{archive.tar}. The last
+example contains only old style option letters (repeating option
+@samp{c} twice), not all of which are meaningful (eg., @samp{.},
+@samp{h}, or @samp{i}), with no argument value. @FIXME{not sure i liked
+the first sentence of this paragraph..}
+
+@node All Options
+@section All @command{tar} Options
+
+The coming manual sections contain an alphabetical listing of all
+@command{tar} operations and options, with brief descriptions and cross
+references to more in-depth explanations in the body of the manual.
+They also contain an alphabetically arranged table of the short option
+forms with their corresponding long option. You can use this table as
+a reference for deciphering @command{tar} commands in scripts.
+
+@menu
+* Operation Summary::
+* Option Summary::
+* Short Option Summary::
+@end menu
+
+@node Operation Summary
+@subsection Operations
+
+@table @option
+
+@opsummary{append}
+@item --append
+@itemx -r
+
+Appends files to the end of the archive. @xref{append}.
+
+@opsummary{catenate}
+@item --catenate
+@itemx -A
+
+Same as @option{--concatenate}. @xref{concatenate}.
+
+@opsummary{compare}
+@item --compare
+@itemx -d
+
+Compares archive members with their counterparts in the file
+system, and reports differences in file size, mode, owner,
+modification date and contents. @xref{compare}.
+
+@opsummary{concatenate}
+@item --concatenate
+@itemx -A
+
+Appends other @command{tar} archives to the end of the archive.
+@xref{concatenate}.
+
+@opsummary{create}
+@item --create
+@itemx -c
+
+Creates a new @command{tar} archive. @xref{create}.
+
+@opsummary{delete}
+@item --delete
+
+Deletes members from the archive. Don't try this on a archive on a
+tape! @xref{delete}.
+
+@opsummary{diff}
+@item --diff
+@itemx -d
+
+Same @option{--compare}. @xref{compare}.
+
+@opsummary{extract}
+@item --extract
+@itemx -x
+
+Extracts members from the archive into the file system. @xref{extract}.
+
+@opsummary{get}
+@item --get
+@itemx -x
+
+Same as @option{--extract}. @xref{extract}.
+
+@opsummary{list}
+@item --list
+@itemx -t
+
+Lists the members in an archive. @xref{list}.
+
+@opsummary{update}
+@item --update
+@itemx -u
+
+Adds files to the end of the archive, but only if they are newer than
+their counterparts already in the archive, or if they do not already
+exist in the archive. @xref{update}.
+
+@end table
+
+@node Option Summary
+@subsection @command{tar} Options
+
+@table @option
+
+@opsummary{absolute-names}
+@item --absolute-names
+@itemx -P
+
+Normally when creating an archive, @command{tar} strips an initial
+@samp{/} from member names. This option disables that behavior.
+@xref{absolute}.
+
+@opsummary{after-date}
+@item --after-date
+
+(See @option{--newer}, @pxref{after})
+
+@opsummary{anchored}
+@item --anchored
+A pattern must match an initial subsequence of the name's components.
+@xref{controlling pattern-matching}.
+
+@opsummary{atime-preserve}
+@item --atime-preserve
+@itemx --atime-preserve=replace
+@itemx --atime-preserve=system
+
+Attempt to preserve the access time of files when reading them. This
+option currently is effective only on files that you own, unless you
+have superuser privileges.
+
+@option{--atime-preserve=replace} remembers the access time of a file
+before reading it, and then restores the access time afterwards. This
+may cause problems if other programs are reading the file at the same
+time, as the times of their accesses will be lost. On most platforms
+restoring the access time also requires @command{tar} to restore the
+data modification time too, so this option may also cause problems if
+other programs are writing the file at the same time. (Tar attempts
+to detect this situation, but cannot do so reliably due to race
+conditions.) Worse, on most platforms restoring the access time also
+updates the status change time, which means that this option is
+incompatible with incremental backups.
+
+@option{--atime-preserve=system} avoids changing time stamps on files,
+without interfering with time stamp updates
+caused by other programs, so it works better with incremental backups.
+However, it requires a special @code{O_NOATIME} option from the
+underlying operating and file system implementation, and it also requires
+that searching directories does not update their access times. As of
+this writing (November 2005) this works only with Linux, and only with
+Linux kernels 2.6.8 and later. Worse, there is currently no reliable
+way to know whether this feature actually works. Sometimes
+@command{tar} knows that it does not work, and if you use
+@option{--atime-preserve=system} then @command{tar} complains and
+exits right away. But other times @command{tar} might think that the
+option works when it actually does not.
+
+Currently @option{--atime-preserve} with no operand defaults to
+@option{--atime-preserve=replace}, but this may change in the future
+as support for @option{--atime-preserve=system} improves.
+
+If your operating system does not support
+@option{--atime-preserve=@-system}, you might be able to preserve access
+times reliably by by using the @command{mount} command. For example,
+you can mount the file system read-only, or access the file system via
+a read-only loopback mount, or use the @samp{noatime} mount option
+available on some systems. However, mounting typically requires
+superuser privileges and can be a pain to manage.
+
+@opsummary{backup}
+@item --backup=@var{backup-type}
+
+Rather than deleting files from the file system, @command{tar} will
+back them up using simple or numbered backups, depending upon
+@var{backup-type}. @xref{backup}.
+
+@opsummary{block-number}
+@item --block-number
+@itemx -R
+
+With this option present, @command{tar} prints error messages for read errors
+with the block number in the archive file. @xref{block-number}.
+
+@opsummary{blocking-factor}
+@item --blocking-factor=@var{blocking}
+@itemx -b @var{blocking}
+
+Sets the blocking factor @command{tar} uses to @var{blocking} x 512 bytes per
+record. @xref{Blocking Factor}.
+
+@opsummary{bzip2}
+@item --bzip2
+@itemx -j
+
+This option tells @command{tar} to read or write archives through
+@code{bzip2}. @xref{gzip}.
+
+@opsummary{checkpoint}
+@item --checkpoint[=@var{number}]
+
+This option directs @command{tar} to print periodic checkpoint
+messages as it reads through the archive. It is intended for when you
+want a visual indication that @command{tar} is still running, but
+don't want to see @option{--verbose} output. For a detailed
+description, see @ref{Progress information}.
+
+@opsummary{check-links}
+@item --check-links
+@itemx -l
+If this option was given, @command{tar} will check the number of links
+dumped for each processed file. If this number does not match the
+total number of hard links for the file, a warning message will be
+output @footnote{Earlier versions of @GNUTAR{} understood @option{-l} as a
+synonym for @option{--one-file-system}. The current semantics, which
+complies to UNIX98, was introduced with version
+1.15.91. @xref{Changes}, for more information.}.
+
+@opsummary{compress}
+@opsummary{uncompress}
+@item --compress
+@itemx --uncompress
+@itemx -Z
+
+@command{tar} will use the @command{compress} program when reading or
+writing the archive. This allows you to directly act on archives
+while saving space. @xref{gzip}.
+
+@opsummary{confirmation}
+@item --confirmation
+
+(See @option{--interactive}.) @xref{interactive}.
+
+@opsummary{delay-directory-restore}
+@item --delay-directory-restore
+
+Delay setting modification times and permissions of extracted
+directories until the end of extraction. @xref{Directory Modification Times and Permissions}.
+
+@opsummary{dereference}
+@item --dereference
+@itemx -h
+
+When creating a @command{tar} archive, @command{tar} will archive the
+file that a symbolic link points to, rather than archiving the
+symlink. @xref{dereference}.
+
+@opsummary{directory}
+@item --directory=@var{dir}
+@itemx -C @var{dir}
+
+When this option is specified, @command{tar} will change its current directory
+to @var{dir} before performing any operations. When this option is used
+during archive creation, it is order sensitive. @xref{directory}.
+
+@opsummary{exclude}
+@item --exclude=@var{pattern}
+
+When performing operations, @command{tar} will skip files that match
+@var{pattern}. @xref{exclude}.
+
+@opsummary{exclude-from}
+@item --exclude-from=@var{file}
+@itemx -X @var{file}
+
+Similar to @option{--exclude}, except @command{tar} will use the list of
+patterns in the file @var{file}. @xref{exclude}.
+
+@opsummary{exclude-caches}
+@item --exclude-caches
+
+Exclude from dump any directory containing a valid cache directory
+tag file, but still dump the directory node and the tag file itself.
+
+@xref{exclude}.
+
+@opsummary{exclude-caches-under}
+@item --exclude-caches-under
+
+Exclude from dump any directory containing a valid cache directory
+tag file, but still dump the directory node itself.
+
+@xref{exclude}.
+
+@opsummary{exclude-caches-all}
+@item --exclude-caches-all
+
+Exclude from dump any directory containing a valid cache directory
+tag file. @xref{exclude}.
+
+@opsummary{exclude-tag}
+@item --exclude-tag=@var{file}
+
+Exclude from dump any directory containing file named @var{file}, but
+dump the directory node and @var{file} itself. @xref{exclude}.
+
+@opsummary{exclude-tag-under}
+@item --exclude-tag-under=@var{file}
+
+Exclude from dump the contents of any directory containing file
+named @var{file}, but dump the directory node itself. @xref{exclude}.
+
+@opsummary{exclude-tag-all}
+@item --exclude-tag-all=@var{file}
+
+Exclude from dump any directory containing file named @var{file}.
+@xref{exclude}.
+
+@opsummary{file}
+@item --file=@var{archive}
+@itemx -f @var{archive}
+
+@command{tar} will use the file @var{archive} as the @command{tar} archive it
+performs operations on, rather than @command{tar}'s compilation dependent
+default. @xref{file tutorial}.
+
+@opsummary{files-from}
+@item --files-from=@var{file}
+@itemx -T @var{file}
+
+@command{tar} will use the contents of @var{file} as a list of archive members
+or files to operate on, in addition to those specified on the
+command-line. @xref{files}.
+
+@opsummary{force-local}
+@item --force-local
+
+Forces @command{tar} to interpret the file name given to @option{--file}
+as a local file, even if it looks like a remote tape drive name.
+@xref{local and remote archives}.
+
+@opsummary{format}
+@item --format=@var{format}
+@itemx -H @var{format}
+
+Selects output archive format. @var{Format} may be one of the
+following:
+
+@table @samp
+@item v7
+Creates an archive that is compatible with Unix V7 @command{tar}.
+
+@item oldgnu
+Creates an archive that is compatible with GNU @command{tar} version
+1.12 or earlier.
+
+@item gnu
+Creates archive in GNU tar 1.13 format. Basically it is the same as
+@samp{oldgnu} with the only difference in the way it handles long
+numeric fields.
+
+@item ustar
+Creates a @acronym{POSIX.1-1988} compatible archive.
+
+@item posix
+Creates a @acronym{POSIX.1-2001 archive}.
+
+@end table
+
+@xref{Formats}, for a detailed discussion of these formats.
+
+@opsummary{group}
+@item --group=@var{group}
+
+Files added to the @command{tar} archive will have a group @acronym{ID} of @var{group},
+rather than the group from the source file. @var{group} is first decoded
+as a group symbolic name, but if this interpretation fails, it has to be
+a decimal numeric group @acronym{ID}. @xref{override}.
+
+Also see the comments for the @option{--owner=@var{user}} option.
+
+@opsummary{gzip}
+@opsummary{gunzip}
+@opsummary{ungzip}
+@item --gzip
+@itemx --gunzip
+@itemx --ungzip
+@itemx -z
+
+This option tells @command{tar} to read or write archives through
+@command{gzip}, allowing @command{tar} to directly operate on several
+kinds of compressed archives transparently. @xref{gzip}.
+
+@opsummary{help}
+@item --help
+@itemx -?
+
+@command{tar} will print out a short message summarizing the operations and
+options to @command{tar} and exit. @xref{help}.
+
+@opsummary{ignore-case}
+@item --ignore-case
+Ignore case when matching member or file names with
+patterns. @xref{controlling pattern-matching}.
+
+@opsummary{ignore-command-error}
+@item --ignore-command-error
+Ignore exit codes of subprocesses. @xref{Writing to an External Program}.
+
+@opsummary{ignore-failed-read}
+@item --ignore-failed-read
+
+Do not exit unsuccessfully merely because an unreadable file was encountered.
+@xref{Reading}.
+
+@opsummary{ignore-zeros}
+@item --ignore-zeros
+@itemx -i
+
+With this option, @command{tar} will ignore zeroed blocks in the
+archive, which normally signals EOF. @xref{Reading}.
+
+@opsummary{incremental}
+@item --incremental
+@itemx -G
+
+Informs @command{tar} that it is working with an old
+@acronym{GNU}-format incremental backup archive. It is intended
+primarily for backwards compatibility only. @xref{Incremental Dumps},
+for a detailed discussion of incremental archives.
+
+@opsummary{index-file}
+@item --index-file=@var{file}
+
+Send verbose output to @var{file} instead of to standard output.
+
+@opsummary{info-script}
+@opsummary{new-volume-script}
+@item --info-script=@var{script-file}
+@itemx --new-volume-script=@var{script-file}
+@itemx -F @var{script-file}
+
+When @command{tar} is performing multi-tape backups, @var{script-file} is run
+at the end of each tape. If @var{script-file} exits with nonzero status,
+@command{tar} fails immediately. @xref{info-script}, for a detailed
+discussion of @var{script-file}.
+
+@opsummary{interactive}
+@item --interactive
+@itemx --confirmation
+@itemx -w
+
+Specifies that @command{tar} should ask the user for confirmation before
+performing potentially destructive options, such as overwriting files.
+@xref{interactive}.
+
+@opsummary{keep-newer-files}
+@item --keep-newer-files
+
+Do not replace existing files that are newer than their archive copies
+when extracting files from an archive.
+
+@opsummary{keep-old-files}
+@item --keep-old-files
+@itemx -k
+
+Do not overwrite existing files when extracting files from an archive.
+@xref{Keep Old Files}.
+
+@opsummary{label}
+@item --label=@var{name}
+@itemx -V @var{name}
+
+When creating an archive, instructs @command{tar} to write @var{name}
+as a name record in the archive. When extracting or listing archives,
+@command{tar} will only operate on archives that have a label matching
+the pattern specified in @var{name}. @xref{Tape Files}.
+
+@opsummary{listed-incremental}
+@item --listed-incremental=@var{snapshot-file}
+@itemx -g @var{snapshot-file}
+
+During a @option{--create} operation, specifies that the archive that
+@command{tar} creates is a new @acronym{GNU}-format incremental
+backup, using @var{snapshot-file} to determine which files to backup.
+With other operations, informs @command{tar} that the archive is in
+incremental format. @xref{Incremental Dumps}.
+
+@opsummary{mode}
+@item --mode=@var{permissions}
+
+When adding files to an archive, @command{tar} will use
+@var{permissions} for the archive members, rather than the permissions
+from the files. @var{permissions} can be specified either as an octal
+number or as symbolic permissions, like with
+@command{chmod}. @xref{override}.
+
+@opsummary{mtime}
+@item --mtime=@var{date}
+
+When adding files to an archive, @command{tar} will use @var{date} as
+the modification time of members when creating archives, instead of
+their actual modification times. The value of @var{date} can be
+either a textual date representation (@pxref{Date input formats}) or a
+name of the existing file, starting with @samp{/} or @samp{.}. In the
+latter case, the modification time of that file is used. @xref{override}.
+
+@opsummary{multi-volume}
+@item --multi-volume
+@itemx -M
+
+Informs @command{tar} that it should create or otherwise operate on a
+multi-volume @command{tar} archive. @xref{Using Multiple Tapes}.
+
+@opsummary{new-volume-script}
+@item --new-volume-script
+
+(see --info-script)
+
+@opsummary{newer}
+@item --newer=@var{date}
+@itemx --after-date=@var{date}
+@itemx -N
+
+When creating an archive, @command{tar} will only add files that have changed
+since @var{date}. If @var{date} begins with @samp{/} or @samp{.}, it
+is taken to be the name of a file whose data modification time specifies
+the date. @xref{after}.
+
+@opsummary{newer-mtime}
+@item --newer-mtime=@var{date}
+
+Like @option{--newer}, but add only files whose
+contents have changed (as opposed to just @option{--newer}, which will
+also back up files for which any status information has
+changed). @xref{after}.
+
+@opsummary{no-anchored}
+@item --no-anchored
+An exclude pattern can match any subsequence of the name's components.
+@xref{controlling pattern-matching}.
+
+@opsummary{no-delay-directory-restore}
+@item --no-delay-directory-restore
+
+Modification times and permissions of extracted
+directories are set when all files from this directory have been
+extracted. This is the default.
+@xref{Directory Modification Times and Permissions}.
+
+@opsummary{no-ignore-case}
+@item --no-ignore-case
+Use case-sensitive matching.
+@xref{controlling pattern-matching}.
+
+@opsummary{no-ignore-command-error}
+@item --no-ignore-command-error
+Print warnings about subprocesses that terminated with a nonzero exit
+code. @xref{Writing to an External Program}.
+
+@opsummary{no-overwrite-dir}
+@item --no-overwrite-dir
+
+Preserve metadata of existing directories when extracting files
+from an archive. @xref{Overwrite Old Files}.
+
+@opsummary{no-quote-chars}
+@item --no-quote-chars=@var{string}
+Remove characters listed in @var{string} from the list of quoted
+characters set by the previous @option{--quote-chars} option
+(@pxref{quoting styles}).
+
+@opsummary{no-recursion}
+@item --no-recursion
+
+With this option, @command{tar} will not recurse into directories.
+@xref{recurse}.
+
+@opsummary{no-same-owner}
+@item --no-same-owner
+@itemx -o
+
+When extracting an archive, do not attempt to preserve the owner
+specified in the @command{tar} archive. This the default behavior
+for ordinary users.
+
+@opsummary{no-same-permissions}
+@item --no-same-permissions
+
+When extracting an archive, subtract the user's umask from files from
+the permissions specified in the archive. This is the default behavior
+for ordinary users.
+
+@opsummary{no-unquote}
+@item --no-unquote
+Treat all input file or member names literally, do not interpret
+escape sequences. @xref{input name quoting}.
+
+@opsummary{no-wildcards}
+@item --no-wildcards
+Do not use wildcards.
+@xref{controlling pattern-matching}.
+
+@opsummary{no-wildcards-match-slash}
+@item --no-wildcards-match-slash
+Wildcards do not match @samp{/}.
+@xref{controlling pattern-matching}.
+
+@opsummary{null}
+@item --null
+
+When @command{tar} is using the @option{--files-from} option, this option
+instructs @command{tar} to expect file names terminated with @acronym{NUL}, so
+@command{tar} can correctly work with file names that contain newlines.
+@xref{nul}.
+
+@opsummary{numeric-owner}
+@item --numeric-owner
+
+This option will notify @command{tar} that it should use numeric user
+and group IDs when creating a @command{tar} file, rather than names.
+@xref{Attributes}.
+
+@item -o
+The function of this option depends on the action @command{tar} is
+performing. When extracting files, @option{-o} is a synonym for
+@option{--no-same-owner}, i.e., it prevents @command{tar} from
+restoring ownership of files being extracted.
+
+When creating an archive, it is a synonym for
+@option{--old-archive}. This behavior is for compatibility
+with previous versions of @GNUTAR{}, and will be
+removed in future releases.
+
+@xref{Changes}, for more information.
+
+@opsummary{occurrence}
+@item --occurrence[=@var{number}]
+
+This option can be used in conjunction with one of the subcommands
+@option{--delete}, @option{--diff}, @option{--extract} or
+@option{--list} when a list of files is given either on the command
+line or via @option{-T} option.
+
+This option instructs @command{tar} to process only the @var{number}th
+occurrence of each named file. @var{Number} defaults to 1, so
+
+@smallexample
+tar -x -f archive.tar --occurrence filename
+@end smallexample
+
+@noindent
+will extract the first occurrence of the member @file{filename} from @file{archive.tar}
+and will terminate without scanning to the end of the archive.
+
+@opsummary{old-archive}
+@item --old-archive
+Synonym for @option{--format=v7}.
+
+@opsummary{one-file-system}
+@item --one-file-system
+Used when creating an archive. Prevents @command{tar} from recursing into
+directories that are on different file systems from the current
+directory @footnote{Earlier versions of @GNUTAR{} understood @option{-l} as a
+synonym for @option{--one-file-system}. This has changed in version
+1.15.91. @xref{Changes}, for more information.}.
+
+@opsummary{overwrite}
+@item --overwrite
+
+Overwrite existing files and directory metadata when extracting files
+from an archive. @xref{Overwrite Old Files}.
+
+@opsummary{overwrite-dir}
+@item --overwrite-dir
+
+Overwrite the metadata of existing directories when extracting files
+from an archive. @xref{Overwrite Old Files}.
+
+@opsummary{owner}
+@item --owner=@var{user}
+
+Specifies that @command{tar} should use @var{user} as the owner of members
+when creating archives, instead of the user associated with the source
+file. @var{user} is first decoded as a user symbolic name, but if
+this interpretation fails, it has to be a decimal numeric user @acronym{ID}.
+@xref{override}.
+
+This option does not affect extraction from archives.
+
+@opsummary{pax-option}
+@item --pax-option=@var{keyword-list}
+This option is meaningful only with @acronym{POSIX.1-2001} archives
+(@pxref{posix}). It modifies the way @command{tar} handles the
+extended header keywords. @var{Keyword-list} is a comma-separated
+list of keyword options. @xref{PAX keywords}, for a detailed
+discussion.
+
+@opsummary{portability}
+@item --portability
+@itemx --old-archive
+Synonym for @option{--format=v7}.
+
+@opsummary{posix}
+@item --posix
+Same as @option{--format=posix}.
+
+@opsummary{preserve}
+@item --preserve
+
+Synonymous with specifying both @option{--preserve-permissions} and
+@option{--same-order}. @xref{Setting Access Permissions}.
+
+@opsummary{preserve-order}
+@item --preserve-order
+
+(See @option{--same-order}; @pxref{Reading}.)
+
+@opsummary{preserve-permissions}
+@opsummary{same-permissions}
+@item --preserve-permissions
+@itemx --same-permissions
+@itemx -p
+
+When @command{tar} is extracting an archive, it normally subtracts the
+users' umask from the permissions specified in the archive and uses
+that number as the permissions to create the destination file.
+Specifying this option instructs @command{tar} that it should use the
+permissions directly from the archive. @xref{Setting Access Permissions}.
+
+@opsummary{quote-chars}
+@item --quote-chars=@var{string}
+Always quote characters from @var{string}, even if the selected
+quoting style would not quote them (@pxref{quoting styles}).
+
+@opsummary{quoting-style}
+@item --quoting-style=@var{style}
+Set quoting style to use when printing member and file names
+(@pxref{quoting styles}). Valid @var{style} values are:
+@code{literal}, @code{shell}, @code{shell-always}, @code{c},
+@code{escape}, @code{locale}, and @code{clocale}. Default quoting
+style is @code{escape}, unless overridden while configuring the
+package.
+
+@opsummary{read-full-records}
+@item --read-full-records
+@itemx -B
+
+Specifies that @command{tar} should reblock its input, for reading
+from pipes on systems with buggy implementations. @xref{Reading}.
+
+@opsummary{record-size}
+@item --record-size=@var{size}
+
+Instructs @command{tar} to use @var{size} bytes per record when accessing the
+archive. @xref{Blocking Factor}.
+
+@opsummary{recursion}
+@item --recursion
+
+With this option, @command{tar} recurses into directories (default).
+@xref{recurse}.
+
+@opsummary{recursive-unlink}
+@item --recursive-unlink
+
+Remove existing
+directory hierarchies before extracting directories of the same name
+from the archive. @xref{Recursive Unlink}.
+
+@opsummary{remove-files}
+@item --remove-files
+
+Directs @command{tar} to remove the source file from the file system after
+appending it to an archive. @xref{remove files}.
+
+@opsummary{restrict}
+@item --restrict
+
+Disable use of some potentially harmful @command{tar} options.
+Currently this option disables shell invocation from multi-volume menu
+(@pxref{Using Multiple Tapes}).
+
+@opsummary{rmt-command}
+@item --rmt-command=@var{cmd}
+
+Notifies @command{tar} that it should use @var{cmd} instead of
+the default @file{/usr/libexec/rmt} (@pxref{Remote Tape Server}).
+
+@opsummary{rsh-command}
+@item --rsh-command=@var{cmd}
+
+Notifies @command{tar} that is should use @var{cmd} to communicate with remote
+devices. @xref{Device}.
+
+@opsummary{same-order}
+@item --same-order
+@itemx --preserve-order
+@itemx -s
+
+This option is an optimization for @command{tar} when running on machines with
+small amounts of memory. It informs @command{tar} that the list of file
+arguments has already been sorted to match the order of files in the
+archive. @xref{Reading}.
+
+@opsummary{same-owner}
+@item --same-owner
+
+When extracting an archive, @command{tar} will attempt to preserve the owner
+specified in the @command{tar} archive with this option present.
+This is the default behavior for the superuser; this option has an
+effect only for ordinary users. @xref{Attributes}.
+
+@opsummary{same-permissions}
+@item --same-permissions
+
+(See @option{--preserve-permissions}; @pxref{Setting Access Permissions}.)
+
+@opsummary{seek}
+@item --seek
+@itemx -n
+
+Assume that the archive media supports seeks to arbitrary
+locations. Usually @command{tar} determines automatically whether
+the archive can be seeked or not. This option is intended for use
+in cases when such recognition fails.
+
+@opsummary{show-defaults}
+@item --show-defaults
+
+Displays the default options used by @command{tar} and exits
+successfully. This option is intended for use in shell scripts.
+Here is an example of what you can see using this option:
+
+@smallexample
+$ tar --show-defaults
+--format=gnu -f- -b20 --quoting-style=escape \
+--rmt-command=/usr/libexec/rmt --rsh-command=/usr/bin/rsh
+@end smallexample
+
+@opsummary{show-omitted-dirs}
+@item --show-omitted-dirs
+
+Instructs @command{tar} to mention the directories it is skipping when
+operating on a @command{tar} archive. @xref{show-omitted-dirs}.
+
+@opsummary{show-transformed-names}
+@opsummary{show-stored-names}
+@item --show-transformed-names
+@itemx --show-stored-names
+
+Display file or member names after applying any transformations
+(@pxref{transform}). In particular, when used in conjunction with one of
+the archive creation operations it instructs @command{tar} to list the
+member names stored in the archive, as opposed to the actual file
+names. @xref{listing member and file names}.
+
+@opsummary{sparse}
+@item --sparse
+@itemx -S
+
+Invokes a @acronym{GNU} extension when adding files to an archive that handles
+sparse files efficiently. @xref{sparse}.
+
+@opsummary{sparse-version}
+@item --sparse-version=@var{version}
+
+Specifies the @dfn{format version} to use when archiving sparse
+files. Implies @option{--sparse}. @xref{sparse}. For the description
+of the supported sparse formats, @xref{Sparse Formats}.
+
+@opsummary{starting-file}
+@item --starting-file=@var{name}
+@itemx -K @var{name}
+
+This option affects extraction only; @command{tar} will skip extracting
+files in the archive until it finds one that matches @var{name}.
+@xref{Scarce}.
+
+@opsummary{strip-components}
+@item --strip-components=@var{number}
+Strip given @var{number} of leading components from file names before
+extraction. For example, if archive @file{archive.tar} contained
+@file{/some/file/name}, then running
+
+@smallexample
+tar --extract --file archive.tar --strip-components=2
+@end smallexample
+
+@noindent
+would extract this file to file @file{name}.
+
+@opsummary{suffix}, summary
+@item --suffix=@var{suffix}
+
+Alters the suffix @command{tar} uses when backing up files from the default
+@samp{~}. @xref{backup}.
+
+@opsummary{tape-length}
+@item --tape-length=@var{num}
+@itemx -L @var{num}
+
+Specifies the length of tapes that @command{tar} is writing as being
+@w{@var{num} x 1024} bytes long. @xref{Using Multiple Tapes}.
+
+@opsummary{test-label}
+@item --test-label
+
+Reads the volume label. If an argument is specified, test whether it
+matches the volume label. @xref{--test-label option}.
+
+@opsummary{to-command}
+@item --to-command=@var{command}
+
+During extraction @command{tar} will pipe extracted files to the
+standard input of @var{command}. @xref{Writing to an External Program}.
+
+@opsummary{to-stdout}
+@item --to-stdout
+@itemx -O
+
+During extraction, @command{tar} will extract files to stdout rather
+than to the file system. @xref{Writing to Standard Output}.
+
+@opsummary{totals}
+@item --totals[=@var{signo}]
+
+Displays the total number of bytes transferred when processing an
+archive. If an argument is given, these data are displayed on
+request, when signal @var{signo} is delivered to @command{tar}.
+@xref{totals}.
+
+@opsummary{touch}
+@item --touch
+@itemx -m
+
+Sets the data modification time of extracted files to the extraction time,
+rather than the data modification time stored in the archive.
+@xref{Data Modification Times}.
+
+@opsummary{transform}
+@item --transform=@var{sed-expr}
+
+Transform file or member names using @command{sed} replacement expression
+@var{sed-expr}. For example,
+
+@smallexample
+$ @kbd{tar cf archive.tar --transform 's,^\./,usr/,' .}
+@end smallexample
+
+@noindent
+will add to @file{archive} files from the current working directory,
+replacing initial @samp{./} prefix with @samp{usr/}. For the detailed
+discussion, @xref{transform}.
+
+To see transformed member names in verbose listings, use
+@option{--show-transformed-names} option
+(@pxref{show-transformed-names}).
+
+@opsummary{uncompress}
+@item --uncompress
+
+(See @option{--compress}. @pxref{gzip})
+
+@opsummary{ungzip}
+@item --ungzip
+
+(See @option{--gzip}. @pxref{gzip})
+
+@opsummary{unlink-first}
+@item --unlink-first
+@itemx -U
+
+Directs @command{tar} to remove the corresponding file from the file
+system before extracting it from the archive. @xref{Unlink First}.
+
+@opsummary{unquote}
+@item --unquote
+Enable unquoting input file or member names (default). @xref{input
+name quoting}.
+
+@opsummary{use-compress-program}
+@item --use-compress-program=@var{prog}
+
+Instructs @command{tar} to access the archive through @var{prog}, which is
+presumed to be a compression program of some sort. @xref{gzip}.
+
+@opsummary{utc}
+@item --utc
+
+Display file modification dates in @acronym{UTC}. This option implies
+@option{--verbose}.
+
+@opsummary{verbose}
+@item --verbose
+@itemx -v
+
+Specifies that @command{tar} should be more verbose about the
+operations it is performing. This option can be specified multiple
+times for some operations to increase the amount of information displayed.
+@xref{verbose}.
+
+@opsummary{verify}
+@item --verify
+@itemx -W
+
+Verifies that the archive was correctly written when creating an
+archive. @xref{verify}.
+
+@opsummary{version}
+@item --version
+
+Print information about the program's name, version, origin and legal
+status, all on standard output, and then exit successfully.
+@xref{help}.
+
+@opsummary{volno-file}
+@item --volno-file=@var{file}
+
+Used in conjunction with @option{--multi-volume}. @command{tar} will
+keep track of which volume of a multi-volume archive it is working in
+@var{file}. @xref{volno-file}.
+
+@opsummary{wildcards}
+@item --wildcards
+Use wildcards when matching member names with patterns.
+@xref{controlling pattern-matching}.
+
+@opsummary{wildcards-match-slash}
+@item --wildcards-match-slash
+Wildcards match @samp{/}.
+@xref{controlling pattern-matching}.
+@end table
+
+@node Short Option Summary
+@subsection Short Options Cross Reference
+
+Here is an alphabetized list of all of the short option forms, matching
+them with the equivalent long option.
+
+@multitable @columnfractions 0.20 0.80
+@headitem Short Option @tab Reference
+
+@item -A @tab @ref{--concatenate}.
+
+@item -B @tab @ref{--read-full-records}.
+
+@item -C @tab @ref{--directory}.
+
+@item -F @tab @ref{--info-script}.
+
+@item -G @tab @ref{--incremental}.
+
+@item -K @tab @ref{--starting-file}.
+
+@item -L @tab @ref{--tape-length}.
+
+@item -M @tab @ref{--multi-volume}.
+
+@item -N @tab @ref{--newer}.
+
+@item -O @tab @ref{--to-stdout}.
+
+@item -P @tab @ref{--absolute-names}.
+
+@item -R @tab @ref{--block-number}.
+
+@item -S @tab @ref{--sparse}.
+
+@item -T @tab @ref{--files-from}.
+
+@item -U @tab @ref{--unlink-first}.
+
+@item -V @tab @ref{--label}.
+
+@item -W @tab @ref{--verify}.
+
+@item -X @tab @ref{--exclude-from}.
+
+@item -Z @tab @ref{--compress}.
+
+@item -b @tab @ref{--blocking-factor}.
+
+@item -c @tab @ref{--create}.
+
+@item -d @tab @ref{--compare}.
+
+@item -f @tab @ref{--file}.
+
+@item -g @tab @ref{--listed-incremental}.
+
+@item -h @tab @ref{--dereference}.
+
+@item -i @tab @ref{--ignore-zeros}.
+
+@item -j @tab @ref{--bzip2}.
+
+@item -k @tab @ref{--keep-old-files}.
+
+@item -l @tab @ref{--check-links}.
+
+@item -m @tab @ref{--touch}.
+
+@item -o @tab When creating, @ref{--no-same-owner}, when extracting ---
+@ref{--portability}.
+
+The later usage is deprecated. It is retained for compatibility with
+the earlier versions of @GNUTAR{}. In future releases
+@option{-o} will be equivalent to @option{--no-same-owner} only.
+
+@item -p @tab @ref{--preserve-permissions}.
+
+@item -r @tab @ref{--append}.
+
+@item -s @tab @ref{--same-order}.
+
+@item -t @tab @ref{--list}.
+
+@item -u @tab @ref{--update}.
+
+@item -v @tab @ref{--verbose}.
+
+@item -w @tab @ref{--interactive}.
+
+@item -x @tab @ref{--extract}.
+
+@item -z @tab @ref{--gzip}.
+
+@end multitable
+
+@node help
+@section @GNUTAR{} documentation
+
+@cindex Getting program version number
+@opindex version
+@cindex Version of the @command{tar} program
+Being careful, the first thing is really checking that you are using
+@GNUTAR{}, indeed. The @option{--version} option
+causes @command{tar} to print information about its name, version,
+origin and legal status, all on standard output, and then exit
+successfully. For example, @w{@samp{tar --version}} might print:
+
+@smallexample
+tar (GNU tar) @value{VERSION}
+Copyright (C) 2006 Free Software Foundation, Inc.
+This is free software. You may redistribute copies of it under the terms
+of the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
+There is NO WARRANTY, to the extent permitted by law.
+
+Written by John Gilmore and Jay Fenlason.
+@end smallexample
+
+@noindent
+The first occurrence of @samp{tar} in the result above is the program
+name in the package (for example, @command{rmt} is another program),
+while the second occurrence of @samp{tar} is the name of the package
+itself, containing possibly many programs. The package is currently
+named @samp{tar}, after the name of the main program it
+contains@footnote{There are plans to merge the @command{cpio} and
+@command{tar} packages into a single one which would be called
+@code{paxutils}. So, who knows if, one of this days, the
+@option{--version} would not output @w{@samp{tar (@acronym{GNU}
+paxutils) 3.2}}}.
+
+@cindex Obtaining help
+@cindex Listing all @command{tar} options
+@xopindex{help, introduction}
+Another thing you might want to do is checking the spelling or meaning
+of some particular @command{tar} option, without resorting to this
+manual, for once you have carefully read it. @GNUTAR{}
+has a short help feature, triggerable through the
+@option{--help} option. By using this option, @command{tar} will
+print a usage message listing all available options on standard
+output, then exit successfully, without doing anything else and
+ignoring all other options. Even if this is only a brief summary, it
+may be several screens long. So, if you are not using some kind of
+scrollable window, you might prefer to use something like:
+
+@smallexample
+$ @kbd{tar --help | less}
+@end smallexample
+
+@noindent
+presuming, here, that you like using @command{less} for a pager. Other
+popular pagers are @command{more} and @command{pg}. If you know about some
+@var{keyword} which interests you and do not want to read all the
+@option{--help} output, another common idiom is doing:
+
+@smallexample
+tar --help | grep @var{keyword}
+@end smallexample
+
+@noindent
+for getting only the pertinent lines. Notice, however, that some
+@command{tar} options have long description lines and the above
+command will list only the first of them.
+
+The exact look of the option summary displayed by @kbd{tar --help} is
+configurable. @xref{Configuring Help Summary}, for a detailed description.
+
+@opindex usage
+If you only wish to check the spelling of an option, running @kbd{tar
+--usage} may be a better choice. This will display a terse list of
+@command{tar} option without accompanying explanations.
+
+The short help output is quite succinct, and you might have to get
+back to the full documentation for precise points. If you are reading
+this paragraph, you already have the @command{tar} manual in some
+form. This manual is available in a variety of forms from
+@url{http://www.gnu.org/software/tar/manual}. It may be printed out of the @GNUTAR{}
+distribution, provided you have @TeX{} already installed somewhere,
+and a laser printer around. Just configure the distribution, execute
+the command @w{@samp{make dvi}}, then print @file{doc/tar.dvi} the
+usual way (contact your local guru to know how). If @GNUTAR{}
+has been conveniently installed at your place, this
+manual is also available in interactive, hypertextual form as an Info
+file. Just call @w{@samp{info tar}} or, if you do not have the
+@command{info} program handy, use the Info reader provided within
+@acronym{GNU} Emacs, calling @samp{tar} from the main Info menu.
+
+There is currently no @code{man} page for @GNUTAR{}.
+If you observe such a @code{man} page on the system you are running,
+either it does not belong to @GNUTAR{}, or it has not
+been produced by @acronym{GNU}. Some package maintainers convert
+@kbd{tar --help} output to a man page, using @command{help2man}. In
+any case, please bear in mind that the authoritative source of
+information about @GNUTAR{} is this Texinfo documentation.
+
+@node defaults
+@section Obtaining @GNUTAR{} default values
+
+@opindex show-defaults
+@GNUTAR{} has some predefined defaults that are used when you do not
+explicitly specify another values. To obtain a list of such
+defaults, use @option{--show-defaults} option. This will output the
+values in the form of @command{tar} command line options:
+
+@smallexample
+@group
+@kbd{tar --show-defaults}
+--format=gnu -f- -b20 --quoting-style=escape
+--rmt-command=/etc/rmt --rsh-command=/usr/bin/rsh
+@end group
+@end smallexample
+
+@noindent
+Notice, that this option outputs only one line. The example output above
+has been split to fit page boundaries.
+
+@noindent
+The above output shows that this version of @GNUTAR{} defaults to
+using @samp{gnu} archive format (@pxref{Formats}), it uses standard
+output as the archive, if no @option{--file} option has been given
+(@pxref{file tutorial}), the default blocking factor is 20
+(@pxref{Blocking Factor}). It also shows the default locations where
+@command{tar} will look for @command{rmt} and @command{rsh} binaries.
+
+@node verbose
+@section Checking @command{tar} progress
+
+Typically, @command{tar} performs most operations without reporting any
+information to the user except error messages. When using @command{tar}
+with many options, particularly ones with complicated or
+difficult-to-predict behavior, it is possible to make serious mistakes.
+@command{tar} provides several options that make observing @command{tar}
+easier. These options cause @command{tar} to print information as it
+progresses in its job, and you might want to use them just for being
+more careful about what is going on, or merely for entertaining
+yourself. If you have encountered a problem when operating on an
+archive, however, you may need more information than just an error
+message in order to solve the problem. The following options can be
+helpful diagnostic tools.
+
+@cindex Verbose operation
+@opindex verbose
+Normally, the @option{--list} (@option{-t}) command to list an archive
+prints just the file names (one per line) and the other commands are
+silent. When used with most operations, the @option{--verbose}
+(@option{-v}) option causes @command{tar} to print the name of each
+file or archive member as it is processed. This and the other options
+which make @command{tar} print status information can be useful in
+monitoring @command{tar}.
+
+With @option{--create} or @option{--extract}, @option{--verbose} used
+once just prints the names of the files or members as they are processed.
+Using it twice causes @command{tar} to print a longer listing
+(@xref{verbose member listing}, for the description) for each member.
+Since @option{--list} already prints the names of the members,
+@option{--verbose} used once with @option{--list} causes @command{tar}
+to print an @samp{ls -l} type listing of the files in the archive.
+The following examples both extract members with long list output:
+
+@smallexample
+$ @kbd{tar --extract --file=archive.tar --verbose --verbose}
+$ @kbd{tar xvvf archive.tar}
+@end smallexample
+
+Verbose output appears on the standard output except when an archive is
+being written to the standard output, as with @samp{tar --create
+--file=- --verbose} (@samp{tar cfv -}, or even @samp{tar cv}---if the
+installer let standard output be the default archive). In that case
+@command{tar} writes verbose output to the standard error stream.
+
+If @option{--index-file=@var{file}} is specified, @command{tar} sends
+verbose output to @var{file} rather than to standard output or standard
+error.
+
+@anchor{totals}
+@cindex Obtaining total status information
+@opindex totals
+The @option{--totals} option causes @command{tar} to print on the
+standard error the total amount of bytes transferred when processing
+an archive. When creating or appending to an archive, this option
+prints the number of bytes written to the archive and the average
+speed at which they have been written, e.g.:
+
+@smallexample
+@group
+$ @kbd{tar -c -f archive.tar --totals /home}
+Total bytes written: 7924664320 (7.4GiB, 85MiB/s)
+@end group
+@end smallexample
+
+When reading an archive, this option displays the number of bytes
+read:
+
+@smallexample
+@group
+$ @kbd{tar -x -f archive.tar --totals}
+Total bytes read: 7924664320 (7.4GiB, 95MiB/s)
+@end group
+@end smallexample
+
+Finally, when deleting from an archive, the @option{--totals} option
+displays both numbers plus number of bytes removed from the archive:
+
+@smallexample
+@group
+$ @kbd{tar --delete -f foo.tar --totals --wildcards '*~'}
+Total bytes read: 9543680 (9.2MiB, 201MiB/s)
+Total bytes written: 3829760 (3.7MiB, 81MiB/s)
+Total bytes deleted: 1474048
+@end group
+@end smallexample
+
+You can also obtain this information on request. When
+@option{--totals} is used with an argument, this argument is
+interpreted as a symbolic name of a signal, upon delivery of which the
+statistics is to be printed:
+
+@table @option
+@item --totals=@var{signo}
+Print statistics upon delivery of signal @var{signo}. Valid arguments
+are: @code{SIGHUP}, @code{SIGQUIT}, @code{SIGINT}, @code{SIGUSR1} and
+@code{SIGUSR2}. Shortened names without @samp{SIG} prefix are also
+accepted.
+@end table
+
+Both forms of @option{--totals} option can be used simultaneously.
+Thus, @kbd{tar -x --totals --totals=USR1} instructs @command{tar} to
+extract all members from its default archive and print statistics
+after finishing the extraction, as well as when receiving signal
+@code{SIGUSR1}.
+
+@anchor{Progress information}
+@cindex Progress information
+@opindex checkpoint
+The @option{--checkpoint} option prints an occasional message
+as @command{tar} reads or writes the archive. It is designed for
+those who don't need the more detailed (and voluminous) output of
+@option{--block-number} (@option{-R}), but do want visual confirmation
+that @command{tar} is actually making forward progress. By default it
+prints a message each 10 records read or written. This can be changed
+by giving it a numeric argument after an equal sign:
+
+@smallexample
+$ @kbd{tar -c --checkpoint=1000} /var
+tar: Write checkpoint 1000
+tar: Write checkpoint 2000
+tar: Write checkpoint 3000
+@end smallexample
+
+This example shows the default checkpoint message used by
+@command{tar}. If you place a dot immediately after the equal
+sign, it will print a @samp{.} at each checkpoint. For example:
+
+@smallexample
+$ @kbd{tar -c --checkpoint=.1000} /var
+...
+@end smallexample
+
+@opindex show-omitted-dirs
+@anchor{show-omitted-dirs}
+The @option{--show-omitted-dirs} option, when reading an archive---with
+@option{--list} or @option{--extract}, for example---causes a message
+to be printed for each directory in the archive which is skipped.
+This happens regardless of the reason for skipping: the directory might
+not have been named on the command line (implicitly or explicitly),
+it might be excluded by the use of the
+@option{--exclude=@var{pattern}} option, or some other reason.
+
+@opindex block-number
+@cindex Block number where error occurred
+@anchor{block-number}
+If @option{--block-number} (@option{-R}) is used, @command{tar} prints, along with
+every message it would normally produce, the block number within the
+archive where the message was triggered. Also, supplementary messages
+are triggered when reading blocks full of NULs, or when hitting end of
+file on the archive. As of now, if the archive if properly terminated
+with a NUL block, the reading of the file may stop before end of file
+is met, so the position of end of file will not usually show when
+@option{--block-number} (@option{-R}) is used. Note that @GNUTAR{}
+drains the archive before exiting when reading the
+archive from a pipe.
+
+@cindex Error message, block number of
+This option is especially useful when reading damaged archives, since
+it helps pinpoint the damaged sections. It can also be used with
+@option{--list} (@option{-t}) when listing a file-system backup tape, allowing you to
+choose among several backup tapes when retrieving a file later, in
+favor of the tape where the file appears earliest (closest to the
+front of the tape). @xref{backup}.
+
+@node interactive
+@section Asking for Confirmation During Operations
+@cindex Interactive operation
+
+Typically, @command{tar} carries out a command without stopping for
+further instructions. In some situations however, you may want to
+exclude some files and archive members from the operation (for instance
+if disk or storage space is tight). You can do this by excluding
+certain files automatically (@pxref{Choosing}), or by performing
+an operation interactively, using the @option{--interactive} (@option{-w}) option.
+@command{tar} also accepts @option{--confirmation} for this option.
+
+@opindex interactive
+When the @option{--interactive} (@option{-w}) option is specified, before
+reading, writing, or deleting files, @command{tar} first prints a message
+for each such file, telling what operation it intends to take, then asks
+for confirmation on the terminal. The actions which require
+confirmation include adding a file to the archive, extracting a file
+from the archive, deleting a file from the archive, and deleting a file
+from disk. To confirm the action, you must type a line of input
+beginning with @samp{y}. If your input line begins with anything other
+than @samp{y}, @command{tar} skips that file.
+
+If @command{tar} is reading the archive from the standard input,
+@command{tar} opens the file @file{/dev/tty} to support the interactive
+communications.
+
+Verbose output is normally sent to standard output, separate from
+other error messages. However, if the archive is produced directly
+on standard output, then verbose output is mixed with errors on
+@code{stderr}. Producing the archive on standard output may be used
+as a way to avoid using disk space, when the archive is soon to be
+consumed by another process reading it, say. Some people felt the need
+of producing an archive on stdout, still willing to segregate between
+verbose output and error output. A possible approach would be using a
+named pipe to receive the archive, and having the consumer process to
+read from that named pipe. This has the advantage of letting standard
+output free to receive verbose output, all separate from errors.
+
+@node operations
+@chapter @GNUTAR{} Operations
+
+@menu
+* Basic tar::
+* Advanced tar::
+* create options::
+* extract options::
+* backup::
+* Applications::
+* looking ahead::
+@end menu
+
+@node Basic tar
+@section Basic @GNUTAR{} Operations
+
+The basic @command{tar} operations, @option{--create} (@option{-c}),
+@option{--list} (@option{-t}) and @option{--extract} (@option{--get},
+@option{-x}), are currently presented and described in the tutorial
+chapter of this manual. This section provides some complementary notes
+for these operations.
+
+@table @option
+@xopindex{create, complementary notes}
+@item --create
+@itemx -c
+
+Creating an empty archive would have some kind of elegance. One can
+initialize an empty archive and later use @option{--append}
+(@option{-r}) for adding all members. Some applications would not
+welcome making an exception in the way of adding the first archive
+member. On the other hand, many people reported that it is
+dangerously too easy for @command{tar} to destroy a magnetic tape with
+an empty archive@footnote{This is well described in @cite{Unix-haters
+Handbook}, by Simson Garfinkel, Daniel Weise & Steven Strassmann, IDG
+Books, ISBN 1-56884-203-1.}. The two most common errors are:
+
+@enumerate
+@item
+Mistakingly using @code{create} instead of @code{extract}, when the
+intent was to extract the full contents of an archive. This error
+is likely: keys @kbd{c} and @kbd{x} are right next to each other on
+the QWERTY keyboard. Instead of being unpacked, the archive then
+gets wholly destroyed. When users speak about @dfn{exploding} an
+archive, they usually mean something else :-).
+
+@item
+Forgetting the argument to @code{file}, when the intent was to create
+an archive with a single file in it. This error is likely because a
+tired user can easily add the @kbd{f} key to the cluster of option
+letters, by the mere force of habit, without realizing the full
+consequence of doing so. The usual consequence is that the single
+file, which was meant to be saved, is rather destroyed.
+@end enumerate
+
+So, recognizing the likelihood and the catastrophic nature of these
+errors, @GNUTAR{} now takes some distance from elegance, and
+cowardly refuses to create an archive when @option{--create} option is
+given, there are no arguments besides options, and
+@option{--files-from} (@option{-T}) option is @emph{not} used. To get
+around the cautiousness of @GNUTAR{} and nevertheless create an
+archive with nothing in it, one may still use, as the value for the
+@option{--files-from} option, a file with no names in it, as shown in
+the following commands:
+
+@smallexample
+@kbd{tar --create --file=empty-archive.tar --files-from=/dev/null}
+@kbd{tar cfT empty-archive.tar /dev/null}
+@end smallexample
+
+@xopindex{extract, complementary notes}
+@item --extract
+@itemx --get
+@itemx -x
+
+A socket is stored, within a @GNUTAR{} archive, as a pipe.
+
+@item @option{--list} (@option{-t})
+
+@GNUTAR{} now shows dates as @samp{1996-08-30},
+while it used to show them as @samp{Aug 30 1996}. Preferably,
+people should get used to ISO 8601 dates. Local American dates should
+be made available again with full date localization support, once
+ready. In the meantime, programs not being localizable for dates
+should prefer international dates, that's really the way to go.
+
+Look up @url{http://www.cl.cam.ac.uk/@/~mgk25/@/iso-time.html} if you
+are curious, it contains a detailed explanation of the ISO 8601 standard.
+
+@end table
+
+@node Advanced tar
+@section Advanced @GNUTAR{} Operations
+
+Now that you have learned the basics of using @GNUTAR{}, you may want
+to learn about further ways in which @command{tar} can help you.
+
+This chapter presents five, more advanced operations which you probably
+won't use on a daily basis, but which serve more specialized functions.
+We also explain the different styles of options and why you might want
+to use one or another, or a combination of them in your @command{tar}
+commands. Additionally, this chapter includes options which allow you to
+define the output from @command{tar} more carefully, and provide help and
+error correction in special circumstances.
+
+@FIXME{check this after the chapter is actually revised to make sure
+it still introduces the info in the chapter correctly : ).}
+
+@menu
+* Operations::
+* append::
+* update::
+* concatenate::
+* delete::
+* compare::
+@end menu
+
+@node Operations
+@subsection The Five Advanced @command{tar} Operations
+@UNREVISED
+
+In the last chapter, you learned about the first three operations to
+@command{tar}. This chapter presents the remaining five operations to
+@command{tar}: @option{--append}, @option{--update}, @option{--concatenate},
+@option{--delete}, and @option{--compare}.
+
+You are not likely to use these operations as frequently as those
+covered in the last chapter; however, since they perform specialized
+functions, they are quite useful when you do need to use them. We
+will give examples using the same directory and files that you created
+in the last chapter. As you may recall, the directory is called
+@file{practice}, the files are @samp{jazz}, @samp{blues}, @samp{folk},
+@samp{rock}, and the two archive files you created are
+@samp{collection.tar} and @samp{music.tar}.
+
+We will also use the archive files @samp{afiles.tar} and
+@samp{bfiles.tar}. The archive @samp{afiles.tar} contains the members @samp{apple},
+@samp{angst}, and @samp{aspic}; @samp{bfiles.tar} contains the members
+@samp{./birds}, @samp{baboon}, and @samp{./box}.
+
+Unless we state otherwise, all practicing you do and examples you follow
+in this chapter will take place in the @file{practice} directory that
+you created in the previous chapter; see @ref{prepare for examples}.
+(Below in this section, we will remind you of the state of the examples
+where the last chapter left them.)
+
+The five operations that we will cover in this chapter are:
+
+@table @option
+@item --append
+@itemx -r
+Add new entries to an archive that already exists.
+@item --update
+@itemx -r
+Add more recent copies of archive members to the end of an archive, if
+they exist.
+@item --concatenate
+@itemx --catenate
+@itemx -A
+Add one or more pre-existing archives to the end of another archive.
+@item --delete
+Delete items from an archive (does not work on tapes).
+@item --compare
+@itemx --diff
+@itemx -d
+Compare archive members to their counterparts in the file system.
+@end table
+
+@node append
+@subsection How to Add Files to Existing Archives: @option{--append}
+@UNREVISED
+
+@opindex append
+If you want to add files to an existing archive, you don't need to
+create a new archive; you can use @option{--append} (@option{-r}).
+The archive must already exist in order to use @option{--append}. (A
+related operation is the @option{--update} operation; you can use this
+to add newer versions of archive members to an existing archive. To learn how to
+do this with @option{--update}, @pxref{update}.)
+
+If you use @option{--append} to add a file that has the same name as an
+archive member to an archive containing that archive member, then the
+old member is not deleted. What does happen, however, is somewhat
+complex. @command{tar} @emph{allows} you to have infinite number of files
+with the same name. Some operations treat these same-named members no
+differently than any other set of archive members: for example, if you
+view an archive with @option{--list} (@option{-t}), you will see all
+of those members listed, with their data modification times, owners, etc.
+
+Other operations don't deal with these members as perfectly as you might
+prefer; if you were to use @option{--extract} to extract the archive,
+only the most recently added copy of a member with the same name as four
+other members would end up in the working directory. This is because
+@option{--extract} extracts an archive in the order the members appeared
+in the archive; the most recently archived members will be extracted
+last. Additionally, an extracted member will @emph{replace} a file of
+the same name which existed in the directory already, and @command{tar}
+will not prompt you about this@footnote{Unless you give it
+@option{--keep-old-files} option, or the disk copy is newer than the
+the one in the archive and you invoke @command{tar} with
+@option{--keep-newer-files} option}. Thus, only the most recently archived
+member will end up being extracted, as it will replace the one
+extracted before it, and so on.
+
+There exists a special option that allows you to get around this
+behavior and extract (or list) only a particular copy of the file.
+This is @option{--occurrence} option. If you run @command{tar} with
+this option, it will extract only the first copy of the file. You
+may also give this option an argument specifying the number of
+copy to be extracted. Thus, for example if the archive
+@file{archive.tar} contained three copies of file @file{myfile}, then
+the command
+
+@smallexample
+tar --extract --file archive.tar --occurrence=2 myfile
+@end smallexample
+
+@noindent
+would extract only the second copy. @xref{Option
+Summary,---occurrence}, for the description of @option{--occurrence}
+option.
+
+@FIXME{ hag -- you might want to incorporate some of the above into the
+MMwtSN node; not sure. i didn't know how to make it simpler...
+
+There are a few ways to get around this. (maybe xref Multiple Members
+with the Same Name.}
+
+@cindex Members, replacing with other members
+@cindex Replacing members with other members
+If you want to replace an archive member, use @option{--delete} to
+delete the member you want to remove from the archive, , and then use
+@option{--append} to add the member you want to be in the archive. Note
+that you can not change the order of the archive; the most recently
+added member will still appear last. In this sense, you cannot truly
+``replace'' one member with another. (Replacing one member with another
+will not work on certain types of media, such as tapes; see @ref{delete}
+and @ref{Media}, for more information.)
+
+@menu
+* appending files:: Appending Files to an Archive
+* multiple::
+@end menu
+
+@node appending files
+@subsubsection Appending Files to an Archive
+@UNREVISED
+@cindex Adding files to an Archive
+@cindex Appending files to an Archive
+@cindex Archives, Appending files to
+
+The simplest way to add a file to an already existing archive is the
+@option{--append} (@option{-r}) operation, which writes specified
+files into the archive whether or not they are already among the
+archived files.
+
+When you use @option{--append}, you @emph{must} specify file name
+arguments, as there is no default. If you specify a file that already
+exists in the archive, another copy of the file will be added to the
+end of the archive. As with other operations, the member names of the
+newly added files will be exactly the same as their names given on the
+command line. The @option{--verbose} (@option{-v}) option will print
+out the names of the files as they are written into the archive.
+
+@option{--append} cannot be performed on some tape drives, unfortunately,
+due to deficiencies in the formats those tape drives use. The archive
+must be a valid @command{tar} archive, or else the results of using this
+operation will be unpredictable. @xref{Media}.
+
+To demonstrate using @option{--append} to add a file to an archive,
+create a file called @file{rock} in the @file{practice} directory.
+Make sure you are in the @file{practice} directory. Then, run the
+following @command{tar} command to add @file{rock} to
+@file{collection.tar}:
+
+@smallexample
+$ @kbd{tar --append --file=collection.tar rock}
+@end smallexample
+
+@noindent
+If you now use the @option{--list} (@option{-t}) operation, you will see that
+@file{rock} has been added to the archive:
+
+@smallexample
+$ @kbd{tar --list --file=collection.tar}
+-rw-r--r-- me user 28 1996-10-18 16:31 jazz
+-rw-r--r-- me user 21 1996-09-23 16:44 blues
+-rw-r--r-- me user 20 1996-09-23 16:44 folk
+-rw-r--r-- me user 20 1996-09-23 16:44 rock
+@end smallexample
+
+@node multiple
+@subsubsection Multiple Members with the Same Name
+
+You can use @option{--append} (@option{-r}) to add copies of files
+which have been updated since the archive was created. (However, we
+do not recommend doing this since there is another @command{tar}
+option called @option{--update}; @xref{update}, for more information.
+We describe this use of @option{--append} here for the sake of
+completeness.) When you extract the archive, the older version will
+be effectively lost. This works because files are extracted from an
+archive in the order in which they were archived. Thus, when the
+archive is extracted, a file archived later in time will replace a
+file of the same name which was archived earlier, even though the
+older version of the file will remain in the archive unless you delete
+all versions of the file.
+
+Supposing you change the file @file{blues} and then append the changed
+version to @file{collection.tar}. As you saw above, the original
+@file{blues} is in the archive @file{collection.tar}. If you change the
+file and append the new version of the file to the archive, there will
+be two copies in the archive. When you extract the archive, the older
+version of the file will be extracted first, and then replaced by the
+newer version when it is extracted.
+
+You can append the new, changed copy of the file @file{blues} to the
+archive in this way:
+
+@smallexample
+$ @kbd{tar --append --verbose --file=collection.tar blues}
+blues
+@end smallexample
+
+@noindent
+Because you specified the @option{--verbose} option, @command{tar} has
+printed the name of the file being appended as it was acted on. Now
+list the contents of the archive:
+
+@smallexample
+$ @kbd{tar --list --verbose --file=collection.tar}
+-rw-r--r-- me user 28 1996-10-18 16:31 jazz
+-rw-r--r-- me user 21 1996-09-23 16:44 blues
+-rw-r--r-- me user 20 1996-09-23 16:44 folk
+-rw-r--r-- me user 20 1996-09-23 16:44 rock
+-rw-r--r-- me user 58 1996-10-24 18:30 blues
+@end smallexample
+
+@noindent
+The newest version of @file{blues} is now at the end of the archive
+(note the different creation dates and file sizes). If you extract
+the archive, the older version of the file @file{blues} will be
+replaced by the newer version. You can confirm this by extracting
+the archive and running @samp{ls} on the directory.
+
+If you wish to extract the first occurrence of the file @file{blues}
+from the archive, use @option{--occurrence} option, as shown in
+the following example:
+
+@smallexample
+$ @kbd{tar --extract -vv --occurrence --file=collection.tar blues}
+-rw-r--r-- me user 21 1996-09-23 16:44 blues
+@end smallexample
+
+@xref{Writing}, for more information on @option{--extract} and
+@xref{Option Summary, --occurrence}, for the description of
+@option{--occurrence} option.
+
+@node update
+@subsection Updating an Archive
+@UNREVISED
+@cindex Updating an archive
+
+@opindex update
+In the previous section, you learned how to use @option{--append} to
+add a file to an existing archive. A related operation is
+@option{--update} (@option{-u}). The @option{--update} operation
+updates a @command{tar} archive by comparing the date of the specified
+archive members against the date of the file with the same name. If
+the file has been modified more recently than the archive member, then
+the newer version of the file is added to the archive (as with
+@option{--append}).
+
+Unfortunately, you cannot use @option{--update} with magnetic tape drives.
+The operation will fail.
+
+@FIXME{other examples of media on which --update will fail? need to ask
+charles and/or mib/thomas/dave shevett..}
+
+Both @option{--update} and @option{--append} work by adding to the end
+of the archive. When you extract a file from the archive, only the
+version stored last will wind up in the file system, unless you use
+the @option{--backup} option. @xref{multiple}, for a detailed discussion.
+
+@menu
+* how to update::
+@end menu
+
+@node how to update
+@subsubsection How to Update an Archive Using @option{--update}
+
+You must use file name arguments with the @option{--update}
+(@option{-u}) operation. If you don't specify any files,
+@command{tar} won't act on any files and won't tell you that it didn't
+do anything (which may end up confusing you).
+
+@c note: the above parenthetical added because in fact, this
+@c behavior just confused the author. :-)
+
+To see the @option{--update} option at work, create a new file,
+@file{classical}, in your practice directory, and some extra text to the
+file @file{blues}, using any text editor. Then invoke @command{tar} with
+the @samp{update} operation and the @option{--verbose} (@option{-v})
+option specified, using the names of all the files in the practice
+directory as file name arguments:
+
+@smallexample
+$ @kbd{tar --update -v -f collection.tar blues folk rock classical}
+blues
+classical
+$
+@end smallexample
+
+@noindent
+Because we have specified verbose mode, @command{tar} prints out the names
+of the files it is working on, which in this case are the names of the
+files that needed to be updated. If you run @samp{tar --list} and look
+at the archive, you will see @file{blues} and @file{classical} at its
+end. There will be a total of two versions of the member @samp{blues};
+the one at the end will be newer and larger, since you added text before
+updating it.
+
+(The reason @command{tar} does not overwrite the older file when updating
+it is because writing to the middle of a section of tape is a difficult
+process. Tapes are not designed to go backward. @xref{Media}, for more
+information about tapes.
+
+@option{--update} (@option{-u}) is not suitable for performing backups for two
+reasons: it does not change directory content entries, and it
+lengthens the archive every time it is used. The @GNUTAR{}
+options intended specifically for backups are more
+efficient. If you need to run backups, please consult @ref{Backups}.
+
+@node concatenate
+@subsection Combining Archives with @option{--concatenate}
+
+@cindex Adding archives to an archive
+@cindex Concatenating Archives
+@opindex concatenate
+@opindex catenate
+@c @cindex @option{-A} described
+Sometimes it may be convenient to add a second archive onto the end of
+an archive rather than adding individual files to the archive. To add
+one or more archives to the end of another archive, you should use the
+@option{--concatenate} (@option{--catenate}, @option{-A}) operation.
+
+To use @option{--concatenate}, give the first archive with
+@option{--file} option and name the rest of archives to be
+concatenated on the command line. The members, and their member
+names, will be copied verbatim from those archives to the first one.
+@footnote{This can cause multiple members to have the same name, for
+information on how this affects reading the archive, @ref{multiple}.}
+The new, concatenated archive will be called by the same name as the
+one given with the @option{--file} option. As usual, if you omit
+@option{--file}, @command{tar} will use the value of the environment
+variable @env{TAPE}, or, if this has not been set, the default archive name.
+
+@FIXME{There is no way to specify a new name...}
+
+To demonstrate how @option{--concatenate} works, create two small archives
+called @file{bluesrock.tar} and @file{folkjazz.tar}, using the relevant
+files from @file{practice}:
+
+@smallexample
+$ @kbd{tar -cvf bluesrock.tar blues rock}
+blues
+rock
+$ @kbd{tar -cvf folkjazz.tar folk jazz}
+folk
+jazz
+@end smallexample
+
+@noindent
+If you like, You can run @samp{tar --list} to make sure the archives
+contain what they are supposed to:
+
+@smallexample
+$ @kbd{tar -tvf bluesrock.tar}
+-rw-r--r-- melissa user 105 1997-01-21 19:42 blues
+-rw-r--r-- melissa user 33 1997-01-20 15:34 rock
+$ @kbd{tar -tvf jazzfolk.tar}
+-rw-r--r-- melissa user 20 1996-09-23 16:44 folk
+-rw-r--r-- melissa user 65 1997-01-30 14:15 jazz
+@end smallexample
+
+We can concatenate these two archives with @command{tar}:
+
+@smallexample
+$ @kbd{cd ..}
+$ @kbd{tar --concatenate --file=bluesrock.tar jazzfolk.tar}
+@end smallexample
+
+If you now list the contents of the @file{bluesrock.tar}, you will see
+that now it also contains the archive members of @file{jazzfolk.tar}:
+
+@smallexample
+$ @kbd{tar --list --file=bluesrock.tar}
+blues
+rock
+folk
+jazz
+@end smallexample
+
+When you use @option{--concatenate}, the source and target archives must
+already exist and must have been created using compatible format
+parameters. Notice, that @command{tar} does not check whether the
+archives it concatenates have compatible formats, it does not
+even check if the files are really tar archives.
+
+Like @option{--append} (@option{-r}), this operation cannot be performed on some
+tape drives, due to deficiencies in the formats those tape drives use.
+
+@cindex @code{concatenate} vs @command{cat}
+@cindex @command{cat} vs @code{concatenate}
+It may seem more intuitive to you to want or try to use @command{cat} to
+concatenate two archives instead of using the @option{--concatenate}
+operation; after all, @command{cat} is the utility for combining files.
+
+However, @command{tar} archives incorporate an end-of-file marker which
+must be removed if the concatenated archives are to be read properly as
+one archive. @option{--concatenate} removes the end-of-archive marker
+from the target archive before each new archive is appended. If you use
+@command{cat} to combine the archives, the result will not be a valid
+@command{tar} format archive. If you need to retrieve files from an
+archive that was added to using the @command{cat} utility, use the
+@option{--ignore-zeros} (@option{-i}) option. @xref{Ignore Zeros}, for further
+information on dealing with archives improperly combined using the
+@command{cat} shell utility.
+
+@node delete
+@subsection Removing Archive Members Using @option{--delete}
+@UNREVISED
+@cindex Deleting files from an archive
+@cindex Removing files from an archive
+
+@opindex delete
+You can remove members from an archive by using the @option{--delete}
+option. Specify the name of the archive with @option{--file}
+(@option{-f}) and then specify the names of the members to be deleted;
+if you list no member names, nothing will be deleted. The
+@option{--verbose} option will cause @command{tar} to print the names
+of the members as they are deleted. As with @option{--extract}, you
+must give the exact member names when using @samp{tar --delete}.
+@option{--delete} will remove all versions of the named file from the
+archive. The @option{--delete} operation can run very slowly.
+
+Unlike other operations, @option{--delete} has no short form.
+
+@cindex Tapes, using @option{--delete} and
+@cindex Deleting from tape archives
+This operation will rewrite the archive. You can only use
+@option{--delete} on an archive if the archive device allows you to
+write to any point on the media, such as a disk; because of this, it
+does not work on magnetic tapes. Do not try to delete an archive member
+from a magnetic tape; the action will not succeed, and you will be
+likely to scramble the archive and damage your tape. There is no safe
+way (except by completely re-writing the archive) to delete files from
+most kinds of magnetic tape. @xref{Media}.
+
+To delete all versions of the file @file{blues} from the archive
+@file{collection.tar} in the @file{practice} directory, make sure you
+are in that directory, and then,
+
+@smallexample
+$ @kbd{tar --list --file=collection.tar}
+blues
+folk
+jazz
+rock
+$ @kbd{tar --delete --file=collection.tar blues}
+$ @kbd{tar --list --file=collection.tar}
+folk
+jazz
+rock
+$
+@end smallexample
+
+@FIXME{Check if the above listing is actually produced after running
+all the examples on collection.tar.}
+
+The @option{--delete} option has been reported to work properly when
+@command{tar} acts as a filter from @code{stdin} to @code{stdout}.
+
+@node compare
+@subsection Comparing Archive Members with the File System
+@cindex Verifying the currency of an archive
+@UNREVISED
+
+@opindex compare
+The @option{--compare} (@option{-d}), or @option{--diff} operation compares
+specified archive members against files with the same names, and then
+reports differences in file size, mode, owner, modification date and
+contents. You should @emph{only} specify archive member names, not file
+names. If you do not name any members, then @command{tar} will compare the
+entire archive. If a file is represented in the archive but does not
+exist in the file system, @command{tar} reports a difference.
+
+You have to specify the record size of the archive when modifying an
+archive with a non-default record size.
+
+@command{tar} ignores files in the file system that do not have
+corresponding members in the archive.
+
+The following example compares the archive members @file{rock},
+@file{blues} and @file{funk} in the archive @file{bluesrock.tar} with
+files of the same name in the file system. (Note that there is no file,
+@file{funk}; @command{tar} will report an error message.)
+
+@smallexample
+$ @kbd{tar --compare --file=bluesrock.tar rock blues funk}
+rock
+blues
+tar: funk not found in archive
+@end smallexample
+
+The spirit behind the @option{--compare} (@option{--diff},
+@option{-d}) option is to check whether the archive represents the
+current state of files on disk, more than validating the integrity of
+the archive media. For this later goal, @xref{verify}.
+
+@node create options
+@section Options Used by @option{--create}
+
+@xopindex{create, additional options}
+The previous chapter described the basics of how to use
+@option{--create} (@option{-c}) to create an archive from a set of files.
+@xref{create}. This section described advanced options to be used with
+@option{--create}.
+
+@menu
+* override:: Overriding File Metadata.
+* Ignore Failed Read::
+@end menu
+
+@node override
+@subsection Overriding File Metadata
+
+As described above, a @command{tar} archive keeps, for each member it contains,
+its @dfn{metadata}, such as modification time, mode and ownership of
+the file. @GNUTAR{} allows to replace these data with other values
+when adding files to the archive. The options described in this
+section affect creation of archives of any type. For POSIX archives,
+see also @ref{PAX keywords}, for additional ways of controlling
+metadata, stored in the archive.
+
+@table @option
+@opindex mode
+@item --mode=@var{permissions}
+
+When adding files to an archive, @command{tar} will use
+@var{permissions} for the archive members, rather than the permissions
+from the files. @var{permissions} can be specified either as an octal
+number or as symbolic permissions, like with
+@command{chmod} (@xref{File permissions, Permissions, File
+permissions, fileutils, @acronym{GNU} file utilities}. This reference
+also has useful information for those not being overly familiar with
+the UNIX permission system). Using latter syntax allows for
+more flexibility. For example, the value @samp{a+rw} adds read and write
+permissions for everybody, while retaining executable bits on directories
+or on any other file already marked as executable:
+
+@smallexample
+$ @kbd{tar -c -f archive.tar --mode='a+rw' .}
+@end smallexample
+
+@item --mtime=@var{date}
+@opindex mtime
+
+When adding files to an archive, @command{tar} will use @var{date} as
+the modification time of members when creating archives, instead of
+their actual modification times. The argument @var{date} can be
+either a textual date representation in almost arbitrary format
+(@pxref{Date input formats}) or a name of the existing file, starting
+with @samp{/} or @samp{.}. In the latter case, the modification time
+of that file will be used.
+
+The following example will set the modification date to 00:00:00 UTC,
+January 1, 1970:
+
+@smallexample
+$ @kbd{tar -c -f archive.tar --mtime='1970-01-01' .}
+@end smallexample
+
+@noindent
+When used with @option{--verbose} (@pxref{verbose tutorial}) @GNUTAR{}
+will try to convert the specified date back to its textual
+representation and compare it with the one given with
+@option{--mtime} options. If the two dates differ, @command{tar} will
+print a warning saying what date it will use. This is to help user
+ensure he is using the right date.
+
+For example:
+
+@smallexample
+$ @kbd{tar -c -f archive.tar -v --mtime=yesterday .}
+tar: Option --mtime: Treating date `yesterday' as 2006-06-20
+13:06:29.152478
+@dots{}
+@end smallexample
+
+@item --owner=@var{user}
+@opindex owner
+
+Specifies that @command{tar} should use @var{user} as the owner of members
+when creating archives, instead of the user associated with the source
+file. The argument @var{user} can be either an existing user symbolic
+name, or a decimal numeric user @acronym{ID}.
+
+There is no value indicating a missing number, and @samp{0} usually means
+@code{root}. Some people like to force @samp{0} as the value to offer in
+their distributions for the owner of files, because the @code{root} user is
+anonymous anyway, so that might as well be the owner of anonymous
+archives. For example:
+
+@smallexample
+@group
+$ @kbd{tar -c -f archive.tar --owner=0 .}
+# @r{Or:}
+$ @kbd{tar -c -f archive.tar --owner=root .}
+@end group
+@end smallexample
+
+@item --group=@var{group}
+@opindex group
+
+Files added to the @command{tar} archive will have a group @acronym{ID} of @var{group},
+rather than the group from the source file. The argument @var{group}
+can be either an existing group symbolic name, or a decimal numeric group @acronym{ID}.
+@end table
+
+@node Ignore Failed Read
+@subsection Ignore Fail Read
+
+@table @option
+@item --ignore-failed-read
+@opindex ignore-failed-read
+Do not exit with nonzero on unreadable files or directories.
+@end table
+
+@node extract options
+@section Options Used by @option{--extract}
+@UNREVISED
+
+@xopindex{extract, additional options}
+The previous chapter showed how to use @option{--extract} to extract
+an archive into the file system. Various options cause @command{tar} to
+extract more information than just file contents, such as the owner,
+the permissions, the modification date, and so forth. This section
+presents options to be used with @option{--extract} when certain special
+considerations arise. You may review the information presented in
+@ref{extract} for more basic information about the
+@option{--extract} operation.
+
+@menu
+* Reading:: Options to Help Read Archives
+* Writing:: Changing How @command{tar} Writes Files
+* Scarce:: Coping with Scarce Resources
+@end menu
+
+@node Reading
+@subsection Options to Help Read Archives
+@cindex Options when reading archives
+@UNREVISED
+
+@cindex Reading incomplete records
+@cindex Records, incomplete
+@opindex read-full-records
+Normally, @command{tar} will request data in full record increments from
+an archive storage device. If the device cannot return a full record,
+@command{tar} will report an error. However, some devices do not always
+return full records, or do not require the last record of an archive to
+be padded out to the next record boundary. To keep reading until you
+obtain a full record, or to accept an incomplete record if it contains
+an end-of-archive marker, specify the @option{--read-full-records} (@option{-B}) option
+in conjunction with the @option{--extract} or @option{--list} operations.
+@xref{Blocking}.
+
+The @option{--read-full-records} (@option{-B}) option is turned on by default when
+@command{tar} reads an archive from standard input, or from a remote
+machine. This is because on @acronym{BSD} Unix systems, attempting to read a
+pipe returns however much happens to be in the pipe, even if it is
+less than was requested. If this option were not enabled, @command{tar}
+would fail as soon as it read an incomplete record from the pipe.
+
+If you're not sure of the blocking factor of an archive, you can
+read the archive by specifying @option{--read-full-records} (@option{-B}) and
+@option{--blocking-factor=@var{512-size}} (@option{-b
+@var{512-size}}), using a blocking factor larger than what the archive
+uses. This lets you avoid having to determine the blocking factor
+of an archive. @xref{Blocking Factor}.
+
+@menu
+* read full records::
+* Ignore Zeros::
+@end menu
+
+@node read full records
+@unnumberedsubsubsec Reading Full Records
+
+@FIXME{need sentence or so of intro here}
+
+@table @option
+@opindex read-full-records
+@item --read-full-records
+@item -B
+Use in conjunction with @option{--extract} (@option{--get},
+@option{-x}) to read an archive which contains incomplete records, or
+one which has a blocking factor less than the one specified.
+@end table
+
+@node Ignore Zeros
+@unnumberedsubsubsec Ignoring Blocks of Zeros
+
+@cindex End-of-archive blocks, ignoring
+@cindex Ignoring end-of-archive blocks
+@opindex ignore-zeros
+Normally, @command{tar} stops reading when it encounters a block of zeros
+between file entries (which usually indicates the end of the archive).
+@option{--ignore-zeros} (@option{-i}) allows @command{tar} to
+completely read an archive which contains a block of zeros before the
+end (i.e., a damaged archive, or one that was created by concatenating
+several archives together).
+
+The @option{--ignore-zeros} (@option{-i}) option is turned off by default because many
+versions of @command{tar} write garbage after the end-of-archive entry,
+since that part of the media is never supposed to be read. @GNUTAR{}
+does not write after the end of an archive, but seeks to
+maintain compatibility among archiving utilities.
+
+@table @option
+@item --ignore-zeros
+@itemx -i
+To ignore blocks of zeros (i.e., end-of-archive entries) which may be
+encountered while reading an archive. Use in conjunction with
+@option{--extract} or @option{--list}.
+@end table
+
+@node Writing
+@subsection Changing How @command{tar} Writes Files
+@UNREVISED
+
+@FIXME{Introductory paragraph}
+
+@menu
+* Dealing with Old Files::
+* Overwrite Old Files::
+* Keep Old Files::
+* Keep Newer Files::
+* Unlink First::
+* Recursive Unlink::
+* Data Modification Times::
+* Setting Access Permissions::
+* Directory Modification Times and Permissions::
+* Writing to Standard Output::
+* Writing to an External Program::
+* remove files::
+@end menu
+
+@node Dealing with Old Files
+@unnumberedsubsubsec Options Controlling the Overwriting of Existing Files
+
+@xopindex{overwrite-dir, introduced}
+When extracting files, if @command{tar} discovers that the extracted
+file already exists, it normally replaces the file by removing it before
+extracting it, to prevent confusion in the presence of hard or symbolic
+links. (If the existing file is a symbolic link, it is removed, not
+followed.) However, if a directory cannot be removed because it is
+nonempty, @command{tar} normally overwrites its metadata (ownership,
+permission, etc.). The @option{--overwrite-dir} option enables this
+default behavior. To be more cautious and preserve the metadata of
+such a directory, use the @option{--no-overwrite-dir} option.
+
+@cindex Overwriting old files, prevention
+@xopindex{keep-old-files, introduced}
+To be even more cautious and prevent existing files from being replaced, use
+the @option{--keep-old-files} (@option{-k}) option. It causes @command{tar} to refuse
+to replace or update a file that already exists, i.e., a file with the
+same name as an archive member prevents extraction of that archive
+member. Instead, it reports an error.
+
+@xopindex{overwrite, introduced}
+To be more aggressive about altering existing files, use the
+@option{--overwrite} option. It causes @command{tar} to overwrite
+existing files and to follow existing symbolic links when extracting.
+
+@cindex Protecting old files
+Some people argue that @GNUTAR{} should not hesitate
+to overwrite files with other files when extracting. When extracting
+a @command{tar} archive, they expect to see a faithful copy of the
+state of the file system when the archive was created. It is debatable
+that this would always be a proper behavior. For example, suppose one
+has an archive in which @file{usr/local} is a link to
+@file{usr/local2}. Since then, maybe the site removed the link and
+renamed the whole hierarchy from @file{/usr/local2} to
+@file{/usr/local}. Such things happen all the time. I guess it would
+not be welcome at all that @GNUTAR{} removes the
+whole hierarchy just to make room for the link to be reinstated
+(unless it @emph{also} simultaneously restores the full
+@file{/usr/local2}, of course!) @GNUTAR{} is indeed
+able to remove a whole hierarchy to reestablish a symbolic link, for
+example, but @emph{only if} @option{--recursive-unlink} is specified
+to allow this behavior. In any case, single files are silently
+removed.
+
+@xopindex{unlink-first, introduced}
+Finally, the @option{--unlink-first} (@option{-U}) option can improve performance in
+some cases by causing @command{tar} to remove files unconditionally
+before extracting them.
+
+@node Overwrite Old Files
+@unnumberedsubsubsec Overwrite Old Files
+
+@table @option
+@opindex overwrite
+@item --overwrite
+Overwrite existing files and directory metadata when extracting files
+from an archive.
+
+This causes @command{tar} to write extracted files into the file system without
+regard to the files already on the system; i.e., files with the same
+names as archive members are overwritten when the archive is extracted.
+It also causes @command{tar} to extract the ownership, permissions,
+and time stamps onto any preexisting files or directories.
+If the name of a corresponding file name is a symbolic link, the file
+pointed to by the symbolic link will be overwritten instead of the
+symbolic link itself (if this is possible). Moreover, special devices,
+empty directories and even symbolic links are automatically removed if
+they are in the way of extraction.
+
+Be careful when using the @option{--overwrite} option, particularly when
+combined with the @option{--absolute-names} (@option{-P}) option, as this combination
+can change the contents, ownership or permissions of any file on your
+system. Also, many systems do not take kindly to overwriting files that
+are currently being executed.
+
+@opindex overwrite-dir
+@item --overwrite-dir
+Overwrite the metadata of directories when extracting files from an
+archive, but remove other files before extracting.
+@end table
+
+@node Keep Old Files
+@unnumberedsubsubsec Keep Old Files
+
+@table @option
+@opindex keep-old-files
+@item --keep-old-files
+@itemx -k
+Do not replace existing files from archive. The
+@option{--keep-old-files} (@option{-k}) option prevents @command{tar}
+from replacing existing files with files with the same name from the
+archive. The @option{--keep-old-files} option is meaningless with
+@option{--list} (@option{-t}). Prevents @command{tar} from replacing
+files in the file system during extraction.
+@end table
+
+@node Keep Newer Files
+@unnumberedsubsubsec Keep Newer Files
+
+@table @option
+@opindex keep-newer-files
+@item --keep-newer-files
+Do not replace existing files that are newer than their archive
+copies. This option is meaningless with @option{--list} (@option{-t}).
+@end table
+
+@node Unlink First
+@unnumberedsubsubsec Unlink First
+
+@table @option
+@opindex unlink-first
+@item --unlink-first
+@itemx -U
+Remove files before extracting over them.
+This can make @command{tar} run a bit faster if you know in advance
+that the extracted files all need to be removed. Normally this option
+slows @command{tar} down slightly, so it is disabled by default.
+@end table
+
+@node Recursive Unlink
+@unnumberedsubsubsec Recursive Unlink
+
+@table @option
+@opindex recursive-unlink
+@item --recursive-unlink
+When this option is specified, try removing files and directory hierarchies
+before extracting over them. @emph{This is a dangerous option!}
+@end table
+
+If you specify the @option{--recursive-unlink} option,
+@command{tar} removes @emph{anything} that keeps you from extracting a file
+as far as current permissions will allow it. This could include removal
+of the contents of a full directory hierarchy.
+
+@node Data Modification Times
+@unnumberedsubsubsec Setting Data Modification Times
+
+@cindex Data modification times of extracted files
+@cindex Modification times of extracted files
+Normally, @command{tar} sets the data modification times of extracted
+files to the corresponding times recorded for the files in the archive, but
+limits the permissions of extracted files by the current @code{umask}
+setting.
+
+To set the data modification times of extracted files to the time when
+the files were extracted, use the @option{--touch} (@option{-m}) option in
+conjunction with @option{--extract} (@option{--get}, @option{-x}).
+
+@table @option
+@opindex touch
+@item --touch
+@itemx -m
+Sets the data modification time of extracted archive members to the time
+they were extracted, not the time recorded for them in the archive.
+Use in conjunction with @option{--extract} (@option{--get}, @option{-x}).
+@end table
+
+@node Setting Access Permissions
+@unnumberedsubsubsec Setting Access Permissions
+
+@cindex Permissions of extracted files
+@cindex Modes of extracted files
+To set the modes (access permissions) of extracted files to those
+recorded for those files in the archive, use @option{--same-permissions}
+in conjunction with the @option{--extract} (@option{--get},
+@option{-x}) operation.
+
+@table @option
+@opindex preserve-permissions
+@opindex same-permissions
+@item --preserve-permissions
+@itemx --same-permissions
+@c @itemx --ignore-umask
+@itemx -p
+Set modes of extracted archive members to those recorded in the
+archive, instead of current umask settings. Use in conjunction with
+@option{--extract} (@option{--get}, @option{-x}).
+@end table
+
+@node Directory Modification Times and Permissions
+@unnumberedsubsubsec Directory Modification Times and Permissions
+
+After successfully extracting a file member, @GNUTAR{} normally
+restores its permissions and modification times, as described in the
+previous sections. This cannot be done for directories, because
+after extracting a directory @command{tar} will almost certainly
+extract files into that directory and this will cause the directory
+modification time to be updated. Moreover, restoring that directory
+permissions may not permit file creation within it. Thus, restoring
+directory permissions and modification times must be delayed at least
+until all files have been extracted into that directory. @GNUTAR{}
+restores directories using the following approach.
+
+The extracted directories are created with the mode specified in the
+archive, as modified by the umask of the user, which gives sufficient
+permissions to allow file creation. The meta-information about the
+directory is recorded in the temporary list of directories. When
+preparing to extract next archive member, @GNUTAR{} checks if the
+directory prefix of this file contains the remembered directory. If
+it does not, the program assumes that all files have been extracted
+into that directory, restores its modification time and permissions
+and removes its entry from the internal list. This approach allows
+to correctly restore directory meta-information in the majority of
+cases, while keeping memory requirements sufficiently small. It is
+based on the fact, that most @command{tar} archives use the predefined
+order of members: first the directory, then all the files and
+subdirectories in that directory.
+
+However, this is not always true. The most important exception are
+incremental archives (@pxref{Incremental Dumps}). The member order in
+an incremental archive is reversed: first all directory members are
+stored, followed by other (non-directory) members. So, when extracting
+from incremental archives, @GNUTAR{} alters the above procedure. It
+remembers all restored directories, and restores their meta-data
+only after the entire archive has been processed. Notice, that you do
+not need to specify any special options for that, as @GNUTAR{}
+automatically detects archives in incremental format.
+
+There may be cases, when such processing is required for normal archives
+too. Consider the following example:
+
+@smallexample
+@group
+$ @kbd{tar --no-recursion -cvf archive \
+ foo foo/file1 bar bar/file foo/file2}
+foo/
+foo/file1
+bar/
+bar/file
+foo/file2
+@end group
+@end smallexample
+
+During the normal operation, after encountering @file{bar}
+@GNUTAR{} will assume that all files from the directory @file{foo}
+were already extracted and will therefore restore its timestamp and
+permission bits. However, after extracting @file{foo/file2} the
+directory timestamp will be offset again.
+
+To correctly restore directory meta-information in such cases, use
+@option{delay-directory-restore} command line option:
+
+@table @option
+@opindex delay-directory-restore
+@item --delay-directory-restore
+Delays restoring of the modification times and permissions of extracted
+directories until the end of extraction. This way, correct
+meta-information is restored even if the archive has unusual member
+ordering.
+
+@opindex no-delay-directory-restore
+@item --no-delay-directory-restore
+Cancel the effect of the previous @option{--delay-directory-restore}.
+Use this option if you have used @option{--delay-directory-restore} in
+@env{TAR_OPTIONS} variable (@pxref{TAR_OPTIONS}) and wish to
+temporarily disable it.
+@end table
+
+@node Writing to Standard Output
+@unnumberedsubsubsec Writing to Standard Output
+
+@cindex Writing extracted files to standard output
+@cindex Standard output, writing extracted files to
+To write the extracted files to the standard output, instead of
+creating the files on the file system, use @option{--to-stdout} (@option{-O}) in
+conjunction with @option{--extract} (@option{--get}, @option{-x}). This option is useful if you are
+extracting files to send them through a pipe, and do not need to
+preserve them in the file system. If you extract multiple members,
+they appear on standard output concatenated, in the order they are
+found in the archive.
+
+@table @option
+@opindex to-stdout
+@item --to-stdout
+@itemx -O
+Writes files to the standard output. Use only in conjunction with
+@option{--extract} (@option{--get}, @option{-x}). When this option is
+used, instead of creating the files specified, @command{tar} writes
+the contents of the files extracted to its standard output. This may
+be useful if you are only extracting the files in order to send them
+through a pipe. This option is meaningless with @option{--list}
+(@option{-t}).
+@end table
+
+This can be useful, for example, if you have a tar archive containing
+a big file and don't want to store the file on disk before processing
+it. You can use a command like this:
+
+@smallexample
+tar -xOzf foo.tgz bigfile | process
+@end smallexample
+
+or even like this if you want to process the concatenation of the files:
+
+@smallexample
+tar -xOzf foo.tgz bigfile1 bigfile2 | process
+@end smallexample
+
+However, @option{--to-command} may be more convenient for use with
+multiple files. See the next section.
+
+@node Writing to an External Program
+@unnumberedsubsubsec Writing to an External Program
+
+You can instruct @command{tar} to send the contents of each extracted
+file to the standard input of an external program:
+
+@table @option
+@opindex to-command
+@item --to-command=@var{command}
+Extract files and pipe their contents to the standard input of
+@var{command}. When this option is used, instead of creating the
+files specified, @command{tar} invokes @var{command} and pipes the
+contents of the files to its standard output. @var{Command} may
+contain command line arguments. The program is executed via
+@code{sh -c}. Notice, that @var{command} is executed once for each regular file
+extracted. Non-regular files (directories, etc.) are ignored when this
+option is used.
+@end table
+
+The command can obtain the information about the file it processes
+from the following environment variables:
+
+@table @var
+@vrindex TAR_FILETYPE, to-command environment
+@item TAR_FILETYPE
+Type of the file. It is a single letter with the following meaning:
+
+@multitable @columnfractions 0.10 0.90
+@item f @tab Regular file
+@item d @tab Directory
+@item l @tab Symbolic link
+@item h @tab Hard link
+@item b @tab Block device
+@item c @tab Character device
+@end multitable
+
+Currently only regular files are supported.
+
+@vrindex TAR_MODE, to-command environment
+@item TAR_MODE
+File mode, an octal number.
+
+@vrindex TAR_FILENAME, to-command environment
+@item TAR_FILENAME
+The name of the file.
+
+@vrindex TAR_REALNAME, to-command environment
+@item TAR_REALNAME
+Name of the file as stored in the archive.
+
+@vrindex TAR_UNAME, to-command environment
+@item TAR_UNAME
+Name of the file owner.
+
+@vrindex TAR_GNAME, to-command environment
+@item TAR_GNAME
+Name of the file owner group.
+
+@vrindex TAR_ATIME, to-command environment
+@item TAR_ATIME
+Time of last access. It is a decimal number, representing seconds
+since the epoch. If the archive provides times with nanosecond
+precision, the nanoseconds are appended to the timestamp after a
+decimal point.
+
+@vrindex TAR_MTIME, to-command environment
+@item TAR_MTIME
+Time of last modification.
+
+@vrindex TAR_CTIME, to-command environment
+@item TAR_CTIME
+Time of last status change.
+
+@vrindex TAR_SIZE, to-command environment
+@item TAR_SIZE
+Size of the file.
+
+@vrindex TAR_UID, to-command environment
+@item TAR_UID
+UID of the file owner.
+
+@vrindex TAR_GID, to-command environment
+@item TAR_GID
+GID of the file owner.
+@end table
+
+In addition to these variables, @env{TAR_VERSION} contains the
+@GNUTAR{} version number.
+
+If @var{command} exits with a non-0 status, @command{tar} will print
+an error message similar to the following:
+
+@smallexample
+tar: 2345: Child returned status 1
+@end smallexample
+
+Here, @samp{2345} is the PID of the finished process.
+
+If this behavior is not wanted, use @option{--ignore-command-error}:
+
+@table @option
+@opindex ignore-command-error
+@item --ignore-command-error
+Ignore exit codes of subprocesses. Notice that if the program
+exits on signal or otherwise terminates abnormally, the error message
+will be printed even if this option is used.
+
+@opindex no-ignore-command-error
+@item --no-ignore-command-error
+Cancel the effect of any previous @option{--ignore-command-error}
+option. This option is useful if you have set
+@option{--ignore-command-error} in @env{TAR_OPTIONS}
+(@pxref{TAR_OPTIONS}) and wish to temporarily cancel it.
+@end table
+
+@node remove files
+@unnumberedsubsubsec Removing Files
+
+@FIXME{The section is too terse. Something more to add? An example,
+maybe?}
+
+@table @option
+@opindex remove-files
+@item --remove-files
+Remove files after adding them to the archive.
+@end table
+
+@node Scarce
+@subsection Coping with Scarce Resources
+@UNREVISED
+
+@cindex Small memory
+@cindex Running out of space
+
+@menu
+* Starting File::
+* Same Order::
+@end menu
+
+@node Starting File
+@unnumberedsubsubsec Starting File
+
+@table @option
+@opindex starting-file
+@item --starting-file=@var{name}
+@itemx -K @var{name}
+Starts an operation in the middle of an archive. Use in conjunction
+with @option{--extract} (@option{--get}, @option{-x}) or @option{--list} (@option{-t}).
+@end table
+
+@cindex Middle of the archive, starting in the
+If a previous attempt to extract files failed due to lack of disk
+space, you can use @option{--starting-file=@var{name}} (@option{-K
+@var{name}}) to start extracting only after member @var{name} of the
+archive. This assumes, of course, that there is now free space, or
+that you are now extracting into a different file system. (You could
+also choose to suspend @command{tar}, remove unnecessary files from
+the file system, and then restart the same @command{tar} operation.
+In this case, @option{--starting-file} is not necessary.
+@xref{Incremental Dumps}, @xref{interactive}, and @ref{exclude}.)
+
+@node Same Order
+@unnumberedsubsubsec Same Order
+
+@table @option
+@cindex Large lists of file names on small machines
+@opindex same-order
+@opindex preserve-order
+@item --same-order
+@itemx --preserve-order
+@itemx -s
+To process large lists of file names on machines with small amounts of
+memory. Use in conjunction with @option{--compare} (@option{--diff},
+@option{-d}), @option{--list} (@option{-t}) or @option{--extract}
+(@option{--get}, @option{-x}).
+@end table
+
+The @option{--same-order} (@option{--preserve-order}, @option{-s}) option tells @command{tar} that the list of file
+names to be listed or extracted is sorted in the same order as the
+files in the archive. This allows a large list of names to be used,
+even on a small machine that would not otherwise be able to hold all
+the names in memory at the same time. Such a sorted list can easily be
+created by running @samp{tar -t} on the archive and editing its output.
+
+This option is probably never needed on modern computer systems.
+
+@node backup
+@section Backup options
+
+@cindex backup options
+
+@GNUTAR{} offers options for making backups of files
+before writing new versions. These options control the details of
+these backups. They may apply to the archive itself before it is
+created or rewritten, as well as individual extracted members. Other
+@acronym{GNU} programs (@command{cp}, @command{install}, @command{ln},
+and @command{mv}, for example) offer similar options.
+
+Backup options may prove unexpectedly useful when extracting archives
+containing many members having identical name, or when extracting archives
+on systems having file name limitations, making different members appear
+has having similar names through the side-effect of name truncation.
+(This is true only if we have a good scheme for truncated backup names,
+which I'm not sure at all: I suspect work is needed in this area.)
+When any existing file is backed up before being overwritten by extraction,
+then clashing files are automatically be renamed to be unique, and the
+true name is kept for only the last file of a series of clashing files.
+By using verbose mode, users may track exactly what happens.
+
+At the detail level, some decisions are still experimental, and may
+change in the future, we are waiting comments from our users. So, please
+do not learn to depend blindly on the details of the backup features.
+For example, currently, directories themselves are never renamed through
+using these options, so, extracting a file over a directory still has
+good chances to fail. Also, backup options apply to created archives,
+not only to extracted members. For created archives, backups will not
+be attempted when the archive is a block or character device, or when it
+refers to a remote file.
+
+For the sake of simplicity and efficiency, backups are made by renaming old
+files prior to creation or extraction, and not by copying. The original
+name is restored if the file creation fails. If a failure occurs after a
+partial extraction of a file, both the backup and the partially extracted
+file are kept.
+
+@table @samp
+@item --backup[=@var{method}]
+@opindex backup
+@vindex VERSION_CONTROL
+@cindex backups
+Back up files that are about to be overwritten or removed.
+Without this option, the original versions are destroyed.
+
+Use @var{method} to determine the type of backups made.
+If @var{method} is not specified, use the value of the @env{VERSION_CONTROL}
+environment variable. And if @env{VERSION_CONTROL} is not set,
+use the @samp{existing} method.
+
+@vindex version-control @r{Emacs variable}
+This option corresponds to the Emacs variable @samp{version-control};
+the same values for @var{method} are accepted as in Emacs. This option
+also allows more descriptive names. The valid @var{method}s are:
+
+@table @samp
+@item t
+@itemx numbered
+@cindex numbered @r{backup method}
+Always make numbered backups.
+
+@item nil
+@itemx existing
+@cindex existing @r{backup method}
+Make numbered backups of files that already have them, simple backups
+of the others.
+
+@item never
+@itemx simple
+@cindex simple @r{backup method}
+Always make simple backups.
+
+@end table
+
+@item --suffix=@var{suffix}
+@opindex suffix
+@cindex backup suffix
+@vindex SIMPLE_BACKUP_SUFFIX
+Append @var{suffix} to each backup file made with @option{--backup}. If this
+option is not specified, the value of the @env{SIMPLE_BACKUP_SUFFIX}
+environment variable is used. And if @env{SIMPLE_BACKUP_SUFFIX} is not
+set, the default is @samp{~}, just as in Emacs.
+
+@end table
+
+@node Applications
+@section Notable @command{tar} Usages
+@UNREVISED
+
+@FIXME{Using Unix file linking capability to recreate directory
+structures---linking files into one subdirectory and then
+@command{tar}ring that directory.}
+
+@FIXME{Nice hairy example using absolute-names, newer, etc.}
+
+@findex uuencode
+You can easily use archive files to transport a group of files from
+one system to another: put all relevant files into an archive on one
+computer system, transfer the archive to another system, and extract
+the contents there. The basic transfer medium might be magnetic tape,
+Internet FTP, or even electronic mail (though you must encode the
+archive with @command{uuencode} in order to transport it properly by
+mail). Both machines do not have to use the same operating system, as
+long as they both support the @command{tar} program.
+
+For example, here is how you might copy a directory's contents from
+one disk to another, while preserving the dates, modes, owners and
+link-structure of all the files therein. In this case, the transfer
+medium is a @dfn{pipe}, which is one a Unix redirection mechanism:
+
+@smallexample
+$ @kbd{(cd sourcedir; tar -cf - .) | (cd targetdir; tar -xf -)}
+@end smallexample
+
+@noindent
+You can avoid subshells by using @option{-C} option:
+
+@smallexample
+$ @kbd{tar -C sourcedir -cf - . | tar -C targetdir -xf -}
+@end smallexample
+
+@noindent
+The command also works using short option forms:
+
+@smallexample
+$ @kbd{(cd sourcedir; tar --create --file=- . ) \
+ | (cd targetdir; tar --extract --file=-)}
+# Or:
+$ @kbd{tar --directory sourcedir --create --file=- . ) \
+ | tar --directory targetdir --extract --file=-}
+@end smallexample
+
+@noindent
+This is one of the easiest methods to transfer a @command{tar} archive.
+
+@node looking ahead
+@section Looking Ahead: The Rest of this Manual
+
+You have now seen how to use all eight of the operations available to
+@command{tar}, and a number of the possible options. The next chapter
+explains how to choose and change file and archive names, how to use
+files to store names of other files which you can then call as
+arguments to @command{tar} (this can help you save time if you expect to
+archive the same list of files a number of times), and so forth.
+@FIXME{in case it's not obvious, i'm making this up in some sense
+based on my limited memory of what the next chapter *really* does. i
+just wanted to flesh out this final section a little bit so i'd
+remember to stick it in here. :-)}
+
+If there are too many files to conveniently list on the command line,
+you can list the names in a file, and @command{tar} will read that file.
+@xref{files}.
+
+There are various ways of causing @command{tar} to skip over some files,
+and not archive them. @xref{Choosing}.
+
+@node Backups
+@chapter Performing Backups and Restoring Files
+@UNREVISED
+
+@GNUTAR{} is distributed along with the scripts
+which the Free Software Foundation uses for performing backups. There
+is no corresponding scripts available yet for doing restoration of
+files. Even if there is a good chance those scripts may be satisfying
+to you, they are not the only scripts or methods available for doing
+backups and restore. You may well create your own, or use more
+sophisticated packages dedicated to that purpose.
+
+Some users are enthusiastic about @code{Amanda} (The Advanced Maryland
+Automatic Network Disk Archiver), a backup system developed by James
+da Silva @file{jds@@cs.umd.edu} and available on many Unix systems.
+This is free software, and it is available at these places:
+
+@smallexample
+http://www.cs.umd.edu/projects/amanda/amanda.html
+ftp://ftp.cs.umd.edu/pub/amanda
+@end smallexample
+
+@FIXME{
+
+Here is a possible plan for a future documentation about the backuping
+scripts which are provided within the @GNUTAR{}
+distribution.
+
+@itemize @bullet
+@item dumps
+ @itemize @minus
+ @item what are dumps
+ @item different levels of dumps
+ @itemize +
+ @item full dump = dump everything
+ @item level 1, level 2 dumps etc
+ A level @var{n} dump dumps everything changed since the last level
+ @var{n}-1 dump (?)
+ @end itemize
+ @item how to use scripts for dumps (ie, the concept)
+ @itemize +
+ @item scripts to run after editing backup specs (details)
+ @end itemize
+ @item Backup Specs, what is it.
+ @itemize +
+ @item how to customize
+ @item actual text of script [/sp/dump/backup-specs]
+ @end itemize
+ @item Problems
+ @itemize +
+ @item rsh doesn't work
+ @item rtape isn't installed
+ @item (others?)
+ @end itemize
+ @item the @option{--incremental} option of tar
+ @item tapes
+ @itemize +
+ @item write protection
+ @item types of media, different sizes and types, useful for different things
+ @item files and tape marks
+ one tape mark between files, two at end.
+ @item positioning the tape
+ MT writes two at end of write,
+ backspaces over one when writing again.
+ @end itemize
+ @end itemize
+@end itemize
+}
+
+This chapter documents both the provided shell scripts and @command{tar}
+options which are more specific to usage as a backup tool.
+
+To @dfn{back up} a file system means to create archives that contain
+all the files in that file system. Those archives can then be used to
+restore any or all of those files (for instance if a disk crashes or a
+file is accidentally deleted). File system @dfn{backups} are also
+called @dfn{dumps}.
+
+@menu
+* Full Dumps:: Using @command{tar} to Perform Full Dumps
+* Incremental Dumps:: Using @command{tar} to Perform Incremental Dumps
+* Backup Levels:: Levels of Backups
+* Backup Parameters:: Setting Parameters for Backups and Restoration
+* Scripted Backups:: Using the Backup Scripts
+* Scripted Restoration:: Using the Restore Script
+@end menu
+
+@node Full Dumps
+@section Using @command{tar} to Perform Full Dumps
+@UNREVISED
+
+@cindex full dumps
+@cindex dumps, full
+
+@cindex corrupted archives
+Full dumps should only be made when no other people or programs
+are modifying files in the file system. If files are modified while
+@command{tar} is making the backup, they may not be stored properly in
+the archive, in which case you won't be able to restore them if you
+have to. (Files not being modified are written with no trouble, and do
+not corrupt the entire archive.)
+
+You will want to use the @option{--label=@var{archive-label}}
+(@option{-V @var{archive-label}}) option to give the archive a
+volume label, so you can tell what this archive is even if the label
+falls off the tape, or anything like that.
+
+Unless the file system you are dumping is guaranteed to fit on
+one volume, you will need to use the @option{--multi-volume} (@option{-M}) option.
+Make sure you have enough tapes on hand to complete the backup.
+
+If you want to dump each file system separately you will need to use
+the @option{--one-file-system} option to prevent
+@command{tar} from crossing file system boundaries when storing
+(sub)directories.
+
+The @option{--incremental} (@option{-G}) (@pxref{Incremental Dumps})
+option is not needed, since this is a complete copy of everything in
+the file system, and a full restore from this backup would only be
+done onto a completely
+empty disk.
+
+Unless you are in a hurry, and trust the @command{tar} program (and your
+tapes), it is a good idea to use the @option{--verify} (@option{-W})
+option, to make sure your files really made it onto the dump properly.
+This will also detect cases where the file was modified while (or just
+after) it was being archived. Not all media (notably cartridge tapes)
+are capable of being verified, unfortunately.
+
+@node Incremental Dumps
+@section Using @command{tar} to Perform Incremental Dumps
+
+@dfn{Incremental backup} is a special form of @GNUTAR{} archive that
+stores additional metadata so that exact state of the file system
+can be restored when extracting the archive.
+
+@GNUTAR{} currently offers two options for handling incremental
+backups: @option{--listed-incremental=@var{snapshot-file}} (@option{-g
+@var{snapshot-file}}) and @option{--incremental} (@option{-G}).
+
+@opindex listed-incremental
+The option @option{--listed-incremental} instructs tar to operate on
+an incremental archive with additional metadata stored in a standalone
+file, called a @dfn{snapshot file}. The purpose of this file is to help
+determine which files have been changed, added or deleted since the
+last backup, so that the next incremental backup will contain only
+modified files. The name of the snapshot file is given as an argument
+to the option:
+
+@table @option
+@item --listed-incremental=@var{file}
+@itemx -g @var{file}
+ Handle incremental backups with snapshot data in @var{file}.
+@end table
+
+To create an incremental backup, you would use
+@option{--listed-incremental} together with @option{--create}
+(@pxref{create}). For example:
+
+@smallexample
+$ @kbd{tar --create \
+ --file=archive.1.tar \
+ --listed-incremental=/var/log/usr.snar \
+ /usr}
+@end smallexample
+
+This will create in @file{archive.1.tar} an incremental backup of
+the @file{/usr} file system, storing additional metadata in the file
+@file{/var/log/usr.snar}. If this file does not exist, it will be
+created. The created archive will then be a @dfn{level 0 backup};
+please see the next section for more on backup levels.
+
+Otherwise, if the file @file{/var/log/usr.snar} exists, it
+determines which files are modified. In this case only these files will be
+stored in the archive. Suppose, for example, that after running the
+above command, you delete file @file{/usr/doc/old} and create
+directory @file{/usr/local/db} with the following contents:
+
+@smallexample
+$ @kbd{ls /usr/local/db}
+/usr/local/db/data
+/usr/local/db/index
+@end smallexample
+
+Some time later you create another incremental backup. You will
+then see:
+
+@smallexample
+$ @kbd{tar --create \
+ --file=archive.2.tar \
+ --listed-incremental=/var/log/usr.snar \
+ /usr}
+tar: usr/local/db: Directory is new
+usr/local/db/
+usr/local/db/data
+usr/local/db/index
+@end smallexample
+
+@noindent
+The created archive @file{archive.2.tar} will contain only these
+three members. This archive is called a @dfn{level 1 backup}. Notice
+that @file{/var/log/usr.snar} will be updated with the new data, so if
+you plan to create more @samp{level 1} backups, it is necessary to
+create a working copy of the snapshot file before running
+@command{tar}. The above example will then be modified as follows:
+
+@smallexample
+$ @kbd{cp /var/log/usr.snar /var/log/usr.snar-1}
+$ @kbd{tar --create \
+ --file=archive.2.tar \
+ --listed-incremental=/var/log/usr.snar-1 \
+ /usr}
+@end smallexample
+
+Incremental dumps depend crucially on time stamps, so the results are
+unreliable if you modify a file's time stamps during dumping (e.g.,
+with the @option{--atime-preserve=replace} option), or if you set the clock
+backwards.
+
+Metadata stored in snapshot files include device numbers, which,
+obviously is supposed to be a non-volatile value. However, it turns
+out that NFS devices have undependable values when an automounter
+gets in the picture. This can lead to a great deal of spurious
+redumping in incremental dumps, so it is somewhat useless to compare
+two NFS devices numbers over time. The solution implemented currently
+is to considers all NFS devices as being equal when it comes to
+comparing directories; this is fairly gross, but there does not seem
+to be a better way to go.
+
+Note that incremental archives use @command{tar} extensions and may
+not be readable by non-@acronym{GNU} versions of the @command{tar} program.
+
+@xopindex{listed-incremental, using with @option{--extract}}
+@xopindex{extract, using with @option{--listed-incremental}}
+To extract from the incremental dumps, use
+@option{--listed-incremental} together with @option{--extract}
+option (@pxref{extracting files}). In this case, @command{tar} does
+not need to access snapshot file, since all the data necessary for
+extraction are stored in the archive itself. So, when extracting, you
+can give whatever argument to @option{--listed-incremental}, the usual
+practice is to use @option{--listed-incremental=/dev/null}.
+Alternatively, you can use @option{--incremental}, which needs no
+arguments. In general, @option{--incremental} (@option{-G}) can be
+used as a shortcut for @option{--listed-incremental} when listing or
+extracting incremental backups (for more information, regarding this
+option, @pxref{incremental-op}).
+
+When extracting from the incremental backup @GNUTAR{} attempts to
+restore the exact state the file system had when the archive was
+created. In particular, it will @emph{delete} those files in the file
+system that did not exist in their directories when the archive was
+created. If you have created several levels of incremental files,
+then in order to restore the exact contents the file system had when
+the last level was created, you will need to restore from all backups
+in turn. Continuing our example, to restore the state of @file{/usr}
+file system, one would do@footnote{Notice, that since both archives
+were created without @option{-P} option (@pxref{absolute}), these
+commands should be run from the root file system.}:
+
+@smallexample
+$ @kbd{tar --extract \
+ --listed-incremental=/dev/null \
+ --file archive.1.tar}
+$ @kbd{tar --extract \
+ --listed-incremental=/dev/null \
+ --file archive.2.tar}
+@end smallexample
+
+To list the contents of an incremental archive, use @option{--list}
+(@pxref{list}), as usual. To obtain more information about the
+archive, use @option{--listed-incremental} or @option{--incremental}
+combined with two @option{--verbose} options@footnote{Two
+@option{--verbose} options were selected to avoid breaking usual
+verbose listing output (@option{--list --verbose}) when using in
+scripts.
+
+@xopindex{incremental, using with @option{--list}}
+@xopindex{listed-incremental, using with @option{--list}}
+@xopindex{list, using with @option{--incremental}}
+@xopindex{list, using with @option{--listed-incremental}}
+Versions of @GNUTAR{} up to 1.15.1 used to dump verbatim binary
+contents of the DUMPDIR header (with terminating nulls) when
+@option{--incremental} or @option{--listed-incremental} option was
+given, no matter what the verbosity level. This behavior, and,
+especially, the binary output it produced were considered inconvenient
+and were changed in version 1.16}:
+
+@smallexample
+@kbd{tar --list --incremental --verbose --verbose archive.tar}
+@end smallexample
+
+This command will print, for each directory in the archive, the list
+of files in that directory at the time the archive was created. This
+information is put out in a format which is both human-readable and
+unambiguous for a program: each file name is printed as
+
+@smallexample
+@var{x} @var{file}
+@end smallexample
+
+@noindent
+where @var{x} is a letter describing the status of the file: @samp{Y}
+if the file is present in the archive, @samp{N} if the file is not
+included in the archive, or a @samp{D} if the file is a directory (and
+is included in the archive). @xref{Dumpdir}, for the detailed
+description of dumpdirs and status codes. Each such
+line is terminated by a newline character. The last line is followed
+by an additional newline to indicate the end of the data.
+
+@anchor{incremental-op}The option @option{--incremental} (@option{-G})
+gives the same behavior as @option{--listed-incremental} when used
+with @option{--list} and @option{--extract} options. When used with
+@option{--create} option, it creates an incremental archive without
+creating snapshot file. Thus, it is impossible to create several
+levels of incremental backups with @option{--incremental} option.
+
+@node Backup Levels
+@section Levels of Backups
+
+An archive containing all the files in the file system is called a
+@dfn{full backup} or @dfn{full dump}. You could insure your data by
+creating a full dump every day. This strategy, however, would waste a
+substantial amount of archive media and user time, as unchanged files
+are daily re-archived.
+
+It is more efficient to do a full dump only occasionally. To back up
+files between full dumps, you can use @dfn{incremental dumps}. A @dfn{level
+one} dump archives all the files that have changed since the last full
+dump.
+
+A typical dump strategy would be to perform a full dump once a week,
+and a level one dump once a day. This means some versions of files
+will in fact be archived more than once, but this dump strategy makes
+it possible to restore a file system to within one day of accuracy by
+only extracting two archives---the last weekly (full) dump and the
+last daily (level one) dump. The only information lost would be in
+files changed or created since the last daily backup. (Doing dumps
+more than once a day is usually not worth the trouble).
+
+@GNUTAR{} comes with scripts you can use to do full
+and level-one (actually, even level-two and so on) dumps. Using
+scripts (shell programs) to perform backups and restoration is a
+convenient and reliable alternative to typing out file name lists
+and @command{tar} commands by hand.
+
+Before you use these scripts, you need to edit the file
+@file{backup-specs}, which specifies parameters used by the backup
+scripts and by the restore script. This file is usually located
+in @file{/etc/backup} directory. @xref{Backup Parameters}, for its
+detailed description. Once the backup parameters are set, you can
+perform backups or restoration by running the appropriate script.
+
+The name of the backup script is @code{backup}. The name of the
+restore script is @code{restore}. The following sections describe
+their use in detail.
+
+@emph{Please Note:} The backup and restoration scripts are
+designed to be used together. While it is possible to restore files by
+hand from an archive which was created using a backup script, and to create
+an archive by hand which could then be extracted using the restore script,
+it is easier to use the scripts. @xref{Incremental Dumps}, before
+making such an attempt.
+
+@node Backup Parameters
+@section Setting Parameters for Backups and Restoration
+
+The file @file{backup-specs} specifies backup parameters for the
+backup and restoration scripts provided with @command{tar}. You must
+edit @file{backup-specs} to fit your system configuration and schedule
+before using these scripts.
+
+Syntactically, @file{backup-specs} is a shell script, containing
+mainly variable assignments. However, any valid shell construct
+is allowed in this file. Particularly, you may wish to define
+functions within that script (e.g., see @code{RESTORE_BEGIN} below).
+For more information about shell script syntax, please refer to
+@url{http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#ta
+g_02, the definition of the Shell Command Language}. See also
+@ref{Top,,Bash Features,bashref,Bash Reference Manual}.
+
+The shell variables controlling behavior of @code{backup} and
+@code{restore} are described in the following subsections.
+
+@menu
+* General-Purpose Variables::
+* Magnetic Tape Control::
+* User Hooks::
+* backup-specs example:: An Example Text of @file{Backup-specs}
+@end menu
+
+@node General-Purpose Variables
+@subsection General-Purpose Variables
+
+@defvr {Backup variable} ADMINISTRATOR
+The user name of the backup administrator. @code{Backup} scripts
+sends a backup report to this address.
+@end defvr
+
+@defvr {Backup variable} BACKUP_HOUR
+The hour at which the backups are done. This can be a number from 0
+to 23, or the time specification in form @var{hours}:@var{minutes},
+or the string @samp{now}.
+
+This variable is used by @code{backup}. Its value may be overridden
+using @option{--time} option (@pxref{Scripted Backups}).
+@end defvr
+
+@defvr {Backup variable} TAPE_FILE
+
+The device @command{tar} writes the archive to. If @var{TAPE_FILE}
+is a remote archive (@pxref{remote-dev}), backup script will suppose
+that your @command{mt} is able to access remote devices. If @var{RSH}
+(@pxref{RSH}) is set, @option{--rsh-command} option will be added to
+invocations of @command{mt}.
+@end defvr
+
+@defvr {Backup variable} BLOCKING
+
+The blocking factor @command{tar} will use when writing the dump archive.
+@xref{Blocking Factor}.
+@end defvr
+
+@defvr {Backup variable} BACKUP_DIRS
+
+A list of file systems to be dumped (for @code{backup}), or restored
+(for @code{restore}). You can include any directory
+name in the list --- subdirectories on that file system will be
+included, regardless of how they may look to other networked machines.
+Subdirectories on other file systems will be ignored.
+
+The host name specifies which host to run @command{tar} on, and should
+normally be the host that actually contains the file system. However,
+the host machine must have @GNUTAR{} installed, and
+must be able to access the directory containing the backup scripts and
+their support files using the same file name that is used on the
+machine where the scripts are run (i.e., what @command{pwd} will print
+when in that directory on that machine). If the host that contains
+the file system does not have this capability, you can specify another
+host as long as it can access the file system through NFS.
+
+If the list of file systems is very long you may wish to put it
+in a separate file. This file is usually named
+@file{/etc/backup/dirs}, but this name may be overridden in
+@file{backup-specs} using @code{DIRLIST} variable.
+@end defvr
+
+@defvr {Backup variable} DIRLIST
+
+The name of the file that contains a list of file systems to backup
+or restore. By default it is @file{/etc/backup/dirs}.
+@end defvr
+
+@defvr {Backup variable} BACKUP_FILES
+
+A list of individual files to be dumped (for @code{backup}), or restored
+(for @code{restore}). These should be accessible from the machine on
+which the backup script is run.
+
+If the list of file systems is very long you may wish to store it
+in a separate file. This file is usually named
+@file{/etc/backup/files}, but this name may be overridden in
+@file{backup-specs} using @code{FILELIST} variable.
+@end defvr
+
+@defvr {Backup variable} FILELIST
+
+The name of the file that contains a list of individual files to backup
+or restore. By default it is @file{/etc/backup/files}.
+@end defvr
+
+@defvr {Backup variable} MT
+
+Full file name of @command{mt} binary.
+@end defvr
+
+@defvr {Backup variable} RSH
+@anchor{RSH}
+Full file name of @command{rsh} binary or its equivalent. You may wish to
+set it to @code{ssh}, to improve security. In this case you will have
+to use public key authentication.
+@end defvr
+
+@defvr {Backup variable} RSH_COMMAND
+
+Full file name of @command{rsh} binary on remote machines. This will
+be passed via @option{--rsh-command} option to the remote invocation
+of @GNUTAR{}.
+@end defvr
+
+@defvr {Backup variable} VOLNO_FILE
+
+Name of temporary file to hold volume numbers. This needs to be accessible
+by all the machines which have file systems to be dumped.
+@end defvr
+
+@defvr {Backup variable} XLIST
+
+Name of @dfn{exclude file list}. An @dfn{exclude file list} is a file
+located on the remote machine and containing the list of files to
+be excluded from the backup. Exclude file lists are searched in
+/etc/tar-backup directory. A common use for exclude file lists
+is to exclude files containing security-sensitive information
+(e.g., @file{/etc/shadow} from backups).
+
+This variable affects only @code{backup}.
+@end defvr
+
+@defvr {Backup variable} SLEEP_TIME
+
+Time to sleep between dumps of any two successive file systems
+
+This variable affects only @code{backup}.
+@end defvr
+
+@defvr {Backup variable} DUMP_REMIND_SCRIPT
+
+Script to be run when it's time to insert a new tape in for the next
+volume. Administrators may want to tailor this script for their site.
+If this variable isn't set, @GNUTAR{} will display its built-in
+prompt, and will expect confirmation from the console. For the
+description of the default prompt, see @ref{change volume prompt}.
+
+@end defvr
+
+@defvr {Backup variable} SLEEP_MESSAGE
+
+Message to display on the terminal while waiting for dump time. Usually
+this will just be some literal text.
+@end defvr
+
+@defvr {Backup variable} TAR
+
+Full file name of the @GNUTAR{} executable. If this is not set, backup
+scripts will search @command{tar} in the current shell path.
+@end defvr
+
+@node Magnetic Tape Control
+@subsection Magnetic Tape Control
+
+Backup scripts access tape device using special @dfn{hook functions}.
+These functions take a single argument -- the name of the tape
+device. Their names are kept in the following variables:
+
+@defvr {Backup variable} MT_BEGIN
+The name of @dfn{begin} function. This function is called before
+accessing the drive. By default it retensions the tape:
+
+@smallexample
+MT_BEGIN=mt_begin
+
+mt_begin() @{
+ mt -f "$1" retension
+@}
+@end smallexample
+@end defvr
+
+@defvr {Backup variable} MT_REWIND
+The name of @dfn{rewind} function. The default definition is as
+follows:
+
+@smallexample
+MT_REWIND=mt_rewind
+
+mt_rewind() @{
+ mt -f "$1" rewind
+@}
+@end smallexample
+
+@end defvr
+
+@defvr {Backup variable} MT_OFFLINE
+The name of the function switching the tape off line. By default
+it is defined as follows:
+
+@smallexample
+MT_OFFLINE=mt_offline
+
+mt_offline() @{
+ mt -f "$1" offl
+@}
+@end smallexample
+@end defvr
+
+@defvr {Backup variable} MT_STATUS
+The name of the function used to obtain the status of the archive device,
+including error count. Default definition:
+
+@smallexample
+MT_STATUS=mt_status
+
+mt_status() @{
+ mt -f "$1" status
+@}
+@end smallexample
+@end defvr
+
+@node User Hooks
+@subsection User Hooks
+
+@dfn{User hooks} are shell functions executed before and after
+each @command{tar} invocation. Thus, there are @dfn{backup
+hooks}, which are executed before and after dumping each file
+system, and @dfn{restore hooks}, executed before and
+after restoring a file system. Each user hook is a shell function
+taking four arguments:
+
+@deffn {User Hook Function} hook @var{level} @var{host} @var{fs} @var{fsname}
+Its arguments are:
+
+@table @var
+@item level
+Current backup or restore level.
+
+@item host
+Name or IP address of the host machine being dumped or restored.
+
+@item fs
+Full file name of the file system being dumped or restored.
+
+@item fsname
+File system name with directory separators replaced with colons. This
+is useful, e.g., for creating unique files.
+@end table
+@end deffn
+
+Following variables keep the names of user hook functions
+
+@defvr {Backup variable} DUMP_BEGIN
+Dump begin function. It is executed before dumping the file system.
+@end defvr
+
+@defvr {Backup variable} DUMP_END
+Executed after dumping the file system.
+@end defvr
+
+@defvr {Backup variable} RESTORE_BEGIN
+Executed before restoring the file system.
+@end defvr
+
+@defvr {Backup variable} RESTORE_END
+Executed after restoring the file system.
+@end defvr
+
+@node backup-specs example
+@subsection An Example Text of @file{Backup-specs}
+
+The following is an example of @file{backup-specs}:
+
+@smallexample
+# site-specific parameters for file system backup.
+
+ADMINISTRATOR=friedman
+BACKUP_HOUR=1
+TAPE_FILE=/dev/nrsmt0
+
+# Use @code{ssh} instead of the less secure @code{rsh}
+RSH=/usr/bin/ssh
+RSH_COMMAND=/usr/bin/ssh
+
+# Override MT_STATUS function:
+my_status() @{
+ mts -t $TAPE_FILE
+@}
+MT_STATUS=my_status
+
+# Disable MT_OFFLINE function
+MT_OFFLINE=:
+
+BLOCKING=124
+BACKUP_DIRS="
+ albert:/fs/fsf
+ apple-gunkies:/gd
+ albert:/fs/gd2
+ albert:/fs/gp
+ geech:/usr/jla
+ churchy:/usr/roland
+ albert:/
+ albert:/usr
+ apple-gunkies:/
+ apple-gunkies:/usr
+ gnu:/hack
+ gnu:/u
+ apple-gunkies:/com/mailer/gnu
+ apple-gunkies:/com/archive/gnu"
+
+BACKUP_FILES="/com/mailer/aliases /com/mailer/league*[a-z]"
+
+@end smallexample
+
+@node Scripted Backups
+@section Using the Backup Scripts
+
+The syntax for running a backup script is:
+
+@smallexample
+backup --level=@var{level} --time=@var{time}
+@end smallexample
+
+The @option{level} option requests the dump level. Thus, to produce
+a full dump, specify @code{--level=0} (this is the default, so
+@option{--level} may be omitted if its value is @code{0}).
+@footnote{For backward compatibility, the @code{backup} will also
+try to deduce the requested dump level from the name of the
+script itself. If the name consists of a string @samp{level-}
+followed by a single decimal digit, that digit is taken as
+the dump level number. Thus, you may create a link from @code{backup}
+to @code{level-1} and then run @code{level-1} whenever you need to
+create a level one dump.}
+
+The @option{--time} option determines when should the backup be
+run. @var{Time} may take three forms:
+
+@table @asis
+@item @var{hh}:@var{mm}
+
+The dump must be run at @var{hh} hours @var{mm} minutes.
+
+@item @var{hh}
+
+The dump must be run at @var{hh} hours
+
+@item now
+
+The dump must be run immediately.
+@end table
+
+You should start a script with a tape or disk mounted. Once you
+start a script, it prompts you for new tapes or disks as it
+needs them. Media volumes don't have to correspond to archive
+files --- a multi-volume archive can be started in the middle of a
+tape that already contains the end of another multi-volume archive.
+The @code{restore} script prompts for media by its archive volume,
+so to avoid an error message you should keep track of which tape
+(or disk) contains which volume of the archive (@pxref{Scripted
+Restoration}).
+
+The backup scripts write two files on the file system. The first is a
+record file in @file{/etc/tar-backup/}, which is used by the scripts
+to store and retrieve information about which files were dumped. This
+file is not meant to be read by humans, and should not be deleted by
+them. @xref{Snapshot Files}, for a more detailed explanation of this
+file.
+
+The second file is a log file containing the names of the file systems
+and files dumped, what time the backup was made, and any error
+messages that were generated, as well as how much space was left in
+the media volume after the last volume of the archive was written.
+You should check this log file after every backup. The file name is
+@file{log-@var{mm-dd-yyyy}-level-@var{n}}, where @var{mm-dd-yyyy}
+represents current date, and @var{n} represents current dump level number.
+
+The script also prints the name of each system being dumped to the
+standard output.
+
+Following is the full list of options accepted by @code{backup}
+script:
+
+@table @option
+@item -l @var{level}
+@itemx --level=@var{level}
+Do backup level @var{level} (default 0).
+
+@item -f
+@itemx --force
+Force backup even if today's log file already exists.
+
+@item -v[@var{level}]
+@itemx --verbose[=@var{level}]
+Set verbosity level. The higher the level is, the more debugging
+information will be output during execution. Default @var{level}
+is 100, which means the highest debugging level.
+
+@item -t @var{start-time}
+@itemx --time=@var{start-time}
+Wait till @var{time}, then do backup.
+
+@item -h
+@itemx --help
+Display short help message and exit.
+
+@item -V
+@itemx --version
+Display information about the program's name, version, origin and legal
+status, all on standard output, and then exit successfully.
+@end table
+
+
+@node Scripted Restoration
+@section Using the Restore Script
+
+To restore files that were archived using a scripted backup, use the
+@code{restore} script. Its usage is quite straightforward. In the
+simplest form, invoke @code{restore --all}, it will
+then restore all the file systems and files specified in
+@file{backup-specs} (@pxref{General-Purpose Variables,BACKUP_DIRS}).
+
+You may select the file systems (and/or files) to restore by
+giving @code{restore} list of @dfn{patterns} in its command
+line. For example, running
+
+@smallexample
+restore 'albert:*'
+@end smallexample
+
+@noindent
+will restore all file systems on the machine @samp{albert}. A more
+complicated example:
+
+@smallexample
+restore 'albert:*' '*:/var'
+@end smallexample
+
+@noindent
+This command will restore all file systems on the machine @samp{albert}
+as well as @file{/var} file system on all machines.
+
+By default @code{restore} will start restoring files from the lowest
+available dump level (usually zero) and will continue through
+all available dump levels. There may be situations where such a
+thorough restore is not necessary. For example, you may wish to
+restore only files from the recent level one backup. To do so,
+use @option{--level} option, as shown in the example below:
+
+@smallexample
+restore --level=1
+@end smallexample
+
+The full list of options accepted by @code{restore} follows:
+
+@table @option
+@item -a
+@itemx --all
+Restore all file systems and files specified in @file{backup-specs}
+
+@item -l @var{level}
+@itemx --level=@var{level}
+Start restoring from the given backup level, instead of the default 0.
+
+@item -v[@var{level}]
+@itemx --verbose[=@var{level}]
+Set verbosity level. The higher the level is, the more debugging
+information will be output during execution. Default @var{level}
+is 100, which means the highest debugging level.
+
+@item -h
+@itemx --help
+Display short help message and exit.
+
+@item -V
+@itemx --version
+Display information about the program's name, version, origin and legal
+status, all on standard output, and then exit successfully.
+@end table
+
+You should start the restore script with the media containing the
+first volume of the archive mounted. The script will prompt for other
+volumes as they are needed. If the archive is on tape, you don't need
+to rewind the tape to to its beginning---if the tape head is
+positioned past the beginning of the archive, the script will rewind
+the tape as needed. @xref{Tape Positioning}, for a discussion of tape
+positioning.
+
+@quotation
+@strong{Warning:} The script will delete files from the active file
+system if they were not in the file system when the archive was made.
+@end quotation
+
+@xref{Incremental Dumps}, for an explanation of how the script makes
+that determination.
+
+@node Choosing
+@chapter Choosing Files and Names for @command{tar}
+@UNREVISED
+
+Certain options to @command{tar} enable you to specify a name for your
+archive. Other options let you decide which files to include or exclude
+from the archive, based on when or whether files were modified, whether
+the file names do or don't match specified patterns, or whether files
+are in specified directories.
+
+This chapter discusses these options in detail.
+
+@menu
+* file:: Choosing the Archive's Name
+* Selecting Archive Members::
+* files:: Reading Names from a File
+* exclude:: Excluding Some Files
+* wildcards:: Wildcards Patterns and Matching
+* quoting styles:: Ways of Quoting Special Characters in Names
+* transform:: Modifying File and Member Names
+* after:: Operating Only on New Files
+* recurse:: Descending into Directories
+* one:: Crossing File System Boundaries
+@end menu
+
+@node file
+@section Choosing and Naming Archive Files
+@UNREVISED
+
+@cindex Naming an archive
+@cindex Archive Name
+@cindex Choosing an archive file
+@cindex Where is the archive?
+By default, @command{tar} uses an archive file name that was compiled when
+it was built on the system; usually this name refers to some physical
+tape drive on the machine. However, the person who installed @command{tar}
+on the system may not have set the default to a meaningful value as far as
+most users are concerned. As a result, you will usually want to tell
+@command{tar} where to find (or create) the archive. The
+@option{--file=@var{archive-name}} (@option{-f @var{archive-name}})
+option allows you to either specify or name a file to use as the archive
+instead of the default archive file location.
+
+@table @option
+@xopindex{file, short description}
+@item --file=@var{archive-name}
+@itemx -f @var{archive-name}
+Name the archive to create or operate on. Use in conjunction with
+any operation.
+@end table
+
+For example, in this @command{tar} command,
+
+@smallexample
+$ @kbd{tar -cvf collection.tar blues folk jazz}
+@end smallexample
+
+@noindent
+@file{collection.tar} is the name of the archive. It must directly
+follow the @option{-f} option, since whatever directly follows @option{-f}
+@emph{will} end up naming the archive. If you neglect to specify an
+archive name, you may end up overwriting a file in the working directory
+with the archive you create since @command{tar} will use this file's name
+for the archive name.
+
+An archive can be saved as a file in the file system, sent through a
+pipe or over a network, or written to an I/O device such as a tape,
+floppy disk, or CD write drive.
+
+@cindex Writing new archives
+@cindex Archive creation
+If you do not name the archive, @command{tar} uses the value of the
+environment variable @env{TAPE} as the file name for the archive. If
+that is not available, @command{tar} uses a default, compiled-in archive
+name, usually that for tape unit zero (i.e., @file{/dev/tu00}).
+
+@cindex Standard input and output
+@cindex tar to standard input and output
+If you use @file{-} as an @var{archive-name}, @command{tar} reads the
+archive from standard input (when listing or extracting files), or
+writes it to standard output (when creating an archive). If you use
+@file{-} as an @var{archive-name} when modifying an archive,
+@command{tar} reads the original archive from its standard input and
+writes the entire new archive to its standard output.
+
+The following example is a convenient way of copying directory
+hierarchy from @file{sourcedir} to @file{targetdir}.
+
+@smallexample
+$ @kbd{(cd sourcedir; tar -cf - .) | (cd targetdir; tar -xpf -)}
+@end smallexample
+
+The @option{-C} option allows to avoid using subshells:
+
+@smallexample
+$ @kbd{tar -C sourcedir -cf - . | tar -C targetdir -xpf -}
+@end smallexample
+
+In both examples above, the leftmost @command{tar} invocation archives
+the contents of @file{sourcedir} to the standard output, while the
+rightmost one reads this archive from its standard input and
+extracts it. The @option{-p} option tells it to restore permissions
+of the extracted files.
+
+@cindex Remote devices
+@cindex tar to a remote device
+@anchor{remote-dev}
+To specify an archive file on a device attached to a remote machine,
+use the following:
+
+@smallexample
+@kbd{--file=@var{hostname}:/@var{dev}/@var{file-name}}
+@end smallexample
+
+@noindent
+@command{tar} will complete the remote connection, if possible, and
+prompt you for a username and password. If you use
+@option{--file=@@@var{hostname}:/@var{dev}/@var{file-name}}, @command{tar}
+will complete the remote connection, if possible, using your username
+as the username on the remote machine.
+
+@cindex Local and remote archives
+@anchor{local and remote archives}
+If the archive file name includes a colon (@samp{:}), then it is assumed
+to be a file on another machine. If the archive file is
+@samp{@var{user}@@@var{host}:@var{file}}, then @var{file} is used on the
+host @var{host}. The remote host is accessed using the @command{rsh}
+program, with a username of @var{user}. If the username is omitted
+(along with the @samp{@@} sign), then your user name will be used.
+(This is the normal @command{rsh} behavior.) It is necessary for the
+remote machine, in addition to permitting your @command{rsh} access, to
+have the @file{rmt} program installed (This command is included in
+the @GNUTAR{} distribution and by default is installed under
+@file{@var{prefix}/libexec/rmt}, were @var{prefix} means your
+installation prefix). If you need to use a file whose name includes a
+colon, then the remote tape drive behavior
+can be inhibited by using the @option{--force-local} option.
+
+When the archive is being created to @file{/dev/null}, @GNUTAR{}
+tries to minimize input and output operations. The Amanda backup
+system, when used with @GNUTAR{}, has an initial sizing pass which
+uses this feature.
+
+@node Selecting Archive Members
+@section Selecting Archive Members
+@cindex Specifying files to act on
+@cindex Specifying archive members
+
+@dfn{File Name arguments} specify which files in the file system
+@command{tar} operates on, when creating or adding to an archive, or which
+archive members @command{tar} operates on, when reading or deleting from
+an archive. @xref{Operations}.
+
+To specify file names, you can include them as the last arguments on
+the command line, as follows:
+@smallexample
+@kbd{tar} @var{operation} [@var{option1} @var{option2} @dots{}] [@var{file name-1} @var{file name-2} @dots{}]
+@end smallexample
+
+If a file name begins with dash (@samp{-}), precede it with
+@option{--add-file} option to prevent it from being treated as an
+option.
+
+@anchor{input name quoting}
+By default @GNUTAR{} attempts to @dfn{unquote} each file or member
+name, replacing @dfn{escape sequences} according to the following
+table:
+
+@multitable @columnfractions 0.20 0.60
+@headitem Escape @tab Replaced with
+@item \a @tab Audible bell (@acronym{ASCII} 7)
+@item \b @tab Backspace (@acronym{ASCII} 8)
+@item \f @tab Form feed (@acronym{ASCII} 12)
+@item \n @tab New line (@acronym{ASCII} 10)
+@item \r @tab Carriage return (@acronym{ASCII} 13)
+@item \t @tab Horizontal tabulation (@acronym{ASCII} 9)
+@item \v @tab Vertical tabulation (@acronym{ASCII} 11)
+@item \? @tab @acronym{ASCII} 127
+@item \@var{n} @tab @acronym{ASCII} @var{n} (@var{n} should be an octal number
+ of up to 3 digits)
+@end multitable
+
+A backslash followed by any other symbol is retained.
+
+This default behavior is controlled by the following command line
+option:
+
+@table @option
+@opindex unquote
+@item --unquote
+Enable unquoting input file or member names (default).
+
+@opindex no-unquote
+@item --no-unquote
+Disable unquoting input file or member names.
+@end table
+
+If you specify a directory name as a file name argument, all the files
+in that directory are operated on by @command{tar}.
+
+If you do not specify files, @command{tar} behavior differs depending
+on the operation mode as described below:
+
+When @command{tar} is invoked with @option{--create} (@option{-c}),
+@command{tar} will stop immediately, reporting the following:
+
+@smallexample
+@group
+$ @kbd{tar cf a.tar}
+tar: Cowardly refusing to create an empty archive
+Try `tar --help' or `tar --usage' for more information.
+@end group
+@end smallexample
+
+If you specify either @option{--list} (@option{-t}) or
+@option{--extract} (@option{--get}, @option{-x}), @command{tar}
+operates on all the archive members in the archive.
+
+If run with @option{--diff} option, tar will compare the archive with
+the contents of the current working directory.
+
+If you specify any other operation, @command{tar} does nothing.
+
+By default, @command{tar} takes file names from the command line. However,
+there are other ways to specify file or member names, or to modify the
+manner in which @command{tar} selects the files or members upon which to
+operate. In general, these methods work both for specifying the names
+of files and archive members.
+
+@node files
+@section Reading Names from a File
+
+@cindex Reading file names from a file
+@cindex Lists of file names
+@cindex File Name arguments, alternatives
+Instead of giving the names of files or archive members on the command
+line, you can put the names into a file, and then use the
+@option{--files-from=@var{file-of-names}} (@option{-T
+@var{file-of-names}}) option to @command{tar}. Give the name of the
+file which contains the list of files to include as the argument to
+@option{--files-from}. In the list, the file names should be separated by
+newlines. You will frequently use this option when you have generated
+the list of files to archive with the @command{find} utility.
+
+@table @option
+@opindex files-from
+@item --files-from=@var{file-name}
+@itemx -T @var{file-name}
+Get names to extract or create from file @var{file-name}.
+@end table
+
+If you give a single dash as a file name for @option{--files-from}, (i.e.,
+you specify either @code{--files-from=-} or @code{-T -}), then the file
+names are read from standard input.
+
+Unless you are running @command{tar} with @option{--create}, you can not use
+both @code{--files-from=-} and @code{--file=-} (@code{-f -}) in the same
+command.
+
+Any number of @option{-T} options can be given in the command line.
+
+The following example shows how to use @command{find} to generate a list of
+files smaller than 400K in length and put that list into a file
+called @file{small-files}. You can then use the @option{-T} option to
+@command{tar} to specify the files from that file, @file{small-files}, to
+create the archive @file{little.tgz}. (The @option{-z} option to
+@command{tar} compresses the archive with @command{gzip}; @pxref{gzip} for
+more information.)
+
+@smallexample
+$ @kbd{find . -size -400 -print > small-files}
+$ @kbd{tar -c -v -z -T small-files -f little.tgz}
+@end smallexample
+
+@noindent
+In the file list given by @option{-T} option, any file name beginning
+with @samp{-} character is considered a @command{tar} option and is
+processed accordingly.@footnote{Versions of @GNUTAR{} up to 1.15.1
+recognized only @option{-C} option in file lists, and only if the
+option and its argument occupied two consecutive lines.} For example,
+the common use of this feature is to change to another directory by
+specifying @option{-C} option:
+
+@smallexample
+@group
+$ @kbd{cat list}
+-C/etc
+passwd
+hosts
+-C/lib
+libc.a
+$ @kbd{tar -c -f foo.tar --files-from list}
+@end group
+@end smallexample
+
+@noindent
+In this example, @command{tar} will first switch to @file{/etc}
+directory and add files @file{passwd} and @file{hosts} to the
+archive. Then it will change to @file{/lib} directory and will archive
+the file @file{libc.a}. Thus, the resulting archive @file{foo.tar} will
+contain:
+
+@smallexample
+@group
+$ @kbd{tar tf foo.tar}
+passwd
+hosts
+libc.a
+@end group
+@end smallexample
+
+@noindent
+@xopindex{directory, using in @option{--files-from} argument}
+Notice that the option parsing algorithm used with @option{-T} is
+stricter than the one used by shell. Namely, when specifying option
+arguments, you should observe the following rules:
+
+@itemize @bullet
+@item
+When using short (single-letter) option form, its argument must
+immediately follow the option letter, without any intervening
+whitespace. For example: @code{-Cdir}.
+
+@item
+When using long option form, the option argument must be separated
+from the option by a single equal sign. No whitespace is allowed on
+any side of the equal sign. For example: @code{--directory=dir}.
+
+@item
+For both short and long option forms, the option argument can be given
+on the next line after the option name, e.g.:
+
+@smallexample
+@group
+--directory
+dir
+@end group
+@end smallexample
+
+@noindent
+and
+
+@smallexample
+@group
+-C
+dir
+@end group
+@end smallexample
+@end itemize
+
+@opindex add-file
+If you happen to have a file whose name starts with @samp{-},
+precede it with @option{--add-file} option to prevent it from
+being recognized as an option. For example: @code{--add-file=--my-file}.
+
+@menu
+* nul::
+@end menu
+
+@node nul
+@subsection @code{NUL} Terminated File Names
+
+@cindex File names, terminated by @code{NUL}
+@cindex @code{NUL} terminated file names
+The @option{--null} option causes
+@option{--files-from=@var{file-of-names}} (@option{-T @var{file-of-names}})
+to read file names terminated by a @code{NUL} instead of a newline, so
+files whose names contain newlines can be archived using
+@option{--files-from}.
+
+@table @option
+@opindex null
+@item --null
+Only consider @code{NUL} terminated file names, instead of files that
+terminate in a newline.
+@end table
+
+The @option{--null} option is just like the one in @acronym{GNU}
+@command{xargs} and @command{cpio}, and is useful with the
+@option{-print0} predicate of @acronym{GNU} @command{find}. In
+@command{tar}, @option{--null} also disables special handling for
+file names that begin with dash.
+
+This example shows how to use @command{find} to generate a list of files
+larger than 800K in length and put that list into a file called
+@file{long-files}. The @option{-print0} option to @command{find} is just
+like @option{-print}, except that it separates files with a @code{NUL}
+rather than with a newline. You can then run @command{tar} with both the
+@option{--null} and @option{-T} options to specify that @command{tar} get the
+files from that file, @file{long-files}, to create the archive
+@file{big.tgz}. The @option{--null} option to @command{tar} will cause
+@command{tar} to recognize the @code{NUL} separator between files.
+
+@smallexample
+$ @kbd{find . -size +800 -print0 > long-files}
+$ @kbd{tar -c -v --null --files-from=long-files --file=big.tar}
+@end smallexample
+
+@FIXME{say anything else here to conclude the section?}
+
+@node exclude
+@section Excluding Some Files
+@UNREVISED
+
+@cindex File names, excluding files by
+@cindex Excluding files by name and pattern
+@cindex Excluding files by file system
+To avoid operating on files whose names match a particular pattern,
+use the @option{--exclude} or @option{--exclude-from} options.
+
+@table @option
+@opindex exclude
+@item --exclude=@var{pattern}
+Causes @command{tar} to ignore files that match the @var{pattern}.
+@end table
+
+@findex exclude
+The @option{--exclude=@var{pattern}} option prevents any file or
+member whose name matches the shell wildcard (@var{pattern}) from
+being operated on.
+For example, to create an archive with all the contents of the directory
+@file{src} except for files whose names end in @file{.o}, use the
+command @samp{tar -cf src.tar --exclude='*.o' src}.
+
+You may give multiple @option{--exclude} options.
+
+@table @option
+@opindex exclude-from
+@item --exclude-from=@var{file}
+@itemx -X @var{file}
+Causes @command{tar} to ignore files that match the patterns listed in
+@var{file}.
+@end table
+
+@findex exclude-from
+Use the @option{--exclude-from} option to read a
+list of patterns, one per line, from @var{file}; @command{tar} will
+ignore files matching those patterns. Thus if @command{tar} is
+called as @w{@samp{tar -c -X foo .}} and the file @file{foo} contains a
+single line @file{*.o}, no files whose names end in @file{.o} will be
+added to the archive.
+
+@findex exclude-caches
+When creating an archive, the @option{--exclude-caches} option family
+causes @command{tar} to exclude all directories that contain a @dfn{cache
+directory tag}. A cache directory tag is a short file with the
+well-known name @file{CACHEDIR.TAG} and having a standard header
+specified in @url{http://www.brynosaurus.com/cachedir/spec.html}.
+Various applications write cache directory tags into directories they
+use to hold regenerable, non-precious data, so that such data can be
+more easily excluded from backups.
+
+There are three @samp{exclude-caches} option, providing a different
+exclusion semantics:
+
+@table @option
+@opindex exclude-caches
+@item --exclude-caches
+Do not archive the contents of the directory, but archive the
+directory itself and the @file{CACHEDIR.TAG} file.
+
+@opindex exclude-caches-under
+@item --exclude-caches-under
+Do not archive the contents of the directory, nor the
+@file{CACHEDIR.TAG} file, archive only the directory itself.
+
+@opindex exclude-caches-all
+@item --exclude-caches-all
+Omit directories containing @file{CACHEDIR.TAG} file entirely.
+@end table
+
+@findex exclude-tag
+Another option family, @option{--exclude-tag}, provides a generalization of
+this concept. It takes a single argument, a file name to look for.
+Any directory that contains this file will be excluded from the dump.
+Similarly to @samp{exclude-caches}, there are three options in this
+option family:
+
+@table @option
+@opindex exclude-tag
+@item --exclude-tag=@var{file}
+Do not dump the contents of the directory, but dump the
+directory itself and the @var{file}.
+
+@opindex exclude-tag-under
+@item --exclude-tag-under=@var{file}
+Do not dump the contents of the directory, nor the
+@var{file}, archive only the directory itself.
+
+@opindex exclude-tag-all
+@item --exclude-tag-all=@var{file}
+Omit directories containing @var{file} file entirely.
+@end table
+
+Multiple @option{--exclude-tag*} options can be given.
+
+For example, given this directory:
+
+@smallexample
+@group
+$ @kbd{find dir}
+dir
+dir/blues
+dir/jazz
+dir/folk
+dir/folk/tagfile
+dir/folk/sanjuan
+dir/folk/trote
+@end group
+@end smallexample
+
+The @option{--exclude-tag} will produce the following:
+
+@smallexample
+$ @kbd{tar -cf archive.tar --exclude-tag=tagfile -v dir}
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+tar: dir/folk/: contains a cache directory tag tagfile;
+ contents not dumped
+dir/folk/tagfile
+@end smallexample
+
+Both the @file{dir/folk} directory and its tagfile are preserved in
+the archive, however the rest of files in this directory are not.
+
+Now, using the @option{--exclude-tag-under} option will exclude
+@file{tagfile} from the dump, while still preserving the directory
+itself, as shown in this example:
+
+@smallexample
+$ @kbd{tar -cf archive.tar --exclude-tag-under=tagfile -v dir}
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+./tar: dir/folk/: contains a cache directory tag tagfile;
+ contents not dumped
+@end smallexample
+
+Finally, using @option{--exclude-tag-all} omits the @file{dir/folk}
+directory entirely:
+
+@smallexample
+$ @kbd{tar -cf archive.tar --exclude-tag-all=tagfile -v dir}
+dir/
+dir/blues
+dir/jazz
+./tar: dir/folk/: contains a cache directory tag tagfile;
+ directory not dumped
+@end smallexample
+
+@menu
+* problems with exclude::
+@end menu
+
+@node problems with exclude
+@unnumberedsubsec Problems with Using the @code{exclude} Options
+
+@xopindex{exclude, potential problems with}
+Some users find @samp{exclude} options confusing. Here are some common
+pitfalls:
+
+@itemize @bullet
+@item
+The main operating mode of @command{tar} does not act on a file name
+explicitly listed on the command line, if one of its file name
+components is excluded. In the example above, if
+you create an archive and exclude files that end with @samp{*.o}, but
+explicitly name the file @samp{dir.o/foo} after all the options have been
+listed, @samp{dir.o/foo} will be excluded from the archive.
+
+@item
+You can sometimes confuse the meanings of @option{--exclude} and
+@option{--exclude-from}. Be careful: use @option{--exclude} when files
+to be excluded are given as a pattern on the command line. Use
+@option{--exclude-from} to introduce the name of a file which contains
+a list of patterns, one per line; each of these patterns can exclude
+zero, one, or many files.
+
+@item
+When you use @option{--exclude=@var{pattern}}, be sure to quote the
+@var{pattern} parameter, so @GNUTAR{} sees wildcard characters
+like @samp{*}. If you do not do this, the shell might expand the
+@samp{*} itself using files at hand, so @command{tar} might receive a
+list of files instead of one pattern, or none at all, making the
+command somewhat illegal. This might not correspond to what you want.
+
+For example, write:
+
+@smallexample
+$ @kbd{tar -c -f @var{archive.tar} --exclude '*.o' @var{directory}}
+@end smallexample
+
+@noindent
+rather than:
+
+@smallexample
+# @emph{Wrong!}
+$ @kbd{tar -c -f @var{archive.tar} --exclude *.o @var{directory}}
+@end smallexample
+
+@item
+You must use use shell syntax, or globbing, rather than @code{regexp}
+syntax, when using exclude options in @command{tar}. If you try to use
+@code{regexp} syntax to describe files to be excluded, your command
+might fail.
+
+@item
+@FIXME{The change in semantics must have occurred before 1.11,
+so I doubt if it is worth mentioning at all. Anyway, should at
+least specify in which version the semantics changed.}
+In earlier versions of @command{tar}, what is now the
+@option{--exclude-from} option was called @option{--exclude} instead.
+Now, @option{--exclude} applies to patterns listed on the command
+line and @option{--exclude-from} applies to patterns listed in a
+file.
+
+@end itemize
+
+@node wildcards
+@section Wildcards Patterns and Matching
+
+@dfn{Globbing} is the operation by which @dfn{wildcard} characters,
+@samp{*} or @samp{?} for example, are replaced and expanded into all
+existing files matching the given pattern. @GNUTAR{} can use wildcard
+patterns for matching (or globbing) archive members when extracting
+from or listing an archive. Wildcard patterns are also used for
+verifying volume labels of @command{tar} archives. This section has the
+purpose of explaining wildcard syntax for @command{tar}.
+
+@FIXME{the next few paragraphs need work.}
+
+A @var{pattern} should be written according to shell syntax, using wildcard
+characters to effect globbing. Most characters in the pattern stand
+for themselves in the matched string, and case is significant: @samp{a}
+will match only @samp{a}, and not @samp{A}. The character @samp{?} in the
+pattern matches any single character in the matched string. The character
+@samp{*} in the pattern matches zero, one, or more single characters in
+the matched string. The character @samp{\} says to take the following
+character of the pattern @emph{literally}; it is useful when one needs to
+match the @samp{?}, @samp{*}, @samp{[} or @samp{\} characters, themselves.
+
+The character @samp{[}, up to the matching @samp{]}, introduces a character
+class. A @dfn{character class} is a list of acceptable characters
+for the next single character of the matched string. For example,
+@samp{[abcde]} would match any of the first five letters of the alphabet.
+Note that within a character class, all of the ``special characters''
+listed above other than @samp{\} lose their special meaning; for example,
+@samp{[-\\[*?]]} would match any of the characters, @samp{-}, @samp{\},
+@samp{[}, @samp{*}, @samp{?}, or @samp{]}. (Due to parsing constraints,
+the characters @samp{-} and @samp{]} must either come @emph{first} or
+@emph{last} in a character class.)
+
+@cindex Excluding characters from a character class
+@cindex Character class, excluding characters from
+If the first character of the class after the opening @samp{[}
+is @samp{!} or @samp{^}, then the meaning of the class is reversed.
+Rather than listing character to match, it lists those characters which
+are @emph{forbidden} as the next single character of the matched string.
+
+Other characters of the class stand for themselves. The special
+construction @samp{[@var{a}-@var{e}]}, using an hyphen between two
+letters, is meant to represent all characters between @var{a} and
+@var{e}, inclusive.
+
+@FIXME{need to add a sentence or so here to make this clear for those
+who don't have dan around.}
+
+Periods (@samp{.}) or forward slashes (@samp{/}) are not considered
+special for wildcard matches. However, if a pattern completely matches
+a directory prefix of a matched string, then it matches the full matched
+string: thus, excluding a directory also excludes all the files beneath it.
+
+@menu
+* controlling pattern-matching::
+@end menu
+
+@node controlling pattern-matching
+@unnumberedsubsec Controlling Pattern-Matching
+
+For the purposes of this section, we call @dfn{exclusion members} all
+member names obtained while processing @option{--exclude} and
+@option{--exclude-from} options, and @dfn{inclusion members} those
+member names that were given in the command line or read from the file
+specified with @option{--files-from} option.
+
+These two pairs of member lists are used in the following operations:
+@option{--diff}, @option{--extract}, @option{--list},
+@option{--update}.
+
+There are no inclusion members in create mode (@option{--create} and
+@option{--append}), since in this mode the names obtained from the
+command line refer to @emph{files}, not archive members.
+
+By default, inclusion members are compared with archive members
+literally @footnote{Notice that earlier @GNUTAR{} versions used
+globbing for inclusion members, which contradicted to UNIX98
+specification and was not documented. @xref{Changes}, for more
+information on this and other changes.} and exclusion members are
+treated as globbing patterns. For example:
+
+@smallexample
+@group
+$ @kbd{tar tf foo.tar}
+a.c
+b.c
+a.txt
+[remarks]
+# @i{Member names are used verbatim:}
+$ @kbd{tar -xf foo.tar -v '[remarks]'}
+[remarks]
+# @i{Exclude member names are globbed:}
+$ @kbd{tar -xf foo.tar -v --exclude '*.c'}
+a.txt
+[remarks]
+@end group
+@end smallexample
+
+This behavior can be altered by using the following options:
+
+@table @option
+@opindex wildcards
+@item --wildcards
+Treat all member names as wildcards.
+
+@opindex no-wildcards
+@item --no-wildcards
+Treat all member names as literal strings.
+@end table
+
+Thus, to extract files whose names end in @samp{.c}, you can use:
+
+@smallexample
+$ @kbd{tar -xf foo.tar -v --wildcards '*.c'}
+a.c
+b.c
+@end smallexample
+
+@noindent
+Notice quoting of the pattern to prevent the shell from interpreting
+it.
+
+The effect of @option{--wildcards} option is canceled by
+@option{--no-wildcards}. This can be used to pass part of
+the command line arguments verbatim and other part as globbing
+patterns. For example, the following invocation:
+
+@smallexample
+$ @kbd{tar -xf foo.tar --wildcards '*.txt' --no-wildcards '[remarks]'}
+@end smallexample
+
+@noindent
+instructs @command{tar} to extract from @file{foo.tar} all files whose
+names end in @samp{.txt} and the file named @file{[remarks]}.
+
+Normally, a pattern matches a name if an initial subsequence of the
+name's components matches the pattern, where @samp{*}, @samp{?}, and
+@samp{[...]} are the usual shell wildcards, @samp{\} escapes wildcards,
+and wildcards can match @samp{/}.
+
+Other than optionally stripping leading @samp{/} from names
+(@pxref{absolute}), patterns and names are used as-is. For
+example, trailing @samp{/} is not trimmed from a user-specified name
+before deciding whether to exclude it.
+
+However, this matching procedure can be altered by the options listed
+below. These options accumulate. For example:
+
+@smallexample
+--ignore-case --exclude='makefile' --no-ignore-case ---exclude='readme'
+@end smallexample
+
+@noindent
+ignores case when excluding @samp{makefile}, but not when excluding
+@samp{readme}.
+
+@table @option
+@opindex anchored
+@opindex no-anchored
+@item --anchored
+@itemx --no-anchored
+If anchored, a pattern must match an initial subsequence
+of the name's components. Otherwise, the pattern can match any
+subsequence. Default is @option{--no-anchored} for exclusion members
+and @option{--anchored} inclusion members.
+
+@opindex ignore-case
+@opindex no-ignore-case
+@item --ignore-case
+@itemx --no-ignore-case
+When ignoring case, upper-case patterns match lower-case names and vice versa.
+When not ignoring case (the default), matching is case-sensitive.
+
+@opindex wildcards-match-slash
+@opindex no-wildcards-match-slash
+@item --wildcards-match-slash
+@itemx --no-wildcards-match-slash
+When wildcards match slash (the default for exclusion members), a
+wildcard like @samp{*} in the pattern can match a @samp{/} in the
+name. Otherwise, @samp{/} is matched only by @samp{/}.
+
+@end table
+
+The @option{--recursion} and @option{--no-recursion} options
+(@pxref{recurse}) also affect how member patterns are interpreted. If
+recursion is in effect, a pattern matches a name if it matches any of
+the name's parent directories.
+
+The following table summarizes pattern-matching default values:
+
+@multitable @columnfractions .3 .7
+@headitem Members @tab Default settings
+@item Inclusion @tab @option{--no-wildcards --anchored --no-wildcards-match-slash}
+@item Exclusion @tab @option{--wildcards --no-anchored --wildcards-match-slash}
+@end multitable
+
+@node quoting styles
+@section Quoting Member Names
+
+When displaying member names, @command{tar} takes care to avoid
+ambiguities caused by certain characters. This is called @dfn{name
+quoting}. The characters in question are:
+
+@itemize @bullet
+@item Non-printable control characters:
+
+@multitable @columnfractions 0.20 0.10 0.60
+@headitem Character @tab @acronym{ASCII} @tab Character name
+@item \a @tab 7 @tab Audible bell
+@item \b @tab 8 @tab Backspace
+@item \f @tab 12 @tab Form feed
+@item \n @tab 10 @tab New line
+@item \r @tab 13 @tab Carriage return
+@item \t @tab 9 @tab Horizontal tabulation
+@item \v @tab 11 @tab Vertical tabulation
+@end multitable
+
+@item Space (@acronym{ASCII} 32)
+
+@item Single and double quotes (@samp{'} and @samp{"})
+
+@item Backslash (@samp{\})
+@end itemize
+
+The exact way @command{tar} uses to quote these characters depends on
+the @dfn{quoting style}. The default quoting style, called
+@dfn{escape} (see below), uses backslash notation to represent control
+characters, space and backslash. Using this quoting style, control
+characters are represented as listed in column @samp{Character} in the
+above table, a space is printed as @samp{\ } and a backslash as @samp{\\}.
+
+@GNUTAR{} offers seven distinct quoting styles, which can be selected
+using @option{--quoting-style} option:
+
+@table @option
+@item --quoting-style=@var{style}
+@opindex quoting-style
+
+Sets quoting style. Valid values for @var{style} argument are:
+literal, shell, shell-always, c, escape, locale, clocale.
+@end table
+
+These styles are described in detail below. To illustrate their
+effect, we will use an imaginary tar archive @file{arch.tar}
+containing the following members:
+
+@smallexample
+@group
+# 1. Contains horizontal tabulation character.
+a tab
+# 2. Contains newline character
+a
+newline
+# 3. Contains a space
+a space
+# 4. Contains double quotes
+a"double"quote
+# 5. Contains single quotes
+a'single'quote
+# 6. Contains a backslash character:
+a\backslash
+@end group
+@end smallexample
+
+Here is how usual @command{ls} command would have listed them, if they
+had existed in the current working directory:
+
+@smallexample
+@group
+$ @kbd{ls}
+a\ttab
+a\nnewline
+a\ space
+a"double"quote
+a'single'quote
+a\\backslash
+@end group
+@end smallexample
+
+Quoting styles:
+
+@table @samp
+@item literal
+No quoting, display each character as is:
+
+@smallexample
+@group
+$ @kbd{tar tf arch.tar --quoting-style=literal}
+./
+./a space
+./a'single'quote
+./a"double"quote
+./a\backslash
+./a tab
+./a
+newline
+@end group
+@end smallexample
+
+@item shell
+Display characters the same way Bourne shell does:
+control characters, except @samp{\t} and @samp{\n}, are printed using
+backslash escapes, @samp{\t} and @samp{\n} are printed as is, and a
+single quote is printed as @samp{\'}. If a name contains any quoted
+characters, it is enclosed in single quotes. In particular, if a name
+contains single quotes, it is printed as several single-quoted strings:
+
+@smallexample
+@group
+$ @kbd{tar tf arch.tar --quoting-style=shell}
+./
+'./a space'
+'./a'\''single'\''quote'
+'./a"double"quote'
+'./a\backslash'
+'./a tab'
+'./a
+newline'
+@end group
+@end smallexample
+
+@item shell-always
+Same as @samp{shell}, but the names are always enclosed in single
+quotes:
+
+@smallexample
+@group
+$ @kbd{tar tf arch.tar --quoting-style=shell-always}
+'./'
+'./a space'
+'./a'\''single'\''quote'
+'./a"double"quote'
+'./a\backslash'
+'./a tab'
+'./a
+newline'
+@end group
+@end smallexample
+
+@item c
+Use the notation of the C programming language. All names are
+enclosed in double quotes. Control characters are quoted using
+backslash notations, double quotes are represented as @samp{\"},
+backslash characters are represented as @samp{\\}. Single quotes and
+spaces are not quoted:
+
+@smallexample
+@group
+$ @kbd{tar tf arch.tar --quoting-style=c}
+"./"
+"./a space"
+"./a'single'quote"
+"./a\"double\"quote"
+"./a\\backslash"
+"./a\ttab"
+"./a\nnewline"
+@end group
+@end smallexample
+
+@item escape
+Control characters are printed using backslash notation, a space is
+printed as @samp{\ } and a backslash as @samp{\\}. This is the
+default quoting style, unless it was changed when configured the
+package.
+
+@smallexample
+@group
+$ @kbd{tar tf arch.tar --quoting-style=escape}
+./
+./a space
+./a'single'quote
+./a"double"quote
+./a\\backslash
+./a\ttab
+./a\nnewline
+@end group
+@end smallexample
+
+@item locale
+Control characters, single quote and backslash are printed using
+backslash notation. All names are quoted using left and right
+quotation marks, appropriate to the current locale. If it does not
+define quotation marks, use @samp{`} as left and @samp{'} as right
+quotation marks. Any occurrences of the right quotation mark in a
+name are escaped with @samp{\}, for example:
+
+For example:
+
+@smallexample
+@group
+$ @kbd{tar tf arch.tar --quoting-style=locale}
+`./'
+`./a space'
+`./a\'single\'quote'
+`./a"double"quote'
+`./a\\backslash'
+`./a\ttab'
+`./a\nnewline'
+@end group
+@end smallexample
+
+@item clocale
+Same as @samp{locale}, but @samp{"} is used for both left and right
+quotation marks, if not provided by the currently selected locale:
+
+@smallexample
+@group
+$ @kbd{tar tf arch.tar --quoting-style=clocale}
+"./"
+"./a space"
+"./a'single'quote"
+"./a\"double\"quote"
+"./a\\backslash"
+"./a\ttab"
+"./a\nnewline"
+@end group
+@end smallexample
+@end table
+
+You can specify which characters should be quoted in addition to those
+implied by the current quoting style:
+
+@table @option
+@item --quote-chars=@var{string}
+Always quote characters from @var{string}, even if the selected
+quoting style would not quote them.
+@end table
+
+For example, using @samp{escape} quoting (compare with the usual
+escape listing above):
+
+@smallexample
+@group
+$ @kbd{tar tf arch.tar --quoting-style=escape --quote-chars=' "'}
+./
+./a\ space
+./a'single'quote
+./a\"double\"quote
+./a\\backslash
+./a\ttab
+./a\nnewline
+@end group
+@end smallexample
+
+To disable quoting of such additional characters, use the following
+option:
+
+@table @option
+@item --no-quote-chars=@var{string}
+Remove characters listed in @var{string} from the list of quoted
+characters set by the previous @option{--quote-chars} option.
+@end table
+
+This option is particularly useful if you have added
+@option{--quote-chars} to your @env{TAR_OPTIONS} (@pxref{TAR_OPTIONS})
+and wish to disable it for the current invocation.
+
+Note, that @option{--no-quote-chars} does @emph{not} disable those
+characters that are quoted by default in the selected quoting style.
+
+@node transform
+@section Modifying File and Member Names
+
+@command{Tar} archives contain detailed information about files stored
+in them and full file names are part of that information. When
+storing file to an archive, its file name is recorded in the archive
+along with the actual file contents. When restoring from an archive,
+a file is created on disk with exactly the same name as that stored
+in the archive. In the majority of cases this is the desired behavior
+of a file archiver. However, there are some cases when it is not.
+
+First of all, it is often unsafe to extract archive members with
+absolute file names or those that begin with a @file{../}. @GNUTAR{}
+takes special precautions when extracting such names and provides a
+special option for handling them, which is described in
+@ref{absolute}.
+
+Secondly, you may wish to extract file names without some leading
+directory components, or with otherwise modified names. In other
+cases it is desirable to store files under differing names in the
+archive.
+
+@GNUTAR{} provides two options for these needs.
+
+@table @option
+@opindex strip-components
+@item --strip-components=@var{number}
+Strip given @var{number} of leading components from file names before
+extraction.
+@end table
+
+For example, suppose you have archived whole @file{/usr} hierarchy to
+a tar archive named @file{usr.tar}. Among other files, this archive
+contains @file{usr/include/stdlib.h}, which you wish to extract to
+the current working directory. To do so, you type:
+
+@smallexample
+$ @kbd{tar -xf usr.tar --strip=2 usr/include/stdlib.h}
+@end smallexample
+
+The option @option{--strip=2} instructs @command{tar} to strip the
+two leading components (@file{usr/} and @file{include/}) off the file
+name.
+
+If you add to the above invocation @option{--verbose} (@option{-v})
+option, you will note that the verbose listing still contains the
+full file name, with the two removed components still in place. This
+can be inconvenient, so @command{tar} provides a special option for
+altering this behavior:
+
+@anchor{show-transformed-names}
+@table @option
+@opindex show-transformed-names
+@item --show-transformed-names
+Display file or member names with all requested transformations
+applied.
+@end table
+
+@noindent
+For example:
+
+@smallexample
+@group
+$ @kbd{tar -xf usr.tar -v --strip=2 usr/include/stdlib.h}
+usr/include/stdlib.h
+$ @kbd{tar -xf usr.tar -v --strip=2 --show-transformed usr/include/stdlib.h}
+stdlib.h
+@end group
+@end smallexample
+
+Notice that in both cases the file is @file{stdlib.h} extracted to the
+current working directory, @option{--show-transformed-names} affects
+only the way its name is displayed.
+
+This option is especially useful for verifying whether the invocation
+will have the desired effect. Thus, before running
+
+@smallexample
+$ @kbd{tar -x --strip=@var{n}}
+@end smallexample
+
+@noindent
+it is often advisable to run
+
+@smallexample
+$ @kbd{tar -t -v --show-transformed --strip=@var{n}}
+@end smallexample
+
+@noindent
+to make sure the command will produce the intended results.
+
+In case you need to apply more complex modifications to the file name,
+@GNUTAR{} provides a general-purpose transformation option:
+
+@table @option
+@opindex transform
+@item --transform=@var{expression}
+Modify file names using supplied @var{expression}.
+@end table
+
+@noindent
+The @var{expression} is a @command{sed}-like replace expression of the
+form:
+
+@smallexample
+s/@var{regexp}/@var{replace}/[@var{flags}]
+@end smallexample
+
+@noindent
+where @var{regexp} is a @dfn{regular expression}, @var{replace} is a
+replacement for each file name part that matches @var{regexp}. Both
+@var{regexp} and @var{replace} are described in detail in
+@ref{The "s" Command, The "s" Command, The `s' Command, sed, GNU sed}.
+
+Supported @var{flags} are:
+
+@table @samp
+@item g
+Apply the replacement to @emph{all} matches to the @var{regexp}, not
+just the first.
+
+@item i
+Use case-insensitive matching
+
+@item x
+@var{regexp} is an @dfn{extended regular expression} (@pxref{Extended
+regexps, Extended regular expressions, Extended regular expressions,
+sed, GNU sed}).
+
+@item @var{number}
+Only replace the @var{number}th match of the @var{regexp}.
+
+Note: the @var{posix} standard does not specify what should happen
+when you mix the @samp{g} and @var{number} modifiers. @GNUTAR{}
+follows the GNU @command{sed} implementation in this regard, so
+the interaction is defined to be: ignore matches before the
+@var{number}th, and then match and replace all matches from the
+@var{number}th on.
+
+@end table
+
+Any delimiter can be used in lieue of @samp{/}, the only requirement being
+that it be used consistently throughout the expression. For example,
+the following two expressions are equivalent:
+
+@smallexample
+@group
+s/one/two/
+s,one,two,
+@end group
+@end smallexample
+
+Changing delimiters is often useful when the @var{regex} contains
+slashes. For example, it is more convenient to write @code{s,/,-,} than
+@code{s/\//-/}.
+
+Here are several examples of @option{--transform} usage:
+
+@enumerate
+@item Extract @file{usr/} hierarchy into @file{usr/local/}:
+
+@smallexample
+$ @kbd{tar --transform='s,usr/,usr/local/,' -x -f arch.tar}
+@end smallexample
+
+@item Strip two leading directory components (equivalent to
+@option{--strip-components=2}):
+
+@smallexample
+$ @kbd{tar --transform='s,/*[^/]*/[^/]*/,,' -x -f arch.tar}
+@end smallexample
+
+@item Prepend @file{/prefix/} to each file name:
+
+@smallexample
+$ @kbd{tar --transform 's,^,/prefix/,' -x -f arch.tar}
+@end smallexample
+
+@item Convert each file name to lower case:
+
+@smallexample
+$ @kbd{tar --transform 's/.*/\L&/' -x -f arch.tar}
+@end smallexample
+
+@end enumerate
+
+Unlike @option{--strip-components}, @option{--transform} can be used
+in any @GNUTAR{} operation mode. For example, the following command
+adds files to the archive while replacing the leading @file{usr/}
+component with @file{var/}:
+
+@smallexample
+$ @kbd{tar -cf arch.tar --transform='s,^usr/,var/,' /}
+@end smallexample
+
+To test @option{--transform} effect we suggest using
+@option{--show-transformed-names} option:
+
+@smallexample
+$ @kbd{tar -cf arch.tar --transform='s,^usr/,var/,' \
+ --verbose --show-transformed-names /}
+@end smallexample
+
+If both @option{--strip-components} and @option{--transform} are used
+together, then @option{--transform} is applied first, and the required
+number of components is then stripped from its result.
+
+@node after
+@section Operating Only on New Files
+@UNREVISED
+
+@cindex Excluding file by age
+@cindex Data Modification time, excluding files by
+@cindex Modification time, excluding files by
+@cindex Age, excluding files by
+The @option{--after-date=@var{date}} (@option{--newer=@var{date}},
+@option{-N @var{date}}) option causes @command{tar} to only work on
+files whose data modification or status change times are newer than
+the @var{date} given. If @var{date} starts with @samp{/} or @samp{.},
+it is taken to be a file name; the data modification time of that file
+is used as the date. If you use this option when creating or appending
+to an archive, the archive will only include new files. If you use
+@option{--after-date} when extracting an archive, @command{tar} will
+only extract files newer than the @var{date} you specify.
+
+If you only want @command{tar} to make the date comparison based on
+modification of the file's data (rather than status
+changes), then use the @option{--newer-mtime=@var{date}} option.
+
+You may use these options with any operation. Note that these options
+differ from the @option{--update} (@option{-u}) operation in that they
+allow you to specify a particular date against which @command{tar} can
+compare when deciding whether or not to archive the files.
+
+@table @option
+@opindex after-date
+@opindex newer
+@item --after-date=@var{date}
+@itemx --newer=@var{date}
+@itemx -N @var{date}
+Only store files newer than @var{date}.
+
+Acts on files only if their data modification or status change times are
+later than @var{date}. Use in conjunction with any operation.
+
+If @var{date} starts with @samp{/} or @samp{.}, it is taken to be a file
+name; the data modification time of that file is used as the date.
+
+@opindex newer-mtime
+@item --newer-mtime=@var{date}
+Acts like @option{--after-date}, but only looks at data modification times.
+@end table
+
+These options limit @command{tar} to operate only on files which have
+been modified after the date specified. A file's status is considered to have
+changed if its contents have been modified, or if its owner,
+permissions, and so forth, have been changed. (For more information on
+how to specify a date, see @ref{Date input formats}; remember that the
+entire date argument must be quoted if it contains any spaces.)
+
+Gurus would say that @option{--after-date} tests both the data
+modification time (@code{mtime}, the time the contents of the file
+were last modified) and the status change time (@code{ctime}, the time
+the file's status was last changed: owner, permissions, etc.@:)
+fields, while @option{--newer-mtime} tests only the @code{mtime}
+field.
+
+To be precise, @option{--after-date} checks @emph{both} @code{mtime} and
+@code{ctime} and processes the file if either one is more recent than
+@var{date}, while @option{--newer-mtime} only checks @code{mtime} and
+disregards @code{ctime}. Neither does it use @code{atime} (the last time the
+contents of the file were looked at).
+
+Date specifiers can have embedded spaces. Because of this, you may need
+to quote date arguments to keep the shell from parsing them as separate
+arguments. For example, the following command will add to the archive
+all the files modified less than two days ago:
+
+@smallexample
+$ @kbd{tar -cf foo.tar --newer-mtime '2 days ago'}
+@end smallexample
+
+When any of these options is used with the option @option{--verbose}
+(@pxref{verbose tutorial}) @GNUTAR{} will try to convert the specified
+date back to its textual representation and compare that with the
+one given with the option. If the two dates differ, @command{tar} will
+print a warning saying what date it will use. This is to help user
+ensure he is using the right date. For example:
+
+@smallexample
+@group
+$ @kbd{tar -c -f archive.tar --after-date='10 days ago' .}
+tar: Option --after-date: Treating date `10 days ago' as 2006-06-11
+13:19:37.232434
+@end group
+@end smallexample
+
+@quotation
+@strong{Please Note:} @option{--after-date} and @option{--newer-mtime}
+should not be used for incremental backups. @xref{Incremental Dumps},
+for proper way of creating incremental backups.
+@end quotation
+
+@node recurse
+@section Descending into Directories
+@UNREVISED
+@cindex Avoiding recursion in directories
+@cindex Descending directories, avoiding
+@cindex Directories, avoiding recursion
+@cindex Recursion in directories, avoiding
+
+@FIXME{arrggh! this is still somewhat confusing to me. :-< }
+
+Usually, @command{tar} will recursively explore all directories (either
+those given on the command line or through the @option{--files-from}
+option) for the various files they contain. However, you may not always
+want @command{tar} to act this way.
+
+@opindex no-recursion
+The @option{--no-recursion} option inhibits @command{tar}'s recursive descent
+into specified directories. If you specify @option{--no-recursion}, you can
+use the @command{find} utility for hunting through levels of directories to
+construct a list of file names which you could then pass to @command{tar}.
+@command{find} allows you to be more selective when choosing which files to
+archive; see @ref{files}, for more information on using @command{find} with
+@command{tar}, or look.
+
+@table @option
+@item --no-recursion
+Prevents @command{tar} from recursively descending directories.
+
+@opindex recursion
+@item --recursion
+Requires @command{tar} to recursively descend directories.
+This is the default.
+@end table
+
+When you use @option{--no-recursion}, @GNUTAR{} grabs
+directory entries themselves, but does not descend on them
+recursively. Many people use @command{find} for locating files they
+want to back up, and since @command{tar} @emph{usually} recursively
+descends on directories, they have to use the @samp{@w{-not -type d}}
+test in their @command{find} invocation (@pxref{Type, Type, Type test,
+find, Finding Files}), as they usually do not want all the files in a
+directory. They then use the @option{--files-from} option to archive
+the files located via @command{find}.
+
+The problem when restoring files archived in this manner is that the
+directories themselves are not in the archive; so the
+@option{--same-permissions} (@option{--preserve-permissions},
+@option{-p}) option does not affect them---while users might really
+like it to. Specifying @option{--no-recursion} is a way to tell
+@command{tar} to grab only the directory entries given to it, adding
+no new files on its own. To summarize, if you use @command{find} to
+create a list of files to be stored in an archive, use it as follows:
+
+@smallexample
+@group
+$ @kbd{find @var{dir} @var{tests} | \
+ tar -cf @var{archive} -T - --no-recursion}
+@end group
+@end smallexample
+
+The @option{--no-recursion} option also applies when extracting: it
+causes @command{tar} to extract only the matched directory entries, not
+the files under those directories.
+
+The @option{--no-recursion} option also affects how globbing patterns
+are interpreted (@pxref{controlling pattern-matching}).
+
+The @option{--no-recursion} and @option{--recursion} options apply to
+later options and operands, and can be overridden by later occurrences
+of @option{--no-recursion} and @option{--recursion}. For example:
+
+@smallexample
+$ @kbd{tar -cf jams.tar --no-recursion grape --recursion grape/concord}
+@end smallexample
+
+@noindent
+creates an archive with one entry for @file{grape}, and the recursive
+contents of @file{grape/concord}, but no entries under @file{grape}
+other than @file{grape/concord}.
+
+@node one
+@section Crossing File System Boundaries
+@cindex File system boundaries, not crossing
+@UNREVISED
+
+@command{tar} will normally automatically cross file system boundaries in
+order to archive files which are part of a directory tree. You can
+change this behavior by running @command{tar} and specifying
+@option{--one-file-system}. This option only affects files that are
+archived because they are in a directory that is being archived;
+@command{tar} will still archive files explicitly named on the command line
+or through @option{--files-from}, regardless of where they reside.
+
+@table @option
+@opindex one-file-system
+@item --one-file-system
+Prevents @command{tar} from crossing file system boundaries when
+archiving. Use in conjunction with any write operation.
+@end table
+
+The @option{--one-file-system} option causes @command{tar} to modify its
+normal behavior in archiving the contents of directories. If a file in
+a directory is not on the same file system as the directory itself, then
+@command{tar} will not archive that file. If the file is a directory
+itself, @command{tar} will not archive anything beneath it; in other words,
+@command{tar} will not cross mount points.
+
+This option is useful for making full or incremental archival backups of
+a file system. If this option is used in conjunction with
+@option{--verbose} (@option{-v}), files that are excluded are
+mentioned by name on the standard error.
+
+@menu
+* directory:: Changing Directory
+* absolute:: Absolute File Names
+@end menu
+
+@node directory
+@subsection Changing the Working Directory
+
+@FIXME{need to read over this node now for continuity; i've switched
+things around some.}
+
+@cindex Changing directory mid-stream
+@cindex Directory, changing mid-stream
+@cindex Working directory, specifying
+To change the working directory in the middle of a list of file names,
+either on the command line or in a file specified using
+@option{--files-from} (@option{-T}), use @option{--directory} (@option{-C}).
+This will change the working directory to the specified directory
+after that point in the list.
+
+@table @option
+@opindex directory
+@item --directory=@var{directory}
+@itemx -C @var{directory}
+Changes the working directory in the middle of a command line.
+@end table
+
+For example,
+
+@smallexample
+$ @kbd{tar -c -f jams.tar grape prune -C food cherry}
+@end smallexample
+
+@noindent
+will place the files @file{grape} and @file{prune} from the current
+directory into the archive @file{jams.tar}, followed by the file
+@file{cherry} from the directory @file{food}. This option is especially
+useful when you have several widely separated files that you want to
+store in the same archive.
+
+Note that the file @file{cherry} is recorded in the archive under the
+precise name @file{cherry}, @emph{not} @file{food/cherry}. Thus, the
+archive will contain three files that all appear to have come from the
+same directory; if the archive is extracted with plain @samp{tar
+--extract}, all three files will be written in the current directory.
+
+Contrast this with the command,
+
+@smallexample
+$ @kbd{tar -c -f jams.tar grape prune -C food red/cherry}
+@end smallexample
+
+@noindent
+which records the third file in the archive under the name
+@file{red/cherry} so that, if the archive is extracted using
+@samp{tar --extract}, the third file will be written in a subdirectory
+named @file{orange-colored}.
+
+You can use the @option{--directory} option to make the archive
+independent of the original name of the directory holding the files.
+The following command places the files @file{/etc/passwd},
+@file{/etc/hosts}, and @file{/lib/libc.a} into the archive
+@file{foo.tar}:
+
+@smallexample
+$ @kbd{tar -c -f foo.tar -C /etc passwd hosts -C /lib libc.a}
+@end smallexample
+
+@noindent
+However, the names of the archive members will be exactly what they were
+on the command line: @file{passwd}, @file{hosts}, and @file{libc.a}.
+They will not appear to be related by file name to the original
+directories where those files were located.
+
+Note that @option{--directory} options are interpreted consecutively. If
+@option{--directory} specifies a relative file name, it is interpreted
+relative to the then current directory, which might not be the same as
+the original current working directory of @command{tar}, due to a previous
+@option{--directory} option.
+
+When using @option{--files-from} (@pxref{files}), you can put various
+@command{tar} options (including @option{-C}) in the file list. Notice,
+however, that in this case the option and its argument may not be
+separated by whitespace. If you use short option, its argument must
+either follow the option letter immediately, without any intervening
+whitespace, or occupy the next line. Otherwise, if you use long
+option, separate its argument by an equal sign.
+
+For instance, the file list for the above example will be:
+
+@smallexample
+@group
+-C/etc
+passwd
+hosts
+--directory=/lib
+libc.a
+@end group
+@end smallexample
+
+@noindent
+To use it, you would invoke @command{tar} as follows:
+
+@smallexample
+$ @kbd{tar -c -f foo.tar --files-from list}
+@end smallexample
+
+The interpretation of @option{--directory} is disabled by
+@option{--null} option.
+
+@node absolute
+@subsection Absolute File Names
+@UNREVISED
+
+@table @option
+@opindex absolute-names
+@item --absolute-names
+@itemx -P
+Do not strip leading slashes from file names, and permit file names
+containing a @file{..} file name component.
+@end table
+
+By default, @GNUTAR{} drops a leading @samp{/} on
+input or output, and complains about file names containing a @file{..}
+component. This option turns off this behavior.
+
+When @command{tar} extracts archive members from an archive, it strips any
+leading slashes (@samp{/}) from the member name. This causes absolute
+member names in the archive to be treated as relative file names. This
+allows you to have such members extracted wherever you want, instead of
+being restricted to extracting the member in the exact directory named
+in the archive. For example, if the archive member has the name
+@file{/etc/passwd}, @command{tar} will extract it as if the name were
+really @file{etc/passwd}.
+
+File names containing @file{..} can cause problems when extracting, so
+@command{tar} normally warns you about such files when creating an
+archive, and rejects attempts to extracts such files.
+
+Other @command{tar} programs do not do this. As a result, if you
+create an archive whose member names start with a slash, they will be
+difficult for other people with a non-@GNUTAR{}
+program to use. Therefore, @GNUTAR{} also strips
+leading slashes from member names when putting members into the
+archive. For example, if you ask @command{tar} to add the file
+@file{/bin/ls} to an archive, it will do so, but the member name will
+be @file{bin/ls}.@footnote{A side effect of this is that when
+@option{--create} is used with @option{--verbose} the resulting output
+is not, generally speaking, the same as the one you'd get running
+@kbd{tar --list} command. This may be important if you use some
+scripts for comparing both outputs. @xref{listing member and file names},
+for the information on how to handle this case.}
+
+If you use the @option{--absolute-names} (@option{-P}) option,
+@command{tar} will do none of these transformations.
+
+To archive or extract files relative to the root directory, specify
+the @option{--absolute-names} (@option{-P}) option.
+
+Normally, @command{tar} acts on files relative to the working
+directory---ignoring superior directory names when archiving, and
+ignoring leading slashes when extracting.
+
+When you specify @option{--absolute-names} (@option{-P}),
+@command{tar} stores file names including all superior directory
+names, and preserves leading slashes. If you only invoked
+@command{tar} from the root directory you would never need the
+@option{--absolute-names} option, but using this option
+may be more convenient than switching to root.
+
+@FIXME{Should be an example in the tutorial/wizardry section using this
+to transfer files between systems.}
+
+@FIXME{Is write access an issue?}
+
+@table @option
+@item --absolute-names
+Preserves full file names (including superior directory names) when
+archiving files. Preserves leading slash when extracting files.
+
+@end table
+
+@FIXME{this is still horrible; need to talk with dan on monday.}
+
+@command{tar} prints out a message about removing the @samp{/} from
+file names. This message appears once per @GNUTAR{}
+invocation. It represents something which ought to be told; ignoring
+what it means can cause very serious surprises, later.
+
+Some people, nevertheless, do not want to see this message. Wanting to
+play really dangerously, one may of course redirect @command{tar} standard
+error to the sink. For example, under @command{sh}:
+
+@smallexample
+$ @kbd{tar -c -f archive.tar /home 2> /dev/null}
+@end smallexample
+
+@noindent
+Another solution, both nicer and simpler, would be to change to
+the @file{/} directory first, and then avoid absolute notation.
+For example:
+
+@smallexample
+$ @kbd{(cd / && tar -c -f archive.tar home)}
+# @i{or}:
+$ @kbd{tar -c -f archive.tar -C / home}
+@end smallexample
+
+@include getdate.texi
+
+@node Formats
+@chapter Controlling the Archive Format
+
+@cindex Tar archive formats
+Due to historical reasons, there are several formats of tar archives.
+All of them are based on the same principles, but have some subtle
+differences that often make them incompatible with each other.
+
+GNU tar is able to create and handle archives in a variety of formats.
+The most frequently used formats are (in alphabetical order):
+
+@table @asis
+@item gnu
+Format used by @GNUTAR{} versions up to 1.13.25. This format derived
+from an early @acronym{POSIX} standard, adding some improvements such as
+sparse file handling and incremental archives. Unfortunately these
+features were implemented in a way incompatible with other archive
+formats.
+
+Archives in @samp{gnu} format are able to hold file names of unlimited
+length.
+
+@item oldgnu
+Format used by @GNUTAR{} of versions prior to 1.12.
+
+@item v7
+Archive format, compatible with the V7 implementation of tar. This
+format imposes a number of limitations. The most important of them
+are:
+
+@enumerate
+@item The maximum length of a file name is limited to 99 characters.
+@item The maximum length of a symbolic link is limited to 99 characters.
+@item It is impossible to store special files (block and character
+devices, fifos etc.)
+@item Maximum value of user or group @acronym{ID} is limited to 2097151 (7777777
+octal)
+@item V7 archives do not contain symbolic ownership information (user
+and group name of the file owner).
+@end enumerate
+
+This format has traditionally been used by Automake when producing
+Makefiles. This practice will change in the future, in the meantime,
+however this means that projects containing file names more than 99
+characters long will not be able to use @GNUTAR{} @value{VERSION} and
+Automake prior to 1.9.
+
+@item ustar
+Archive format defined by @acronym{POSIX.1-1988} specification. It stores
+symbolic ownership information. It is also able to store
+special files. However, it imposes several restrictions as well:
+
+@enumerate
+@item The maximum length of a file name is limited to 256 characters,
+provided that the file name can be split at a directory separator in
+two parts, first of them being at most 155 bytes long. So, in most
+cases the maximum file name length will be shorter than 256
+characters.
+@item The maximum length of a symbolic link name is limited to
+100 characters.
+@item Maximum size of a file the archive is able to accommodate
+is 8GB
+@item Maximum value of UID/GID is 2097151.
+@item Maximum number of bits in device major and minor numbers is 21.
+@end enumerate
+
+@item star
+Format used by J@"org Schilling @command{star}
+implementation. @GNUTAR{} is able to read @samp{star} archives but
+currently does not produce them.
+
+@item posix
+Archive format defined by @acronym{POSIX.1-2001} specification. This is the
+most flexible and feature-rich format. It does not impose any
+restrictions on file sizes or file name lengths. This format is quite
+recent, so not all tar implementations are able to handle it properly.
+However, this format is designed in such a way that any tar
+implementation able to read @samp{ustar} archives will be able to read
+most @samp{posix} archives as well, with the only exception that any
+additional information (such as long file names etc.) will in such
+case be extracted as plain text files along with the files it refers to.
+
+This archive format will be the default format for future versions
+of @GNUTAR{}.
+
+@end table
+
+The following table summarizes the limitations of each of these
+formats:
+
+@multitable @columnfractions .10 .20 .20 .20 .20
+@headitem Format @tab UID @tab File Size @tab File Name @tab Devn
+@item gnu @tab 1.8e19 @tab Unlimited @tab Unlimited @tab 63
+@item oldgnu @tab 1.8e19 @tab Unlimited @tab Unlimited @tab 63
+@item v7 @tab 2097151 @tab 8GB @tab 99 @tab n/a
+@item ustar @tab 2097151 @tab 8GB @tab 256 @tab 21
+@item posix @tab Unlimited @tab Unlimited @tab Unlimited @tab Unlimited
+@end multitable
+
+The default format for @GNUTAR{} is defined at compilation
+time. You may check it by running @command{tar --help}, and examining
+the last lines of its output. Usually, @GNUTAR{} is configured
+to create archives in @samp{gnu} format, however, future version will
+switch to @samp{posix}.
+
+@menu
+* Compression:: Using Less Space through Compression
+* Attributes:: Handling File Attributes
+* Portability:: Making @command{tar} Archives More Portable
+* cpio:: Comparison of @command{tar} and @command{cpio}
+@end menu
+
+@node Compression
+@section Using Less Space through Compression
+
+@menu
+* gzip:: Creating and Reading Compressed Archives
+* sparse:: Archiving Sparse Files
+@end menu
+
+@node gzip
+@subsection Creating and Reading Compressed Archives
+@cindex Compressed archives
+@cindex Storing archives in compressed format
+
+@GNUTAR{} is able to create and read compressed archives. It supports
+@command{gzip} and @command{bzip2} compression programs. For backward
+compatibility, it also supports @command{compress} command, although
+we strongly recommend against using it, since there is a patent
+covering the algorithm it uses and you could be sued for patent
+infringement merely by running @command{compress}! Besides, it is less
+effective than @command{gzip} and @command{bzip2}.
+
+Creating a compressed archive is simple: you just specify a
+@dfn{compression option} along with the usual archive creation
+commands. The compression option is @option{-z} (@option{--gzip}) to
+create a @command{gzip} compressed archive, @option{-j}
+(@option{--bzip2}) to create a @command{bzip2} compressed archive, and
+@option{-Z} (@option{--compress}) to use @command{compress} program.
+For example:
+
+@smallexample
+$ @kbd{tar cfz archive.tar.gz .}
+@end smallexample
+
+Reading compressed archive is even simpler: you don't need to specify
+any additional options as @GNUTAR{} recognizes its format
+automatically. Thus, the following commands will list and extract the
+archive created in previous example:
+
+@smallexample
+# List the compressed archive
+$ @kbd{tar tf archive.tar.gz}
+# Extract the compressed archive
+$ @kbd{tar xf archive.tar.gz}
+@end smallexample
+
+The only case when you have to specify a decompression option while
+reading the archive is when reading from a pipe or from a tape drive
+that does not support random access. However, in this case @GNUTAR{}
+will indicate which option you should use. For example:
+
+@smallexample
+$ @kbd{cat archive.tar.gz | tar tf -}
+tar: Archive is compressed. Use -z option
+tar: Error is not recoverable: exiting now
+@end smallexample
+
+If you see such diagnostics, just add the suggested option to the
+invocation of @GNUTAR{}:
+
+@smallexample
+$ @kbd{cat archive.tar.gz | tar tfz -}
+@end smallexample
+
+Notice also, that there are several restrictions on operations on
+compressed archives. First of all, compressed archives cannot be
+modified, i.e., you cannot update (@option{--update} (@option{-u})) them or delete
+(@option{--delete}) members from them. Likewise, you cannot append
+another @command{tar} archive to a compressed archive using
+@option{--append} (@option{-r})). Secondly, multi-volume archives cannot be
+compressed.
+
+The following table summarizes compression options used by @GNUTAR{}.
+
+@table @option
+@opindex gzip
+@opindex ungzip
+@item -z
+@itemx --gzip
+@itemx --ungzip
+Filter the archive through @command{gzip}.
+
+You can use @option{--gzip} and @option{--gunzip} on physical devices
+(tape drives, etc.) and remote files as well as on normal files; data
+to or from such devices or remote files is reblocked by another copy
+of the @command{tar} program to enforce the specified (or default) record
+size. The default compression parameters are used; if you need to
+override them, set @env{GZIP} environment variable, e.g.:
+
+@smallexample
+$ @kbd{GZIP=--best tar cfz archive.tar.gz subdir}
+@end smallexample
+
+@noindent
+Another way would be to avoid the @option{--gzip} (@option{--gunzip}, @option{--ungzip}, @option{-z}) option and run
+@command{gzip} explicitly:
+
+@smallexample
+$ @kbd{tar cf - subdir | gzip --best -c - > archive.tar.gz}
+@end smallexample
+
+@cindex corrupted archives
+About corrupted compressed archives: @command{gzip}'ed files have no
+redundancy, for maximum compression. The adaptive nature of the
+compression scheme means that the compression tables are implicitly
+spread all over the archive. If you lose a few blocks, the dynamic
+construction of the compression tables becomes unsynchronized, and there
+is little chance that you could recover later in the archive.
+
+There are pending suggestions for having a per-volume or per-file
+compression in @GNUTAR{}. This would allow for viewing the
+contents without decompression, and for resynchronizing decompression at
+every volume or file, in case of corrupted archives. Doing so, we might
+lose some compressibility. But this would have make recovering easier.
+So, there are pros and cons. We'll see!
+
+@opindex bzip2
+@item -j
+@itemx --bzip2
+Filter the archive through @code{bzip2}. Otherwise like @option{--gzip}.
+
+@opindex compress
+@opindex uncompress
+@item -Z
+@itemx --compress
+@itemx --uncompress
+Filter the archive through @command{compress}. Otherwise like @option{--gzip}.
+
+The @acronym{GNU} Project recommends you not use
+@command{compress}, because there is a patent covering the algorithm it
+uses. You could be sued for patent infringement merely by running
+@command{compress}.
+
+@opindex use-compress-program
+@item --use-compress-program=@var{prog}
+Use external compression program @var{prog}. Use this option if you
+have a compression program that @GNUTAR{} does not support. There
+are two requirements to which @var{prog} should comply:
+
+First, when called without options, it should read data from standard
+input, compress it and output it on standard output.
+
+Secondly, if called with @option{-d} argument, it should do exactly
+the opposite, i.e., read the compressed data from the standard input
+and produce uncompressed data on the standard output.
+@end table
+
+@cindex gpg, using with tar
+@cindex gnupg, using with tar
+@cindex Using encrypted archives
+The @option{--use-compress-program} option, in particular, lets you
+implement your own filters, not necessarily dealing with
+compression/decompression. For example, suppose you wish to implement
+PGP encryption on top of compression, using @command{gpg} (@pxref{Top,
+gpg, gpg ---- encryption and signing tool, gpg, GNU Privacy Guard
+Manual}). The following script does that:
+
+@smallexample
+@group
+#! /bin/sh
+case $1 in
+-d) gpg --decrypt - | gzip -d -c;;
+'') gzip -c | gpg -s ;;
+*) echo "Unknown option $1">&2; exit 1;;
+esac
+@end group
+@end smallexample
+
+Suppose you name it @file{gpgz} and save it somewhere in your
+@env{PATH}. Then the following command will create a compressed
+archive signed with your private key:
+
+@smallexample
+$ @kbd{tar -cf foo.tar.gpgz --use-compress=gpgz .}
+@end smallexample
+
+@noindent
+Likewise, the following command will list its contents:
+
+@smallexample
+$ @kbd{tar -tf foo.tar.gpgz --use-compress=gpgz .}
+@end smallexample
+
+@ignore
+The above is based on the following discussion:
+
+ I have one question, or maybe it's a suggestion if there isn't a way
+ to do it now. I would like to use @option{--gzip}, but I'd also like
+ the output to be fed through a program like @acronym{GNU}
+ @command{ecc} (actually, right now that's @samp{exactly} what I'd like
+ to use :-)), basically adding ECC protection on top of compression.
+ It seems as if this should be quite easy to do, but I can't work out
+ exactly how to go about it. Of course, I can pipe the standard output
+ of @command{tar} through @command{ecc}, but then I lose (though I
+ haven't started using it yet, I confess) the ability to have
+ @command{tar} use @command{rmt} for it's I/O (I think).
+
+ I think the most straightforward thing would be to let me specify a
+ general set of filters outboard of compression (preferably ordered,
+ so the order can be automatically reversed on input operations, and
+ with the options they require specifiable), but beggars shouldn't be
+ choosers and anything you decide on would be fine with me.
+
+ By the way, I like @command{ecc} but if (as the comments say) it can't
+ deal with loss of block sync, I'm tempted to throw some time at adding
+ that capability. Supposing I were to actually do such a thing and
+ get it (apparently) working, do you accept contributed changes to
+ utilities like that? (Leigh Clayton @file{loc@@soliton.com}, May 1995).
+
+ Isn't that exactly the role of the
+ @option{--use-compress-prog=@var{program}} option?
+ I never tried it myself, but I suspect you may want to write a
+ @var{prog} script or program able to filter stdin to stdout to
+ way you want. It should recognize the @option{-d} option, for when
+ extraction is needed rather than creation.
+
+ It has been reported that if one writes compressed data (through the
+ @option{--gzip} or @option{--compress} options) to a DLT and tries to use
+ the DLT compression mode, the data will actually get bigger and one will
+ end up with less space on the tape.
+@end ignore
+
+@node sparse
+@subsection Archiving Sparse Files
+@cindex Sparse Files
+
+Files in the file system occasionally have @dfn{holes}. A @dfn{hole}
+in a file is a section of the file's contents which was never written.
+The contents of a hole reads as all zeros. On many operating systems,
+actual disk storage is not allocated for holes, but they are counted
+in the length of the file. If you archive such a file, @command{tar}
+could create an archive longer than the original. To have @command{tar}
+attempt to recognize the holes in a file, use @option{--sparse}
+(@option{-S}). When you use this option, then, for any file using
+less disk space than would be expected from its length, @command{tar}
+searches the file for consecutive stretches of zeros. It then records
+in the archive for the file where the consecutive stretches of zeros
+are, and only archives the ``real contents'' of the file. On
+extraction (using @option{--sparse} is not needed on extraction) any
+such files have holes created wherever the continuous stretches of zeros
+were found. Thus, if you use @option{--sparse}, @command{tar} archives
+won't take more space than the original.
+
+@table @option
+@opindex sparse
+@item -S
+@itemx --sparse
+This option instructs @command{tar} to test each file for sparseness
+before attempting to archive it. If the file is found to be sparse it
+is treated specially, thus allowing to decrease the amount of space
+used by its image in the archive.
+
+This option is meaningful only when creating or updating archives. It
+has no effect on extraction.
+@end table
+
+Consider using @option{--sparse} when performing file system backups,
+to avoid archiving the expanded forms of files stored sparsely in the
+system.
+
+Even if your system has no sparse files currently, some may be
+created in the future. If you use @option{--sparse} while making file
+system backups as a matter of course, you can be assured the archive
+will never take more space on the media than the files take on disk
+(otherwise, archiving a disk filled with sparse files might take
+hundreds of tapes). @xref{Incremental Dumps}.
+
+However, be aware that @option{--sparse} option presents a serious
+drawback. Namely, in order to determine if the file is sparse
+@command{tar} has to read it before trying to archive it, so in total
+the file is read @strong{twice}. So, always bear in mind that the
+time needed to process all files with this option is roughly twice
+the time needed to archive them without it.
+@FIXME{A technical note:
+
+Programs like @command{dump} do not have to read the entire file; by
+examining the file system directly, they can determine in advance
+exactly where the holes are and thus avoid reading through them. The
+only data it need read are the actual allocated data blocks.
+@GNUTAR{} uses a more portable and straightforward
+archiving approach, it would be fairly difficult that it does
+otherwise. Elizabeth Zwicky writes to @file{comp.unix.internals}, on
+1990-12-10:
+
+@quotation
+What I did say is that you cannot tell the difference between a hole and an
+equivalent number of nulls without reading raw blocks. @code{st_blocks} at
+best tells you how many holes there are; it doesn't tell you @emph{where}.
+Just as programs may, conceivably, care what @code{st_blocks} is (care
+to name one that does?), they may also care where the holes are (I have
+no examples of this one either, but it's equally imaginable).
+
+I conclude from this that good archivers are not portable. One can
+arguably conclude that if you want a portable program, you can in good
+conscience restore files with as many holes as possible, since you can't
+get it right.
+@end quotation
+}
+
+@cindex sparse formats, defined
+When using @samp{POSIX} archive format, @GNUTAR{} is able to store
+sparse files using in three distinct ways, called @dfn{sparse
+formats}. A sparse format is identified by its @dfn{number},
+consisting, as usual of two decimal numbers, delimited by a dot. By
+default, format @samp{1.0} is used. If, for some reason, you wish to
+use an earlier format, you can select it using
+@option{--sparse-version} option.
+
+@table @option
+@opindex sparse-version
+@item --sparse-version=@var{version}
+
+Select the format to store sparse files in. Valid @var{version} values
+are: @samp{0.0}, @samp{0.1} and @samp{1.0}. @xref{Sparse Formats},
+for a detailed description of each format.
+@end table
+
+Using @option{--sparse-format} option implies @option{--sparse}.
+
+@node Attributes
+@section Handling File Attributes
+@UNREVISED
+
+When @command{tar} reads files, it updates their access times. To
+avoid this, use the @option{--atime-preserve[=METHOD]} option, which can either
+reset the access time retroactively or avoid changing it in the first
+place.
+
+Handling of file attributes
+
+@table @option
+@opindex atime-preserve
+@item --atime-preserve
+@itemx --atime-preserve=replace
+@itemx --atime-preserve=system
+Preserve the access times of files that are read. This works only for
+files that you own, unless you have superuser privileges.
+
+@option{--atime-preserve=replace} works on most systems, but it also
+restores the data modification time and updates the status change
+time. Hence it doesn't interact with incremental dumps nicely
+(@pxref{Incremental Dumps}), and it can set access or data modification times
+incorrectly if other programs access the file while @command{tar} is
+running.
+
+@option{--atime-preserve=system} avoids changing the access time in
+the first place, if the operating system supports this.
+Unfortunately, this may or may not work on any given operating system
+or file system. If @command{tar} knows for sure it won't work, it
+complains right away.
+
+Currently @option{--atime-preserve} with no operand defaults to
+@option{--atime-preserve=replace}, but this is intended to change to
+@option{--atime-preserve=system} when the latter is better-supported.
+
+@opindex touch
+@item -m
+@itemx --touch
+Do not extract data modification time.
+
+When this option is used, @command{tar} leaves the data modification times
+of the files it extracts as the times when the files were extracted,
+instead of setting it to the times recorded in the archive.
+
+This option is meaningless with @option{--list} (@option{-t}).
+
+@opindex same-owner
+@item --same-owner
+Create extracted files with the same ownership they have in the
+archive.
+
+This is the default behavior for the superuser,
+so this option is meaningful only for non-root users, when @command{tar}
+is executed on those systems able to give files away. This is
+considered as a security flaw by many people, at least because it
+makes quite difficult to correctly account users for the disk space
+they occupy. Also, the @code{suid} or @code{sgid} attributes of
+files are easily and silently lost when files are given away.
+
+When writing an archive, @command{tar} writes the user @acronym{ID} and user name
+separately. If it can't find a user name (because the user @acronym{ID} is not
+in @file{/etc/passwd}), then it does not write one. When restoring,
+it tries to look the name (if one was written) up in
+@file{/etc/passwd}. If it fails, then it uses the user @acronym{ID} stored in
+the archive instead.
+
+@opindex no-same-owner
+@item --no-same-owner
+@itemx -o
+Do not attempt to restore ownership when extracting. This is the
+default behavior for ordinary users, so this option has an effect
+only for the superuser.
+
+@opindex numeric-owner
+@item --numeric-owner
+The @option{--numeric-owner} option allows (ANSI) archives to be written
+without user/group name information or such information to be ignored
+when extracting. It effectively disables the generation and/or use
+of user/group name information. This option forces extraction using
+the numeric ids from the archive, ignoring the names.
+
+This is useful in certain circumstances, when restoring a backup from
+an emergency floppy with different passwd/group files for example.
+It is otherwise impossible to extract files with the right ownerships
+if the password file in use during the extraction does not match the
+one belonging to the file system(s) being extracted. This occurs,
+for example, if you are restoring your files after a major crash and
+had booted from an emergency floppy with no password file or put your
+disk into another machine to do the restore.
+
+The numeric ids are @emph{always} saved into @command{tar} archives.
+The identifying names are added at create time when provided by the
+system, unless @option{--old-archive} (@option{-o}) is used. Numeric ids could be
+used when moving archives between a collection of machines using
+a centralized management for attribution of numeric ids to users
+and groups. This is often made through using the NIS capabilities.
+
+When making a @command{tar} file for distribution to other sites, it
+is sometimes cleaner to use a single owner for all files in the
+distribution, and nicer to specify the write permission bits of the
+files as stored in the archive independently of their actual value on
+the file system. The way to prepare a clean distribution is usually
+to have some Makefile rule creating a directory, copying all needed
+files in that directory, then setting ownership and permissions as
+wanted (there are a lot of possible schemes), and only then making a
+@command{tar} archive out of this directory, before cleaning
+everything out. Of course, we could add a lot of options to
+@GNUTAR{} for fine tuning permissions and ownership.
+This is not the good way, I think. @GNUTAR{} is
+already crowded with options and moreover, the approach just explained
+gives you a great deal of control already.
+
+@xopindex{same-permissions, short description}
+@xopindex{preserve-permissions, short description}
+@item -p
+@itemx --same-permissions
+@itemx --preserve-permissions
+Extract all protection information.
+
+This option causes @command{tar} to set the modes (access permissions) of
+extracted files exactly as recorded in the archive. If this option
+is not used, the current @code{umask} setting limits the permissions
+on extracted files. This option is by default enabled when
+@command{tar} is executed by a superuser.
+
+
+This option is meaningless with @option{--list} (@option{-t}).
+
+@opindex preserve
+@item --preserve
+Same as both @option{--same-permissions} and @option{--same-order}.
+
+The @option{--preserve} option has no equivalent short option name.
+It is equivalent to @option{--same-permissions} plus @option{--same-order}.
+
+@FIXME{I do not see the purpose of such an option. (Neither I. FP.)
+Neither do I. --Sergey}
+
+@end table
+
+@node Portability
+@section Making @command{tar} Archives More Portable
+
+Creating a @command{tar} archive on a particular system that is meant to be
+useful later on many other machines and with other versions of @command{tar}
+is more challenging than you might think. @command{tar} archive formats
+have been evolving since the first versions of Unix. Many such formats
+are around, and are not always compatible with each other. This section
+discusses a few problems, and gives some advice about making @command{tar}
+archives more portable.
+
+One golden rule is simplicity. For example, limit your @command{tar}
+archives to contain only regular files and directories, avoiding
+other kind of special files. Do not attempt to save sparse files or
+contiguous files as such. Let's discuss a few more problems, in turn.
+
+@FIXME{Discuss GNU extensions (incremental backups, multi-volume
+archives and archive labels) in GNU and PAX formats.}
+
+@menu
+* Portable Names:: Portable Names
+* dereference:: Symbolic Links
+* old:: Old V7 Archives
+* ustar:: Ustar Archives
+* gnu:: GNU and old GNU format archives.
+* posix:: @acronym{POSIX} archives
+* Checksumming:: Checksumming Problems
+* Large or Negative Values:: Large files, negative time stamps, etc.
+* Other Tars:: How to Extract GNU-Specific Data Using
+ Other @command{tar} Implementations
+@end menu
+
+@node Portable Names
+@subsection Portable Names
+
+Use portable file and member names. A name is portable if it contains
+only @acronym{ASCII} letters and digits, @samp{/}, @samp{.}, @samp{_}, and
+@samp{-}; it cannot be empty, start with @samp{-} or @samp{//}, or
+contain @samp{/-}. Avoid deep directory nesting. For portability to
+old Unix hosts, limit your file name components to 14 characters or
+less.
+
+If you intend to have your @command{tar} archives to be read under
+MSDOS, you should not rely on case distinction for file names, and you
+might use the @acronym{GNU} @command{doschk} program for helping you
+further diagnosing illegal MSDOS names, which are even more limited
+than System V's.
+
+@node dereference
+@subsection Symbolic Links
+@cindex File names, using symbolic links
+@cindex Symbolic link as file name
+
+@opindex dereference
+Normally, when @command{tar} archives a symbolic link, it writes a
+block to the archive naming the target of the link. In that way, the
+@command{tar} archive is a faithful record of the file system contents.
+@option{--dereference} (@option{-h}) is used with @option{--create} (@option{-c}), and causes
+@command{tar} to archive the files symbolic links point to, instead of
+the links themselves. When this option is used, when @command{tar}
+encounters a symbolic link, it will archive the linked-to file,
+instead of simply recording the presence of a symbolic link.
+
+The name under which the file is stored in the file system is not
+recorded in the archive. To record both the symbolic link name and
+the file name in the system, archive the file under both names. If
+all links were recorded automatically by @command{tar}, an extracted file
+might be linked to a file name that no longer exists in the file
+system.
+
+If a linked-to file is encountered again by @command{tar} while creating
+the same archive, an entire second copy of it will be stored. (This
+@emph{might} be considered a bug.)
+
+So, for portable archives, do not archive symbolic links as such,
+and use @option{--dereference} (@option{-h}): many systems do not support
+symbolic links, and moreover, your distribution might be unusable if
+it contains unresolved symbolic links.
+
+@node old
+@subsection Old V7 Archives
+@cindex Format, old style
+@cindex Old style format
+@cindex Old style archives
+@cindex v7 archive format
+
+Certain old versions of @command{tar} cannot handle additional
+information recorded by newer @command{tar} programs. To create an
+archive in V7 format (not ANSI), which can be read by these old
+versions, specify the @option{--format=v7} option in
+conjunction with the @option{--create} (@option{-c}) (@command{tar} also
+accepts @option{--portability} or @option{--old-archive} for this
+option). When you specify it,
+@command{tar} leaves out information about directories, pipes, fifos,
+contiguous files, and device files, and specifies file ownership by
+group and user IDs instead of group and user names.
+
+When updating an archive, do not use @option{--format=v7}
+unless the archive was created using this option.
+
+In most cases, a @emph{new} format archive can be read by an @emph{old}
+@command{tar} program without serious trouble, so this option should
+seldom be needed. On the other hand, most modern @command{tar}s are
+able to read old format archives, so it might be safer for you to
+always use @option{--format=v7} for your distributions. Notice,
+however, that @samp{ustar} format is a better alternative, as it is
+free from many of @samp{v7}'s drawbacks.
+
+@node ustar
+@subsection Ustar Archive Format
+
+@cindex ustar archive format
+Archive format defined by @acronym{POSIX}.1-1988 specification is called
+@code{ustar}. Although it is more flexible than the V7 format, it
+still has many restrictions (@xref{Formats,ustar}, for the detailed
+description of @code{ustar} format). Along with V7 format,
+@code{ustar} format is a good choice for archives intended to be read
+with other implementations of @command{tar}.
+
+To create archive in @code{ustar} format, use @option{--format=ustar}
+option in conjunction with the @option{--create} (@option{-c}).
+
+@node gnu
+@subsection @acronym{GNU} and old @GNUTAR{} format
+
+@cindex GNU archive format
+@cindex Old GNU archive format
+@GNUTAR{} was based on an early draft of the
+@acronym{POSIX} 1003.1 @code{ustar} standard. @acronym{GNU} extensions to
+@command{tar}, such as the support for file names longer than 100
+characters, use portions of the @command{tar} header record which were
+specified in that @acronym{POSIX} draft as unused. Subsequent changes in
+@acronym{POSIX} have allocated the same parts of the header record for
+other purposes. As a result, @GNUTAR{} format is
+incompatible with the current @acronym{POSIX} specification, and with
+@command{tar} programs that follow it.
+
+In the majority of cases, @command{tar} will be configured to create
+this format by default. This will change in future releases, since
+we plan to make @samp{POSIX} format the default.
+
+To force creation a @GNUTAR{} archive, use option
+@option{--format=gnu}.
+
+@node posix
+@subsection @GNUTAR{} and @acronym{POSIX} @command{tar}
+
+@cindex POSIX archive format
+@cindex PAX archive format
+Starting from version 1.14 @GNUTAR{} features full support for
+@acronym{POSIX.1-2001} archives.
+
+A @acronym{POSIX} conformant archive will be created if @command{tar}
+was given @option{--format=posix} (@option{--format=pax}) option. No
+special option is required to read and extract from a @acronym{POSIX}
+archive.
+
+@menu
+* PAX keywords:: Controlling Extended Header Keywords.
+@end menu
+
+@node PAX keywords
+@subsubsection Controlling Extended Header Keywords
+
+@table @option
+@opindex pax-option
+@item --pax-option=@var{keyword-list}
+Handle keywords in @acronym{PAX} extended headers. This option is
+equivalent to @option{-o} option of the @command{pax} utility.
+@end table
+
+@var{Keyword-list} is a comma-separated
+list of keyword options, each keyword option taking one of
+the following forms:
+
+@table @code
+@item delete=@var{pattern}
+When used with one of archive-creation commands,
+this option instructs @command{tar} to omit from extended header records
+that it produces any keywords matching the string @var{pattern}.
+
+When used in extract or list mode, this option instructs tar
+to ignore any keywords matching the given @var{pattern} in the extended
+header records. In both cases, matching is performed using the pattern
+matching notation described in @acronym{POSIX 1003.2}, 3.13
+(@pxref{wildcards}). For example:
+
+@smallexample
+--pax-option delete=security.*
+@end smallexample
+
+would suppress security-related information.
+
+@item exthdr.name=@var{string}
+
+This keyword allows user control over the name that is written into the
+ustar header blocks for the extended headers. The name is obtained
+from @var{string} after making the following substitutions:
+
+@multitable @columnfractions .25 .55
+@headitem Meta-character @tab Replaced By
+@item %d @tab The directory name of the file, equivalent to the
+result of the @command{dirname} utility on the translated file name.
+@item %f @tab The name of the file with the directory information
+stripped, equivalent to the result of the @command{basename} utility
+on the translated file name.
+@item %p @tab The process @acronym{ID} of the @command{tar} process.
+@item %% @tab A @samp{%} character.
+@end multitable
+
+Any other @samp{%} characters in @var{string} produce undefined
+results.
+
+If no option @samp{exthdr.name=string} is specified, @command{tar}
+will use the following default value:
+
+@smallexample
+%d/PaxHeaders.%p/%f
+@end smallexample
+
+@item globexthdr.name=@var{string}
+This keyword allows user control over the name that is written into
+the ustar header blocks for global extended header records. The name
+is obtained from the contents of @var{string}, after making
+the following substitutions:
+
+@multitable @columnfractions .25 .55
+@headitem Meta-character @tab Replaced By
+@item %n @tab An integer that represents the
+sequence number of the global extended header record in the archive,
+starting at 1.
+@item %p @tab The process @acronym{ID} of the @command{tar} process.
+@item %% @tab A @samp{%} character.
+@end multitable
+
+Any other @samp{%} characters in @var{string} produce undefined results.
+
+If no option @samp{globexthdr.name=string} is specified, @command{tar}
+will use the following default value:
+
+@smallexample
+$TMPDIR/GlobalHead.%p.%n
+@end smallexample
+
+@noindent
+where @samp{$TMPDIR} represents the value of the @var{TMPDIR}
+environment variable. If @var{TMPDIR} is not set, @command{tar}
+uses @samp{/tmp}.
+
+@item @var{keyword}=@var{value}
+When used with one of archive-creation commands, these keyword/value pairs
+will be included at the beginning of the archive in a global extended
+header record. When used with one of archive-reading commands,
+@command{tar} will behave as if it has encountered these keyword/value
+pairs at the beginning of the archive in a global extended header
+record.
+
+@item @var{keyword}:=@var{value}
+When used with one of archive-creation commands, these keyword/value pairs
+will be included as records at the beginning of an extended header for
+each file. This is effectively equivalent to @var{keyword}=@var{value}
+form except that it creates no global extended header records.
+
+When used with one of archive-reading commands, @command{tar} will
+behave as if these keyword/value pairs were included as records at the
+end of each extended header; thus, they will override any global or
+file-specific extended header record keywords of the same names.
+For example, in the command:
+
+@smallexample
+tar --format=posix --create \
+ --file archive --pax-option gname:=user .
+@end smallexample
+
+the group name will be forced to a new value for all files
+stored in the archive.
+@end table
+
+@node Checksumming
+@subsection Checksumming Problems
+
+SunOS and HP-UX @command{tar} fail to accept archives created using
+@GNUTAR{} and containing non-@acronym{ASCII} file names, that
+is, file names having characters with the eight bit set, because they
+use signed checksums, while @GNUTAR{} uses unsigned
+checksums while creating archives, as per @acronym{POSIX} standards. On
+reading, @GNUTAR{} computes both checksums and
+accept any. It is somewhat worrying that a lot of people may go
+around doing backup of their files using faulty (or at least
+non-standard) software, not learning about it until it's time to
+restore their missing files with an incompatible file extractor, or
+vice versa.
+
+@GNUTAR{} compute checksums both ways, and accept
+any on read, so @acronym{GNU} tar can read Sun tapes even with their
+wrong checksums. @GNUTAR{} produces the standard
+checksum, however, raising incompatibilities with Sun. That is to
+say, @GNUTAR{} has not been modified to
+@emph{produce} incorrect archives to be read by buggy @command{tar}'s.
+I've been told that more recent Sun @command{tar} now read standard
+archives, so maybe Sun did a similar patch, after all?
+
+The story seems to be that when Sun first imported @command{tar}
+sources on their system, they recompiled it without realizing that
+the checksums were computed differently, because of a change in
+the default signing of @code{char}'s in their compiler. So they
+started computing checksums wrongly. When they later realized their
+mistake, they merely decided to stay compatible with it, and with
+themselves afterwards. Presumably, but I do not really know, HP-UX
+has chosen that their @command{tar} archives to be compatible with Sun's.
+The current standards do not favor Sun @command{tar} format. In any
+case, it now falls on the shoulders of SunOS and HP-UX users to get
+a @command{tar} able to read the good archives they receive.
+
+@node Large or Negative Values
+@subsection Large or Negative Values
+@cindex large values
+@cindex future time stamps
+@cindex negative time stamps
+@UNREVISED{}
+
+The above sections suggest to use @samp{oldest possible} archive
+format if in doubt. However, sometimes it is not possible. If you
+attempt to archive a file whose metadata cannot be represented using
+required format, @GNUTAR{} will print error message and ignore such a
+file. You will than have to switch to a format that is able to
+handle such values. The format summary table (@pxref{Formats}) will
+help you to do so.
+
+In particular, when trying to archive files larger than 8GB or with
+timestamps not in the range 1970-01-01 00:00:00 through 2242-03-16
+12:56:31 @sc{utc}, you will have to chose between @acronym{GNU} and
+@acronym{POSIX} archive formats. When considering which format to
+choose, bear in mind that the @acronym{GNU} format uses
+two's-complement base-256 notation to store values that do not fit
+into standard @acronym{ustar} range. Such archives can generally be
+read only by a @GNUTAR{} implementation. Moreover, they sometimes
+cannot be correctly restored on another hosts even by @GNUTAR{}. For
+example, using two's complement representation for negative time
+stamps that assumes a signed 32-bit @code{time_t} generates archives
+that are not portable to hosts with differing @code{time_t}
+representations.
+
+On the other hand, @acronym{POSIX} archives, generally speaking, can
+be extracted by any tar implementation that understands older
+@acronym{ustar} format. The only exception are files larger than 8GB.
+
+@FIXME{Describe how @acronym{POSIX} archives are extracted by non
+POSIX-aware tars.}
+
+@node Other Tars
+@subsection How to Extract GNU-Specific Data Using Other @command{tar} Implementations
+
+In previous sections you became acquainted with various quirks
+necessary to make your archives portable. Sometimes you may need to
+extract archives containing GNU-specific members using some
+third-party @command{tar} implementation or an older version of
+@GNUTAR{}. Of course your best bet is to have @GNUTAR{} installed,
+but if it is for some reason impossible, this section will explain
+how to cope without it.
+
+When we speak about @dfn{GNU-specific} members we mean two classes of
+them: members split between the volumes of a multi-volume archive and
+sparse members. You will be able to always recover such members if
+the archive is in PAX format. In addition split members can be
+recovered from archives in old GNU format. The following subsections
+describe the required procedures in detail.
+
+@menu
+* Split Recovery:: Members Split Between Volumes
+* Sparse Recovery:: Sparse Members
+@end menu
+
+@node Split Recovery
+@subsubsection Extracting Members Split Between Volumes
+
+@cindex Mutli-volume archives, extracting using non-GNU tars
+If a member is split between several volumes of an old GNU format archive
+most third party @command{tar} implementation will fail to extract
+it. To extract it, use @command{tarcat} program (@pxref{Tarcat}).
+This program is available from
+@uref{http://www.gnu.org/@/software/@/tar/@/utils/@/tarcat.html, @GNUTAR{}
+home page}. It concatenates several archive volumes into a single
+valid archive. For example, if you have three volumes named from
+@file{vol-1.tar} to @file{vol-3.tar}, you can do the following to
+extract them using a third-party @command{tar}:
+
+@smallexample
+$ @kbd{tarcat vol-1.tar vol-2.tar vol-3.tar | tar xf -}
+@end smallexample
+
+@cindex Mutli-volume archives in PAX format, extracting using non-GNU tars
+You could use this approach for most (although not all) PAX
+format archives as well. However, extracting split members from a PAX
+archive is a much easier task, because PAX volumes are constructed in
+such a way that each part of a split member is extracted to a
+different file by @command{tar} implementations that are not aware of
+GNU extensions. More specifically, the very first part retains its
+original name, and all subsequent parts are named using the pattern:
+
+@smallexample
+%d/GNUFileParts.%p/%f.%n
+@end smallexample
+
+@noindent
+where symbols preceeded by @samp{%} are @dfn{macro characters} that
+have the following meaning:
+
+@multitable @columnfractions .25 .55
+@headitem Meta-character @tab Replaced By
+@item %d @tab The directory name of the file, equivalent to the
+result of the @command{dirname} utility on its full name.
+@item %f @tab The file name of the file, equivalent to the result
+of the @command{basename} utility on its full name.
+@item %p @tab The process @acronym{ID} of the @command{tar} process that
+created the archive.
+@item %n @tab Ordinal number of this particular part.
+@end multitable
+
+For example, if the file @file{var/longfile} was split during archive
+creation between three volumes, and the creator @command{tar} process
+had process @acronym{ID} @samp{27962}, then the member names will be:
+
+@smallexample
+var/longfile
+var/GNUFileParts.27962/longfile.1
+var/GNUFileParts.27962/longfile.2
+@end smallexample
+
+When you extract your archive using a third-party @command{tar}, these
+files will be created on your disk, and the only thing you will need
+to do to restore your file in its original form is concatenate them in
+the proper order, for example:
+
+@smallexample
+@group
+$ @kbd{cd var}
+$ @kbd{cat GNUFileParts.27962/longfile.1 \
+ GNUFileParts.27962/longfile.2 >> longfile}
+$ rm -f GNUFileParts.27962
+@end group
+@end smallexample
+
+Notice, that if the @command{tar} implementation you use supports PAX
+format archives, it will probably emit warnings about unknown keywords
+during extraction. They will look like this:
+
+@smallexample
+@group
+Tar file too small
+Unknown extended header keyword 'GNU.volume.filename' ignored.
+Unknown extended header keyword 'GNU.volume.size' ignored.
+Unknown extended header keyword 'GNU.volume.offset' ignored.
+@end group
+@end smallexample
+
+@noindent
+You can safely ignore these warnings.
+
+If your @command{tar} implementation is not PAX-aware, you will get
+more warnings and more files generated on your disk, e.g.:
+
+@smallexample
+@group
+$ @kbd{tar xf vol-1.tar}
+var/PaxHeaders.27962/longfile: Unknown file type 'x', extracted as
+normal file
+Unexpected EOF in archive
+$ @kbd{tar xf vol-2.tar}
+tmp/GlobalHead.27962.1: Unknown file type 'g', extracted as normal file
+GNUFileParts.27962/PaxHeaders.27962/sparsefile.1: Unknown file type
+'x', extracted as normal file
+@end group
+@end smallexample
+
+Ignore these warnings. The @file{PaxHeaders.*} directories created
+will contain files with @dfn{extended header keywords} describing the
+extracted files. You can delete them, unless they describe sparse
+members. Read further to learn more about them.
+
+@node Sparse Recovery
+@subsubsection Extracting Sparse Members
+
+@cindex sparse files, extracting with non-GNU tars
+Any @command{tar} implementation will be able to extract sparse members from a
+PAX archive. However, the extracted files will be @dfn{condensed},
+i.e., any zero blocks will be removed from them. When we restore such
+a condensed file to its original form, by adding zero blocks (or
+@dfn{holes}) back to their original locations, we call this process
+@dfn{expanding} a compressed sparse file.
+
+@pindex xsparse
+To expand a file, you will need a simple auxiliary program called
+@command{xsparse}. It is available in source form from
+@uref{http://www.gnu.org/@/software/@/tar/@/utils/@/xsparse.html, @GNUTAR{}
+home page}.
+
+@cindex sparse files v.1.0, extracting with non-GNU tars
+Let's begin with archive members in @dfn{sparse format
+version 1.0}@footnote{@xref{PAX 1}.}, which are the easiest to expand.
+The condensed file will contain both file map and file data, so no
+additional data will be needed to restore it. If the original file
+name was @file{@var{dir}/@var{name}}, then the condensed file will be
+named @file{@var{dir}/@/GNUSparseFile.@var{n}/@/@var{name}}, where
+@var{n} is a decimal number@footnote{technically speaking, @var{n} is a
+@dfn{process @acronym{ID}} of the @command{tar} process which created the
+archive (@pxref{PAX keywords}).}.
+
+To expand a version 1.0 file, run @command{xsparse} as follows:
+
+@smallexample
+$ @kbd{xsparse @file{cond-file}}
+@end smallexample
+
+@noindent
+where @file{cond-file} is the name of the condensed file. The utility
+will deduce the name for the resulting expanded file using the
+following algorithm:
+
+@enumerate 1
+@item If @file{cond-file} does not contain any directories,
+@file{../cond-file} will be used;
+
+@item If @file{cond-file} has the form
+@file{@var{dir}/@var{t}/@var{name}}, where both @var{t} and @var{name}
+are simple names, with no @samp{/} characters in them, the output file
+name will be @file{@var{dir}/@var{name}}.
+
+@item Otherwise, if @file{cond-file} has the form
+@file{@var{dir}/@var{name}}, the output file name will be
+@file{@var{name}}.
+@end enumerate
+
+In the unlikely case when this algorithm does not suit your needs,
+you can explicitly specify output file name as a second argument to
+the command:
+
+@smallexample
+$ @kbd{xsparse @file{cond-file} @file{out-file}}
+@end smallexample
+
+It is often a good idea to run @command{xsparse} in @dfn{dry run} mode
+first. In this mode, the command does not actually expand the file,
+but verbosely lists all actions it would be taking to do so. The dry
+run mode is enabled by @option{-n} command line argument:
+
+@smallexample
+@group
+$ @kbd{xsparse -n /home/gray/GNUSparseFile.6058/sparsefile}
+Reading v.1.0 sparse map
+Expanding file `/home/gray/GNUSparseFile.6058/sparsefile' to
+`/home/gray/sparsefile'
+Finished dry run
+@end group
+@end smallexample
+
+To actually expand the file, you would run:
+
+@smallexample
+$ @kbd{xsparse /home/gray/GNUSparseFile.6058/sparsefile}
+@end smallexample
+
+@noindent
+The program behaves the same way all UNIX utilities do: it will keep
+quiet unless it has simething important to tell you (e.g. an error
+condition or something). If you wish it to produce verbose output,
+similar to that from the dry run mode, use @option{-v} option:
+
+@smallexample
+@group
+$ @kbd{xsparse -v /home/gray/GNUSparseFile.6058/sparsefile}
+Reading v.1.0 sparse map
+Expanding file `/home/gray/GNUSparseFile.6058/sparsefile' to
+`/home/gray/sparsefile'
+Done
+@end group
+@end smallexample
+
+Additionally, if your @command{tar} implementation has extracted the
+@dfn{extended headers} for this file, you can instruct @command{xstar}
+to use them in order to verify the integrity of the expanded file.
+The option @option{-x} sets the name of the extended header file to
+use. Continuing our example:
+
+@smallexample
+@group
+$ @kbd{xsparse -v -x /home/gray/PaxHeaders.6058/sparsefile \
+ /home/gray/GNUSparseFile.6058/sparsefile}
+Reading extended header file
+Found variable GNU.sparse.major = 1
+Found variable GNU.sparse.minor = 0
+Found variable GNU.sparse.name = sparsefile
+Found variable GNU.sparse.realsize = 217481216
+Reading v.1.0 sparse map
+Expanding file `/home/gray/GNUSparseFile.6058/sparsefile' to
+`/home/gray/sparsefile'
+Done
+@end group
+@end smallexample
+
+@anchor{extracting sparse v.0.x}
+@cindex sparse files v.0.1, extracting with non-GNU tars
+@cindex sparse files v.0.0, extracting with non-GNU tars
+An @dfn{extended header} is a special @command{tar} archive header
+that precedes an archive member and contains a set of
+@dfn{variables}, describing the member properties that cannot be
+stored in the standard @code{ustar} header. While optional for
+expanding sparse version 1.0 members, the use of extended headers is
+mandatory when expanding sparse members in older sparse formats: v.0.0
+and v.0.1 (The sparse formats are described in detail in @ref{Sparse
+Formats}.) So, for these formats, the question is: how to obtain
+extended headers from the archive?
+
+If you use a @command{tar} implementation that does not support PAX
+format, extended headers for each member will be extracted as a
+separate file. If we represent the member name as
+@file{@var{dir}/@var{name}}, then the extended header file will be
+named @file{@var{dir}/@/PaxHeaders.@var{n}/@/@var{name}}, where
+@var{n} is an integer number.
+
+Things become more difficult if your @command{tar} implementation
+does support PAX headers, because in this case you will have to
+manually extract the headers. We recommend the following algorithm:
+
+@enumerate 1
+@item
+Consult the documentation of your @command{tar} implementation for an
+option that prints @dfn{block numbers} along with the archive
+listing (analogous to @GNUTAR{}'s @option{-R} option). For example,
+@command{star} has @option{-block-number}.
+
+@item
+Obtain verbose listing using the @samp{block number} option, and
+find block numbers of the sparse member in question and the member
+immediately following it. For example, running @command{star} on our
+archive we obtain:
+
+@smallexample
+@group
+$ @kbd{star -t -v -block-number -f arc.tar}
+@dots{}
+star: Unknown extended header keyword 'GNU.sparse.size' ignored.
+star: Unknown extended header keyword 'GNU.sparse.numblocks' ignored.
+star: Unknown extended header keyword 'GNU.sparse.name' ignored.
+star: Unknown extended header keyword 'GNU.sparse.map' ignored.
+block 56: 425984 -rw-r--r-- gray/users Jun 25 14:46 2006 GNUSparseFile.28124/sparsefile
+block 897: 65391 -rw-r--r-- gray/users Jun 24 20:06 2006 README
+@dots{}
+@end group
+@end smallexample
+
+@noindent
+(as usual, ignore the warnings about unknown keywords.)
+
+@item
+Let @var{size} be the size of the sparse member, @var{Bs} be its block number
+and @var{Bn} be the block number of the next member.
+Compute:
+
+@smallexample
+@var{N} = @var{Bs} - @var{Bn} - @var{size}/512 - 2
+@end smallexample
+
+@noindent
+This number gives the size of the extended header part in tar @dfn{blocks}.
+In our example, this formula gives: @code{897 - 56 - 425984 / 512 - 2
+= 7}.
+
+@item
+Use @command{dd} to extract the headers:
+
+@smallexample
+@kbd{dd if=@var{archive} of=@var{hname} bs=512 skip=@var{Bs} count=@var{N}}
+@end smallexample
+
+@noindent
+where @var{archive} is the archive name, @var{hname} is a name of the
+file to store the extended header in, @var{Bs} and @var{N} are
+computed in previous steps.
+
+In our example, this command will be
+
+@smallexample
+$ @kbd{dd if=arc.tar of=xhdr bs=512 skip=56 count=7}
+@end smallexample
+@end enumerate
+
+Finally, you can expand the condensed file, using the obtained header:
+
+@smallexample
+@group
+$ @kbd{xsparse -v -x xhdr GNUSparseFile.6058/sparsefile}
+Reading extended header file
+Found variable GNU.sparse.size = 217481216
+Found variable GNU.sparse.numblocks = 208
+Found variable GNU.sparse.name = sparsefile
+Found variable GNU.sparse.map = 0,2048,1050624,2048,@dots{}
+Expanding file `GNUSparseFile.28124/sparsefile' to `sparsefile'
+Done
+@end group
+@end smallexample
+
+@node cpio
+@section Comparison of @command{tar} and @command{cpio}
+@UNREVISED
+
+@FIXME{Reorganize the following material}
+
+The @command{cpio} archive formats, like @command{tar}, do have maximum
+file name lengths. The binary and old @acronym{ASCII} formats have a maximum file
+length of 256, and the new @acronym{ASCII} and @acronym{CRC ASCII} formats have a max
+file length of 1024. @acronym{GNU} @command{cpio} can read and write archives
+with arbitrary file name lengths, but other @command{cpio} implementations
+may crash unexplainedly trying to read them.
+
+@command{tar} handles symbolic links in the form in which it comes in @acronym{BSD};
+@command{cpio} doesn't handle symbolic links in the form in which it comes
+in System V prior to SVR4, and some vendors may have added symlinks
+to their system without enhancing @command{cpio} to know about them.
+Others may have enhanced it in a way other than the way I did it
+at Sun, and which was adopted by AT&T (and which is, I think, also
+present in the @command{cpio} that Berkeley picked up from AT&T and put
+into a later @acronym{BSD} release---I think I gave them my changes).
+
+(SVR4 does some funny stuff with @command{tar}; basically, its @command{cpio}
+can handle @command{tar} format input, and write it on output, and it
+probably handles symbolic links. They may not have bothered doing
+anything to enhance @command{tar} as a result.)
+
+@command{cpio} handles special files; traditional @command{tar} doesn't.
+
+@command{tar} comes with V7, System III, System V, and @acronym{BSD} source;
+@command{cpio} comes only with System III, System V, and later @acronym{BSD}
+(4.3-tahoe and later).
+
+@command{tar}'s way of handling multiple hard links to a file can handle
+file systems that support 32-bit inumbers (e.g., the @acronym{BSD} file system);
+@command{cpio}s way requires you to play some games (in its ``binary''
+format, i-numbers are only 16 bits, and in its ``portable @acronym{ASCII}'' format,
+they're 18 bits---it would have to play games with the "file system @acronym{ID}"
+field of the header to make sure that the file system @acronym{ID}/i-number pairs
+of different files were always different), and I don't know which
+@command{cpio}s, if any, play those games. Those that don't might get
+confused and think two files are the same file when they're not, and
+make hard links between them.
+
+@command{tar}s way of handling multiple hard links to a file places only
+one copy of the link on the tape, but the name attached to that copy
+is the @emph{only} one you can use to retrieve the file; @command{cpio}s
+way puts one copy for every link, but you can retrieve it using any
+of the names.
+
+@quotation
+What type of check sum (if any) is used, and how is this calculated.
+@end quotation
+
+See the attached manual pages for @command{tar} and @command{cpio} format.
+@command{tar} uses a checksum which is the sum of all the bytes in the
+@command{tar} header for a file; @command{cpio} uses no checksum.
+
+@quotation
+If anyone knows why @command{cpio} was made when @command{tar} was present
+at the unix scene,
+@end quotation
+
+It wasn't. @command{cpio} first showed up in PWB/UNIX 1.0; no
+generally-available version of UNIX had @command{tar} at the time. I don't
+know whether any version that was generally available @emph{within AT&T}
+had @command{tar}, or, if so, whether the people within AT&T who did
+@command{cpio} knew about it.
+
+On restore, if there is a corruption on a tape @command{tar} will stop at
+that point, while @command{cpio} will skip over it and try to restore the
+rest of the files.
+
+The main difference is just in the command syntax and header format.
+
+@command{tar} is a little more tape-oriented in that everything is blocked
+to start on a record boundary.
+
+@quotation
+Is there any differences between the ability to recover crashed
+archives between the two of them. (Is there any chance of recovering
+crashed archives at all.)
+@end quotation
+
+Theoretically it should be easier under @command{tar} since the blocking
+lets you find a header with some variation of @samp{dd skip=@var{nn}}.
+However, modern @command{cpio}'s and variations have an option to just
+search for the next file header after an error with a reasonable chance
+of resyncing. However, lots of tape driver software won't allow you to
+continue past a media error which should be the only reason for getting
+out of sync unless a file changed sizes while you were writing the
+archive.
+
+@quotation
+If anyone knows why @command{cpio} was made when @command{tar} was present
+at the unix scene, please tell me about this too.
+@end quotation
+
+Probably because it is more media efficient (by not blocking everything
+and using only the space needed for the headers where @command{tar}
+always uses 512 bytes per file header) and it knows how to archive
+special files.
+
+You might want to look at the freely available alternatives. The
+major ones are @command{afio}, @GNUTAR{}, and
+@command{pax}, each of which have their own extensions with some
+backwards compatibility.
+
+Sparse files were @command{tar}red as sparse files (which you can
+easily test, because the resulting archive gets smaller, and
+@acronym{GNU} @command{cpio} can no longer read it).
+
+@node Media
+@chapter Tapes and Other Archive Media
+@UNREVISED
+
+A few special cases about tape handling warrant more detailed
+description. These special cases are discussed below.
+
+Many complexities surround the use of @command{tar} on tape drives. Since
+the creation and manipulation of archives located on magnetic tape was
+the original purpose of @command{tar}, it contains many features making
+such manipulation easier.
+
+Archives are usually written on dismountable media---tape cartridges,
+mag tapes, or floppy disks.
+
+The amount of data a tape or disk holds depends not only on its size,
+but also on how it is formatted. A 2400 foot long reel of mag tape
+holds 40 megabytes of data when formatted at 1600 bits per inch. The
+physically smaller EXABYTE tape cartridge holds 2.3 gigabytes.
+
+Magnetic media are re-usable---once the archive on a tape is no longer
+needed, the archive can be erased and the tape or disk used over.
+Media quality does deteriorate with use, however. Most tapes or disks
+should be discarded when they begin to produce data errors. EXABYTE
+tape cartridges should be discarded when they generate an @dfn{error
+count} (number of non-usable bits) of more than 10k.
+
+Magnetic media are written and erased using magnetic fields, and
+should be protected from such fields to avoid damage to stored data.
+Sticking a floppy disk to a filing cabinet using a magnet is probably
+not a good idea.
+
+@menu
+* Device:: Device selection and switching
+* Remote Tape Server::
+* Common Problems and Solutions::
+* Blocking:: Blocking
+* Many:: Many archives on one tape
+* Using Multiple Tapes:: Using Multiple Tapes
+* label:: Including a Label in the Archive
+* verify::
+* Write Protection::
+@end menu
+
+@node Device
+@section Device Selection and Switching
+@UNREVISED
+
+@table @option
+@item -f [@var{hostname}:]@var{file}
+@itemx --file=[@var{hostname}:]@var{file}
+Use archive file or device @var{file} on @var{hostname}.
+@end table
+
+This option is used to specify the file name of the archive @command{tar}
+works on.
+
+If the file name is @samp{-}, @command{tar} reads the archive from standard
+input (when listing or extracting), or writes it to standard output
+(when creating). If the @samp{-} file name is given when updating an
+archive, @command{tar} will read the original archive from its standard
+input, and will write the entire new archive to its standard output.
+
+If the file name contains a @samp{:}, it is interpreted as
+@samp{hostname:file name}. If the @var{hostname} contains an @dfn{at}
+sign (@samp{@@}), it is treated as @samp{user@@hostname:file name}. In
+either case, @command{tar} will invoke the command @command{rsh} (or
+@command{remsh}) to start up an @command{/usr/libexec/rmt} on the remote
+machine. If you give an alternate login name, it will be given to the
+@command{rsh}.
+Naturally, the remote machine must have an executable
+@command{/usr/libexec/rmt}. This program is free software from the
+University of California, and a copy of the source code can be found
+with the sources for @command{tar}; it's compiled and installed by default.
+The exact path to this utility is determined when configuring the package.
+It is @file{@var{prefix}/libexec/rmt}, where @var{prefix} stands for
+your installation prefix. This location may also be overridden at
+runtime by using @option{rmt-command=@var{command}} option (@xref{Option Summary,
+---rmt-command}, for detailed description of this option. @xref{Remote
+Tape Server}, for the description of @command{rmt} command).
+
+If this option is not given, but the environment variable @env{TAPE}
+is set, its value is used; otherwise, old versions of @command{tar}
+used a default archive name (which was picked when @command{tar} was
+compiled). The default is normally set up to be the @dfn{first} tape
+drive or other transportable I/O medium on the system.
+
+Starting with version 1.11.5, @GNUTAR{} uses
+standard input and standard output as the default device, and I will
+not try anymore supporting automatic device detection at installation
+time. This was failing really in too many cases, it was hopeless.
+This is now completely left to the installer to override standard
+input and standard output for default device, if this seems
+preferable. Further, I think @emph{most} actual usages of
+@command{tar} are done with pipes or disks, not really tapes,
+cartridges or diskettes.
+
+Some users think that using standard input and output is running
+after trouble. This could lead to a nasty surprise on your screen if
+you forget to specify an output file name---especially if you are going
+through a network or terminal server capable of buffering large amounts
+of output. We had so many bug reports in that area of configuring
+default tapes automatically, and so many contradicting requests, that
+we finally consider the problem to be portably intractable. We could
+of course use something like @samp{/dev/tape} as a default, but this
+is @emph{also} running after various kind of trouble, going from hung
+processes to accidental destruction of real tapes. After having seen
+all this mess, using standard input and output as a default really
+sounds like the only clean choice left, and a very useful one too.
+
+@GNUTAR{} reads and writes archive in records, I
+suspect this is the main reason why block devices are preferred over
+character devices. Most probably, block devices are more efficient
+too. The installer could also check for @samp{DEFTAPE} in
+@file{<sys/mtio.h>}.
+
+@table @option
+@xopindex{force-local, short description}
+@item --force-local
+Archive file is local even if it contains a colon.
+
+@opindex rsh-command
+@item --rsh-command=@var{command}
+Use remote @var{command} instead of @command{rsh}. This option exists
+so that people who use something other than the standard @command{rsh}
+(e.g., a Kerberized @command{rsh}) can access a remote device.
+
+When this command is not used, the shell command found when
+the @command{tar} program was installed is used instead. This is
+the first found of @file{/usr/ucb/rsh}, @file{/usr/bin/remsh},
+@file{/usr/bin/rsh}, @file{/usr/bsd/rsh} or @file{/usr/bin/nsh}.
+The installer may have overridden this by defining the environment
+variable @env{RSH} @emph{at installation time}.
+
+@item -[0-7][lmh]
+Specify drive and density.
+
+@xopindex{multi-volume, short description}
+@item -M
+@itemx --multi-volume
+Create/list/extract multi-volume archive.
+
+This option causes @command{tar} to write a @dfn{multi-volume} archive---one
+that may be larger than will fit on the medium used to hold it.
+@xref{Multi-Volume Archives}.
+
+@xopindex{tape-length, short description}
+@item -L @var{num}
+@itemx --tape-length=@var{num}
+Change tape after writing @var{num} x 1024 bytes.
+
+This option might be useful when your tape drivers do not properly
+detect end of physical tapes. By being slightly conservative on the
+maximum tape length, you might avoid the problem entirely.
+
+@xopindex{info-script, short description}
+@xopindex{new-volume-script, short description}
+@item -F @var{file}
+@itemx --info-script=@var{file}
+@itemx --new-volume-script=@var{file}
+Execute @file{file} at end of each tape. This implies
+@option{--multi-volume} (@option{-M}). @xref{info-script}, for a detailed
+description of this option.
+@end table
+
+@node Remote Tape Server
+@section The Remote Tape Server
+
+@cindex remote tape drive
+@pindex rmt
+In order to access the tape drive on a remote machine, @command{tar}
+uses the remote tape server written at the University of California at
+Berkeley. The remote tape server must be installed as
+@file{@var{prefix}/libexec/rmt} on any machine whose tape drive you
+want to use. @command{tar} calls @command{rmt} by running an
+@command{rsh} or @command{remsh} to the remote machine, optionally
+using a different login name if one is supplied.
+
+A copy of the source for the remote tape server is provided. It is
+Copyright @copyright{} 1983 by the Regents of the University of
+California, but can be freely distributed. It is compiled and
+installed by default.
+
+@cindex absolute file names
+Unless you use the @option{--absolute-names} (@option{-P}) option,
+@GNUTAR{} will not allow you to create an archive that contains
+absolute file names (a file name beginning with @samp{/}.) If you try,
+@command{tar} will automatically remove the leading @samp{/} from the
+file names it stores in the archive. It will also type a warning
+message telling you what it is doing.
+
+When reading an archive that was created with a different
+@command{tar} program, @GNUTAR{} automatically
+extracts entries in the archive which have absolute file names as if
+the file names were not absolute. This is an important feature. A
+visitor here once gave a @command{tar} tape to an operator to restore;
+the operator used Sun @command{tar} instead of @GNUTAR{},
+and the result was that it replaced large portions of
+our @file{/bin} and friends with versions from the tape; needless to
+say, we were unhappy about having to recover the file system from
+backup tapes.
+
+For example, if the archive contained a file @file{/usr/bin/computoy},
+@GNUTAR{} would extract the file to @file{usr/bin/computoy},
+relative to the current directory. If you want to extract the files in
+an archive to the same absolute names that they had when the archive
+was created, you should do a @samp{cd /} before extracting the files
+from the archive, or you should either use the @option{--absolute-names}
+option, or use the command @samp{tar -C / @dots{}}.
+
+@cindex Ultrix 3.1 and write failure
+Some versions of Unix (Ultrix 3.1 is known to have this problem),
+can claim that a short write near the end of a tape succeeded,
+when it actually failed. This will result in the -M option not
+working correctly. The best workaround at the moment is to use a
+significantly larger blocking factor than the default 20.
+
+In order to update an archive, @command{tar} must be able to backspace the
+archive in order to reread or rewrite a record that was just read (or
+written). This is currently possible only on two kinds of files: normal
+disk files (or any other file that can be backspaced with @samp{lseek}),
+and industry-standard 9-track magnetic tape (or any other kind of tape
+that can be backspaced with the @code{MTIOCTOP} @code{ioctl}.
+
+This means that the @option{--append}, @option{--concatenate}, and
+@option{--delete} commands will not work on any other kind of file.
+Some media simply cannot be backspaced, which means these commands and
+options will never be able to work on them. These non-backspacing
+media include pipes and cartridge tape drives.
+
+Some other media can be backspaced, and @command{tar} will work on them
+once @command{tar} is modified to do so.
+
+Archives created with the @option{--multi-volume}, @option{--label}, and
+@option{--incremental} (@option{-G}) options may not be readable by other version
+of @command{tar}. In particular, restoring a file that was split over
+a volume boundary will require some careful work with @command{dd}, if
+it can be done at all. Other versions of @command{tar} may also create
+an empty file whose name is that of the volume header. Some versions
+of @command{tar} may create normal files instead of directories archived
+with the @option{--incremental} (@option{-G}) option.
+
+@node Common Problems and Solutions
+@section Some Common Problems and their Solutions
+
+@ifclear PUBLISH
+
+@format
+errors from system:
+permission denied
+no such file or directory
+not owner
+
+errors from @command{tar}:
+directory checksum error
+header format error
+
+errors from media/system:
+i/o error
+device busy
+@end format
+
+@end ifclear
+
+@node Blocking
+@section Blocking
+@UNREVISED
+
+@dfn{Block} and @dfn{record} terminology is rather confused, and it
+is also confusing to the expert reader. On the other hand, readers
+who are new to the field have a fresh mind, and they may safely skip
+the next two paragraphs, as the remainder of this manual uses those
+two terms in a quite consistent way.
+
+John Gilmore, the writer of the public domain @command{tar} from which
+@GNUTAR{} was originally derived, wrote (June 1995):
+
+@quotation
+The nomenclature of tape drives comes from IBM, where I believe
+they were invented for the IBM 650 or so. On IBM mainframes, what
+is recorded on tape are tape blocks. The logical organization of
+data is into records. There are various ways of putting records into
+blocks, including @code{F} (fixed sized records), @code{V} (variable
+sized records), @code{FB} (fixed blocked: fixed size records, @var{n}
+to a block), @code{VB} (variable size records, @var{n} to a block),
+@code{VSB} (variable spanned blocked: variable sized records that can
+occupy more than one block), etc. The @code{JCL} @samp{DD RECFORM=}
+parameter specified this to the operating system.
+
+The Unix man page on @command{tar} was totally confused about this.
+When I wrote @code{PD TAR}, I used the historically correct terminology
+(@command{tar} writes data records, which are grouped into blocks).
+It appears that the bogus terminology made it into @acronym{POSIX} (no surprise
+here), and now Fran@,{c}ois has migrated that terminology back
+into the source code too.
+@end quotation
+
+The term @dfn{physical block} means the basic transfer chunk from or
+to a device, after which reading or writing may stop without anything
+being lost. In this manual, the term @dfn{block} usually refers to
+a disk physical block, @emph{assuming} that each disk block is 512
+bytes in length. It is true that some disk devices have different
+physical blocks, but @command{tar} ignore these differences in its own
+format, which is meant to be portable, so a @command{tar} block is always
+512 bytes in length, and @dfn{block} always mean a @command{tar} block.
+The term @dfn{logical block} often represents the basic chunk of
+allocation of many disk blocks as a single entity, which the operating
+system treats somewhat atomically; this concept is only barely used
+in @GNUTAR{}.
+
+The term @dfn{physical record} is another way to speak of a physical
+block, those two terms are somewhat interchangeable. In this manual,
+the term @dfn{record} usually refers to a tape physical block,
+@emph{assuming} that the @command{tar} archive is kept on magnetic tape.
+It is true that archives may be put on disk or used with pipes,
+but nevertheless, @command{tar} tries to read and write the archive one
+@dfn{record} at a time, whatever the medium in use. One record is made
+up of an integral number of blocks, and this operation of putting many
+disk blocks into a single tape block is called @dfn{reblocking}, or
+more simply, @dfn{blocking}. The term @dfn{logical record} refers to
+the logical organization of many characters into something meaningful
+to the application. The term @dfn{unit record} describes a small set
+of characters which are transmitted whole to or by the application,
+and often refers to a line of text. Those two last terms are unrelated
+to what we call a @dfn{record} in @GNUTAR{}.
+
+When writing to tapes, @command{tar} writes the contents of the archive
+in chunks known as @dfn{records}. To change the default blocking
+factor, use the @option{--blocking-factor=@var{512-size}} (@option{-b
+@var{512-size}}) option. Each record will then be composed of
+@var{512-size} blocks. (Each @command{tar} block is 512 bytes.
+@xref{Standard}.) Each file written to the archive uses at least one
+full record. As a result, using a larger record size can result in
+more wasted space for small files. On the other hand, a larger record
+size can often be read and written much more efficiently.
+
+Further complicating the problem is that some tape drives ignore the
+blocking entirely. For these, a larger record size can still improve
+performance (because the software layers above the tape drive still
+honor the blocking), but not as dramatically as on tape drives that
+honor blocking.
+
+When reading an archive, @command{tar} can usually figure out the
+record size on itself. When this is the case, and a non-standard
+record size was used when the archive was created, @command{tar} will
+print a message about a non-standard blocking factor, and then operate
+normally. On some tape devices, however, @command{tar} cannot figure
+out the record size itself. On most of those, you can specify a
+blocking factor (with @option{--blocking-factor}) larger than the
+actual blocking factor, and then use the @option{--read-full-records}
+(@option{-B}) option. (If you specify a blocking factor with
+@option{--blocking-factor} and don't use the
+@option{--read-full-records} option, then @command{tar} will not
+attempt to figure out the recording size itself.) On some devices,
+you must always specify the record size exactly with
+@option{--blocking-factor} when reading, because @command{tar} cannot
+figure it out. In any case, use @option{--list} (@option{-t}) before
+doing any extractions to see whether @command{tar} is reading the archive
+correctly.
+
+@command{tar} blocks are all fixed size (512 bytes), and its scheme for
+putting them into records is to put a whole number of them (one or
+more) into each record. @command{tar} records are all the same size;
+at the end of the file there's a block containing all zeros, which
+is how you tell that the remainder of the last record(s) are garbage.
+
+In a standard @command{tar} file (no options), the block size is 512
+and the record size is 10240, for a blocking factor of 20. What the
+@option{--blocking-factor} option does is sets the blocking factor,
+changing the record size while leaving the block size at 512 bytes.
+20 was fine for ancient 800 or 1600 bpi reel-to-reel tape drives;
+most tape drives these days prefer much bigger records in order to
+stream and not waste tape. When writing tapes for myself, some tend
+to use a factor of the order of 2048, say, giving a record size of
+around one megabyte.
+
+If you use a blocking factor larger than 20, older @command{tar}
+programs might not be able to read the archive, so we recommend this
+as a limit to use in practice. @GNUTAR{}, however,
+will support arbitrarily large record sizes, limited only by the
+amount of virtual memory or the physical characteristics of the tape
+device.
+
+@menu
+* Format Variations:: Format Variations
+* Blocking Factor:: The Blocking Factor of an Archive
+@end menu
+
+@node Format Variations
+@subsection Format Variations
+@cindex Format Parameters
+@cindex Format Options
+@cindex Options, archive format specifying
+@cindex Options, format specifying
+@UNREVISED
+
+Format parameters specify how an archive is written on the archive
+media. The best choice of format parameters will vary depending on
+the type and number of files being archived, and on the media used to
+store the archive.
+
+To specify format parameters when accessing or creating an archive,
+you can use the options described in the following sections.
+If you do not specify any format parameters, @command{tar} uses
+default parameters. You cannot modify a compressed archive.
+If you create an archive with the @option{--blocking-factor} option
+specified (@pxref{Blocking Factor}), you must specify that
+blocking-factor when operating on the archive. @xref{Formats}, for other
+examples of format parameter considerations.
+
+@node Blocking Factor
+@subsection The Blocking Factor of an Archive
+@cindex Blocking Factor
+@cindex Record Size
+@cindex Number of blocks per record
+@cindex Number of bytes per record
+@cindex Bytes per record
+@cindex Blocks per record
+@UNREVISED
+
+@opindex blocking-factor
+The data in an archive is grouped into blocks, which are 512 bytes.
+Blocks are read and written in whole number multiples called
+@dfn{records}. The number of blocks in a record (i.e., the size of a
+record in units of 512 bytes) is called the @dfn{blocking factor}.
+The @option{--blocking-factor=@var{512-size}} (@option{-b
+@var{512-size}}) option specifies the blocking factor of an archive.
+The default blocking factor is typically 20 (i.e., 10240 bytes), but
+can be specified at installation. To find out the blocking factor of
+an existing archive, use @samp{tar --list --file=@var{archive-name}}.
+This may not work on some devices.
+
+Records are separated by gaps, which waste space on the archive media.
+If you are archiving on magnetic tape, using a larger blocking factor
+(and therefore larger records) provides faster throughput and allows you
+to fit more data on a tape (because there are fewer gaps). If you are
+archiving on cartridge, a very large blocking factor (say 126 or more)
+greatly increases performance. A smaller blocking factor, on the other
+hand, may be useful when archiving small files, to avoid archiving lots
+of nulls as @command{tar} fills out the archive to the end of the record.
+In general, the ideal record size depends on the size of the
+inter-record gaps on the tape you are using, and the average size of the
+files you are archiving. @xref{create}, for information on
+writing archives.
+
+@FIXME{Need example of using a cartridge with blocking factor=126 or more.}
+
+Archives with blocking factors larger than 20 cannot be read
+by very old versions of @command{tar}, or by some newer versions
+of @command{tar} running on old machines with small address spaces.
+With @GNUTAR{}, the blocking factor of an archive is limited
+only by the maximum record size of the device containing the archive,
+or by the amount of available virtual memory.
+
+Also, on some systems, not using adequate blocking factors, as sometimes
+imposed by the device drivers, may yield unexpected diagnostics. For
+example, this has been reported:
+
+@smallexample
+Cannot write to /dev/dlt: Invalid argument
+@end smallexample
+
+@noindent
+In such cases, it sometimes happen that the @command{tar} bundled by
+the system is aware of block size idiosyncrasies, while @GNUTAR{}
+requires an explicit specification for the block size,
+which it cannot guess. This yields some people to consider
+@GNUTAR{} is misbehaving, because by comparison,
+@cite{the bundle @command{tar} works OK}. Adding @w{@kbd{-b 256}},
+for example, might resolve the problem.
+
+If you use a non-default blocking factor when you create an archive, you
+must specify the same blocking factor when you modify that archive. Some
+archive devices will also require you to specify the blocking factor when
+reading that archive, however this is not typically the case. Usually, you
+can use @option{--list} (@option{-t}) without specifying a blocking factor---@command{tar}
+reports a non-default record size and then lists the archive members as
+it would normally. To extract files from an archive with a non-standard
+blocking factor (particularly if you're not sure what the blocking factor
+is), you can usually use the @option{--read-full-records} (@option{-B}) option while
+specifying a blocking factor larger then the blocking factor of the archive
+(i.e., @samp{tar --extract --read-full-records --blocking-factor=300}.
+@xref{list}, for more information on the @option{--list} (@option{-t})
+operation. @xref{Reading}, for a more detailed explanation of that option.
+
+@table @option
+@item --blocking-factor=@var{number}
+@itemx -b @var{number}
+Specifies the blocking factor of an archive. Can be used with any
+operation, but is usually not necessary with @option{--list} (@option{-t}).
+@end table
+
+Device blocking
+
+@table @option
+@item -b @var{blocks}
+@itemx --blocking-factor=@var{blocks}
+Set record size to @math{@var{blocks} * 512} bytes.
+
+This option is used to specify a @dfn{blocking factor} for the archive.
+When reading or writing the archive, @command{tar}, will do reads and writes
+of the archive in records of @math{@var{block}*512} bytes. This is true
+even when the archive is compressed. Some devices requires that all
+write operations be a multiple of a certain size, and so, @command{tar}
+pads the archive out to the next record boundary.
+
+The default blocking factor is set when @command{tar} is compiled, and is
+typically 20. Blocking factors larger than 20 cannot be read by very
+old versions of @command{tar}, or by some newer versions of @command{tar}
+running on old machines with small address spaces.
+
+With a magnetic tape, larger records give faster throughput and fit
+more data on a tape (because there are fewer inter-record gaps).
+If the archive is in a disk file or a pipe, you may want to specify
+a smaller blocking factor, since a large one will result in a large
+number of null bytes at the end of the archive.
+
+When writing cartridge or other streaming tapes, a much larger
+blocking factor (say 126 or more) will greatly increase performance.
+However, you must specify the same blocking factor when reading or
+updating the archive.
+
+Apparently, Exabyte drives have a physical block size of 8K bytes.
+If we choose our blocksize as a multiple of 8k bytes, then the problem
+seems to disappear. Id est, we are using block size of 112 right
+now, and we haven't had the problem since we switched@dots{}
+
+With @GNUTAR{} the blocking factor is limited only
+by the maximum record size of the device containing the archive, or by
+the amount of available virtual memory.
+
+However, deblocking or reblocking is virtually avoided in a special
+case which often occurs in practice, but which requires all the
+following conditions to be simultaneously true:
+@itemize @bullet
+@item
+the archive is subject to a compression option,
+@item
+the archive is not handled through standard input or output, nor
+redirected nor piped,
+@item
+the archive is directly handled to a local disk, instead of any special
+device,
+@item
+@option{--blocking-factor} is not explicitly specified on the @command{tar}
+invocation.
+@end itemize
+
+If the output goes directly to a local disk, and not through
+stdout, then the last write is not extended to a full record size.
+Otherwise, reblocking occurs. Here are a few other remarks on this
+topic:
+
+@itemize @bullet
+
+@item
+@command{gzip} will complain about trailing garbage if asked to
+uncompress a compressed archive on tape, there is an option to turn
+the message off, but it breaks the regularity of simply having to use
+@samp{@var{prog} -d} for decompression. It would be nice if gzip was
+silently ignoring any number of trailing zeros. I'll ask Jean-loup
+Gailly, by sending a copy of this message to him.
+
+@item
+@command{compress} does not show this problem, but as Jean-loup pointed
+out to Michael, @samp{compress -d} silently adds garbage after
+the result of decompression, which tar ignores because it already
+recognized its end-of-file indicator. So this bug may be safely
+ignored.
+
+@item
+@samp{gzip -d -q} will be silent about the trailing zeros indeed,
+but will still return an exit status of 2 which tar reports in turn.
+@command{tar} might ignore the exit status returned, but I hate doing
+that, as it weakens the protection @command{tar} offers users against
+other possible problems at decompression time. If @command{gzip} was
+silently skipping trailing zeros @emph{and} also avoiding setting the
+exit status in this innocuous case, that would solve this situation.
+
+@item
+@command{tar} should become more solid at not stopping to read a pipe at
+the first null block encountered. This inelegantly breaks the pipe.
+@command{tar} should rather drain the pipe out before exiting itself.
+@end itemize
+
+@xopindex{ignore-zeros, short description}
+@item -i
+@itemx --ignore-zeros
+Ignore blocks of zeros in archive (means EOF).
+
+The @option{--ignore-zeros} (@option{-i}) option causes @command{tar} to ignore blocks
+of zeros in the archive. Normally a block of zeros indicates the
+end of the archive, but when reading a damaged archive, or one which
+was created by concatenating several archives together, this option
+allows @command{tar} to read the entire archive. This option is not on
+by default because many versions of @command{tar} write garbage after
+the zeroed blocks.
+
+Note that this option causes @command{tar} to read to the end of the
+archive file, which may sometimes avoid problems when multiple files
+are stored on a single physical tape.
+
+@xopindex{read-full-records, short description}
+@item -B
+@itemx --read-full-records
+Reblock as we read (for reading 4.2@acronym{BSD} pipes).
+
+If @option{--read-full-records} is used, @command{tar}
+will not panic if an attempt to read a record from the archive does
+not return a full record. Instead, @command{tar} will keep reading
+until it has obtained a full
+record.
+
+This option is turned on by default when @command{tar} is reading
+an archive from standard input, or from a remote machine. This is
+because on @acronym{BSD} Unix systems, a read of a pipe will return however
+much happens to be in the pipe, even if it is less than @command{tar}
+requested. If this option was not used, @command{tar} would fail as
+soon as it read an incomplete record from the pipe.
+
+This option is also useful with the commands for updating an archive.
+
+@end table
+
+Tape blocking
+
+@FIXME{Appropriate options should be moved here from elsewhere.}
+
+@cindex blocking factor
+@cindex tape blocking
+
+When handling various tapes or cartridges, you have to take care of
+selecting a proper blocking, that is, the number of disk blocks you
+put together as a single tape block on the tape, without intervening
+tape gaps. A @dfn{tape gap} is a small landing area on the tape
+with no information on it, used for decelerating the tape to a
+full stop, and for later regaining the reading or writing speed.
+When the tape driver starts reading a record, the record has to
+be read whole without stopping, as a tape gap is needed to stop the
+tape motion without loosing information.
+
+@cindex Exabyte blocking
+@cindex DAT blocking
+Using higher blocking (putting more disk blocks per tape block) will use
+the tape more efficiently as there will be less tape gaps. But reading
+such tapes may be more difficult for the system, as more memory will be
+required to receive at once the whole record. Further, if there is a
+reading error on a huge record, this is less likely that the system will
+succeed in recovering the information. So, blocking should not be too
+low, nor it should be too high. @command{tar} uses by default a blocking of
+20 for historical reasons, and it does not really matter when reading or
+writing to disk. Current tape technology would easily accommodate higher
+blockings. Sun recommends a blocking of 126 for Exabytes and 96 for DATs.
+We were told that for some DLT drives, the blocking should be a multiple
+of 4Kb, preferably 64Kb (@w{@kbd{-b 128}}) or 256 for decent performance.
+Other manufacturers may use different recommendations for the same tapes.
+This might also depends of the buffering techniques used inside modern
+tape controllers. Some imposes a minimum blocking, or a maximum blocking.
+Others request blocking to be some exponent of two.
+
+So, there is no fixed rule for blocking. But blocking at read time
+should ideally be the same as blocking used at write time. At one place
+I know, with a wide variety of equipment, they found it best to use a
+blocking of 32 to guarantee that their tapes are fully interchangeable.
+
+I was also told that, for recycled tapes, prior erasure (by the same
+drive unit that will be used to create the archives) sometimes lowers
+the error rates observed at rewriting time.
+
+I might also use @option{--number-blocks} instead of
+@option{--block-number}, so @option{--block} will then expand to
+@option{--blocking-factor} unambiguously.
+
+@node Many
+@section Many Archives on One Tape
+
+@FIXME{Appropriate options should be moved here from elsewhere.}
+
+@findex ntape @r{device}
+Most tape devices have two entries in the @file{/dev} directory, or
+entries that come in pairs, which differ only in the minor number for
+this device. Let's take for example @file{/dev/tape}, which often
+points to the only or usual tape device of a given system. There might
+be a corresponding @file{/dev/nrtape} or @file{/dev/ntape}. The simpler
+name is the @emph{rewinding} version of the device, while the name
+having @samp{nr} in it is the @emph{no rewinding} version of the same
+device.
+
+A rewinding tape device will bring back the tape to its beginning point
+automatically when this device is opened or closed. Since @command{tar}
+opens the archive file before using it and closes it afterwards, this
+means that a simple:
+
+@smallexample
+$ @kbd{tar cf /dev/tape @var{directory}}
+@end smallexample
+
+@noindent
+will reposition the tape to its beginning both prior and after saving
+@var{directory} contents to it, thus erasing prior tape contents and
+making it so that any subsequent write operation will destroy what has
+just been saved.
+
+@cindex tape positioning
+So, a rewinding device is normally meant to hold one and only one file.
+If you want to put more than one @command{tar} archive on a given tape, you
+will need to avoid using the rewinding version of the tape device. You
+will also have to pay special attention to tape positioning. Errors in
+positioning may overwrite the valuable data already on your tape. Many
+people, burnt by past experiences, will only use rewinding devices and
+limit themselves to one file per tape, precisely to avoid the risk of
+such errors. Be fully aware that writing at the wrong position on a
+tape loses all information past this point and most probably until the
+end of the tape, and this destroyed information @emph{cannot} be
+recovered.
+
+To save @var{directory-1} as a first archive at the beginning of a
+tape, and leave that tape ready for a second archive, you should use:
+
+@smallexample
+$ @kbd{mt -f /dev/nrtape rewind}
+$ @kbd{tar cf /dev/nrtape @var{directory-1}}
+@end smallexample
+
+@cindex tape marks
+@dfn{Tape marks} are special magnetic patterns written on the tape
+media, which are later recognizable by the reading hardware. These
+marks are used after each file, when there are many on a single tape.
+An empty file (that is to say, two tape marks in a row) signal the
+logical end of the tape, after which no file exist. Usually,
+non-rewinding tape device drivers will react to the close request issued
+by @command{tar} by first writing two tape marks after your archive, and by
+backspacing over one of these. So, if you remove the tape at that time
+from the tape drive, it is properly terminated. But if you write
+another file at the current position, the second tape mark will be
+erased by the new information, leaving only one tape mark between files.
+
+So, you may now save @var{directory-2} as a second archive after the
+first on the same tape by issuing the command:
+
+@smallexample
+$ @kbd{tar cf /dev/nrtape @var{directory-2}}
+@end smallexample
+
+@noindent
+and so on for all the archives you want to put on the same tape.
+
+Another usual case is that you do not write all the archives the same
+day, and you need to remove and store the tape between two archive
+sessions. In general, you must remember how many files are already
+saved on your tape. Suppose your tape already has 16 files on it, and
+that you are ready to write the 17th. You have to take care of skipping
+the first 16 tape marks before saving @var{directory-17}, say, by using
+these commands:
+
+@smallexample
+$ @kbd{mt -f /dev/nrtape rewind}
+$ @kbd{mt -f /dev/nrtape fsf 16}
+$ @kbd{tar cf /dev/nrtape @var{directory-17}}
+@end smallexample
+
+In all the previous examples, we put aside blocking considerations, but
+you should do the proper things for that as well. @xref{Blocking}.
+
+@menu
+* Tape Positioning:: Tape Positions and Tape Marks
+* mt:: The @command{mt} Utility
+@end menu
+
+@node Tape Positioning
+@subsection Tape Positions and Tape Marks
+@UNREVISED
+
+Just as archives can store more than one file from the file system,
+tapes can store more than one archive file. To keep track of where
+archive files (or any other type of file stored on tape) begin and
+end, tape archive devices write magnetic @dfn{tape marks} on the
+archive media. Tape drives write one tape mark between files,
+two at the end of all the file entries.
+
+If you think of data as a series of records "rrrr"'s, and tape marks as
+"*"'s, a tape might look like the following:
+
+@smallexample
+rrrr*rrrrrr*rrrrr*rr*rrrrr**-------------------------
+@end smallexample
+
+Tape devices read and write tapes using a read/write @dfn{tape
+head}---a physical part of the device which can only access one
+point on the tape at a time. When you use @command{tar} to read or
+write archive data from a tape device, the device will begin reading
+or writing from wherever on the tape the tape head happens to be,
+regardless of which archive or what part of the archive the tape
+head is on. Before writing an archive, you should make sure that no
+data on the tape will be overwritten (unless it is no longer needed).
+Before reading an archive, you should make sure the tape head is at
+the beginning of the archive you want to read. You can do it manually
+via @code{mt} utility (@pxref{mt}). The @code{restore} script does
+that automatically (@pxref{Scripted Restoration}).
+
+If you want to add new archive file entries to a tape, you should
+advance the tape to the end of the existing file entries, backspace
+over the last tape mark, and write the new archive file. If you were
+to add two archives to the example above, the tape might look like the
+following:
+
+@smallexample
+rrrr*rrrrrr*rrrrr*rr*rrrrr*rrr*rrrr**----------------
+@end smallexample
+
+@node mt
+@subsection The @command{mt} Utility
+@UNREVISED
+
+@FIXME{Is it true that this only works on non-block devices?
+should explain the difference, (fixed or variable).}
+@xref{Blocking Factor}.
+
+You can use the @command{mt} utility to advance or rewind a tape past a
+specified number of archive files on the tape. This will allow you
+to move to the beginning of an archive before extracting or reading
+it, or to the end of all the archives before writing a new one.
+@FIXME{Why isn't there an "advance 'til you find two tape marks
+together"?}
+
+The syntax of the @command{mt} command is:
+
+@smallexample
+@kbd{mt [-f @var{tapename}] @var{operation} [@var{number}]}
+@end smallexample
+
+where @var{tapename} is the name of the tape device, @var{number} is
+the number of times an operation is performed (with a default of one),
+and @var{operation} is one of the following:
+
+@FIXME{is there any use for record operations?}
+
+@table @option
+@item eof
+@itemx weof
+Writes @var{number} tape marks at the current position on the tape.
+
+@item fsf
+Moves tape position forward @var{number} files.
+
+@item bsf
+Moves tape position back @var{number} files.
+
+@item rewind
+Rewinds the tape. (Ignores @var{number}).
+
+@item offline
+@itemx rewoff1
+Rewinds the tape and takes the tape device off-line. (Ignores @var{number}).
+
+@item status
+Prints status information about the tape unit.
+
+@end table
+
+@FIXME{Is there a better way to frob the spacing on the list?}
+
+If you don't specify a @var{tapename}, @command{mt} uses the environment
+variable @env{TAPE}; if @env{TAPE} is not set, @command{mt} will use
+the default device specified in your @file{sys/mtio.h} file
+(@code{DEFTAPE} variable). If this is not defined, the program will
+display a descriptive error message and exit with code 1.
+
+@command{mt} returns a 0 exit status when the operation(s) were
+successful, 1 if the command was unrecognized, and 2 if an operation
+failed.
+
+@node Using Multiple Tapes
+@section Using Multiple Tapes
+
+Often you might want to write a large archive, one larger than will fit
+on the actual tape you are using. In such a case, you can run multiple
+@command{tar} commands, but this can be inconvenient, particularly if you
+are using options like @option{--exclude=@var{pattern}} or dumping entire file systems.
+Therefore, @command{tar} provides a special mode for creating
+multi-volume archives.
+
+@dfn{Multi-volume} archive is a single @command{tar} archive, stored
+on several media volumes of fixed size. Although in this section we will
+often call @samp{volume} a @dfn{tape}, there is absolutely no
+requirement for multi-volume archives to be stored on tapes. Instead,
+they can use whatever media type the user finds convenient, they can
+even be located on files.
+
+When creating a multi-volume archive, @GNUTAR{} continues to fill
+current volume until it runs out of space, then it switches to
+next volume (usually the operator is queried to replace the tape on
+this point), and continues working on the new volume. This operation
+continues until all requested files are dumped. If @GNUTAR{} detects
+end of media while dumping a file, such a file is archived in split
+form. Some very big files can even be split across several volumes.
+
+Each volume is itself a valid @GNUTAR{} archive, so it can be read
+without any special options. Consequently any file member residing
+entirely on one volume can be extracted or otherwise operated upon
+without needing the other volume. Sure enough, to extract a split
+member you would need all volumes its parts reside on.
+
+Multi-volume archives suffer from several limitations. In particular,
+they cannot be compressed.
+
+@GNUTAR{} is able to create multi-volume archives of two formats
+(@pxref{Formats}): @samp{GNU} and @samp{POSIX}.
+
+@menu
+* Multi-Volume Archives:: Archives Longer than One Tape or Disk
+* Tape Files:: Tape Files
+* Tarcat:: Concatenate Volumes into a Single Archive
+
+@end menu
+
+@node Multi-Volume Archives
+@subsection Archives Longer than One Tape or Disk
+@cindex Multi-volume archives
+
+@opindex multi-volume
+To create an archive that is larger than will fit on a single unit of
+the media, use the @option{--multi-volume} (@option{-M}) option in conjunction with
+the @option{--create} option (@pxref{create}). A @dfn{multi-volume}
+archive can be manipulated like any other archive (provided the
+@option{--multi-volume} option is specified), but is stored on more
+than one tape or disk.
+
+When you specify @option{--multi-volume}, @command{tar} does not report an
+error when it comes to the end of an archive volume (when reading), or
+the end of the media (when writing). Instead, it prompts you to load
+a new storage volume. If the archive is on a magnetic tape, you
+should change tapes when you see the prompt; if the archive is on a
+floppy disk, you should change disks; etc.
+
+@table @option
+@item --multi-volume
+@itemx -M
+Creates a multi-volume archive, when used in conjunction with
+@option{--create} (@option{-c}). To perform any other operation on a multi-volume
+archive, specify @option{--multi-volume} in conjunction with that
+operation.
+For example:
+
+@smallexample
+$ @kbd{tar --create --multi-volume --file=/dev/tape @var{files}}
+@end smallexample
+@end table
+
+The method @command{tar} uses to detect end of tape is not perfect, and
+fails on some operating systems or on some devices. If @command{tar}
+cannot detect the end of the tape itself, you can use
+@option{--tape-length} option to inform it about the capacity of the
+tape:
+
+@anchor{tape-length}
+@table @option
+@opindex tape-length
+@item --tape-length=@var{size}
+@itemx -L @var{size}
+Set maximum length of a volume. The @var{size} argument should then
+be the usable size of the tape in units of 1024 bytes. This option
+selects @option{--multi-volume} automatically. For example:
+
+@smallexample
+$ @kbd{tar --create --tape-length=41943040 --file=/dev/tape @var{files}}
+@end smallexample
+@end table
+
+@anchor{change volume prompt}
+When @GNUTAR{} comes to the end of a storage media, it asks you to
+change the volume. The built-in prompt for POSIX locale
+is@footnote{If you run @GNUTAR{} under a different locale, the
+translation to the locale's language will be used.}:
+
+@smallexample
+Prepare volume #@var{n} for `@var{archive}' and hit return:
+@end smallexample
+
+@noindent
+where @var{n} is the ordinal number of the volume to be created and
+@var{archive} is archive file or device name.
+
+When prompting for a new tape, @command{tar} accepts any of the following
+responses:
+
+@table @kbd
+@item ?
+Request @command{tar} to explain possible responses
+@item q
+Request @command{tar} to exit immediately.
+@item n @var{file-name}
+Request @command{tar} to write the next volume on the file @var{file-name}.
+@item !
+Request @command{tar} to run a subshell. This option can be disabled
+by giving @option{--restrict} command line option to
+@command{tar}@footnote{@xref{--restrict}, for more information about
+this option}.
+@item y
+Request @command{tar} to begin writing the next volume.
+@end table
+
+(You should only type @samp{y} after you have changed the tape;
+otherwise @command{tar} will write over the volume it just finished.)
+
+@cindex Volume number file
+@cindex volno file
+@anchor{volno-file}
+@opindex volno-file
+The volume number used by @command{tar} in its tape-changing prompt
+can be changed; if you give the
+@option{--volno-file=@var{file-of-number}} option, then
+@var{file-of-number} should be an non-existing file to be created, or
+else, a file already containing a decimal number. That number will be
+used as the volume number of the first volume written. When
+@command{tar} is finished, it will rewrite the file with the
+now-current volume number. (This does not change the volume number
+written on a tape label, as per @ref{label}, it @emph{only} affects
+the number used in the prompt.)
+
+@cindex End-of-archive info script
+@cindex Info script
+@anchor{info-script}
+@opindex info-script
+@opindex new-volume-script
+If you want more elaborate behavior than this, you can write a special
+@dfn{new volume script}, that will be responsible for changing the
+volume, and instruct @command{tar} to use it instead of its normal
+prompting procedure:
+
+@table @option
+@item --info-script=@var{script-name}
+@itemx --new-volume-script=@var{script-name}
+@itemx -F @var{script-name}
+Specify the full name of the volume script to use. The script can be
+used to eject cassettes, or to broadcast messages such as
+@samp{Someone please come change my tape} when performing unattended
+backups.
+@end table
+
+The @var{script-name} is executed without any command line
+arguments. It inherits @command{tar}'s shell environment.
+Additional data is passed to it via the following
+environment variables:
+
+@table @env
+@vrindex TAR_VERSION, info script environment variable
+@item TAR_VERSION
+@GNUTAR{} version number.
+
+@vrindex TAR_ARCHIVE, info script environment variable
+@item TAR_ARCHIVE
+The name of the archive @command{tar} is processing.
+
+@vrindex TAR_VOLUME, info script environment variable
+@item TAR_VOLUME
+Ordinal number of the volume @command{tar} is about to start.
+
+@vrindex TAR_SUBCOMMAND, info script environment variable
+@item TAR_SUBCOMMAND
+Short option describing the operation @command{tar} is executing
+@xref{Operations}, for a complete list of subcommand options.
+
+@vrindex TAR_FORMAT, info script environment variable
+@item TAR_FORMAT
+Format of the archive being processed. @xref{Formats}, for a complete
+list of archive format names.
+
+@vrindex TAR_FD, info script environment variable
+@item TAR_FD
+File descriptor which can be used to communicate the new volume
+name to @command{tar}.
+@end table
+
+The volume script can instruct @command{tar} to use new archive name,
+by writing in to file descriptor @env{$TAR_FD} (see below for an example).
+
+If the info script fails, @command{tar} exits; otherwise, it begins
+writing the next volume.
+
+If you want @command{tar} to cycle through a series of files or tape
+drives, there are three approaches to choose from. First of all, you
+can give @command{tar} multiple @option{--file} options. In this case
+the specified files will be used, in sequence, as the successive
+volumes of the archive. Only when the first one in the sequence needs
+to be used again will @command{tar} prompt for a tape change (or run
+the info script). For example, suppose someone has two tape drives on
+a system named @file{/dev/tape0} and @file{/dev/tape1}. For having
+@GNUTAR{} to switch to the second drive when it needs to write the
+second tape, and then back to the first tape, etc., just do either of:
+
+@smallexample
+$ @kbd{tar --create --multi-volume --file=/dev/tape0 --file=/dev/tape1 @var{files}}
+$ @kbd{tar cMff /dev/tape0 /dev/tape1 @var{files}}
+@end smallexample
+
+The second method is to use the @samp{n} response to the tape-change
+prompt.
+
+Finally, the most flexible approach is to use a volume script, that
+writes new archive name to the file descriptor @env{$TAR_FD}. For example, the
+following volume script will create a series of archive files, named
+@file{@var{archive}-@var{vol}}, where @var{archive} is the name of the
+archive being created (as given by @option{--file} option) and
+@var{vol} is the ordinal number of the archive being created:
+
+@smallexample
+@group
+#! /bin/sh
+echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.
+
+name=`expr $TAR_ARCHIVE : '\(.*\)-.*'`
+case $TAR_SUBCOMMAND in
+-c) ;;
+-d|-x|-t) test -r $@{name:-$TAR_ARCHIVE@}-$TAR_VOLUME || exit 1
+ ;;
+*) exit 1
+esac
+
+echo $@{name:-$TAR_ARCHIVE@}-$TAR_VOLUME >&$TAR_FD
+@end group
+@end smallexample
+
+The same script cant be used while listing, comparing or extracting
+from the created archive. For example:
+
+@smallexample
+@group
+# @r{Create a multi-volume archive:}
+$ @kbd{tar -c -L1024 -f archive.tar -F new-volume .}
+# @r{Extract from the created archive:}
+$ @kbd{tar -x -f archive.tar -F new-volume .}
+@end group
+@end smallexample
+
+@noindent
+Notice, that the first command had to use @option{-L} option, since
+otherwise @GNUTAR{} will end up writing everything to file
+@file{archive.tar}.
+
+You can read each individual volume of a multi-volume archive as if it
+were an archive by itself. For example, to list the contents of one
+volume, use @option{--list}, without @option{--multi-volume} specified.
+To extract an archive member from one volume (assuming it is described
+that volume), use @option{--extract}, again without
+@option{--multi-volume}.
+
+If an archive member is split across volumes (i.e., its entry begins on
+one volume of the media and ends on another), you need to specify
+@option{--multi-volume} to extract it successfully. In this case, you
+should load the volume where the archive member starts, and use
+@samp{tar --extract --multi-volume}---@command{tar} will prompt for later
+volumes as it needs them. @xref{extracting archives}, for more
+information about extracting archives.
+
+Multi-volume archives can be modified like any other archive. To add
+files to a multi-volume archive, you need to only mount the last
+volume of the archive media (and new volumes, if needed). For all
+other operations, you need to use the entire archive.
+
+If a multi-volume archive was labeled using
+@option{--label=@var{archive-label}} (@pxref{label}) when it was
+created, @command{tar} will not automatically label volumes which are
+added later. To label subsequent volumes, specify
+@option{--label=@var{archive-label}} again in conjunction with the
+@option{--append}, @option{--update} or @option{--concatenate} operation.
+
+Notice that multi-volume support is a GNU extension and the archives
+created in this mode should be read only using @GNUTAR{}. If you
+absolutely have to process such archives using a third-party @command{tar}
+implementation, read @ref{Split Recovery}.
+
+@node Tape Files
+@subsection Tape Files
+@UNREVISED
+
+To give the archive a name which will be recorded in it, use the
+@option{--label=@var{volume-label}} (@option{-V @var{volume-label}})
+option. This will write a special block identifying
+@var{volume-label} as the name of the archive to the front of the
+archive which will be displayed when the archive is listed with
+@option{--list}. If you are creating a multi-volume archive with
+@option{--multi-volume} (@pxref{Using Multiple Tapes}), then the
+volume label will have @samp{Volume @var{nnn}} appended to the name
+you give, where @var{nnn} is the number of the volume of the archive.
+(If you use the @option{--label=@var{volume-label}}) option when
+reading an archive, it checks to make sure the label on the tape
+matches the one you give. @xref{label}.
+
+When @command{tar} writes an archive to tape, it creates a single
+tape file. If multiple archives are written to the same tape, one
+after the other, they each get written as separate tape files. When
+extracting, it is necessary to position the tape at the right place
+before running @command{tar}. To do this, use the @command{mt} command.
+For more information on the @command{mt} command and on the organization
+of tapes into a sequence of tape files, see @ref{mt}.
+
+People seem to often do:
+
+@smallexample
+@kbd{--label="@var{some-prefix} `date +@var{some-format}`"}
+@end smallexample
+
+or such, for pushing a common date in all volumes or an archive set.
+
+@node Tarcat
+@subsection Concatenate Volumes into a Single Archive
+
+@pindex tarcat
+ Sometimes it is necessary to convert existing @GNUTAR{} multi-volume
+archive to a single @command{tar} archive. Simply concatenating all
+volumes into one will not work, since each volume carries an additional
+information at the beginning. @GNUTAR{} is shipped with the shell
+script @command{tarcat} designed for this purpose.
+
+ The script takes a list of files comprising a multi-volume archive
+and creates the resulting archive at the standard output. For example:
+
+@smallexample
+@kbd{tarcat vol.1 vol.2 vol.3 | tar tf -}
+@end smallexample
+
+ The script implements a simple heuristics to determine the format of
+the first volume file and to decide how to process the rest of the
+files. However, it makes no attempt to verify whether the files are
+given in order or even if they are valid @command{tar} archives.
+It uses @command{dd} and does not filter its standard error, so you
+will usually see lots of spurious messages.
+
+@FIXME{The script is not installed. Should we install it?}
+
+@node label
+@section Including a Label in the Archive
+@cindex Labeling an archive
+@cindex Labels on the archive media
+@cindex Labeling multi-volume archives
+@UNREVISED
+
+@opindex label
+ To avoid problems caused by misplaced paper labels on the archive
+media, you can include a @dfn{label} entry---an archive member which
+contains the name of the archive---in the archive itself. Use the
+@option{--label=@var{archive-label}} (@option{-V @var{archive-label}})
+option in conjunction with the @option{--create} operation to include
+a label entry in the archive as it is being created.
+
+@table @option
+@item --label=@var{archive-label}
+@itemx -V @var{archive-label}
+Includes an @dfn{archive-label} at the beginning of the archive when
+the archive is being created, when used in conjunction with the
+@option{--create} operation. Checks to make sure the archive label
+matches the one specified (when used in conjunction with any other
+operation.
+@end table
+
+ If you create an archive using both
+@option{--label=@var{archive-label}} (@option{-V @var{archive-label}})
+and @option{--multi-volume} (@option{-M}), each volume of the archive
+will have an archive label of the form @samp{@var{archive-label}
+Volume @var{n}}, where @var{n} is 1 for the first volume, 2 for the
+next, and so on. @xref{Using Multiple Tapes}, for information on
+creating multiple volume archives.
+
+@cindex Volume label, listing
+@cindex Listing volume label
+ The volume label will be displayed by @option{--list} along with
+the file contents. If verbose display is requested, it will also be
+explicitly marked as in the example below:
+
+@smallexample
+@group
+$ @kbd{tar --verbose --list --file=iamanarchive}
+V--------- 0 0 0 1992-03-07 12:01 iamalabel--Volume Header--
+-rw-r--r-- ringo user 40 1990-05-21 13:30 iamafilename
+@end group
+@end smallexample
+
+@opindex test-label
+@anchor{--test-label option}
+ However, @option{--list} option will cause listing entire
+contents of the archive, which may be undesirable (for example, if the
+archive is stored on a tape). You can request checking only the volume
+by specifying @option{--test-label} option. This option reads only the
+first block of an archive, so it can be used with slow storage
+devices. For example:
+
+@smallexample
+@group
+$ @kbd{tar --test-label --file=iamanarchive}
+iamalabel
+@end group
+@end smallexample
+
+ If @option{--test-label} is used with a single command line
+argument, @command{tar} compares the volume label with the
+argument. It exits with code 0 if the two strings match, and with code
+2 otherwise. In this case no output is displayed. For example:
+
+@smallexample
+@group
+$ @kbd{tar --test-label --file=iamanarchive 'iamalable'}
+@result{} 0
+$ @kbd{tar --test-label --file=iamanarchive 'iamalable' alabel}
+@result{} 1
+@end group
+@end smallexample
+
+ If you request any operation, other than @option{--create}, along
+with using @option{--label} option, @command{tar} will first check if
+the archive label matches the one specified and will refuse to proceed
+if it does not. Use this as a safety precaution to avoid accidentally
+overwriting existing archives. For example, if you wish to add files
+to @file{archive}, presumably labeled with string @samp{My volume},
+you will get:
+
+@smallexample
+@group
+$ @kbd{tar -rf archive --label 'My volume' .}
+tar: Archive not labeled to match `My volume'
+@end group
+@end smallexample
+
+@noindent
+in case its label does not match. This will work even if
+@file{archive} is not labeled at all.
+
+ Similarly, @command{tar} will refuse to list or extract the
+archive if its label doesn't match the @var{archive-label}
+specified. In those cases, @var{archive-label} argument is interpreted
+as a globbing-style pattern which must match the actual magnetic
+volume label. @xref{exclude}, for a precise description of how match
+is attempted@footnote{Previous versions of @command{tar} used full
+regular expression matching, or before that, only exact string
+matching, instead of wildcard matchers. We decided for the sake of
+simplicity to use a uniform matching device through
+@command{tar}.}. If the switch @option{--multi-volume} (@option{-M}) is being used,
+the volume label matcher will also suffix @var{archive-label} by
+@w{@samp{ Volume [1-9]*}} if the initial match fails, before giving
+up. Since the volume numbering is automatically added in labels at
+creation time, it sounded logical to equally help the user taking care
+of it when the archive is being read.
+
+ The @option{--label} was once called @option{--volume}, but is not
+available under that name anymore.
+
+ You can also use @option{--label} to get a common information on
+all tapes of a series. For having this information different in each
+series created through a single script used on a regular basis, just
+manage to get some date string as part of the label. For example:
+
+@smallexample
+@group
+$ @kbd{tar cfMV /dev/tape "Daily backup for `date +%Y-%m-%d`"}
+$ @kbd{tar --create --file=/dev/tape --multi-volume \
+ --volume="Daily backup for `date +%Y-%m-%d`"}
+@end group
+@end smallexample
+
+ Also note that each label has its own date and time, which corresponds
+to when @GNUTAR{} initially attempted to write it,
+often soon after the operator launches @command{tar} or types the
+carriage return telling that the next tape is ready. Comparing date
+labels does give an idea of tape throughput only if the delays for
+rewinding tapes and the operator switching them were negligible, which
+is usually not the case.
+
+@node verify
+@section Verifying Data as It is Stored
+@cindex Verifying a write operation
+@cindex Double-checking a write operation
+
+@table @option
+@item -W
+@itemx --verify
+@opindex verify, short description
+Attempt to verify the archive after writing.
+@end table
+
+This option causes @command{tar} to verify the archive after writing it.
+Each volume is checked after it is written, and any discrepancies
+are recorded on the standard error output.
+
+Verification requires that the archive be on a back-space-able medium.
+This means pipes, some cartridge tape drives, and some other devices
+cannot be verified.
+
+You can insure the accuracy of an archive by comparing files in the
+system with archive members. @command{tar} can compare an archive to the
+file system as the archive is being written, to verify a write
+operation, or can compare a previously written archive, to insure that
+it is up to date.
+
+@xopindex{verify, using with @option{--create}}
+@xopindex{create, using with @option{--verify}}
+To check for discrepancies in an archive immediately after it is
+written, use the @option{--verify} (@option{-W}) option in conjunction with
+the @option{--create} operation. When this option is
+specified, @command{tar} checks archive members against their counterparts
+in the file system, and reports discrepancies on the standard error.
+
+To verify an archive, you must be able to read it from before the end
+of the last written entry. This option is useful for detecting data
+errors on some tapes. Archives written to pipes, some cartridge tape
+drives, and some other devices cannot be verified.
+
+One can explicitly compare an already made archive with the file
+system by using the @option{--compare} (@option{--diff}, @option{-d})
+option, instead of using the more automatic @option{--verify} option.
+@xref{compare}.
+
+Note that these two options have a slightly different intent. The
+@option{--compare} option checks how identical are the logical contents of some
+archive with what is on your disks, while the @option{--verify} option is
+really for checking if the physical contents agree and if the recording
+media itself is of dependable quality. So, for the @option{--verify}
+operation, @command{tar} tries to defeat all in-memory cache pertaining to
+the archive, while it lets the speed optimization undisturbed for the
+@option{--compare} option. If you nevertheless use @option{--compare} for
+media verification, you may have to defeat the in-memory cache yourself,
+maybe by opening and reclosing the door latch of your recording unit,
+forcing some doubt in your operating system about the fact this is really
+the same volume as the one just written or read.
+
+The @option{--verify} option would not be necessary if drivers were indeed
+able to detect dependably all write failures. This sometimes require many
+magnetic heads, some able to read after the writes occurred. One would
+not say that drivers unable to detect all cases are necessarily flawed,
+as long as programming is concerned.
+
+The @option{--verify} (@option{-W}) option will not work in
+conjunction with the @option{--multi-volume} (@option{-M}) option or
+the @option{--append} (@option{-r}), @option{--update} (@option{-u})
+and @option{--delete} operations. @xref{Operations}, for more
+information on these operations.
+
+Also, since @command{tar} normally strips leading @samp{/} from file
+names (@pxref{absolute}), a command like @samp{tar --verify -cf
+/tmp/foo.tar /etc} will work as desired only if the working directory is
+@file{/}, as @command{tar} uses the archive's relative member names
+(e.g., @file{etc/motd}) when verifying the archive.
+
+@node Write Protection
+@section Write Protection
+
+Almost all tapes and diskettes, and in a few rare cases, even disks can
+be @dfn{write protected}, to protect data on them from being changed.
+Once an archive is written, you should write protect the media to prevent
+the archive from being accidentally overwritten or deleted. (This will
+protect the archive from being changed with a tape or floppy drive---it
+will not protect it from magnet fields or other physical hazards).
+
+The write protection device itself is usually an integral part of the
+physical media, and can be a two position (write enabled/write
+disabled) switch, a notch which can be popped out or covered, a ring
+which can be removed from the center of a tape reel, or some other
+changeable feature.
+
+@node Changes
+@appendix Changes
+
+This appendix lists some important user-visible changes between
+version @GNUTAR{} @value{VERSION} and previous versions. An up-to-date
+version of this document is available at
+@uref{http://www.gnu.org/@/software/@/tar/manual/changes.html,the
+@GNUTAR{} documentation page}.
+
+@table @asis
+@item Use of globbing patterns when listing and extracting.
+
+Previous versions of GNU tar assumed shell-style globbing when
+extracting from or listing an archive. For example:
+
+@smallexample
+$ @kbd{tar xf foo.tar '*.c'}
+@end smallexample
+
+would extract all files whose names end in @samp{.c}. This behavior
+was not documented and was incompatible with traditional tar
+implementations. Therefore, starting from version 1.15.91, GNU tar
+no longer uses globbing by default. For example, the above invocation
+is now interpreted as a request to extract from the archive the file
+named @file{*.c}.
+
+To facilitate transition to the new behavior for those users who got
+used to the previous incorrect one, @command{tar} will print a warning
+if it finds out that a requested member was not found in the archive
+and its name looks like a globbing pattern. For example:
+
+@smallexample
+$ @kbd{tar xf foo.tar '*.c'}
+tar: Pattern matching characters used in file names. Please,
+tar: use --wildcards to enable pattern matching, or --no-wildcards to
+tar: suppress this warning.
+tar: *.c: Not found in archive
+tar: Error exit delayed from previous errors
+@end smallexample
+
+To treat member names as globbing patterns, use --wildcards option.
+If you want to tar to mimic the behavior of versions prior to 1.15.91,
+add this option to your @env{TAR_OPTIONS} variable.
+
+@xref{wildcards}, for the detailed discussion of the use of globbing
+patterns by @GNUTAR{}.
+
+@item Use of short option @option{-o}.
+
+Earlier versions of @GNUTAR{} understood @option{-o} command line
+option as a synonym for @option{--old-archive}.
+
+@GNUTAR{} starting from version 1.13.90 understands this option as
+a synonym for @option{--no-same-owner}. This is compatible with
+UNIX98 @command{tar} implementations.
+
+However, to facilitate transition, @option{-o} option retains its
+old semantics when it is used with one of archive-creation commands.
+Users are encouraged to use @option{--format=oldgnu} instead.
+
+It is especially important, since versions of @acronym{GNU} Automake
+up to and including 1.8.4 invoke tar with this option to produce
+distribution tarballs. @xref{Formats,v7}, for the detailed discussion
+of this issue and its implications.
+
+@FIXME{Change the first argument to tar-formats when the new Automake is
+out. The proposition to add @anchor{} to the appropriate place of its
+docs was accepted by Automake people --Sergey 2006-05-25}.
+@xref{Options, tar-v7, Changing Automake's Behavior,
+automake, GNU Automake}, for a description on how to use various
+archive formats with @command{automake}.
+
+Future versions of @GNUTAR{} will understand @option{-o} only as a
+synonym for @option{--no-same-owner}.
+
+@item Use of short option @option{-l}
+
+Earlier versions of @GNUTAR{} understood @option{-l} option as a
+synonym for @option{--one-file-system}. Since such usage contradicted
+to UNIX98 specification and harmed compatibility with other
+implementation, it was declared deprecated in version 1.14. However,
+to facilitate transition to its new semantics, it was supported by
+versions 1.15 and 1.15.90. The present use of @option{-l} as a short
+variant of @option{--check-links} was introduced in version 1.15.91.
+
+@item Use of options @option{--portability} and @option{--old-archive}
+
+These options are deprecated. Please use @option{--format=v7} instead.
+
+@item Use of option @option{--posix}
+
+This option is deprecated. Please use @option{--format=posix} instead.
+@end table
+
+@node Configuring Help Summary
+@appendix Configuring Help Summary
+
+Running @kbd{tar --help} displays the short @command{tar} option
+summary (@pxref{help}). This summary is organized by @dfn{groups} of
+semantically close options. The options within each group are printed
+in the following order: a short option, eventually followed by a list
+of corresponding long option names, followed by a short description of
+the option. For example, here is an excerpt from the actual @kbd{tar
+--help} output:
+
+@verbatim
+ Main operation mode:
+
+ -A, --catenate, --concatenate append tar files to an archive
+ -c, --create create a new archive
+ -d, --diff, --compare find differences between archive and
+ file system
+ --delete delete from the archive
+@end verbatim
+
+@vrindex ARGP_HELP_FMT, environment variable
+The exact visual representation of the help output is configurable via
+@env{ARGP_HELP_FMT} environment variable. The value of this variable
+is a comma-separated list of @dfn{format variable} assignments. There
+are two kinds of format variables. An @dfn{offset variable} keeps the
+offset of some part of help output text from the leftmost column on
+the screen. A @dfn{boolean} variable is a flag that toggles some
+output feature on or off. Depending on the type of the corresponding
+variable, there are two kinds of assignments:
+
+@table @asis
+@item Offset assignment
+
+The assignment to an offset variable has the following syntax:
+
+@smallexample
+@var{variable}=@var{value}
+@end smallexample
+
+@noindent
+where @var{variable} is the variable name, and @var{value} is a
+numeric value to be assigned to the variable.
+
+@item Boolean assignment
+
+To assign @code{true} value to a variable, simply put this variable name. To
+assign @code{false} value, prefix the variable name with @samp{no-}. For
+example:
+
+@smallexample
+@group
+# Assign @code{true} value:
+dup-args
+# Assign @code{false} value:
+no-dup-args
+@end group
+@end smallexample
+@end table
+
+Following variables are declared:
+
+@deftypevr {Help Output} boolean dup-args
+If true, arguments for an option are shown with both short and long
+options, even when a given option has both forms, for example:
+
+@smallexample
+ -f ARCHIVE, --file=ARCHIVE use archive file or device ARCHIVE
+@end smallexample
+
+If false, then if an option has both short and long forms, the
+argument is only shown with the long one, for example:
+
+@smallexample
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+@end smallexample
+
+@noindent
+and a message indicating that the argument is applicable to both
+forms is printed below the options. This message can be disabled
+using @code{dup-args-note} (see below).
+
+The default is false.
+@end deftypevr
+
+@deftypevr {Help Output} boolean dup-args-note
+If this variable is true, which is the default, the following notice
+is displayed at the end of the help output:
+
+@quotation
+Mandatory or optional arguments to long options are also mandatory or
+optional for any corresponding short options.
+@end quotation
+
+Setting @code{no-dup-args-note} inhibits this message. Normally, only one of
+variables @code{dup-args} or @code{dup-args-note} should be set.
+@end deftypevr
+
+@deftypevr {Help Output} offset short-opt-col
+Column in which short options start. Default is 2.
+
+@smallexample
+@group
+$ @kbd{tar --help|grep ARCHIVE}
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+$ @kbd{ARGP_HELP_FMT=short-opt-col=6 tar --help|grep ARCHIVE}
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+@end group
+@end smallexample
+@end deftypevr
+
+@deftypevr {Help Output} offset long-opt-col
+Column in which long options start. Default is 6. For example:
+
+@smallexample
+@group
+$ @kbd{tar --help|grep ARCHIVE}
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+$ @kbd{ARGP_HELP_FMT=long-opt-col=16 tar --help|grep ARCHIVE}
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+@end group
+@end smallexample
+@end deftypevr
+
+@deftypevr {Help Output} offset doc-opt-col
+Column in which @dfn{doc options} start. A doc option isn't actually
+an option, but rather an arbitrary piece of documentation that is
+displayed in much the same manner as the options. For example, in
+the description of @option{--format} option:
+
+@smallexample
+@group
+ -H, --format=FORMAT create archive of the given format.
+
+ FORMAT is one of the following:
+
+ gnu GNU tar 1.13.x format
+ oldgnu GNU format as per tar <= 1.12
+ pax POSIX 1003.1-2001 (pax) format
+ posix same as pax
+ ustar POSIX 1003.1-1988 (ustar) format
+ v7 old V7 tar format
+@end group
+@end smallexample
+
+@noindent
+the format names are doc options. Thus, if you set
+@kbd{ARGP_HELP_FMT=doc-opt-col=6} the above part of the help output
+will look as follows:
+
+@smallexample
+@group
+ -H, --format=FORMAT create archive of the given format.
+
+ FORMAT is one of the following:
+
+ gnu GNU tar 1.13.x format
+ oldgnu GNU format as per tar <= 1.12
+ pax POSIX 1003.1-2001 (pax) format
+ posix same as pax
+ ustar POSIX 1003.1-1988 (ustar) format
+ v7 old V7 tar format
+@end group
+@end smallexample
+@end deftypevr
+
+@deftypevr {Help Output} offset opt-doc-col
+Column in which option description starts. Default is 29.
+
+@smallexample
+@group
+$ @kbd{tar --help|grep ARCHIVE}
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+$ @kbd{ARGP_HELP_FMT=opt-doc-col=19 tar --help|grep ARCHIVE}
+ -f, --file=ARCHIVE use archive file or device ARCHIVE
+$ @kbd{ARGP_HELP_FMT=opt-doc-col=9 tar --help|grep ARCHIVE}
+ -f, --file=ARCHIVE
+ use archive file or device ARCHIVE
+@end group
+@end smallexample
+
+@noindent
+Notice, that the description starts on a separate line if
+@code{opt-doc-col} value is too small.
+@end deftypevr
+
+@deftypevr {Help Output} offset header-col
+Column in which @dfn{group headers} are printed. A group header is a
+descriptive text preceding an option group. For example, in the
+following text:
+
+@verbatim
+ Main operation mode:
+
+ -A, --catenate, --concatenate append tar files to
+ an archive
+ -c, --create create a new archive
+@end verbatim
+@noindent
+@samp{Main operation mode:} is the group header.
+
+The default value is 1.
+@end deftypevr
+
+@deftypevr {Help Output} offset usage-indent
+Indentation of wrapped usage lines. Affects @option{--usage}
+output. Default is 12.
+@end deftypevr
+
+@deftypevr {Help Output} offset rmargin
+Right margin of the text output. Used for wrapping.
+@end deftypevr
+
+@node Tar Internals
+@appendix Tar Internals
+@include intern.texi
+
+@node Genfile
+@appendix Genfile
+@include genfile.texi
+
+@node Free Software Needs Free Documentation
+@appendix Free Software Needs Free Documentation
+@include freemanuals.texi
+
+@node Copying This Manual
+@appendix Copying This Manual
+
+@menu
+* GNU Free Documentation License:: License for copying this manual
+@end menu
+
+@include fdl.texi
+
+@node Index of Command Line Options
+@appendix Index of Command Line Options
+
+This appendix contains an index of all @GNUTAR{} long command line
+options. The options are listed without the preceding double-dash.
+For a cross-reference of short command line options, @ref{Short Option Summary}.
+
+@printindex op
+
+@node Index
+@appendix Index
+
+@printindex cp
+
+@summarycontents
+@contents
+@bye
+
+@c Local variables:
+@c texinfo-column-for-description: 32
+@c End:
diff --git a/doc/texify.sed b/doc/texify.sed
new file mode 100644
index 0000000..ccc41dd
--- /dev/null
+++ b/doc/texify.sed
@@ -0,0 +1,26 @@
+# Copyright (C) 2006 Free Software Foundation, Inc.
+#
+# GNU tar is free software; you can 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.
+#
+# GNU tar is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU tar; if not, write to the Free Software
+# Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+1{s,/\*,@comment ,
+b
+}
+2,/.*\*\//{s,\*/,,;s/^/@comment/
+b
+}
+/\/* END \*\//,$d
+s/\([{}]\)/@\1/g
+s,/\*,&@r{,
+s,\*/,}&,
diff --git a/doc/texinfo.tex b/doc/texinfo.tex
new file mode 100644
index 0000000..58bea4d
--- /dev/null
+++ b/doc/texinfo.tex
@@ -0,0 +1,7086 @@
+% 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{2005-01-30.17}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 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 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this texinfo.tex file; see the file COPYING. If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://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}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar = `\.
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar = `\;
+\chardef\underChar = `\_
+
+\chardef\spaceChar = `\ %
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode\spaceChar=\spacecat}
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+ ap-pen-dix bit-map bit-maps
+ data-base data-bases eshell fall-ing half-way long-est man-u-script
+ man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+ par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+ spell-ing spell-ings
+ stand-alone strong-est time-stamp time-stamps which-ever white-space
+ wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \escapechar = `\\ % use backslash in output files.
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingxxx.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 2\baselineskip
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \normalturnoffactive
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+ \def\next{#2}%
+ \begingroup
+ \obeylines
+ \spaceisspace
+ #1%
+ \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ \argremovecomment #1\comment\ArgTerm%
+ }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+% @end itemize @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+ \def\temp{#3}%
+ \ifx\temp\empty
+ % We cannot use \next here, as it holds the macro to run;
+ % thus we 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 \next.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
+
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick. --kasal, 16nov03
+
+\def\parseargdef#1{%
+ \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+ \def#2{\parsearg#1}%
+ \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+ \obeyspaces
+ \gdef\obeyedspace{ }
+
+ % Make each space character in the input produce a normal interword
+ % space in the output. Don't allow a line break at this space, as this
+ % is used only in environments like @example, where each line of input
+ % should produce a line of output anyway.
+ %
+ \gdef\sepspaces{\obeyspaces\let =\tie}
+
+ % If an index command is used in an @example environment, any spaces
+ % therein should become regular spaces in the raw index file, not the
+ % expansion of \tie (\leavevmode \penalty \@M \ ).
+ \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex. It's used like this:
+%
+% \envdef\foo{...}
+% \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo. \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches. The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+ \def\temp{#1}%
+ \ifx\thisenv\temp
+ \else
+ \badenverr
+ \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ out of any environment%
+ \else
+ in environment \expandafter\string#1%
+ \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+ \if 1\csname iscond.#1\endcsname
+ \else
+ % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux file.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence. (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo. Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+ L\kern-.36em
+ {\setbox0=\hbox{T}%
+ \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+ \kern-.15em
+ \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+ \ifnum\catcode`\^^M=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \startsavinginserts
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it. Thus, space below is not quite equal to space
+% above. But it's pretty close.
+\def\Egroup{%
+ % To get correct interline space between the last line of the group
+ % and the first line afterwards, we have to propagate \prevdepth.
+ \endgraf % Not \par, as it may have been set to \lisppar.
+ \global\dimen1 = \prevdepth
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+ \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable
+ \def\temp{\input #1 }%
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+ \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+ \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+ \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+ the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+ \ifhmode
+ \let\next\centerH
+ \else
+ \let\next\centerV
+ \fi
+ \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+ {%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+ }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent{%
+ \restorefirstparagraphindent
+ \indent
+ }%
+ \gdef\noindent{%
+ \restorefirstparagraphindent
+ \noindent
+ }%
+ \global\everypar = {%
+ \kern -\parindent
+ \restorefirstparagraphindent
+ }%
+}
+
+\gdef\restorefirstparagraphindent{%
+ \global \let \indent = \ptexindent
+ \global \let \noindent = \ptexnoindent
+ \global \everypar = {}%
+}
+
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+ \catcode\underChar = \active
+ \gdef\mathunderscore{%
+ \catcode\underChar=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+ }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ $\finishmath
+}
+\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+ \leavevmode
+ \hbox to 1.5em{%
+ \hskip 0pt plus 0.25fil
+ .\hfil.\hfil.%
+ \hskip 0pt plus 0.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \dots
+ \spacefactor=3000
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ \openin 1 texinfo.cnf
+ \ifeof 1 \else \input texinfo.cnf \fi
+ \closein 1
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set). So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+ \ifx\pdfoutput\relax
+ \else
+ \ifcase\pdfoutput
+ \else
+ \pdftrue
+ \fi
+ \fi
+\fi
+%
+\ifpdf
+ \input pdfcolor
+ \pdfcatalog{/PageMode /UseOutlines}%
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}%
+ \def\imageheight{#3}%
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifx\empty\imagewidth\else width \imagewidth \fi
+ \ifx\empty\imageheight\else height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.pdf%
+ \else
+ {#1.pdf}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ \def\pdfmkdest#1{{%
+ % We have to set dummies so commands such as @code in a section title
+ % aren't expanded.
+ \atdummies
+ \normalturnoffactive
+ \pdfdest name{#1} xyz%
+ }}
+ \def\pdfmkpgn#1{#1}
+ \let\linkcolor = \Blue % was Cyan, but that seems light?
+ \def\endlink{\Black\pdfendlink}
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text. #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 worthwhile, since most documents are normally structured.
+ \def\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\numchapentry##1##2##3##4{%
+ \def\thischapnum{##2}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsecentry##1##2##3##4{%
+ \advancenumber{chap\thischapnum}%
+ \def\thissecnum{##2}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsubsecentry##1##2##3##4{%
+ \advancenumber{sec\thissecnum}%
+ \def\thissubsecnum{##2}%
+ }%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \advancenumber{subsec\thissubsecnum}%
+ }%
+ \def\thischapnum{0}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \input \jobname.toc
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % PDF outlines are displayed using system fonts, instead of
+ % document fonts. Therefore we cannot use special characters,
+ % since the encoding is unknown. For example, the eogonek from
+ % Latin 2 (0xea) gets translated to a | character. Info from
+ % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+ %
+ % xx to do this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Right
+ % now, I guess we'll just let the pdf reader have its way.
+ \indexnofonts
+ \turnoffactive
+ \input \jobname.toc
+ \endgroup
+ }
+ %
+ \def\makelinks #1,{%
+ \def\params{#1}\def\E{END}%
+ \ifx\params\E
+ \let\nextmakelinks=\relax
+ \else
+ \let\nextmakelinks=\makelinks
+ \ifnum\lnkcount>0,\fi
+ \picknum{#1}%
+ \startlink attr{/Border [0 0 0]}
+ goto name{\pdfmkpgn{\the\pgn}}%
+ \linkcolor #1%
+ \advance\lnkcount by 1%
+ \endlink
+ \fi
+ \nextmakelinks
+ }
+ \def\picknum#1{\expandafter\pn#1}
+ \def\pn#1{%
+ \def\p{#1}%
+ \ifx\p\lbrace
+ \let\nextpn=\ppn
+ \else
+ \let\nextpn=\ppnn
+ \def\first{#1}
+ \fi
+ \nextpn
+ }
+ \def\ppn#1{\pgn=#1\gobble}
+ \def\ppnn{\pgn=\first}
+ \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ \def\pdfurl#1{%
+ \begingroup
+ \normalturnoffactive\def\@{@}%
+ \makevalueexpandable
+ \leavevmode\Red
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+ \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+ \csname ten#1\endcsname % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}
+\setfont\texttt\ttshape{10}{\mainmagstep}
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}
+\setfont\deftt\ttshape{10}{\magstep1}
+\setfont\defttsl\ttslshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}
+\setfont\reducedtt\ttshape{10}{1000}
+\setfont\reducedbf\bfshape{10}{1000}
+\setfont\reducedit\itshape{10}{1000}
+\setfont\reducedsl\slshape{10}{1000}
+\setfont\reducedsf\sfshape{10}{1000}
+\setfont\reducedsc\scshape{10}{1000}
+\setfont\reducedttsl\ttslshape{10}{1000}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this because \STYLE needs to also set the
+% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \let\tenttsl=\textttsl
+ \def\curfontsize{text}%
+ \def\lsize{reduced}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \def\curfontsize{title}%
+ \def\lsize{chap}\def\lllsize{subsec}%
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \let\tenttsl=\chapttsl
+ \def\curfontsize{chap}%
+ \def\lsize{sec}\def\lllsize{text}%
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \let\tenttsl=\secttsl
+ \def\curfontsize{sec}%
+ \def\lsize{subsec}\def\lllsize{reduced}%
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \let\tenttsl=\ssecttsl
+ \def\curfontsize{ssec}%
+ \def\lsize{text}\def\lllsize{small}%
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+ \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+ \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+ \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+ \let\tenttsl=\reducedttsl
+ \def\curfontsize{reduced}%
+ \def\lsize{small}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \def\curfontsize{small}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \def\curfontsize{smaller}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts \rm
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+ \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% @b, explicit bold.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\frenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ }
+\catcode`@=\other
+
+\def\t#1{%
+ {\tt \rawbackslash \frenchspacing #1}%
+ \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\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}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \frenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active
+ \catcode`\_=\active
+ %
+ \global\def\code{\begingroup
+ \catcode`\-=\active \let-\codedash
+ \catcode`\_=\active \let_\codeunder
+ \codex
+ }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+ \def\arg{#1}%
+ \ifx\arg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\arg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\arg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle option `\arg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+ {\selectfonts\lsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+ {\frenchspacing #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from 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
+}
+
+% @registeredsymbol - R in a circle. The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+ \hfil\crcr\Orb}}%
+ }$%
+}
+
+% Laurent Siebenmann reports \Orb undefined with:
+% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+ % Open one extra group, as we want to close it in the middle of \Etitlepage.
+ \begingroup
+ \parindent=0pt \textfonts
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \let\page = \oldpage
+ \page
+ \null
+ }%
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \leftline{\titlefonts\rm #1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+ \checkenv\titlepage
+ {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+ \def\temp{\quotation}%
+ \ifx\thisenv\temp
+ \def\quotationauthor{#1}% printed in \Equotation.
+ \else
+ \checkenv\titlepage
+ \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+ {\authorfont \leftline{#1}}%
+ \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -\baselineskip
+ \global\advance\vsize by -\baselineskip
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemindicate{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. However, if
+ % what follows is an environment such as @example, there will be no
+ % \parskip glue; then the negative vskip we just inserted would
+ % cause the example and the item to crash together. So we use this
+ % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+ % \parskip glue after all. Section titles are handled this way also.
+ %
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+ \let\itemindex\gobble
+ \tablecheck{table}%
+}
+\envdef\ftable{%
+ \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+ \tablecheck{ftable}%
+}
+\envdef\vtable{%
+ \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+ \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+ \ifnum \the\catcode`\^^M=\active
+ \endgroup
+ \errmessage{This command won't work in this context; perhaps the problem is
+ that we are \inenvironment\thisenv}%
+ \def\next{\doignore{#1}}%
+ \else
+ \let\next\tablex
+ \fi
+ \next
+}
+\def\tablex#1{%
+ \def\itemindicate{#1}%
+ \parsearg\tabley
+}
+\def\tabley#1{%
+ {%
+ \makevalueexpandable
+ \edef\temp{\noexpand\tablez #1\space\space\space}%
+ \expandafter
+ }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+ \aboveenvbreak
+ \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+ \ifnum 0#2>0 \tableindent=#2\mil \fi
+ \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+ \itemmax=\tableindent
+ \advance \itemmax by -\itemmargin
+ \advance \leftskip by \tableindent
+ \exdentamount=\tableindent
+ \parindent = 0pt
+ \parskip = \smallskipamount
+ \ifdim \parskip=0pt \parskip=2pt \fi
+ \let\item = \internalBitem
+ \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ \def\itemcontents{#1}%
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+ \advance\itemno by 1 % for enumerations
+ {\let\par=\endgraf \smallbreak}% reasonable place to break
+ {%
+ % If the document has an @itemize directly after a section title, a
+ % \nobreak will be last on the list, and \sectionheading will have
+ % done a \vskip-\parskip. In that case, we don't want to zero
+ % parskip, or the item text will crash with the heading. On the
+ % other hand, when there is normal text preceding the item (as there
+ % usually is), we do want to zero parskip, or there would be too much
+ % space. In that case, we won't have a \nobreak before. At least
+ % that's the theory.
+ \ifnum\lastpenalty<10000 \parskip=0in \fi
+ \noindent
+ \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+ \vadjust{\penalty 1200}}% not good to break after first line of item.
+ \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1. We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry. Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp. But then the space in a template
+% line is not enough. That is bad. So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab % insert after every tab.
+%
+\envdef\multitable{%
+ \vskip\parskip
+ \startsavinginserts
+ %
+ % @item within a multitable starts a normal row.
+ % We use \def instead of \let so that if one of the multitable entries
+ % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+ % \endtemplate) expanding \doitemize.
+ \def\item{\crcr}%
+ %
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ %
+ \everycr = {%
+ \noalign{%
+ \global\everytab={}%
+ \global\colcount=0 % Reset the column counter.
+ % Check for saved footnotes, etc.
+ \checkinserts
+ % Keeps underfull box messages off when table breaks over pages.
+ %\filbreak
+ % Maybe so, but it also creates really weird page breaks when the
+ % table breaks over pages. Wouldn't \vfil be better? Wait until the
+ % problem manifests itself, so it can be fixed for real --karl.
+ }%
+ }%
+ %
+ \parsearg\domultitable
+}
+\def\domultitable#1{%
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup &%
+ \global\advance\colcount by 1
+ \multistrut
+ \vtop{%
+ % Use the current \colcount to find the correct column width:
+ \hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively
+ % marking characters.
+ \noindent\ignorespaces##\unskip\multistrut
+ }\cr
+}
+\def\Emultitable{%
+ \crcr
+ \egroup % end the \halign
+ \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+ \def\multistrut{\strut}% just use the standard line spacing
+ %
+ % Compute \multitablelinespace (if not defined by user) for use in
+ % \multitableparskip calculation. We used define \multistrut based on
+ % this, but (ironically) that caused the spacing to be off.
+ % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed. They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested. But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+ \expandafter\let\csname #1\endcsname = \relax
+ \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Scan in ``verbatim'' mode:
+ \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', which must be on a line
+ % by itself.
+ \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.
+ \obeylines %
+ \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.
+\def\enddoignore{\endgroup\ignorespaces}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ {%
+ \makevalueexpandable
+ \def\temp{#2}%
+ \edef\next{\gdef\makecsname{SET#1}}%
+ \ifx\temp\empty
+ \next{}%
+ \else
+ \setzzz#2\endsetzzz
+ \fi
+ }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+ {%
+ \makevalueexpandable
+ \global\expandafter\let\csname SET#1\endcsname=\relax
+ }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+ \catcode`\- = \active \catcode`\_ = \active
+ %
+ \gdef\makevalueexpandable{%
+ \let\value = \expandablevalue
+ % We don't want these characters active, ...
+ \catcode`\-=\other \catcode`\_=\other
+ % ..., but we might end up with active ones in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}, though.
+ % So \let them to their normal equivalents.
+ \let-\realdash \let_\normalunderscore
+ }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file. This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+ {%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname SET#2\endcsname\relax
+ #1% If not set, redefine \next.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % \definedummyword defines \#1 as \realbackslash #1\space, thus
+ % effectively preventing its expansion. This is used only for control
+ % words, not control letters, because the \space would be incorrect
+ % for control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+ }%
+ \let\definedummyaccent\definedummyletter
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux file, @ is the escape character. So we want to redefine
+% everything using @ instead of \realbackslash. When everything uses
+% @, this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % (See comments in \indexdummies.)
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{@##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{@##1}%
+ }%
+ \let\definedummyaccent\definedummyletter
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% Called from \indexdummies and \atdummies. \definedummyword and
+% \definedummyletter must be defined first.
+%
+\def\commondummies{%
+ %
+ \normalturnoffactive
+ %
+ \commondummiesnofonts
+ %
+ \definedummyletter{_}%
+ %
+ % Non-English letters.
+ \definedummyword{AA}%
+ \definedummyword{AE}%
+ \definedummyword{L}%
+ \definedummyword{OE}%
+ \definedummyword{O}%
+ \definedummyword{aa}%
+ \definedummyword{ae}%
+ \definedummyword{l}%
+ \definedummyword{oe}%
+ \definedummyword{o}%
+ \definedummyword{ss}%
+ \definedummyword{exclamdown}%
+ \definedummyword{questiondown}%
+ \definedummyword{ordf}%
+ \definedummyword{ordm}%
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword{bf}%
+ \definedummyword{gtr}%
+ \definedummyword{hat}%
+ \definedummyword{less}%
+ \definedummyword{sf}%
+ \definedummyword{sl}%
+ \definedummyword{tclose}%
+ \definedummyword{tt}%
+ %
+ \definedummyword{LaTeX}%
+ \definedummyword{TeX}%
+ %
+ % Assorted special characters.
+ \definedummyword{bullet}%
+ \definedummyword{comma}%
+ \definedummyword{copyright}%
+ \definedummyword{registeredsymbol}%
+ \definedummyword{dots}%
+ \definedummyword{enddots}%
+ \definedummyword{equiv}%
+ \definedummyword{error}%
+ \definedummyword{euro}%
+ \definedummyword{expansion}%
+ \definedummyword{minus}%
+ \definedummyword{pounds}%
+ \definedummyword{point}%
+ \definedummyword{print}%
+ \definedummyword{result}%
+ %
+ % Handle some cases of @value -- where it does not contain any
+ % (non-fully-expandable) commands.
+ \makevalueexpandable
+ %
+ % Normal spaces, not active ones.
+ \unsepspaces
+ %
+ % No macro expansion.
+ \turnoffmacros
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+% Better have this without active chars.
+{
+ \catcode`\~=\other
+ \gdef\commondummiesnofonts{%
+ % Control letters and accents.
+ \definedummyletter{!}%
+ \definedummyaccent{"}%
+ \definedummyaccent{'}%
+ \definedummyletter{*}%
+ \definedummyaccent{,}%
+ \definedummyletter{.}%
+ \definedummyletter{/}%
+ \definedummyletter{:}%
+ \definedummyaccent{=}%
+ \definedummyletter{?}%
+ \definedummyaccent{^}%
+ \definedummyaccent{`}%
+ \definedummyaccent{~}%
+ \definedummyword{u}%
+ \definedummyword{v}%
+ \definedummyword{H}%
+ \definedummyword{dotaccent}%
+ \definedummyword{ringaccent}%
+ \definedummyword{tieaccent}%
+ \definedummyword{ubaraccent}%
+ \definedummyword{udotaccent}%
+ \definedummyword{dotless}%
+ %
+ % Texinfo font commands.
+ \definedummyword{b}%
+ \definedummyword{i}%
+ \definedummyword{r}%
+ \definedummyword{sc}%
+ \definedummyword{t}%
+ %
+ % Commands that take arguments.
+ \definedummyword{acronym}%
+ \definedummyword{cite}%
+ \definedummyword{code}%
+ \definedummyword{command}%
+ \definedummyword{dfn}%
+ \definedummyword{emph}%
+ \definedummyword{env}%
+ \definedummyword{file}%
+ \definedummyword{kbd}%
+ \definedummyword{key}%
+ \definedummyword{math}%
+ \definedummyword{option}%
+ \definedummyword{samp}%
+ \definedummyword{strong}%
+ \definedummyword{tie}%
+ \definedummyword{uref}%
+ \definedummyword{url}%
+ \definedummyword{var}%
+ \definedummyword{verb}%
+ \definedummyword{w}%
+ }
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+ % Accent commands should become @asis.
+ \def\definedummyaccent##1{%
+ \expandafter\let\csname ##1\endcsname\asis
+ }%
+ % We can just ignore other control letters.
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{}%
+ }%
+ % Hopefully, all control words can become @asis.
+ \let\definedummyword\definedummyaccent
+ %
+ \commondummiesnofonts
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters.
+ % (The following {} will end up in the sort string, but that's ok.)
+ \def\bullet{bullet}%
+ \def\comma{,}%
+ \def\copyright{copyright}%
+ \def\registeredsymbol{R}%
+ \def\dots{...}%
+ \def\enddots{...}%
+ \def\equiv{==}%
+ \def\error{error}%
+ \def\euro{euro}%
+ \def\expansion{==>}%
+ \def\minus{-}%
+ \def\pounds{pounds}%
+ \def\point{.}%
+ \def\print{-|}%
+ \def\result{=>}%
+ %
+ % Don't write macro names.
+ \emptyusermacros
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with a space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \ifvmode
+ \dosubindsanitize
+ \else
+ \dosubindwrite
+ \fi
+ }%
+ \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+
+% Take care of unwanted page breaks:
+%
+% 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 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}
+%
+% ..., ready, GO:
+%
+\def\dosubindsanitize{%
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \skip0 = \lastskip
+ \edef\lastskipmacro{\the\lastskip}%
+ \count255 = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\skip0 glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifx\lastskipmacro\zeroskipmacro
+ \else
+ \vskip-\skip0
+ \fi
+ %
+ \dosubindwrite
+ %
+ \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\count255>9999 \penalty\count255 \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\skip0
+ \fi
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\backslashcurfont}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \nobreak
+ \vskip 0pt plus 3\baselineskip
+ \penalty 0
+ \vskip 0pt plus -3\baselineskip
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ % Do our best not to break after the initial.
+ \nobreak
+ \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin. It is used for index
+% and table of contents entries. The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+% \def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active. This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+% --kasal, 21nov03
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing
+ % columns.
+ \vskip 0pt plus1pt
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\doentry{%
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+ % #1 is the page number.
+ %
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#1}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd
+ \ %
+ \else
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#1.%
+ \ \the\toksA
+ \else
+ \ #1%
+ \fi
+ \fi
+ \par
+ \endgroup
+}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+ % Compute the abs. sec. level:
+ \absseclevel=#2
+ \advance\absseclevel by \secbase
+ % Make sure \absseclevel doesn't fall outside the range:
+ \ifnum \absseclevel < 0
+ \absseclevel = 0
+ \else
+ \ifnum \absseclevel > 3
+ \absseclevel = 3
+ \fi
+ \fi
+ % The heading type:
+ \def\headtype{#1}%
+ \if \headtype U%
+ \ifnum \absseclevel < \unmlevel
+ \chardef\unmlevel = \absseclevel
+ \fi
+ \else
+ % Check for appendix sections:
+ \ifnum \absseclevel = 0
+ \edef\chapheadtype{\headtype}%
+ \else
+ \if \headtype A\if \chapheadtype N%
+ \errmessage{@appendix... within a non-appendix chapter}%
+ \fi\fi
+ \fi
+ % Check for numbered within unnumbered:
+ \ifnum \absseclevel > \unmlevel
+ \def\headtype{U}%
+ \else
+ \chardef\unmlevel = 3
+ \fi
+ \fi
+ % Now print the heading:
+ \if \headtype U%
+ \ifcase\absseclevel
+ \unnumberedzzz{#3}%
+ \or \unnumberedseczzz{#3}%
+ \or \unnumberedsubseczzz{#3}%
+ \or \unnumberedsubsubseczzz{#3}%
+ \fi
+ \else
+ \if \headtype A%
+ \ifcase\absseclevel
+ \appendixzzz{#3}%
+ \or \appendixsectionzzz{#3}%
+ \or \appendixsubseczzz{#3}%
+ \or \appendixsubsubseczzz{#3}%
+ \fi
+ \else
+ \ifcase\absseclevel
+ \chapterzzz{#3}%
+ \or \seczzz{#3}%
+ \or \numberedsubseczzz{#3}%
+ \or \numberedsubsubseczzz{#3}%
+ \fi
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v. By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ % section resetting is \global in case the chapter is in a group, such
+ % as an @include file.
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\chapno by 1
+ %
+ % Used for \float.
+ \gdef\chaplevelprefix{\the\chapno.}%
+ \resetallfloatnos
+ %
+ \message{\putwordChapter\space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ \def\appendixnum{\putwordAppendix\space \appendixletter}%
+ \message{\appendixnum}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\unnumberedno by 1
+ %
+ % Since an unnumbered has no number, no prefix for figures.
+ \global\let\chaplevelprefix = \empty
+ \resetallfloatnos
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}%
+ \message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+ % Well, we could do the following in a group, but that would break
+ % an assumption that \chapmacro is called at the outermost level.
+ % Thus we are safer this way: --kasal, 24feb04
+ \let\centerparametersmaybe = \centerparameters
+ \unnmhead0{#1}%
+ \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+ \bigskip \par\penalty 200\relax
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ %
+ % Have to define \thissection before calling \donoderef, because the
+ % xref code eventually uses it. On the other hand, it has to be called
+ % after \pchapsepmacro, or the headline will change too soon.
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \gdef\thischapter{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \gdef\thischapter{}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now. And we don't
+ % use \thissection because that changes with each section.
+ %
+ \xdef\thischapter{\putwordAppendix{} \appendixletter:
+ \noexpand\thischaptername}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \xdef\thischapter{\putwordChapter{} \the\chapno:
+ \noexpand\thischaptername}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+ \global\let\chapmacro=\chfopen
+ \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rm
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Only insert the space after the number if we have a section number.
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\thissection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \thissection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\thissection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\thissection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chfplain.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chfplain.
+ \donoderef{#3}%
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.)
+ \vskip-\parskip
+ %
+ % This is purely so the last item on the list is a known \penalty >
+ % 10000. This is so \startdefun can avoid allowing breakpoints after
+ % section headings. Otherwise, it would insert a valid breakpoint between:
+ %
+ % @section sec-whatever
+ % @deffn def-whatever
+ \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ \toks0 = {#2}%
+ \toks2 = \expandafter{\lastnode}%
+ \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
+ {\the\toks2}{\noexpand\folio}}}%
+ \temp
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \def\thischapter{}%
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ % We can't do this, because then an actual ^ in a section
+ % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
+ %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \ifeof 1 \else
+ \pdfmakeoutlines
+ \fi
+ \closein 1
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\numchapentry = \shortchapentry
+ \let\appentry = \shortchapentry
+ \let\unnchapentry = \shortunnchapentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\numsecentry##1##2##3##4{}
+ \let\appsecentry = \numsecentry
+ \let\unnsecentry = \numsecentry
+ \let\numsubsecentry = \numsecentry
+ \let\appsubsecentry = \numsecentry
+ \let\unnsubsecentry = \numsecentry
+ \let\numsubsubsecentry = \numsecentry
+ \let\appsubsubsecentry = \numsecentry
+ \let\unnsubsubsecentry = \numsecentry
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \input \jobname.toc
+ \fi
+ \closein 1
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ %
+ % We'd like to right-justify chapter numbers, but that looks strange
+ % with appendix letters. And right-justifying numbers and
+ % left-justifying letters looks strange when there is less than 10
+ % chapters. Have to read the whole toc once to know how many chapters
+ % there are before deciding ...
+ \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{%
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\*=\ptexstar
+ \let\t=\ptext
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz and
+ % \sectionheading, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty<10000 \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+ \ifhmode\par\fi % can't be in the midst of a paragraph.
+ \startsavinginserts
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt % we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+ % each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \kern3pt
+ \hsize=\cartinner
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+ \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+ \ifhmode\par\fi
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ % @cartouche defines \nonarrowing to inhibit narrowing
+ % at next level down.
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \fi
+ \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+% @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+ \ifx\SETdispenvsize\smallword
+ \smallexamplefonts \rm
+ \fi
+}
+\def\setsmalldispenv{%
+ \ifx\SETdispenvsize\nosmallword
+ \else
+ \smallexamplefonts \rm
+ \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+ \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+ \expandafter\let\csname E#1\endcsname \afterenvbreak
+ \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+ \makedispenv{#1}{#3}
+ \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+ \nonfillstart
+ \tt
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins. We keep \parskip nonzero in general, since
+% we're doing normal filling. So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \let\nonarrowing = \relax
+ \fi
+ \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+ \par
+ \ifx\quotationauthor\undefined\else
+ % indent a bit.
+ \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+ \fi
+ {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty \else
+ {\bf #1: }%
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+\endgroup
+\def\setupverbatim{%
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+ % We really want {...\end verbatim} in the body of the macro, but
+ % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+ \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+ {%
+ \makevalueexpandable
+ \setupverbatim
+ \input #1
+ \afterenvbreak
+ }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+ \begingroup
+ \parindent = 0pt % paragraph indentation looks wrong on title page
+ \scanexp\copyingtext
+ \endgroup
+}
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+% Start the processing of @deffn:
+\def\startdefun{%
+ \ifnum\lastpenalty<10000
+ \medbreak
+ \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 \defargscommonending, 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.
+ %
+ \ifnum\lastpenalty=10002 \penalty2000 \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 \fi
+ %
+ % And now, it's time to reuse the body of the original defun:
+ \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+ \begingroup
+ % call \deffnheader:
+ #1#2 \endheader
+ % common ending:
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty 10002 % signal to \startdefun and \dodefunx
+ % Some of the @defun-type tags do not enable magic parentheses,
+ % rendering the following check redundant. But we don't optimize.
+ \checkparencounts
+ \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+ \expandafter\let\csname E#1\endcsname = \Edefun
+ \edef\temp{\noexpand\domakedefun
+ \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+ \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+ % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+ \dosubind{fn}{\code{#3}}{#1}%
+ \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{fn}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{vr}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+ \doind{tp}{\code{#2}}%
+ \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % How we'll format the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \def\temp{#1}%
+ \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+ %
+ % Figure out line sizes for the paragraph shape.
+ % The first line needs space for \box0; but if \rightskip is nonzero,
+ % we need only space for the part of \box0 which exceeds it:
+ \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ % (plain.tex says that \dimen1 should be used only as global.)
+ \parshape 2 0in \dimen0 \defargsindent \dimen2
+ %
+ % Put the type name to the right margin.
+ \noindent
+ \hbox to 0pt{%
+ \hfil\box0 \kern-\hsize
+ % \hsize has to be shortened this way:
+ \kern\leftskip
+ % Intentionally do not respect \rightskip, since we need the space.
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \exdentamount=\defbodyindent
+ {%
+ % defun fonts. We use typewriter by default (used to be bold) because:
+ % . we're printing identifiers, they should be in tt in principle.
+ % . in languages with many accents, such as Czech or French, it's
+ % common to leave accents off identifiers. The result looks ok in
+ % tt, but exceedingly strange in rm.
+ % . we don't want -- and --- to be treated as ligatures.
+ % . this still does not fix the ?` and !` ligatures, but so far no
+ % one has made identifiers using them :).
+ \df \tt
+ \def\temp{#2}% return value type
+ \ifx\temp\empty\else \tclose{\temp} \fi
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \tenrm
+ %
+ \boldbrax
+ % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name. This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable. Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+ % use sl by default (not ttsl),
+ % tt for the names.
+ \df \sl \hyphenchar\font=0
+ %
+ % On the other hand, if an argument has two dashes (for instance), we
+ % want a way to get ttsl. Let's try @var for that.
+ \let\var=\ttslanted
+ #1%
+ \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\[=\active \catcode`\]=\active
+ \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+ \activeparens
+ \global\let(=\lparen \global\let)=\rparen
+ \global\let[=\lbrack \global\let]=\rbrack
+ \global\let& = \&
+
+ \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+ \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+ \ifampseen
+ % At the first level, print parens in roman,
+ % otherwise use the default font.
+ \ifnum \parencount=1 \rm \fi
+ \else
+ % The \sf parens (in \boldbrax) actually are a little bolder than
+ % the contained text. This is especially needed for [ and ] .
+ \sf
+ \fi
+}
+\def\infirstlevel#1{%
+ \ifampseen
+ \ifnum\parencount=1
+ #1%
+ \fi
+ \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+ \global\advance\parencount by 1
+ {\parenfont(}%
+ \infirstlevel \bfafterword
+}
+\def\clnr{%
+ {\parenfont)}%
+ \infirstlevel \sl
+ \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+ \global\advance\brackcount by 1
+ {\bf[}%
+}
+\def\rbrb{%
+ {\bf]}%
+ \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+ \ifnum\parencount=0 \else \badparencount \fi
+ \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+ \errmessage{Unbalanced parentheses in @def}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \errmessage{Unbalanced square braces in @def}%
+ \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+\def\scanmacro#1{%
+ \begingroup
+ \newlinechar`\^^M
+ \let\xeatspaces\eatspaces
+ % Undo catcode changes of \startcontents and \doprintindex
+ % When called from @insertcopying or (short)caption, we need active
+ % backslash to get it printed correctly. Previously, we had
+ % \catcode`\\=\other instead. We'll see whether a problem appears
+ % with macro expansion. --kasal, 19aug04
+ \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+ % ... and \example
+ \spaceisspace
+ %
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ %
+ % I've verified that it is necessary both for e-TeX and for ordinary TeX
+ % --kasal, 29nov03
+ \scantokens{#1\endinput}%
+ \endgroup
+}
+
+\def\scanexp#1{%
+ \edef\temp{\noexpand\scanmacro{#1}}%
+ \temp
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+\def\macrolist{} % List of all defined macros in the form
+ % \do\macro1\do\macro2...
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+% \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+ \expandafter\let
+ \csname#1\expandafter\endcsname
+ \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+ \catcode`\"=\other
+ \catcode`\+=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\@=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\~=\other
+}
+
+\def\scanargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+ \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+ \scanctxt
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\^^M=\other
+ \usembodybackslash
+}
+
+\def\macroargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ % Add the macroname to \macrolist
+ \toks0 = \expandafter{\macrolist\do}%
+ \xdef\macrolist{\the\toks0
+ \expandafter\noexpand\csname\the\macname\endcsname}%
+ \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\do\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\do \noexpand #1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \next}
+
+% We want to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+% For \indexnofonts, 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.
+%
+\def\emptyusermacros{\begingroup
+ \def\do##1{\let\noexpand##1=\noexpand\asis}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+ {%
+ \expandafter\let\obeyedspace=\empty
+ \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+ }%
+ \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references. The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross, , , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+% or the anchor name.
+% 2) NAME-snt - section number and type, passed as the SNT arg, or
+% empty for anchors.
+% 3) NAME-pg - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat. In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+ \pdfmkdest{#1}%
+ \iflinks
+ {%
+ \atdummies % preserve commands, but don't expand them
+ \turnoffactive
+ \otherbackslash
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\thissection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \writexrdef{pg}{\folio}% will be written later, during \shipout
+ }%
+ \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual\unskip}%
+ \setbox0=\hbox{\printedrefname\unskip}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printedrefname{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % Make link in pdf output.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\turnoffactive \otherbackslash
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{#1}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{\pdfmkpgn{#1}}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". We distinguish them by the
+ % LABEL-title being set to a magic string.
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd0 = 0pt
+ \refx{#1-snt}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % if the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd1 > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive \otherbackslash
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via a macro so it can be overridden.
+ \xrefprintnodename\printedrefname
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname XR#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file. Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions). But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
+ %
+ % Was that xref control sequence that we just defined for a float?
+ \expandafter\iffloat\csname XR#1\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{#1}}%
+ \fi
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+%
+\def\tryauxfile{%
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \readauxfile
+ \global\havexrefstrue
+ \fi
+ \closein 1
+}
+
+\def\readauxfile{\begingroup
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % This is to support \ in node names and titles, since the \
+ % characters end up in a \csname. It's easier than
+ % leaving it active and making its active definition an actual \
+ % character. What I don't understand is why it works in the *value*
+ % of the xrdef. Seems like it should be a catcode12 \, and that
+ % should not typeset properly. But it works, so I'm moving on for
+ % now. --karl, 15jan04.
+ \catcode`\\=\other
+ %
+ % Make the characters 128-255 be printing characters.
+ {%
+ \count 1=128
+ \def\loop{%
+ \catcode\count 1=\other
+ \advance\count 1 by 1
+ \ifnum \count 1<256 \loop \fi
+ }%
+ }%
+ %
+ % @ is our escape character in .aux files, and we need braces.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+ %
+ \input \jobname.aux
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\gdef\dofootnote{%
+ \insert\footins\bgroup
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished. Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes. --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+ \ifx \insert\ptexinsert
+ \let\insert\saveinsert
+ \else
+ \let\checkinserts\relax
+ \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+ \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+ \afterassignment\next
+ % swallow the left brace
+ \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+ \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+ {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+ \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
+ \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+ \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+ \next
+}
+\def\newsaveinsX #1{%
+ \csname newbox\endcsname #1%
+ \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+ \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup\hss
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \hss \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc. We don't actually implement floating yet, we always include the
+% float "here". But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label. Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored. It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+ \let\thiscaption=\empty
+ \let\thisshortcaption=\empty
+ %
+ % don't lose footnotes inside @float.
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \startsavinginserts
+ %
+ % We can't be used inside a paragraph.
+ \par
+ %
+ \vtop\bgroup
+ \def\floattype{#1}%
+ \def\floatlabel{#2}%
+ \def\floatloc{#3}% we do nothing with this yet.
+ %
+ \ifx\floattype\empty
+ \let\safefloattype=\empty
+ \else
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ \fi
+ %
+ % If label is given but no type, we handle that as the empty type.
+ \ifx\floatlabel\empty \else
+ % We want each FLOATTYPE to be numbered separately (Figure 1,
+ % Table 1, Figure 2, ...). (And if no label, no number.)
+ %
+ \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+ \global\advance\floatno by 1
+ %
+ {%
+ % This magic value for \thissection is output by \setref as the
+ % XREFLABEL-title value. \xrefX uses it to distinguish float
+ % labels (which have a completely different output format) from
+ % node and anchor labels. And \xrdef uses it to construct the
+ % lists of floats.
+ %
+ \edef\thissection{\floatmagic=\safefloattype}%
+ \setref{\floatlabel}{Yfloat}%
+ }%
+ \fi
+ %
+ % start with \parskip glue, I guess.
+ \vskip\parskip
+ %
+ % Don't suppress indentation if a float happens to start a section.
+ \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption: Foo 1.1
+% @float Foo & @caption{Cap}: Foo: Cap
+% @float Foo & no caption: Foo
+% @float ,lbl & Caption{Cap}: 1.1: Cap
+% @float ,lbl & no caption: 1.1
+% @float & @caption{Cap}: Cap
+% @float & no caption:
+%
+\def\Efloat{%
+ \let\floatident = \empty
+ %
+ % In all cases, if we have a float type, it comes first.
+ \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+ %
+ % If we have an xref label, the number comes next.
+ \ifx\floatlabel\empty \else
+ \ifx\floattype\empty \else % if also had float type, need tie first.
+ \appendtomacro\floatident{\tie}%
+ \fi
+ % the number.
+ \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+ \fi
+ %
+ % Start the printed caption with what we've constructed in
+ % \floatident, but keep it separate; we need \floatident again.
+ \let\captionline = \floatident
+ %
+ \ifx\thiscaption\empty \else
+ \ifx\floatident\empty \else
+ \appendtomacro\captionline{: }% had ident, so need a colon between
+ \fi
+ %
+ % caption text.
+ \appendtomacro\captionline{\scanexp\thiscaption}%
+ \fi
+ %
+ % If we have anything to print, print it, with space before.
+ % Eventually this needs to become an \insert.
+ \ifx\captionline\empty \else
+ \vskip.5\parskip
+ \captionline
+ %
+ % Space below caption.
+ \vskip\parskip
+ \fi
+ %
+ % If have an xref label, write the list of floats info. Do this
+ % after the caption, to avoid chance of it being a breakpoint.
+ \ifx\floatlabel\empty \else
+ % Write the text that goes in the lof to the aux file as
+ % \floatlabel-lof. Besides \floatident, we include the short
+ % caption if specified, else the full caption if specified, else nothing.
+ {%
+ \atdummies \turnoffactive \otherbackslash
+ % since we read the caption text in the macro world, where ^^M
+ % is turned into a normal character, we have to scan it back, so
+ % we don't write the literal three characters "^^M" into the aux file.
+ \scanexp{%
+ \xdef\noexpand\gtemp{%
+ \ifx\thisshortcaption\empty
+ \thiscaption
+ \else
+ \thisshortcaption
+ \fi
+ }%
+ }%
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+ \ifx\gtemp\empty \else : \gtemp \fi}}%
+ }%
+ \fi
+ \egroup % end of \vtop
+ %
+ % place the captured inserts
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use. Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+ \ifx#1\relax
+ % Haven't seen this figure type before.
+ \csname newcount\endcsname #1%
+ %
+ % Remember to reset this floatno at the next chap.
+ \expandafter\gdef\expandafter\resetallfloatnos
+ \expandafter{\resetallfloatnos #1=0 }%
+ \fi
+ \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value. We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref. That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string. If so, #2 will be the
+% (safe) float type for this float. We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+ \def\temp{#1}%
+ \def\iffloattype{#2}%
+ \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+ \def\floattype{#1}% floattype
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ %
+ % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+ \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+ \ifhavexrefs
+ % if the user said @listoffloats foo but never @float foo.
+ \message{\linenumber No `\safefloattype' floats to list.}%
+ \fi
+ \else
+ \begingroup
+ \leftskip=\tocindent % indent these entries like a toc
+ \let\do=\listoffloatsdo
+ \csname floatlist\safefloattype\endcsname
+ \endgroup
+ \fi
+}
+
+% This is called on each entry in a list of floats. We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file. We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+ % Can't fully expand XR#1-lof because it can contain anything. Just
+ % pass the control sequence. On the other hand, XR#1-pg is just the
+ % page number, and we want to fully expand that so we can get a link
+ % in pdf output.
+ \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+ %
+ % use the same \entry macro we use to generate the TOC and index.
+ \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+ \writeentry
+}}
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\parseargdef\documentlanguage{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{51\baselineskip}{160mm}
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@backslashcurfont}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\backslashcurfont}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+ @let"=@normaldoublequote
+ @let\=@realbackslash
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+ @unsepspaces
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'. (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+ arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/doc/value.texi b/doc/value.texi
new file mode 100644
index 0000000..e80311f
--- /dev/null
+++ b/doc/value.texi
@@ -0,0 +1,22 @@
+@c This is part of GNU tar manual.
+@c Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
+@c 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+@c See file tar.texi for copying conditions.
+
+@macro GNUTAR
+@acronym{GNU} @command{tar}
+@end macro
+
+@macro xopindex{option,text}
+@opindex \option\@r{, \text\}
+@end macro
+
+@macro opsummary{option}
+@ifclear ANCHOR--\option\
+@set ANCHOR--\option\ 1
+@anchor{--\option\}
+@end ifclear
+@xopindex{\option\, summary}
+@end macro
+
+
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644
index 0000000..ebaa8b2
--- /dev/null
+++ b/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 8 June 2007
+@set UPDATED-MONTH June 2007
+@set EDITION 1.17
+@set VERSION 1.17
diff --git a/lib/Makefile.am b/lib/Makefile.am
new file mode 100644
index 0000000..b9fc8a4
--- /dev/null
+++ b/lib/Makefile.am
@@ -0,0 +1,41 @@
+# Makefile for GNU tar library. -*- Makefile -*-
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2004,
+# 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+include gnulib.mk
+
+rmt-command.h : Makefile
+ rm -f $@-t $@
+ echo "#ifndef DEFAULT_RMT_COMMAND" >> $@-t
+ echo "# define DEFAULT_RMT_COMMAND \"$(DEFAULT_RMT_DIR)/`echo rmt | sed '$(transform)'`$(EXEEXT)\"" >> $@-t
+ echo "#endif" >> $@-t
+ mv $@-t $@
+BUILT_SOURCES += rmt-command.h
+CLEANFILES += rmt-command.h rmt-command.h-t
+
+noinst_HEADERS += system.h system-ioctl.h rmt.h paxlib.h stdopen.h
+libtar_a_SOURCES += \
+ paxerror.c paxexit.c paxlib.h paxnames.c \
+ prepargs.c prepargs.h \
+ rtapelib.c \
+ rmt.h \
+ stdopen.c stdopen.h \
+ system.h system-ioctl.h
+
+libtar_a_LIBADD += $(LIBOBJS)
+libtar_a_DEPENDENCIES += $(LIBOBJS)
diff --git a/lib/Makefile.in b/lib/Makefile.in
new file mode 100644
index 0000000..28589ae
--- /dev/null
+++ b/lib/Makefile.in
@@ -0,0 +1,1459 @@
+# Makefile.in generated by automake 1.10a from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007 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 GNU tar library. -*- Makefile -*-
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2004,
+# 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+# Copyright (C) 2004-2007 Free Software Foundation, Inc.
+#
+# This file is free software, distributed under the terms of the GNU
+# General Public License. As a special exception to the GNU General
+# Public License, this file may be distributed as part of a program
+# that contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+# Reproduce by: gnulib-tool --import --dir=. --local-dir=gl --lib=libtar --source-base=.#bootmp/lib --m4-base=.#bootmp/m4 --doc-base=.#bootmp/doc --aux-dir=.#bootmp/build-aux --avoid=lock --avoid=size_max --avoid=xsize --no-libtool --macro-prefix=gl alloca argmatch argp backupfile closeout configmake dirname error exclude exitfail fileblocks fnmatch-gnu ftruncate full-write getdate getline getopt getpagesize gettext gettime hash human inttostr inttypes lchown localcharset memset mkdtemp modechange obstack quote quotearg rmdir rpmatch safe-read save-cwd savedir setenv stat-time stdbool stdint stpcpy strdup strerror strtol strtoul timespec unlinkdir unlocked-io utime utimens version-etc-fsf xalloc xalloc-die xgetcwd xstrtoumax
+
+
+
+VPATH = @srcdir@
+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@
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/gnulib.mk alloca.c getdate.c \
+ waitpid.c
+subdir = lib
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/absolute-header.m4 \
+ $(top_srcdir)/m4/alloca.m4 $(top_srcdir)/m4/allocsa.m4 \
+ $(top_srcdir)/m4/argmatch.m4 $(top_srcdir)/m4/argp.m4 \
+ $(top_srcdir)/m4/backupfile.m4 $(top_srcdir)/m4/bison.m4 \
+ $(top_srcdir)/m4/canonicalize-lgpl.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/chown.m4 \
+ $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close-stream.m4 $(top_srcdir)/m4/closeout.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/d-ino.m4 \
+ $(top_srcdir)/m4/dirfd.m4 $(top_srcdir)/m4/dirname.m4 \
+ $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/double-slash-root.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eealloc.m4 \
+ $(top_srcdir)/m4/eoverflow.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exclude.m4 $(top_srcdir)/m4/exitfail.m4 \
+ $(top_srcdir)/m4/extensions.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-safer.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+ $(top_srcdir)/m4/fileblocks.m4 $(top_srcdir)/m4/float_h.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fpending.m4 \
+ $(top_srcdir)/m4/ftruncate.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdate.m4 $(top_srcdir)/m4/getdelim.m4 \
+ $(top_srcdir)/m4/getline.m4 $(top_srcdir)/m4/getopt.m4 \
+ $(top_srcdir)/m4/getpagesize.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/hash.m4 \
+ $(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intmax_t.m4 \
+ $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lchown.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/lstat.m4 $(top_srcdir)/m4/mbchar.m4 \
+ $(top_srcdir)/m4/mbiter.m4 $(top_srcdir)/m4/mbrtowc.m4 \
+ $(top_srcdir)/m4/mbscasecmp.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mempcpy.m4 \
+ $(top_srcdir)/m4/memrchr.m4 $(top_srcdir)/m4/memset.m4 \
+ $(top_srcdir)/m4/mkdtemp.m4 $(top_srcdir)/m4/mktime.m4 \
+ $(top_srcdir)/m4/modechange.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/pathmax.m4 \
+ $(top_srcdir)/m4/paxutils.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quote.m4 \
+ $(top_srcdir)/m4/quotearg.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/rmdir.m4 \
+ $(top_srcdir)/m4/rmt.m4 $(top_srcdir)/m4/rpmatch.m4 \
+ $(top_srcdir)/m4/rtapelib.m4 $(top_srcdir)/m4/safe-read.m4 \
+ $(top_srcdir)/m4/safe-write.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/savedir.m4 $(top_srcdir)/m4/setenv.m4 \
+ $(top_srcdir)/m4/sleep.m4 $(top_srcdir)/m4/ssize_t.m4 \
+ $(top_srcdir)/m4/stat-time.m4 $(top_srcdir)/m4/stdarg.m4 \
+ $(top_srcdir)/m4/stdbool.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/string_h.m4 $(top_srcdir)/m4/strndup.m4 \
+ $(top_srcdir)/m4/strnlen.m4 $(top_srcdir)/m4/strtoimax.m4 \
+ $(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoll.m4 \
+ $(top_srcdir)/m4/strtoul.m4 $(top_srcdir)/m4/strtoull.m4 \
+ $(top_srcdir)/m4/strtoumax.m4 $(top_srcdir)/m4/sys_stat_h.m4 \
+ $(top_srcdir)/m4/sys_time_h.m4 $(top_srcdir)/m4/sysexits.m4 \
+ $(top_srcdir)/m4/system.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/time_r.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
+ $(top_srcdir)/m4/unlinkdir.m4 $(top_srcdir)/m4/unlocked-io.m4 \
+ $(top_srcdir)/m4/utimbuf.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wchar.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wctype.m4 \
+ $(top_srcdir)/m4/wcwidth.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xgetcwd.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/xstrtol.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libtar_a_AR = $(AR) $(ARFLAGS)
+am__DEPENDENCIES_1 =
+am_libtar_a_OBJECTS = allocsa.$(OBJEXT) argp-ba.$(OBJEXT) \
+ argp-eexst.$(OBJEXT) argp-fmtstream.$(OBJEXT) \
+ argp-fs-xinl.$(OBJEXT) argp-help.$(OBJEXT) \
+ argp-parse.$(OBJEXT) argp-pin.$(OBJEXT) argp-pv.$(OBJEXT) \
+ argp-pvh.$(OBJEXT) argp-xinl.$(OBJEXT) full-write.$(OBJEXT) \
+ getdate.$(OBJEXT) localcharset.$(OBJEXT) mbchar.$(OBJEXT) \
+ mbscasecmp.$(OBJEXT) openat-die.$(OBJEXT) strnlen1.$(OBJEXT) \
+ version-etc.$(OBJEXT) version-etc-fsf.$(OBJEXT) \
+ xalloc-die.$(OBJEXT) xstrndup.$(OBJEXT) xstrtoumax.$(OBJEXT) \
+ paxerror.$(OBJEXT) paxexit.$(OBJEXT) paxnames.$(OBJEXT) \
+ prepargs.$(OBJEXT) rtapelib.$(OBJEXT) stdopen.$(OBJEXT)
+libtar_a_OBJECTS = $(am_libtar_a_OBJECTS)
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
+YLWRAP = $(top_srcdir)/build-aux/ylwrap
+SOURCES = $(libtar_a_SOURCES) $(EXTRA_libtar_a_SOURCES)
+DIST_SOURCES = $(libtar_a_SOURCES) $(EXTRA_libtar_a_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ABSOLUTE_DIRENT_H = @ABSOLUTE_DIRENT_H@
+ABSOLUTE_FCNTL_H = @ABSOLUTE_FCNTL_H@
+ABSOLUTE_FLOAT_H = @ABSOLUTE_FLOAT_H@
+ABSOLUTE_INTTYPES_H = @ABSOLUTE_INTTYPES_H@
+ABSOLUTE_STDINT_H = @ABSOLUTE_STDINT_H@
+ABSOLUTE_STDIO_H = @ABSOLUTE_STDIO_H@
+ABSOLUTE_STDLIB_H = @ABSOLUTE_STDLIB_H@
+ABSOLUTE_STRING_H = @ABSOLUTE_STRING_H@
+ABSOLUTE_SYSEXITS_H = @ABSOLUTE_SYSEXITS_H@
+ABSOLUTE_SYS_STAT_H = @ABSOLUTE_SYS_STAT_H@
+ABSOLUTE_SYS_TIME_H = @ABSOLUTE_SYS_TIME_H@
+ABSOLUTE_TIME_H = @ABSOLUTE_TIME_H@
+ABSOLUTE_UNISTD_H = @ABSOLUTE_UNISTD_H@
+ABSOLUTE_WCHAR_H = @ABSOLUTE_WCHAR_H@
+ABSOLUTE_WCTYPE_H = @ABSOLUTE_WCTYPE_H@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOM4TE = @AUTOM4TE@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BACKUP_LIBEXEC_SCRIPTS = @BACKUP_LIBEXEC_SCRIPTS@
+BACKUP_SBIN_SCRIPTS = @BACKUP_SBIN_SCRIPTS@
+BACKUP_SED_COND = @BACKUP_SED_COND@
+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@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFAULT_ARCHIVE = @DEFAULT_ARCHIVE@
+DEFAULT_ARCHIVE_FORMAT = @DEFAULT_ARCHIVE_FORMAT@
+DEFAULT_BLOCKING = @DEFAULT_BLOCKING@
+DEFAULT_QUOTING_STYLE = @DEFAULT_QUOTING_STYLE@
+DEFAULT_RMT_COMMAND = @DEFAULT_RMT_COMMAND@
+DEFAULT_RMT_DIR = @DEFAULT_RMT_DIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRENT_H = @DIRENT_H@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EOVERFLOW = @EOVERFLOW@
+EXEEXT = @EXEEXT@
+FCNTL_H = @FCNTL_H@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+GETOPT_H = @GETOPT_H@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GREP = @GREP@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_MKDIR = @HAVE_DECL_MKDIR@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_IO_H = @HAVE_IO_H@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_READLINK = @HAVE_READLINK@
+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_SLEEP = @HAVE_SLEEP@
+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_STRNDUP = @HAVE_STRNDUP@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_SYSEXITS_H = @HAVE_SYSEXITS_H@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE__BOOL = @HAVE__BOOL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTTYPES_H = @INTTYPES_H@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTAR_LIBDEPS = @LIBTAR_LIBDEPS@
+LIBTAR_LTLIBDEPS = @LIBTAR_LTLIBDEPS@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_SETSOCKOPT = @LIB_SETSOCKOPT@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PU_RMT_PROG = @PU_RMT_PROG@
+RANLIB = @RANLIB@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_FCHDIR = @REPLACE_FCHDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STRPTIME = @REPLACE_STRPTIME@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYSEXITS_H = @SYSEXITS_H@
+SYS_STAT_H = @SYS_STAT_H@
+SYS_TIME_H = @SYS_TIME_H@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WCHAR_H = @WCHAR_H@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WCTYPE_H = @WCTYPE_H@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+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@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = 1.5 gnits
+noinst_HEADERS = system.h system-ioctl.h rmt.h paxlib.h stdopen.h
+noinst_LIBRARIES = libtar.a
+noinst_LTLIBRARIES =
+EXTRA_DIST = alloca.c alloca_.h allocsa.valgrind argmatch.c argmatch.h \
+ backupfile.c backupfile.h canonicalize-lgpl.c canonicalize.h \
+ chdir-long.c chdir-long.h chown.c fchown-stub.c close-stream.c \
+ close-stream.h closeout.c closeout.h dirfd.c dirfd.h \
+ basename.c dirname.c dirname.h stripslash.c dup2.c error.c \
+ error.h exclude.c exclude.h exitfail.c exitfail.h dirent_.h \
+ fchdir.c fcntl_.h creat-safer.c fcntl--.h fcntl-safer.h \
+ open-safer.c fileblocks.c float_.h fnmatch.c fnmatch_.h \
+ fnmatch_loop.c __fpending.c __fpending.h ftruncate.c getcwd.c \
+ getdate.c getdate.h getdelim.c getdelim.h getline.c getline.h \
+ getopt.c getopt1.c getopt_.h getopt_int.h getpagesize.h \
+ gettime.c gettimeofday.c hash.c hash.h human.c human.h \
+ intprops.h imaxtostr.c inttostr.c inttostr.h offtostr.c \
+ uinttostr.c umaxtostr.c inttypes_.h lchown.c lchown.h \
+ config.charset ref-add.sin ref-del.sin lstat.c lstat.h \
+ malloc.c mbchar.h memchr.c mempcpy.c memrchr.c memset.c \
+ mkdtemp.c mktime.c modechange.c modechange.h obstack.c \
+ obstack.h at-func.c fchmodat.c fchownat.c fstatat.c mkdirat.c \
+ openat-priv.h openat-proc.c openat.c openat.h pathmax.h \
+ quote.c quote.h quotearg.c quotearg.h readlink.c regcomp.c \
+ regex.c regex.h regex_internal.c regex_internal.h regexec.c \
+ rmdir.c rpmatch.c safe-read.c safe-read.h safe-write.c \
+ safe-write.h same-inode.h save-cwd.c save-cwd.h savedir.c \
+ savedir.h setenv.c setenv.h unsetenv.c sleep.c stat-macros.h \
+ stat-time.h stdbool_.h stdint_.h stdio_.h stdlib_.h stpcpy.c \
+ strcasecmp.c strncasecmp.c strchrnul.c strdup.c strerror.c \
+ string_.h strndup.c strnlen.c strtoimax.c strtol.c strtoll.c \
+ strtoul.c strtoull.c strtoumax.c sys_stat_.h sys_time_.h \
+ sysexits_.h tempname.c tempname.h time_.h time_r.c timespec.h \
+ unistd_.h dup-safer.c fd-safer.c pipe-safer.c unistd--.h \
+ unistd-safer.h unlinkdir.c unlinkdir.h unlocked-io.h utime.c \
+ utimens.c utimens.h asnprintf.c float+.h printf-args.c \
+ printf-args.h printf-parse.c printf-parse.h vasnprintf.c \
+ vasnprintf.h vsnprintf.c wchar_.h wctype_.h xalloc.h xmalloc.c \
+ xgetcwd.c xgetcwd.h xstrtol.c xstrtol.h xstrtoul.c
+BUILT_SOURCES = $(ALLOCA_H) configmake.h $(DIRENT_H) $(FCNTL_H) \
+ $(FLOAT_H) $(FNMATCH_H) getdate.c $(GETOPT_H) $(INTTYPES_H) \
+ $(STDBOOL_H) $(STDINT_H) stdio.h stdlib.h string.h \
+ $(SYS_STAT_H) $(SYS_TIME_H) $(SYSEXITS_H) time.h unistd.h \
+ $(WCHAR_H) $(WCTYPE_H) rmt-command.h
+SUFFIXES = .sed .sin
+MOSTLYCLEANFILES = core *.stackdump alloca.h alloca.h-t dirent.h \
+ dirent.h-t fcntl.h fcntl.h-t float.h float.h-t fnmatch.h \
+ fnmatch.h-t getopt.h getopt.h-t inttypes.h inttypes.h-t \
+ stdbool.h stdbool.h-t stdint.h stdint.h-t stdio.h stdio.h-t \
+ stdlib.h stdlib.h-t string.h string.h-t sys/stat.h \
+ sys/stat.h-t sys/time.h sys/time.h-t sysexits.h sysexits.h-t \
+ time.h time.h-t unistd.h unistd.h-t wchar.h wchar.h-t wctype.h \
+ wctype.h-t
+MOSTLYCLEANDIRS = sys
+CLEANFILES = configmake.h configmake.h-t charset.alias ref-add.sed \
+ ref-del.sed rmt-command.h rmt-command.h-t
+DISTCLEANFILES =
+MAINTAINERCLEANFILES = getdate.c
+AM_CPPFLAGS =
+
+# This is for those projects which use "gettextize --intl" to put a source-code
+# copy of libintl into their package. In such projects, every Makefile.am needs
+# -I$(top_builddir)/intl, so that <libintl.h> can be found in this directory.
+# For the Makefile.ams in other directories it is the maintainer's
+# responsibility; for the one from gnulib we do it here.
+# This option has no effect when the user disables NLS (because then the intl
+# directory contains no libintl.h file) or when the project does not use
+# "gettextize --intl".
+#AM_CPPFLAGS += -I$(top_builddir)/intl
+libtar_a_SOURCES = allocsa.h allocsa.c argp.h argp-ba.c argp-eexst.c \
+ argp-fmtstream.c argp-fmtstream.h argp-fs-xinl.c argp-help.c \
+ argp-namefrob.h argp-parse.c argp-pin.c argp-pv.c argp-pvh.c \
+ argp-xinl.c full-write.h full-write.c getdate.y gettext.h \
+ localcharset.h localcharset.c mbchar.c mbscasecmp.c mbuiter.h \
+ openat-die.c strnlen1.h strnlen1.c verify.h version-etc.h \
+ version-etc.c version-etc-fsf.c wcwidth.h xalloc-die.c \
+ xstrndup.h xstrndup.c xstrtoumax.c paxerror.c paxexit.c \
+ paxlib.h paxnames.c prepargs.c prepargs.h rtapelib.c rmt.h \
+ stdopen.c stdopen.h system.h system-ioctl.h
+libtar_a_LIBADD = $(gl_LIBOBJS) @ALLOCA@ $(LIBOBJS)
+libtar_a_DEPENDENCIES = $(gl_LIBOBJS) @ALLOCA@ $(LIBOBJS)
+EXTRA_libtar_a_SOURCES = alloca.c argmatch.c backupfile.c \
+ canonicalize-lgpl.c chdir-long.c chown.c fchown-stub.c \
+ close-stream.c closeout.c dirfd.c basename.c dirname.c \
+ stripslash.c dup2.c error.c exclude.c exitfail.c fchdir.c \
+ creat-safer.c open-safer.c fileblocks.c fnmatch.c \
+ fnmatch_loop.c __fpending.c ftruncate.c getcwd.c getdelim.c \
+ getline.c getopt.c getopt1.c gettime.c gettimeofday.c hash.c \
+ human.c imaxtostr.c inttostr.c offtostr.c uinttostr.c \
+ umaxtostr.c lchown.c lstat.c malloc.c memchr.c mempcpy.c \
+ memrchr.c memset.c mkdtemp.c mktime.c modechange.c obstack.c \
+ at-func.c fchmodat.c fchownat.c fstatat.c mkdirat.c \
+ openat-proc.c openat.c quote.c quotearg.c readlink.c regcomp.c \
+ regex.c regex_internal.c regexec.c rmdir.c rpmatch.c \
+ safe-read.c safe-write.c save-cwd.c savedir.c setenv.c \
+ unsetenv.c sleep.c stpcpy.c strcasecmp.c strncasecmp.c \
+ strchrnul.c strdup.c strerror.c strndup.c strnlen.c \
+ strtoimax.c strtol.c strtoll.c strtoul.c strtoull.c \
+ strtoumax.c tempname.c time_r.c dup-safer.c fd-safer.c \
+ pipe-safer.c unlinkdir.c utime.c utimens.c asnprintf.c \
+ printf-args.c printf-parse.c vasnprintf.c vsnprintf.c \
+ xmalloc.c xgetcwd.c xstrtol.c xstrtoul.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__ || 60000000 <= __DECC_VER)
+LINK_WARNING_H = $(top_srcdir)/build-aux/link-warning.h
+charset_alias = $(DESTDIR)$(libdir)/charset.alias
+charset_tmp = $(DESTDIR)$(libdir)/charset.tmp
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .sed .sin .c .o .obj .y
+$(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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits lib/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnits lib/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(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
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libtar.a: $(libtar_a_OBJECTS) $(libtar_a_DEPENDENCIES)
+ -rm -f libtar.a
+ $(libtar_a_AR) libtar.a $(libtar_a_OBJECTS) $(libtar_a_LIBADD)
+ $(RANLIB) libtar.a
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/waitpid.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/__fpending.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloca.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allocsa.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argmatch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-ba.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-eexst.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-fmtstream.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-fs-xinl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-help.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-parse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-pin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-pv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-pvh.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argp-xinl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asnprintf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/at-func.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backupfile.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basename.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/canonicalize-lgpl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chdir-long.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chown.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/close-stream.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closeout.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/creat-safer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirfd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirname.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup-safer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exclude.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exitfail.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fchdir.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fchmodat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fchown-stub.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fchownat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fd-safer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileblocks.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch_loop.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstatat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftruncate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/full-write.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getcwd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdelim.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getline.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gettime.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gettimeofday.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/human.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imaxtostr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inttostr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lchown.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localcharset.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbchar.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbscasecmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memchr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mempcpy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memrchr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memset.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkdirat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkdtemp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktime.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modechange.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/obstack.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/offtostr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/open-safer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat-die.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat-proc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paxerror.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paxexit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paxnames.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipe-safer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prepargs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-args.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-parse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quote.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quotearg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readlink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regcomp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex_internal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regexec.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmdir.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpmatch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtapelib.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safe-read.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safe-write.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/save-cwd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/savedir.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setenv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sleep.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdopen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpcpy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcasecmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strchrnul.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strdup.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stripslash.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strncasecmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strndup.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strnlen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strnlen1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtoimax.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtol.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtoll.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtoul.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtoull.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtoumax.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tempname.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_r.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uinttostr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/umaxtostr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unlinkdir.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unsetenv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utime.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utimens.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vasnprintf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version-etc-fsf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version-etc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsnprintf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xalloc-die.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetcwd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrndup.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrtol.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrtoul.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrtoumax.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.y.c:
+ $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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) $(HEADERS) all-local
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+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 -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."
+ -rm -f getdate.c
+ -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 -rf $(DEPDIR) ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-exec-local
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf $(DEPDIR) ./$(DEPDIR)
+ -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: uninstall-local
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
+ clean-generic clean-noinstLIBRARIES clean-noinstLTLIBRARIES \
+ ctags 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-exec-local \
+ 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 uninstall \
+ uninstall-am uninstall-local
+
+
+# We need the following in order to create <alloca.h> when the system
+# doesn't have one that works with the given compiler.
+alloca.h: alloca_.h
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/alloca_.h; \
+ } > $@-t
+ mv -f $@-t $@
+
+# Retrieve values of the variables through 'configure' followed by
+# 'make', not directly through 'configure', so that a user who
+# sets some of these variables consistently on the 'make' command
+# line gets correct results.
+#
+# One advantage of this approach, compared to the classical
+# approach of adding -DLIBDIR=\"$(libdir)\" etc. to AM_CPPFLAGS,
+# is that it protects against the use of undefined variables.
+# If, say, $(libdir) is not set in the Makefile, LIBDIR is not
+# defined by this module, and code using LIBDIR gives a
+# compilation error.
+#
+# Another advantage is that 'make' output is shorter.
+#
+# Listed in the same order as the GNU makefile conventions.
+# The Automake-defined pkg* macros are appended, in the order
+# listed in the Automake 1.10a+ documentation.
+configmake.h: Makefile
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ echo '#define PREFIX "$(prefix)"'; \
+ echo '#define EXEC_PREFIX "$(exec_prefix)"'; \
+ echo '#define BINDIR "$(bindir)"'; \
+ echo '#define SBINDIR "$(sbindir)"'; \
+ echo '#define LIBEXECDIR "$(libexecdir)"'; \
+ echo '#define DATAROOTDIR "$(datarootdir)"'; \
+ echo '#define DATADIR "$(datadir)"'; \
+ echo '#define SYSCONFDIR "$(sysconfdir)"'; \
+ echo '#define SHAREDSTATEDIR "$(sharedstatedir)"'; \
+ echo '#define LOCALSTATEDIR "$(localstatedir)"'; \
+ echo '#define INCLUDEDIR "$(includedir)"'; \
+ echo '#define OLDINCLUDEDIR "$(oldincludedir)"'; \
+ echo '#define DOCDIR "$(docdir)"'; \
+ echo '#define INFODIR "$(infodir)"'; \
+ echo '#define HTMLDIR "$(htmldir)"'; \
+ echo '#define DVIDIR "$(dvidir)"'; \
+ echo '#define PDFDIR "$(pdfdir)"'; \
+ echo '#define PSDIR "$(psdir)"'; \
+ echo '#define LIBDIR "$(libdir)"'; \
+ echo '#define LISPDIR "$(lispdir)"'; \
+ echo '#define LOCALEDIR "$(localedir)"'; \
+ echo '#define MANDIR "$(mandir)"'; \
+ echo '#define MANEXT "$(manext)"'; \
+ echo '#define PKGDATADIR "$(pkgdatadir)"'; \
+ echo '#define PKGINCLUDEDIR "$(pkgincludedir)"'; \
+ echo '#define PKGLIBDIR "$(pkglibdir)"'; \
+ echo '#define PKGLIBEXECDIR "$(pkglibexecdir)"'; \
+ } | sed '/""/d' > $@-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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''ABSOLUTE_DIRENT_H''@|$(ABSOLUTE_DIRENT_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \
+ < $(srcdir)/dirent_.h; \
+ } > $@-t
+ mv $@-t $@
+
+# 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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''ABSOLUTE_FCNTL_H''@|$(ABSOLUTE_FCNTL_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ < $(srcdir)/fcntl_.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.
+float.h: float_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''ABSOLUTE_FLOAT_H''@|$(ABSOLUTE_FLOAT_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ < $(srcdir)/float_.h; \
+ } > $@-t
+ mv $@-t $@
+
+# We need the following in order to create <fnmatch.h> when the system
+# doesn't have one that supports the required API.
+fnmatch.h: fnmatch_.h
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/fnmatch_.h; \
+ } > $@-t
+ mv -f $@-t $@
+
+# 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_.h
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/getopt_.h; \
+ } > $@-t
+ mv -f $@-t $@
+
+# 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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's|@''ABSOLUTE_INTTYPES_H''@|$(ABSOLUTE_INTTYPES_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's/@''PRI_MACROS_BROKEN''@/$(PRI_MACROS_BROKEN)/g' \
+ -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
+ -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/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 '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+ < $(srcdir)/inttypes_.h; \
+ } > $@-t
+ mv $@-t $@
+
+# We need the following in order to install a simple file in $(libdir)
+# which is shared with other installed packages. We use a list of referencing
+# packages so that "make uninstall" will remove the file if and only if it
+# is not used by another installed package.
+# On systems with glibc-2.1 or newer, the file is redundant, therefore we
+# avoid installing it.
+
+all-local: charset.alias ref-add.sed ref-del.sed
+install-exec-local: all-local
+ test $(GLIBC21) != no || $(mkinstalldirs) $(DESTDIR)$(libdir)
+ if test -f $(charset_alias); then \
+ sed -f ref-add.sed $(charset_alias) > $(charset_tmp) ; \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \
+ rm -f $(charset_tmp) ; \
+ else \
+ if test $(GLIBC21) = no; then \
+ sed -f ref-add.sed charset.alias > $(charset_tmp) ; \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \
+ rm -f $(charset_tmp) ; \
+ fi ; \
+ fi
+
+uninstall-local: all-local
+ if test -f $(charset_alias); then \
+ sed -f ref-del.sed $(charset_alias) > $(charset_tmp); \
+ if grep '^# Packages using this file: $$' $(charset_tmp) \
+ > /dev/null; then \
+ rm -f $(charset_alias); \
+ else \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias); \
+ fi; \
+ rm -f $(charset_tmp); \
+ fi
+
+charset.alias: config.charset
+ rm -f t-$@ $@
+ $(SHELL) $(srcdir)/config.charset '$(host)' > t-$@
+ mv t-$@ $@
+.sin.sed:
+ rm -f t-$@ $@
+ sed -e '/^#/d' -e 's/@''PACKAGE''@/$(PACKAGE)/g' $< > t-$@
+ mv t-$@ $@
+
+# We need the following in order to create <stdbool.h> when the system
+# doesn't have one that works.
+stdbool.h: stdbool_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool_.h; \
+ } > $@-t
+ mv $@-t $@
+
+# We need the following in order to create <stdint.h> when the system
+# doesn't have one that works with the given compiler.
+stdint.h: stdint_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+ -e 's|@''ABSOLUTE_STDINT_H''@|$(ABSOLUTE_STDINT_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/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_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
+ -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/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' \
+ < $(srcdir)/stdint_.h; \
+ } > $@-t
+ mv $@-t $@
+
+# 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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''ABSOLUTE_STDIO_H''@|$(ABSOLUTE_STDIO_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''GNULIB_FPRINTF_POSIX''@|$(GNULIB_FPRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_PRINTF_POSIX''@|$(GNULIB_PRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_SNPRINTF''@|$(GNULIB_SNPRINTF)|g' \
+ -e 's|@''GNULIB_SPRINTF_POSIX''@|$(GNULIB_SPRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_VFPRINTF_POSIX''@|$(GNULIB_VFPRINTF_POSIX)|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_VASPRINTF''@|$(GNULIB_VASPRINTF)|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_FFLUSH''@|$(GNULIB_FFLUSH)|g' \
+ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \
+ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \
+ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \
+ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \
+ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
+ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
+ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
+ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \
+ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \
+ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
+ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
+ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
+ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
+ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \
+ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
+ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \
+ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
+ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+ < $(srcdir)/stdio_.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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''ABSOLUTE_STDLIB_H''@|$(ABSOLUTE_STDLIB_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''GNULIB_GETSUBOPT''@|$(GNULIB_GETSUBOPT)|g' \
+ -e 's|@''GNULIB_MKDTEMP''@|$(GNULIB_MKDTEMP)|g' \
+ -e 's|@''GNULIB_MKSTEMP''@|$(GNULIB_MKSTEMP)|g' \
+ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+ < $(srcdir)/stdlib_.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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''ABSOLUTE_STRING_H''@|$(ABSOLUTE_STRING_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''GNULIB_MBSLEN''@|$(GNULIB_MBSLEN)|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_MEMMEM''@|$(GNULIB_MEMMEM)|g' \
+ -e 's|@''GNULIB_MEMPCPY''@|$(GNULIB_MEMPCPY)|g' \
+ -e 's|@''GNULIB_MEMRCHR''@|$(GNULIB_MEMRCHR)|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_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_STRCASESTR''@|$(GNULIB_STRCASESTR)|g' \
+ -e 's|@''GNULIB_STRTOK_R''@|$(GNULIB_STRTOK_R)|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_STPCPY''@|$(HAVE_STPCPY)|g' \
+ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+ -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
+ -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
+ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+ -e 's|@''HAVE_STRNDUP''@|$(HAVE_STRNDUP)|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 '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+ < $(srcdir)/string_.h; \
+ } > $@-t
+ mv $@-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_.h
+ @MKDIR_P@ sys
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''ABSOLUTE_SYS_STAT_H''@|$(ABSOLUTE_SYS_STAT_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''HAVE_IO_H''@|$(HAVE_IO_H)|g' \
+ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \
+ -e 's|@''HAVE_DECL_MKDIR''@|$(HAVE_DECL_MKDIR)|g' \
+ < $(srcdir)/sys_stat_.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_.h
+ @MKDIR_P@ sys
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \
+ -e 's|@''ABSOLUTE_SYS_TIME_H''@|$(ABSOLUTE_SYS_TIME_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \
+ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \
+ < $(srcdir)/sys_time_.h; \
+ } > $@-t
+ mv $@-t $@
+
+# We need the following in order to create <sysexits.h> when the system
+# doesn't have one that works with the given compiler.
+sysexits.h: sysexits_.h
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SYSEXITS_H''@|$(HAVE_SYSEXITS_H)|g' \
+ -e 's|@''ABSOLUTE_SYSEXITS_H''@|$(ABSOLUTE_SYSEXITS_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ < $(srcdir)/sysexits_.h; \
+ } > $@-t
+ mv -f $@-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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@ABSOLUTE_TIME_H''@|$(ABSOLUTE_TIME_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \
+ -e 's|@REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \
+ -e 's|@REPLACE_STRPTIME''@|$(REPLACE_STRPTIME)|g' \
+ -e 's|@REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|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' \
+ < $(srcdir)/time_.h; \
+ } > $@-t
+ mv $@-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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+ -e 's|@''ABSOLUTE_UNISTD_H''@|$(ABSOLUTE_UNISTD_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \
+ -e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \
+ -e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \
+ -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \
+ -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \
+ -e 's|@''GNULIB_GETLOGIN_R''@|$(GNULIB_GETLOGIN_R)|g' \
+ -e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \
+ -e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \
+ -e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \
+ -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
+ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+ -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \
+ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+ < $(srcdir)/unistd_.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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''ABSOLUTE_WCHAR_H''@|$(ABSOLUTE_WCHAR_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ < $(srcdir)/wchar_.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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \
+ -e 's|@''ABSOLUTE_WCTYPE_H''@|$(ABSOLUTE_WCTYPE_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
+ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
+ < $(srcdir)/wctype_.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
+
+rmt-command.h : Makefile
+ rm -f $@-t $@
+ echo "#ifndef DEFAULT_RMT_COMMAND" >> $@-t
+ echo "# define DEFAULT_RMT_COMMAND \"$(DEFAULT_RMT_DIR)/`echo rmt | sed '$(transform)'`$(EXEEXT)\"" >> $@-t
+ echo "#endif" >> $@-t
+ mv $@-t $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/__fpending.c b/lib/__fpending.c
new file mode 100644
index 0000000..221aee6
--- /dev/null
+++ b/lib/__fpending.c
@@ -0,0 +1,30 @@
+/* __fpending.c -- return the number of pending output bytes on a stream
+ Copyright (C) 2000, 2004, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "__fpending.h"
+
+/* Return the number of pending (aka buffered, unflushed)
+ bytes on the stream, FP, that is open for writing. */
+size_t
+__fpending (FILE *fp)
+{
+ return PENDING_OUTPUT_N_BYTES;
+}
diff --git a/lib/__fpending.h b/lib/__fpending.h
new file mode 100644
index 0000000..8a8aabc
--- /dev/null
+++ b/lib/__fpending.h
@@ -0,0 +1,34 @@
+/* Declare __fpending.
+
+ Copyright (C) 2000, 2003, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ Written by Jim Meyering. */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifndef HAVE_DECL___FPENDING
+"this configure-time declaration test was not run"
+#endif
+
+#if HAVE_DECL___FPENDING
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+#else
+size_t __fpending (FILE *);
+#endif
diff --git a/lib/alloca.c b/lib/alloca.c
new file mode 100644
index 0000000..3a1f4e2
--- /dev/null
+++ b/lib/alloca.c
@@ -0,0 +1,489 @@
+/* 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 2, this file's not needed. */
+#if !defined (__GNUC__) || __GNUC__ < 2
+
+/* 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 */
+
+/* If your stack is a linked list of frames, you have to
+ provide an "address metric" ADDRESS_FUNCTION macro. */
+
+# if defined (CRAY) && defined (CRAY_STACKSEG_END)
+long i00afunc ();
+# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
+# else
+# define ADDRESS_FUNCTION(arg) &(arg)
+# endif
+
+/* 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 void
+find_stack_direction (void)
+{
+ static char *addr = NULL; /* Address of first `dummy', once known. */
+ auto char dummy; /* To get stack address. */
+
+ if (addr == NULL)
+ { /* Initial entry. */
+ addr = ADDRESS_FUNCTION (dummy);
+
+ find_stack_direction (); /* Recurse once. */
+ }
+ else
+ {
+ /* Second entry. */
+ if (ADDRESS_FUNCTION (dummy) > addr)
+ stack_dir = 1; /* Stack grew upward. */
+ else
+ stack_dir = -1; /* Stack grew downward. */
+ }
+}
+
+# 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 = ADDRESS_FUNCTION (probe);
+
+# if STACK_DIRECTION == 0
+ if (STACK_DIR == 0) /* Unknown growth direction. */
+ find_stack_direction ();
+# 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);
+ }
+}
+
+# if defined (CRAY) && defined (CRAY_STACKSEG_END)
+
+# ifdef DEBUG_I00AFUNC
+# include <stdio.h>
+# endif
+
+# ifndef CRAY_STACK
+# define CRAY_STACK
+# ifndef CRAY2
+/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
+struct stack_control_header
+ {
+ long shgrow:32; /* Number of times stack has grown. */
+ long shaseg:32; /* Size of increments to stack. */
+ long shhwm:32; /* High water mark of stack. */
+ long shsize:32; /* Current size of stack (all segments). */
+ };
+
+/* The stack segment linkage control information occurs at
+ the high-address end of a stack segment. (The stack
+ grows from low addresses to high addresses.) The initial
+ part of the stack segment linkage control information is
+ 0200 (octal) words. This provides for register storage
+ for the routine which overflows the stack. */
+
+struct stack_segment_linkage
+ {
+ long ss[0200]; /* 0200 overflow words. */
+ long sssize:32; /* Number of words in this segment. */
+ long ssbase:32; /* Offset to stack base. */
+ long:32;
+ long sspseg:32; /* Offset to linkage control of previous
+ segment of stack. */
+ long:32;
+ long sstcpt:32; /* Pointer to task common address block. */
+ long sscsnm; /* Private control structure number for
+ microtasking. */
+ long ssusr1; /* Reserved for user. */
+ long ssusr2; /* Reserved for user. */
+ long sstpid; /* Process ID for pid based multi-tasking. */
+ long ssgvup; /* Pointer to multitasking thread giveup. */
+ long sscray[7]; /* Reserved for Cray Research. */
+ long ssa0;
+ long ssa1;
+ long ssa2;
+ long ssa3;
+ long ssa4;
+ long ssa5;
+ long ssa6;
+ long ssa7;
+ long sss0;
+ long sss1;
+ long sss2;
+ long sss3;
+ long sss4;
+ long sss5;
+ long sss6;
+ long sss7;
+ };
+
+# else /* CRAY2 */
+/* The following structure defines the vector of words
+ returned by the STKSTAT library routine. */
+struct stk_stat
+ {
+ long now; /* Current total stack size. */
+ long maxc; /* Amount of contiguous space which would
+ be required to satisfy the maximum
+ stack demand to date. */
+ long high_water; /* Stack high-water mark. */
+ long overflows; /* Number of stack overflow ($STKOFEN) calls. */
+ long hits; /* Number of internal buffer hits. */
+ long extends; /* Number of block extensions. */
+ long stko_mallocs; /* Block allocations by $STKOFEN. */
+ long underflows; /* Number of stack underflow calls ($STKRETN). */
+ long stko_free; /* Number of deallocations by $STKRETN. */
+ long stkm_free; /* Number of deallocations by $STKMRET. */
+ long segments; /* Current number of stack segments. */
+ long maxs; /* Maximum number of stack segments so far. */
+ long pad_size; /* Stack pad size. */
+ long current_address; /* Current stack segment address. */
+ long current_size; /* Current stack segment size. This
+ number is actually corrupted by STKSTAT to
+ include the fifteen word trailer area. */
+ long initial_address; /* Address of initial segment. */
+ long initial_size; /* Size of initial segment. */
+ };
+
+/* The following structure describes the data structure which trails
+ any stack segment. I think that the description in 'asdef' is
+ out of date. I only describe the parts that I am sure about. */
+
+struct stk_trailer
+ {
+ long this_address; /* Address of this block. */
+ long this_size; /* Size of this block (does not include
+ this trailer). */
+ long unknown2;
+ long unknown3;
+ long link; /* Address of trailer block of previous
+ segment. */
+ long unknown5;
+ long unknown6;
+ long unknown7;
+ long unknown8;
+ long unknown9;
+ long unknown10;
+ long unknown11;
+ long unknown12;
+ long unknown13;
+ long unknown14;
+ };
+
+# endif /* CRAY2 */
+# endif /* not CRAY_STACK */
+
+# ifdef CRAY2
+/* Determine a "stack measure" for an arbitrary ADDRESS.
+ I doubt that "lint" will like this much. */
+
+static long
+i00afunc (long *address)
+{
+ struct stk_stat status;
+ struct stk_trailer *trailer;
+ long *block, size;
+ long result = 0;
+
+ /* We want to iterate through all of the segments. The first
+ step is to get the stack status structure. We could do this
+ more quickly and more directly, perhaps, by referencing the
+ $LM00 common block, but I know that this works. */
+
+ STKSTAT (&status);
+
+ /* Set up the iteration. */
+
+ trailer = (struct stk_trailer *) (status.current_address
+ + status.current_size
+ - 15);
+
+ /* There must be at least one stack segment. Therefore it is
+ a fatal error if "trailer" is null. */
+
+ if (trailer == 0)
+ abort ();
+
+ /* Discard segments that do not contain our argument address. */
+
+ while (trailer != 0)
+ {
+ block = (long *) trailer->this_address;
+ size = trailer->this_size;
+ if (block == 0 || size == 0)
+ abort ();
+ trailer = (struct stk_trailer *) trailer->link;
+ if ((block <= address) && (address < (block + size)))
+ break;
+ }
+
+ /* Set the result to the offset in this segment and add the sizes
+ of all predecessor segments. */
+
+ result = address - block;
+
+ if (trailer == 0)
+ {
+ return result;
+ }
+
+ do
+ {
+ if (trailer->this_size <= 0)
+ abort ();
+ result += trailer->this_size;
+ trailer = (struct stk_trailer *) trailer->link;
+ }
+ while (trailer != 0);
+
+ /* We are done. Note that if you present a bogus address (one
+ not in any segment), you will get a different number back, formed
+ from subtracting the address of the first block. This is probably
+ not what you want. */
+
+ return (result);
+}
+
+# else /* not CRAY2 */
+/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
+ Determine the number of the cell within the stack,
+ given the address of the cell. The purpose of this
+ routine is to linearize, in some sense, stack addresses
+ for alloca. */
+
+static long
+i00afunc (long address)
+{
+ long stkl = 0;
+
+ long size, pseg, this_segment, stack;
+ long result = 0;
+
+ struct stack_segment_linkage *ssptr;
+
+ /* Register B67 contains the address of the end of the
+ current stack segment. If you (as a subprogram) store
+ your registers on the stack and find that you are past
+ the contents of B67, you have overflowed the segment.
+
+ B67 also points to the stack segment linkage control
+ area, which is what we are really interested in. */
+
+ stkl = CRAY_STACKSEG_END ();
+ ssptr = (struct stack_segment_linkage *) stkl;
+
+ /* If one subtracts 'size' from the end of the segment,
+ one has the address of the first word of the segment.
+
+ If this is not the first segment, 'pseg' will be
+ nonzero. */
+
+ pseg = ssptr->sspseg;
+ size = ssptr->sssize;
+
+ this_segment = stkl - size;
+
+ /* It is possible that calling this routine itself caused
+ a stack overflow. Discard stack segments which do not
+ contain the target address. */
+
+ while (!(this_segment <= address && address <= stkl))
+ {
+# ifdef DEBUG_I00AFUNC
+ fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
+# endif
+ if (pseg == 0)
+ break;
+ stkl = stkl - pseg;
+ ssptr = (struct stack_segment_linkage *) stkl;
+ size = ssptr->sssize;
+ pseg = ssptr->sspseg;
+ this_segment = stkl - size;
+ }
+
+ result = address - this_segment;
+
+ /* If you subtract pseg from the current end of the stack,
+ you get the address of the previous stack segment's end.
+ This seems a little convoluted to me, but I'll bet you save
+ a cycle somewhere. */
+
+ while (pseg != 0)
+ {
+# ifdef DEBUG_I00AFUNC
+ fprintf (stderr, "%011o %011o\n", pseg, size);
+# endif
+ stkl = stkl - pseg;
+ ssptr = (struct stack_segment_linkage *) stkl;
+ size = ssptr->sssize;
+ pseg = ssptr->sspseg;
+ result += size;
+ }
+ return (result);
+}
+
+# endif /* not CRAY2 */
+# endif /* CRAY */
+
+# endif /* no alloca */
+#endif /* not GCC version 2 */
diff --git a/lib/alloca_.h b/lib/alloca_.h
new file mode 100644
index 0000000..af274b9
--- /dev/null
+++ b/lib/alloca_.h
@@ -0,0 +1,54 @@
+/* Memory allocation on the stack.
+
+ Copyright (C) 1995, 1999, 2001-2004, 2006-2007 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+/* 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
+# ifdef __GNUC__
+# define alloca __builtin_alloca
+# elif defined _AIX
+# define alloca __alloca
+# elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# include <stddef.h>
+# ifdef __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+# endif
+#endif
+
+#endif /* _GL_ALLOCA_H */
diff --git a/lib/allocsa.c b/lib/allocsa.c
new file mode 100644
index 0000000..97652e6
--- /dev/null
+++ b/lib/allocsa.c
@@ -0,0 +1,137 @@
+/* Safe automatic memory allocation.
+ Copyright (C) 2003, 2006 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "allocsa.h"
+
+/* The speed critical point in this file is freesa() applied to an alloca()
+ result: it must be fast, to match the speed of alloca(). The speed of
+ mallocsa() and freesa() in the other case are not critical, because they
+ are only invoked for big memory sizes. */
+
+#if HAVE_ALLOCA
+
+/* Store the mallocsa() results in a hash table. This is needed to reliably
+ distinguish a mallocsa() result and an alloca() result.
+
+ Although it is possible that the same pointer is returned by alloca() and
+ by mallocsa() at different times in the same application, it does not lead
+ to a bug in freesa(), because:
+ - Before a pointer returned by alloca() can point into malloc()ed memory,
+ the function must return, and once this has happened the programmer must
+ not call freesa() on it anyway.
+ - Before a pointer returned by mallocsa() can point into the stack, it
+ must be freed. The only function that can free it is freesa(), and
+ when freesa() frees it, it also removes it from the hash table. */
+
+#define MAGIC_NUMBER 0x1415fb4a
+#define MAGIC_SIZE sizeof (int)
+/* This is how the header info would look like without any alignment
+ considerations. */
+struct preliminary_header { void *next; char room[MAGIC_SIZE]; };
+/* But the header's size must be a multiple of sa_alignment_max. */
+#define HEADER_SIZE \
+ (((sizeof (struct preliminary_header) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max)
+struct header { void *next; char room[HEADER_SIZE - sizeof (struct preliminary_header) + MAGIC_SIZE]; };
+/* Verify that HEADER_SIZE == sizeof (struct header). */
+typedef int verify1[2 * (HEADER_SIZE == sizeof (struct header)) - 1];
+/* We make the hash table quite big, so that during lookups the probability
+ of empty hash buckets is quite high. There is no need to make the hash
+ table resizable, because when the hash table gets filled so much that the
+ lookup becomes slow, it means that the application has memory leaks. */
+#define HASH_TABLE_SIZE 257
+static void * mallocsa_results[HASH_TABLE_SIZE];
+
+#endif
+
+void *
+mallocsa (size_t n)
+{
+#if HAVE_ALLOCA
+ /* Allocate one more word, that serves as an indicator for malloc()ed
+ memory, so that freesa() of an alloca() result is fast. */
+ size_t nplus = n + HEADER_SIZE;
+
+ if (nplus >= n)
+ {
+ char *p = (char *) malloc (nplus);
+
+ if (p != NULL)
+ {
+ size_t slot;
+
+ p += HEADER_SIZE;
+
+ /* Put a magic number into the indicator word. */
+ ((int *) p)[-1] = MAGIC_NUMBER;
+
+ /* Enter p into the hash table. */
+ slot = (unsigned long) p % HASH_TABLE_SIZE;
+ ((struct header *) (p - HEADER_SIZE))->next = mallocsa_results[slot];
+ mallocsa_results[slot] = p;
+
+ 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
+freesa (void *p)
+{
+ /* mallocsa() may have returned NULL. */
+ if (p != NULL)
+ {
+ /* Attempt to quickly distinguish the mallocsa() result - which has
+ a magic indicator word - and the alloca() result - which has an
+ uninitialized indicator word. It is for this test that sa_increment
+ additional bytes are allocated in the alloca() case. */
+ if (((int *) p)[-1] == MAGIC_NUMBER)
+ {
+ /* Looks like a mallocsa() result. To see whether it really is one,
+ perform a lookup in the hash table. */
+ size_t slot = (unsigned long) p % HASH_TABLE_SIZE;
+ void **chain = &mallocsa_results[slot];
+ for (; *chain != NULL;)
+ {
+ if (*chain == p)
+ {
+ /* Found it. Remove it from the hash table and free it. */
+ char *p_begin = (char *) p - HEADER_SIZE;
+ *chain = ((struct header *) p_begin)->next;
+ free (p_begin);
+ return;
+ }
+ chain = &((struct header *) ((char *) *chain - HEADER_SIZE))->next;
+ }
+ }
+ /* At this point, we know it was not a mallocsa() result. */
+ }
+}
+#endif
diff --git a/lib/allocsa.h b/lib/allocsa.h
new file mode 100644
index 0000000..ffee917
--- /dev/null
+++ b/lib/allocsa.h
@@ -0,0 +1,124 @@
+/* Safe automatic memory allocation.
+ Copyright (C) 2003-2007 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _ALLOCSA_H
+#define _ALLOCSA_H
+
+#include <alloca.h>
+#include <stddef.h>
+#include <stdlib.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 an inline function. */
+# define safe_alloca(N) ((N) < 4032 ? alloca (N) : NULL)
+#else
+# define safe_alloca(N) ((void) (N), NULL)
+#endif
+
+/* allocsa(N) is a safe variant of alloca(N). It allocates N bytes of
+ memory allocated on the stack, that must be freed using freesa() before
+ the function returns. Upon failure, it returns NULL. */
+#if HAVE_ALLOCA
+# define allocsa(N) \
+ ((N) < 4032 - sa_increment \
+ ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \
+ : mallocsa (N))
+#else
+# define allocsa(N) \
+ mallocsa (N)
+#endif
+extern void * mallocsa (size_t n);
+
+/* Free a block of memory allocated through allocsa(). */
+#if HAVE_ALLOCA
+extern void freesa (void *p);
+#else
+# define freesa free
+#endif
+
+/* Maybe we should also define a variant
+ nallocsa (size_t n, size_t s) - behaves like allocsa (n * s)
+ If this would be useful in your application. please speak up. */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* ------------------- Auxiliary, non-public definitions ------------------- */
+
+/* Determine the alignment of a type at compile time. */
+#if defined __GNUC__
+# 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),
+#if HAVE_LONG_LONG_INT
+ sa_alignment_longlong = sa_alignof (long long),
+#endif
+ sa_alignment_longdouble = sa_alignof (long double),
+ sa_alignment_max = ((sa_alignment_long - 1) | (sa_alignment_double - 1)
+#if HAVE_LONG_LONG_INT
+ | (sa_alignment_longlong - 1)
+#endif
+ | (sa_alignment_longdouble - 1)
+ ) + 1,
+/* The increment that guarantees room for a magic word must be >= sizeof (int)
+ and a multiple of sa_alignment_max. */
+ sa_increment = ((sizeof (int) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max
+};
+
+#endif /* _ALLOCSA_H */
diff --git a/lib/allocsa.valgrind b/lib/allocsa.valgrind
new file mode 100644
index 0000000..f4c77d6
--- /dev/null
+++ b/lib/allocsa.valgrind
@@ -0,0 +1,7 @@
+# Suppress a valgrind message about use of uninitialized memory in freesa().
+# This use is OK because it provides only a speedup.
+{
+ freesa
+ Memcheck:Cond
+ fun:freesa
+}
diff --git a/lib/argmatch.c b/lib/argmatch.c
new file mode 100644
index 0000000..72d9248
--- /dev/null
+++ b/lib/argmatch.c
@@ -0,0 +1,278 @@
+/* argmatch.c -- find a match for a string in an array
+
+ Copyright (C) 1990, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by David MacKenzie <djm@ai.mit.edu>
+ Modified by Akim Demaille <demaille@inf.enst.fr> */
+
+#include <config.h>
+
+/* Specification. */
+#include "argmatch.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "error.h"
+#include "quotearg.h"
+#include "quote.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* When reporting an invalid argument, show nonprinting characters
+ by using the quoting style ARGMATCH_QUOTING_STYLE. Do not use
+ literal_quoting_style. */
+#ifndef ARGMATCH_QUOTING_STYLE
+# define ARGMATCH_QUOTING_STYLE locale_quoting_style
+#endif
+
+/* Non failing version of argmatch call this function after failing. */
+#ifndef ARGMATCH_DIE
+# include "exitfail.h"
+# define ARGMATCH_DIE exit (exit_failure)
+#endif
+
+#ifdef ARGMATCH_DIE_DECL
+ARGMATCH_DIE_DECL;
+#endif
+
+static void
+__argmatch_die (void)
+{
+ ARGMATCH_DIE;
+}
+
+/* Used by XARGMATCH and XARGCASEMATCH. See description in argmatch.h.
+ Default to __argmatch_die, but allow caller to change this at run-time. */
+argmatch_exit_fn argmatch_die = __argmatch_die;
+
+
+/* If ARG is an unambiguous match for an element of the
+ NULL-terminated array ARGLIST, return the index in ARGLIST
+ of the matched element, else -1 if it does not match any element
+ or -2 if it is ambiguous (is a prefix of more than one element).
+
+ If VALLIST is none null, use it to resolve ambiguities limited to
+ synonyms, i.e., for
+ "yes", "yop" -> 0
+ "no", "nope" -> 1
+ "y" is a valid argument, for `0', and "n" for `1'. */
+
+ptrdiff_t
+argmatch (const char *arg, const char *const *arglist,
+ const char *vallist, size_t valsize)
+{
+ size_t i; /* Temporary index in ARGLIST. */
+ size_t arglen; /* Length of ARG. */
+ ptrdiff_t matchind = -1; /* Index of first nonexact match. */
+ bool ambiguous = false; /* If true, multiple nonexact match(es). */
+
+ arglen = strlen (arg);
+
+ /* Test all elements for either exact match or abbreviated matches. */
+ for (i = 0; arglist[i]; i++)
+ {
+ if (!strncmp (arglist[i], arg, arglen))
+ {
+ if (strlen (arglist[i]) == arglen)
+ /* Exact match found. */
+ return i;
+ else if (matchind == -1)
+ /* First nonexact match found. */
+ matchind = i;
+ else
+ {
+ /* Second nonexact match found. */
+ if (vallist == NULL
+ || memcmp (vallist + valsize * matchind,
+ vallist + valsize * i, valsize))
+ {
+ /* There is a real ambiguity, or we could not
+ disambiguate. */
+ ambiguous = true;
+ }
+ }
+ }
+ }
+ if (ambiguous)
+ return -2;
+ else
+ return matchind;
+}
+
+/* Error reporting for argmatch.
+ CONTEXT is a description of the type of entity that was being matched.
+ VALUE is the invalid value that was given.
+ PROBLEM is the return value from argmatch. */
+
+void
+argmatch_invalid (const char *context, const char *value, ptrdiff_t problem)
+{
+ char const *format = (problem == -1
+ ? _("invalid argument %s for %s")
+ : _("ambiguous argument %s for %s"));
+
+ error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value),
+ quote_n (1, context));
+}
+
+/* List the valid arguments for argmatch.
+ ARGLIST is the same as in argmatch.
+ VALLIST is a pointer to an array of values.
+ VALSIZE is the size of the elements of VALLIST */
+void
+argmatch_valid (const char *const *arglist,
+ const char *vallist, size_t valsize)
+{
+ size_t i;
+ const char *last_val = NULL;
+
+ /* We try to put synonyms on the same line. The assumption is that
+ synonyms follow each other */
+ fprintf (stderr, _("Valid arguments are:"));
+ for (i = 0; arglist[i]; i++)
+ if ((i == 0)
+ || memcmp (last_val, vallist + valsize * i, valsize))
+ {
+ fprintf (stderr, "\n - `%s'", arglist[i]);
+ last_val = vallist + valsize * i;
+ }
+ else
+ {
+ fprintf (stderr, ", `%s'", arglist[i]);
+ }
+ putc ('\n', stderr);
+}
+
+/* Never failing versions of the previous functions.
+
+ CONTEXT is the context for which argmatch is called (e.g.,
+ "--version-control", or "$VERSION_CONTROL" etc.). Upon failure,
+ calls the (supposed never to return) function EXIT_FN. */
+
+ptrdiff_t
+__xargmatch_internal (const char *context,
+ const char *arg, const char *const *arglist,
+ const char *vallist, size_t valsize,
+ argmatch_exit_fn exit_fn)
+{
+ ptrdiff_t res = argmatch (arg, arglist, vallist, valsize);
+ if (res >= 0)
+ /* Success. */
+ return res;
+
+ /* We failed. Explain why. */
+ argmatch_invalid (context, arg, res);
+ argmatch_valid (arglist, vallist, valsize);
+ (*exit_fn) ();
+
+ return -1; /* To please the compilers. */
+}
+
+/* Look for VALUE in VALLIST, an array of objects of size VALSIZE and
+ return the first corresponding argument in ARGLIST */
+const char *
+argmatch_to_argument (const char *value,
+ const char *const *arglist,
+ const char *vallist, size_t valsize)
+{
+ size_t i;
+
+ for (i = 0; arglist[i]; i++)
+ if (!memcmp (value, vallist + valsize * i, valsize))
+ return arglist[i];
+ return NULL;
+}
+
+#ifdef TEST
+/*
+ * Based on "getversion.c" by David MacKenzie <djm@gnu.ai.mit.edu>
+ */
+char *program_name;
+
+/* When to make backup files. */
+enum backup_type
+{
+ /* Never make backups. */
+ no_backups,
+
+ /* Make simple backups of every file. */
+ simple_backups,
+
+ /* Make numbered backups of files that already have numbered backups,
+ and simple backups of the others. */
+ numbered_existing_backups,
+
+ /* Make numbered backups of every file. */
+ numbered_backups
+};
+
+/* Two tables describing arguments (keys) and their corresponding
+ values */
+static const char *const backup_args[] =
+{
+ "no", "none", "off",
+ "simple", "never",
+ "existing", "nil",
+ "numbered", "t",
+ 0
+};
+
+static const enum backup_type backup_vals[] =
+{
+ no_backups, no_backups, no_backups,
+ simple_backups, simple_backups,
+ numbered_existing_backups, numbered_existing_backups,
+ numbered_backups, numbered_backups
+};
+
+int
+main (int argc, const char *const *argv)
+{
+ const char *cp;
+ enum backup_type backup_type = no_backups;
+
+ program_name = (char *) argv[0];
+
+ if (argc > 2)
+ {
+ fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", program_name);
+ exit (1);
+ }
+
+ if ((cp = getenv ("VERSION_CONTROL")))
+ backup_type = XARGMATCH ("$VERSION_CONTROL", cp,
+ backup_args, backup_vals);
+
+ if (argc == 2)
+ backup_type = XARGMATCH (program_name, argv[1],
+ backup_args, backup_vals);
+
+ printf ("The version control is `%s'\n",
+ ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));
+
+ return 0;
+}
+#endif
diff --git a/lib/argmatch.h b/lib/argmatch.h
new file mode 100644
index 0000000..f2dfe59
--- /dev/null
+++ b/lib/argmatch.h
@@ -0,0 +1,103 @@
+/* argmatch.h -- definitions and prototypes for argmatch.c
+
+ Copyright (C) 1990, 1998, 1999, 2001, 2002, 2004, 2005 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by David MacKenzie <djm@ai.mit.edu>
+ Modified by Akim Demaille <demaille@inf.enst.fr> */
+
+#ifndef ARGMATCH_H_
+# define ARGMATCH_H_ 1
+
+# include <stddef.h>
+
+# include "verify.h"
+
+# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
+
+/* Assert there are as many real arguments as there are values
+ (argument list ends with a NULL guard). */
+
+# define ARGMATCH_VERIFY(Arglist, Vallist) \
+ verify (ARRAY_CARDINALITY (Arglist) == ARRAY_CARDINALITY (Vallist) + 1)
+
+/* Return the index of the element of ARGLIST (NULL terminated) that
+ matches with ARG. If VALLIST is not NULL, then use it to resolve
+ false ambiguities (i.e., different matches of ARG but corresponding
+ to the same values in VALLIST). */
+
+ptrdiff_t argmatch (char const *arg, char const *const *arglist,
+ char const *vallist, size_t valsize);
+
+# define ARGMATCH(Arg, Arglist, Vallist) \
+ argmatch (Arg, Arglist, (char const *) (Vallist), sizeof *(Vallist))
+
+/* xargmatch calls this function when it fails. This function should not
+ return. By default, this is a function that calls ARGMATCH_DIE which
+ in turn defaults to `exit (exit_failure)'. */
+typedef void (*argmatch_exit_fn) (void);
+extern argmatch_exit_fn argmatch_die;
+
+/* Report on stderr why argmatch failed. Report correct values. */
+
+void argmatch_invalid (char const *context, char const *value,
+ ptrdiff_t problem);
+
+/* Left for compatibility with the old name invalid_arg */
+
+# define invalid_arg(Context, Value, Problem) \
+ argmatch_invalid (Context, Value, Problem)
+
+
+
+/* Report on stderr the list of possible arguments. */
+
+void argmatch_valid (char const *const *arglist,
+ char const *vallist, size_t valsize);
+
+# define ARGMATCH_VALID(Arglist, Vallist) \
+ argmatch_valid (Arglist, (char const *) (Vallist), sizeof *(Vallist))
+
+
+
+/* Same as argmatch, but upon failure, reports a explanation on the
+ failure, and exits using the function EXIT_FN. */
+
+ptrdiff_t __xargmatch_internal (char const *context,
+ char const *arg, char const *const *arglist,
+ char const *vallist, size_t valsize,
+ argmatch_exit_fn exit_fn);
+
+/* Programmer friendly interface to __xargmatch_internal. */
+
+# define XARGMATCH(Context, Arg, Arglist, Vallist) \
+ ((Vallist) [__xargmatch_internal (Context, Arg, Arglist, \
+ (char const *) (Vallist), \
+ sizeof *(Vallist), \
+ argmatch_die)])
+
+/* Convert a value into a corresponding argument. */
+
+char const *argmatch_to_argument (char const *value,
+ char const *const *arglist,
+ char const *vallist, size_t valsize);
+
+# define ARGMATCH_TO_ARGUMENT(Value, Arglist, Vallist) \
+ argmatch_to_argument (Value, Arglist, \
+ (char const *) (Vallist), sizeof *(Vallist))
+
+#endif /* ARGMATCH_H_ */
diff --git a/lib/argp-ba.c b/lib/argp-ba.c
new file mode 100644
index 0000000..8bb7309
--- /dev/null
+++ b/lib/argp-ba.c
@@ -0,0 +1,25 @@
+/* Default definition for ARGP_PROGRAM_BUG_ADDRESS.
+ Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* If set by the user program, it should point to string that is the
+ bug-reporting address for the program. It will be printed by argp_help if
+ the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help
+ messages), embedded in a sentence that says something like `Report bugs to
+ ADDR.'. */
+const char *argp_program_bug_address;
diff --git a/lib/argp-eexst.c b/lib/argp-eexst.c
new file mode 100644
index 0000000..bcab1c0
--- /dev/null
+++ b/lib/argp-eexst.c
@@ -0,0 +1,31 @@
+/* Default definition for ARGP_ERR_EXIT_STATUS
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sysexits.h>
+
+#include "argp.h"
+
+/* The exit status that argp will use when exiting due to a parsing error.
+ If not defined or set by the user program, this defaults to EX_USAGE from
+ <sysexits.h>. */
+error_t argp_err_exit_status = EX_USAGE;
diff --git a/lib/argp-fmtstream.c b/lib/argp-fmtstream.c
new file mode 100644
index 0000000..0dd9256
--- /dev/null
+++ b/lib/argp-fmtstream.c
@@ -0,0 +1,435 @@
+/* Word-wrapping and line-truncating streams
+ Copyright (C) 1997-1999,2001,2002,2003,2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This package emulates glibc `line_wrap_stream' semantics for systems that
+ don't have that. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+#include "argp-fmtstream.h"
+#include "argp-namefrob.h"
+
+#ifndef ARGP_FMTSTREAM_USE_LINEWRAP
+
+#ifndef isblank
+#define isblank(ch) ((ch)==' ' || (ch)=='\t')
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+# include <wchar.h>
+# include <libio/libioP.h>
+# define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a)
+#endif
+
+#define INIT_BUF_SIZE 200
+#define PRINTF_SIZE_GUESS 150
+
+/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
+ written on it with LMARGIN spaces and limits them to RMARGIN columns
+ total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
+ replacing the whitespace before them with a newline and WMARGIN spaces.
+ Otherwise, chars beyond RMARGIN are simply dropped until a newline.
+ Returns NULL if there was an error. */
+argp_fmtstream_t
+__argp_make_fmtstream (FILE *stream,
+ size_t lmargin, size_t rmargin, ssize_t wmargin)
+{
+ argp_fmtstream_t fs;
+
+ fs = (struct argp_fmtstream *) malloc (sizeof (struct argp_fmtstream));
+ if (fs != NULL)
+ {
+ fs->stream = stream;
+
+ fs->lmargin = lmargin;
+ fs->rmargin = rmargin;
+ fs->wmargin = wmargin;
+ fs->point_col = 0;
+ fs->point_offs = 0;
+
+ fs->buf = (char *) malloc (INIT_BUF_SIZE);
+ if (! fs->buf)
+ {
+ free (fs);
+ fs = 0;
+ }
+ else
+ {
+ fs->p = fs->buf;
+ fs->end = fs->buf + INIT_BUF_SIZE;
+ }
+ }
+
+ return fs;
+}
+#if 0
+/* Not exported. */
+#ifdef weak_alias
+weak_alias (__argp_make_fmtstream, argp_make_fmtstream)
+#endif
+#endif
+
+/* Flush FS to its stream, and free it (but don't close the stream). */
+void
+__argp_fmtstream_free (argp_fmtstream_t fs)
+{
+ __argp_fmtstream_update (fs);
+ if (fs->p > fs->buf)
+ {
+#ifdef USE_IN_LIBIO
+ __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
+#else
+ fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
+#endif
+ }
+ free (fs->buf);
+ free (fs);
+}
+#if 0
+/* Not exported. */
+#ifdef weak_alias
+weak_alias (__argp_fmtstream_free, argp_fmtstream_free)
+#endif
+#endif
+
+/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the
+ end of its buffer. This code is mostly from glibc stdio/linewrap.c. */
+void
+__argp_fmtstream_update (argp_fmtstream_t fs)
+{
+ char *buf, *nl;
+ size_t len;
+
+ /* Scan the buffer for newlines. */
+ buf = fs->buf + fs->point_offs;
+ while (buf < fs->p)
+ {
+ size_t r;
+
+ if (fs->point_col == 0 && fs->lmargin != 0)
+ {
+ /* We are starting a new line. Print spaces to the left margin. */
+ const size_t pad = fs->lmargin;
+ if (fs->p + pad < fs->end)
+ {
+ /* We can fit in them in the buffer by moving the
+ buffer text up and filling in the beginning. */
+ memmove (buf + pad, buf, fs->p - buf);
+ fs->p += pad; /* Compensate for bigger buffer. */
+ memset (buf, ' ', pad); /* Fill in the spaces. */
+ buf += pad; /* Don't bother searching them. */
+ }
+ else
+ {
+ /* No buffer space for spaces. Must flush. */
+ size_t i;
+ for (i = 0; i < pad; i++)
+ {
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (fs->stream, 0) > 0)
+ putwc_unlocked (L' ', fs->stream);
+ else
+#endif
+ putc_unlocked (' ', fs->stream);
+ }
+ }
+ fs->point_col = pad;
+ }
+
+ len = fs->p - buf;
+ nl = memchr (buf, '\n', len);
+
+ if (fs->point_col < 0)
+ fs->point_col = 0;
+
+ if (!nl)
+ {
+ /* The buffer ends in a partial line. */
+
+ if (fs->point_col + len < fs->rmargin)
+ {
+ /* The remaining buffer text is a partial line and fits
+ within the maximum line width. Advance point for the
+ characters to be written and stop scanning. */
+ fs->point_col += len;
+ break;
+ }
+ else
+ /* Set the end-of-line pointer for the code below to
+ the end of the buffer. */
+ nl = fs->p;
+ }
+ else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin)
+ {
+ /* The buffer contains a full line that fits within the maximum
+ line width. Reset point and scan the next line. */
+ fs->point_col = 0;
+ buf = nl + 1;
+ continue;
+ }
+
+ /* This line is too long. */
+ r = fs->rmargin - 1;
+
+ if (fs->wmargin < 0)
+ {
+ /* Truncate the line by overwriting the excess with the
+ newline and anything after it in the buffer. */
+ if (nl < fs->p)
+ {
+ memmove (buf + (r - fs->point_col), nl, fs->p - nl);
+ fs->p -= buf + (r - fs->point_col) - nl;
+ /* Reset point for the next line and start scanning it. */
+ fs->point_col = 0;
+ buf += r + 1; /* Skip full line plus \n. */
+ }
+ else
+ {
+ /* The buffer ends with a partial line that is beyond the
+ maximum line width. Advance point for the characters
+ written, and discard those past the max from the buffer. */
+ fs->point_col += len;
+ fs->p -= fs->point_col - r;
+ break;
+ }
+ }
+ else
+ {
+ /* Do word wrap. Go to the column just past the maximum line
+ width and scan back for the beginning of the word there.
+ Then insert a line break. */
+
+ char *p, *nextline;
+ int i;
+
+ p = buf + (r + 1 - fs->point_col);
+ while (p >= buf && !isblank (*p))
+ --p;
+ nextline = p + 1; /* This will begin the next line. */
+
+ if (nextline > buf)
+ {
+ /* Swallow separating blanks. */
+ if (p >= buf)
+ do
+ --p;
+ while (p >= buf && isblank (*p));
+ nl = p + 1; /* The newline will replace the first blank. */
+ }
+ else
+ {
+ /* A single word that is greater than the maximum line width.
+ Oh well. Put it on an overlong line by itself. */
+ p = buf + (r + 1 - fs->point_col);
+ /* Find the end of the long word. */
+ if (p < nl)
+ do
+ ++p;
+ while (p < nl && !isblank (*p));
+ if (p == nl)
+ {
+ /* It already ends a line. No fussing required. */
+ fs->point_col = 0;
+ buf = nl + 1;
+ continue;
+ }
+ /* We will move the newline to replace the first blank. */
+ nl = p;
+ /* Swallow separating blanks. */
+ do
+ ++p;
+ while (isblank (*p));
+ /* The next line will start here. */
+ nextline = p;
+ }
+
+ /* Note: There are a bunch of tests below for
+ NEXTLINE == BUF + LEN + 1; this case is where NL happens to fall
+ at the end of the buffer, and NEXTLINE is in fact empty (and so
+ we need not be careful to maintain its contents). */
+
+ if ((nextline == buf + len + 1
+ ? fs->end - nl < fs->wmargin + 1
+ : nextline - (nl + 1) < fs->wmargin)
+ && fs->p > nextline)
+ {
+ /* The margin needs more blanks than we removed. */
+ if (fs->end - fs->p > fs->wmargin + 1)
+ /* Make some space for them. */
+ {
+ size_t mv = fs->p - nextline;
+ memmove (nl + 1 + fs->wmargin, nextline, mv);
+ nextline = nl + 1 + fs->wmargin;
+ len = nextline + mv - buf;
+ *nl++ = '\n';
+ }
+ else
+ /* Output the first line so we can use the space. */
+ {
+#ifdef _LIBC
+ __fxprintf (fs->stream, "%.*s\n",
+ (int) (nl - fs->buf), fs->buf);
+#else
+ if (nl > fs->buf)
+ fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream);
+ putc_unlocked ('\n', fs->stream);
+#endif
+
+ len += buf - fs->buf;
+ nl = buf = fs->buf;
+ }
+ }
+ else
+ /* We can fit the newline and blanks in before
+ the next word. */
+ *nl++ = '\n';
+
+ if (nextline - nl >= fs->wmargin
+ || (nextline == buf + len + 1 && fs->end - nextline >= fs->wmargin))
+ /* Add blanks up to the wrap margin column. */
+ for (i = 0; i < fs->wmargin; ++i)
+ *nl++ = ' ';
+ else
+ for (i = 0; i < fs->wmargin; ++i)
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (fs->stream, 0) > 0)
+ putwc_unlocked (L' ', fs->stream);
+ else
+#endif
+ putc_unlocked (' ', fs->stream);
+
+ /* Copy the tail of the original buffer into the current buffer
+ position. */
+ if (nl < nextline)
+ memmove (nl, nextline, buf + len - nextline);
+ len -= nextline - buf;
+
+ /* Continue the scan on the remaining lines in the buffer. */
+ buf = nl;
+
+ /* Restore bufp to include all the remaining text. */
+ fs->p = nl + len;
+
+ /* Reset the counter of what has been output this line. If wmargin
+ is 0, we want to avoid the lmargin getting added, so we set
+ point_col to a magic value of -1 in that case. */
+ fs->point_col = fs->wmargin ? fs->wmargin : -1;
+ }
+ }
+
+ /* Remember that we've scanned as far as the end of the buffer. */
+ fs->point_offs = fs->p - fs->buf;
+}
+
+/* Ensure that FS has space for AMOUNT more bytes in its buffer, either by
+ growing the buffer, or by flushing it. True is returned iff we succeed. */
+int
+__argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount)
+{
+ if ((size_t) (fs->end - fs->p) < amount)
+ {
+ ssize_t wrote;
+
+ /* Flush FS's buffer. */
+ __argp_fmtstream_update (fs);
+
+#ifdef _LIBC
+ __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
+ wrote = fs->p - fs->buf;
+#else
+ wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
+#endif
+ if (wrote == fs->p - fs->buf)
+ {
+ fs->p = fs->buf;
+ fs->point_offs = 0;
+ }
+ else
+ {
+ fs->p -= wrote;
+ fs->point_offs -= wrote;
+ memmove (fs->buf, fs->buf + wrote, fs->p - fs->buf);
+ return 0;
+ }
+
+ if ((size_t) (fs->end - fs->buf) < amount)
+ /* Gotta grow the buffer. */
+ {
+ size_t old_size = fs->end - fs->buf;
+ size_t new_size = old_size + amount;
+ char *new_buf;
+
+ if (new_size < old_size || ! (new_buf = realloc (fs->buf, new_size)))
+ {
+ __set_errno (ENOMEM);
+ return 0;
+ }
+
+ fs->buf = new_buf;
+ fs->end = new_buf + new_size;
+ fs->p = fs->buf;
+ }
+ }
+
+ return 1;
+}
+
+ssize_t
+__argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...)
+{
+ int out;
+ size_t avail;
+ size_t size_guess = PRINTF_SIZE_GUESS; /* How much space to reserve. */
+
+ do
+ {
+ va_list args;
+
+ if (! __argp_fmtstream_ensure (fs, size_guess))
+ return -1;
+
+ va_start (args, fmt);
+ avail = fs->end - fs->p;
+ out = __vsnprintf (fs->p, avail, fmt, args);
+ va_end (args);
+ if ((size_t) out >= avail)
+ size_guess = out + 1;
+ }
+ while ((size_t) out >= avail);
+
+ fs->p += out;
+
+ return out;
+}
+#if 0
+/* Not exported. */
+#ifdef weak_alias
+weak_alias (__argp_fmtstream_printf, argp_fmtstream_printf)
+#endif
+#endif
+
+#endif /* !ARGP_FMTSTREAM_USE_LINEWRAP */
diff --git a/lib/argp-fmtstream.h b/lib/argp-fmtstream.h
new file mode 100644
index 0000000..e045a72
--- /dev/null
+++ b/lib/argp-fmtstream.h
@@ -0,0 +1,301 @@
+/* Word-wrapping and line-truncating streams.
+ Copyright (C) 1997, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This package emulates glibc `line_wrap_stream' semantics for systems that
+ don't have that. If the system does have it, it is just a wrapper for
+ that. This header file is only used internally while compiling argp, and
+ shouldn't be installed. */
+
+#ifndef _ARGP_FMTSTREAM_H
+#define _ARGP_FMTSTREAM_H
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# define __attribute__(Spec) /* empty */
+# endif
+/* The __-protected variants of `format' and `printf' attributes
+ are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) || __STRICT_ANSI__
+# define __format__ format
+# define __printf__ printf
+# endif
+#endif
+
+#if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \
+ || (defined (__GNU_LIBRARY__) && defined (HAVE_LINEWRAP_H))
+/* line_wrap_stream is available, so use that. */
+#define ARGP_FMTSTREAM_USE_LINEWRAP
+#endif
+
+#ifdef ARGP_FMTSTREAM_USE_LINEWRAP
+/* Just be a simple wrapper for line_wrap_stream; the semantics are
+ *slightly* different, as line_wrap_stream doesn't actually make a new
+ object, it just modifies the given stream (reversibly) to do
+ line-wrapping. Since we control who uses this code, it doesn't matter. */
+
+#include <linewrap.h>
+
+typedef FILE *argp_fmtstream_t;
+
+#define argp_make_fmtstream line_wrap_stream
+#define __argp_make_fmtstream line_wrap_stream
+#define argp_fmtstream_free line_unwrap_stream
+#define __argp_fmtstream_free line_unwrap_stream
+
+#define __argp_fmtstream_putc(fs,ch) putc(ch,fs)
+#define argp_fmtstream_putc(fs,ch) putc(ch,fs)
+#define __argp_fmtstream_puts(fs,str) fputs(str,fs)
+#define argp_fmtstream_puts(fs,str) fputs(str,fs)
+#define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
+#define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
+#define __argp_fmtstream_printf fprintf
+#define argp_fmtstream_printf fprintf
+
+#define __argp_fmtstream_lmargin line_wrap_lmargin
+#define argp_fmtstream_lmargin line_wrap_lmargin
+#define __argp_fmtstream_set_lmargin line_wrap_set_lmargin
+#define argp_fmtstream_set_lmargin line_wrap_set_lmargin
+#define __argp_fmtstream_rmargin line_wrap_rmargin
+#define argp_fmtstream_rmargin line_wrap_rmargin
+#define __argp_fmtstream_set_rmargin line_wrap_set_rmargin
+#define argp_fmtstream_set_rmargin line_wrap_set_rmargin
+#define __argp_fmtstream_wmargin line_wrap_wmargin
+#define argp_fmtstream_wmargin line_wrap_wmargin
+#define __argp_fmtstream_set_wmargin line_wrap_set_wmargin
+#define argp_fmtstream_set_wmargin line_wrap_set_wmargin
+#define __argp_fmtstream_point line_wrap_point
+#define argp_fmtstream_point line_wrap_point
+
+#else /* !ARGP_FMTSTREAM_USE_LINEWRAP */
+/* Guess we have to define our own version. */
+
+struct argp_fmtstream
+{
+ FILE *stream; /* The stream we're outputting to. */
+
+ size_t lmargin, rmargin; /* Left and right margins. */
+ ssize_t wmargin; /* Margin to wrap to, or -1 to truncate. */
+
+ /* Point in buffer to which we've processed for wrapping, but not output. */
+ size_t point_offs;
+ /* Output column at POINT_OFFS, or -1 meaning 0 but don't add lmargin. */
+ ssize_t point_col;
+
+ char *buf; /* Output buffer. */
+ char *p; /* Current end of text in BUF. */
+ char *end; /* Absolute end of BUF. */
+};
+
+typedef struct argp_fmtstream *argp_fmtstream_t;
+
+/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
+ written on it with LMARGIN spaces and limits them to RMARGIN columns
+ total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
+ replacing the whitespace before them with a newline and WMARGIN spaces.
+ Otherwise, chars beyond RMARGIN are simply dropped until a newline.
+ Returns NULL if there was an error. */
+extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream,
+ size_t __lmargin,
+ size_t __rmargin,
+ ssize_t __wmargin);
+extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream,
+ size_t __lmargin,
+ size_t __rmargin,
+ ssize_t __wmargin);
+
+/* Flush __FS to its stream, and free it (but don't close the stream). */
+extern void __argp_fmtstream_free (argp_fmtstream_t __fs);
+extern void argp_fmtstream_free (argp_fmtstream_t __fs);
+
+extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,
+ const char *__fmt, ...)
+ __attribute__ ((__format__ (printf, 2, 3)));
+extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs,
+ const char *__fmt, ...)
+ __attribute__ ((__format__ (printf, 2, 3)));
+
+extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
+extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
+
+extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str);
+extern int argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str);
+
+extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs,
+ const char *__str, size_t __len);
+extern size_t argp_fmtstream_write (argp_fmtstream_t __fs,
+ const char *__str, size_t __len);
+
+/* Access macros for various bits of state. */
+#define argp_fmtstream_lmargin(__fs) ((__fs)->lmargin)
+#define argp_fmtstream_rmargin(__fs) ((__fs)->rmargin)
+#define argp_fmtstream_wmargin(__fs) ((__fs)->wmargin)
+#define __argp_fmtstream_lmargin argp_fmtstream_lmargin
+#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
+#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
+
+/* Set __FS's left margin to LMARGIN and return the old value. */
+extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
+ size_t __lmargin);
+extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
+ size_t __lmargin);
+
+/* Set __FS's right margin to __RMARGIN and return the old value. */
+extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
+ size_t __rmargin);
+extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
+ size_t __rmargin);
+
+/* Set __FS's wrap margin to __WMARGIN and return the old value. */
+extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
+ size_t __wmargin);
+extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
+ size_t __wmargin);
+
+/* Return the column number of the current output point in __FS. */
+extern size_t argp_fmtstream_point (argp_fmtstream_t __fs);
+extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs);
+
+/* Internal routines. */
+extern void _argp_fmtstream_update (argp_fmtstream_t __fs);
+extern void __argp_fmtstream_update (argp_fmtstream_t __fs);
+extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
+extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
+
+#ifdef __OPTIMIZE__
+/* Inline versions of above routines. */
+
+#if !_LIBC
+#define __argp_fmtstream_putc argp_fmtstream_putc
+#define __argp_fmtstream_puts argp_fmtstream_puts
+#define __argp_fmtstream_write argp_fmtstream_write
+#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
+#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
+#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
+#define __argp_fmtstream_point argp_fmtstream_point
+#define __argp_fmtstream_update _argp_fmtstream_update
+#define __argp_fmtstream_ensure _argp_fmtstream_ensure
+#endif
+
+#ifndef ARGP_FS_EI
+#define ARGP_FS_EI extern inline
+#endif
+
+ARGP_FS_EI size_t
+__argp_fmtstream_write (argp_fmtstream_t __fs,
+ const char *__str, size_t __len)
+{
+ if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len))
+ {
+ memcpy (__fs->p, __str, __len);
+ __fs->p += __len;
+ return __len;
+ }
+ else
+ return 0;
+}
+
+ARGP_FS_EI int
+__argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str)
+{
+ size_t __len = strlen (__str);
+ if (__len)
+ {
+ size_t __wrote = __argp_fmtstream_write (__fs, __str, __len);
+ return __wrote == __len ? 0 : -1;
+ }
+ else
+ return 0;
+}
+
+ARGP_FS_EI int
+__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch)
+{
+ if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1))
+ return *__fs->p++ = __ch;
+ else
+ return EOF;
+}
+
+/* Set __FS's left margin to __LMARGIN and return the old value. */
+ARGP_FS_EI size_t
+__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin)
+{
+ size_t __old;
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ __old = __fs->lmargin;
+ __fs->lmargin = __lmargin;
+ return __old;
+}
+
+/* Set __FS's right margin to __RMARGIN and return the old value. */
+ARGP_FS_EI size_t
+__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin)
+{
+ size_t __old;
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ __old = __fs->rmargin;
+ __fs->rmargin = __rmargin;
+ return __old;
+}
+
+/* Set FS's wrap margin to __WMARGIN and return the old value. */
+ARGP_FS_EI size_t
+__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin)
+{
+ size_t __old;
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ __old = __fs->wmargin;
+ __fs->wmargin = __wmargin;
+ return __old;
+}
+
+/* Return the column number of the current output point in __FS. */
+ARGP_FS_EI size_t
+__argp_fmtstream_point (argp_fmtstream_t __fs)
+{
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ return __fs->point_col >= 0 ? __fs->point_col : 0;
+}
+
+#if !_LIBC
+#undef __argp_fmtstream_putc
+#undef __argp_fmtstream_puts
+#undef __argp_fmtstream_write
+#undef __argp_fmtstream_set_lmargin
+#undef __argp_fmtstream_set_rmargin
+#undef __argp_fmtstream_set_wmargin
+#undef __argp_fmtstream_point
+#undef __argp_fmtstream_update
+#undef __argp_fmtstream_ensure
+#endif
+
+#endif /* __OPTIMIZE__ */
+
+#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */
+
+#endif /* argp-fmtstream.h */
diff --git a/lib/argp-fs-xinl.c b/lib/argp-fs-xinl.c
new file mode 100644
index 0000000..3b4c917
--- /dev/null
+++ b/lib/argp-fs-xinl.c
@@ -0,0 +1,43 @@
+/* Real definitions for extern inline functions in argp-fmtstream.h
+ Copyright (C) 1997, 2003, 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define ARGP_FS_EI
+#undef __OPTIMIZE__
+#define __OPTIMIZE__ 1
+#include "argp-fmtstream.h"
+
+#if 0
+/* Not exported. */
+/* Add weak aliases. */
+#if _LIBC - 0 && !defined (ARGP_FMTSTREAM_USE_LINEWRAP) && defined (weak_alias)
+
+weak_alias (__argp_fmtstream_putc, argp_fmtstream_putc)
+weak_alias (__argp_fmtstream_puts, argp_fmtstream_puts)
+weak_alias (__argp_fmtstream_write, argp_fmtstream_write)
+weak_alias (__argp_fmtstream_set_lmargin, argp_fmtstream_set_lmargin)
+weak_alias (__argp_fmtstream_set_rmargin, argp_fmtstream_set_rmargin)
+weak_alias (__argp_fmtstream_set_wmargin, argp_fmtstream_set_wmargin)
+weak_alias (__argp_fmtstream_point, argp_fmtstream_point)
+
+#endif
+#endif
diff --git a/lib/argp-help.c b/lib/argp-help.c
new file mode 100644
index 0000000..396e733
--- /dev/null
+++ b/lib/argp-help.c
@@ -0,0 +1,1954 @@
+/* Hierarchial argument parsing help output
+ Copyright (C) 1995-2005, 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <alloca.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <limits.h>
+#ifdef USE_IN_LIBIO
+# include <wchar.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+# undef dgettext
+# define dgettext(domain, msgid) \
+ INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
+#else
+# include "gettext.h"
+#endif
+
+#include "argp.h"
+#include "argp-fmtstream.h"
+#include "argp-namefrob.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* User-selectable (using an environment variable) formatting parameters.
+
+ These may be specified in an environment variable called `ARGP_HELP_FMT',
+ with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2
+ Where VALn must be a positive integer. The list of variables is in the
+ UPARAM_NAMES vector, below. */
+
+/* Default parameters. */
+#define DUP_ARGS 0 /* True if option argument can be duplicated. */
+#define DUP_ARGS_NOTE 1 /* True to print a note about duplicate args. */
+#define SHORT_OPT_COL 2 /* column in which short options start */
+#define LONG_OPT_COL 6 /* column in which long options start */
+#define DOC_OPT_COL 2 /* column in which doc options start */
+#define OPT_DOC_COL 29 /* column in which option text starts */
+#define HEADER_COL 1 /* column in which group headers are printed */
+#define USAGE_INDENT 12 /* indentation of wrapped usage lines */
+#define RMARGIN 79 /* right margin used for wrapping */
+
+/* User-selectable (using an environment variable) formatting parameters.
+ They must all be of type `int' for the parsing code to work. */
+struct uparams
+{
+ /* If true, arguments for an option are shown with both short and long
+ options, even when a given option has both, e.g. `-x ARG, --longx=ARG'.
+ If false, then if an option has both, the argument is only shown with
+ the long one, e.g., `-x, --longx=ARG', and a message indicating that
+ this really means both is printed below the options. */
+ int dup_args;
+
+ /* This is true if when DUP_ARGS is false, and some duplicate arguments have
+ been suppressed, an explanatory message should be printed. */
+ int dup_args_note;
+
+ /* Various output columns. */
+ int short_opt_col; /* column in which short options start */
+ int long_opt_col; /* column in which long options start */
+ int doc_opt_col; /* column in which doc options start */
+ int opt_doc_col; /* column in which option text starts */
+ int header_col; /* column in which group headers are printed */
+ int usage_indent; /* indentation of wrapped usage lines */
+ int rmargin; /* right margin used for wrapping */
+
+ int valid; /* True when the values in here are valid. */
+};
+
+/* This is a global variable, as user options are only ever read once. */
+static struct uparams uparams = {
+ DUP_ARGS, DUP_ARGS_NOTE,
+ SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL,
+ USAGE_INDENT, RMARGIN,
+ 0
+};
+
+/* A particular uparam, and what the user name is. */
+struct uparam_name
+{
+ const char *name; /* User name. */
+ int is_bool; /* Whether it's `boolean'. */
+ size_t uparams_offs; /* Location of the (int) field in UPARAMS. */
+};
+
+/* The name-field mappings we know about. */
+static const struct uparam_name uparam_names[] =
+{
+ { "dup-args", 1, offsetof (struct uparams, dup_args) },
+ { "dup-args-note", 1, offsetof (struct uparams, dup_args_note) },
+ { "short-opt-col", 0, offsetof (struct uparams, short_opt_col) },
+ { "long-opt-col", 0, offsetof (struct uparams, long_opt_col) },
+ { "doc-opt-col", 0, offsetof (struct uparams, doc_opt_col) },
+ { "opt-doc-col", 0, offsetof (struct uparams, opt_doc_col) },
+ { "header-col", 0, offsetof (struct uparams, header_col) },
+ { "usage-indent", 0, offsetof (struct uparams, usage_indent) },
+ { "rmargin", 0, offsetof (struct uparams, rmargin) },
+ { 0 }
+};
+
+static void
+validate_uparams (const struct argp_state *state, struct uparams *upptr)
+{
+ const struct uparam_name *up;
+
+ for (up = uparam_names; up->name; up++)
+ {
+ if (up->is_bool
+ || up->uparams_offs == offsetof (struct uparams, rmargin))
+ continue;
+ if (*(int *)((char *)upptr + up->uparams_offs) >= upptr->rmargin)
+ {
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "\
+ARGP_HELP_FMT: %s value is less than or equal to %s"),
+ "rmargin", up->name);
+ return;
+ }
+ }
+ uparams = *upptr;
+ uparams.valid = 1;
+}
+
+/* Read user options from the environment, and fill in UPARAMS appropiately. */
+static void
+fill_in_uparams (const struct argp_state *state)
+{
+ const char *var = getenv ("ARGP_HELP_FMT");
+ struct uparams new_params = uparams;
+
+#define SKIPWS(p) do { while (isspace ((unsigned char) *p)) p++; } while (0);
+
+ if (var)
+ {
+ /* Parse var. */
+ while (*var)
+ {
+ SKIPWS (var);
+
+ if (isalpha ((unsigned char) *var))
+ {
+ size_t var_len;
+ const struct uparam_name *un;
+ int unspec = 0, val = 0;
+ const char *arg = var;
+
+ while (isalnum ((unsigned char) *arg) || *arg == '-' || *arg == '_')
+ arg++;
+ var_len = arg - var;
+
+ SKIPWS (arg);
+
+ if (*arg == '\0' || *arg == ',')
+ unspec = 1;
+ else if (*arg == '=')
+ {
+ arg++;
+ SKIPWS (arg);
+ }
+
+ if (unspec)
+ {
+ if (var[0] == 'n' && var[1] == 'o' && var[2] == '-')
+ {
+ val = 0;
+ var += 3;
+ var_len -= 3;
+ }
+ else
+ val = 1;
+ }
+ else if (isdigit ((unsigned char) *arg))
+ {
+ val = atoi (arg);
+ while (isdigit ((unsigned char) *arg))
+ arg++;
+ SKIPWS (arg);
+ }
+
+ for (un = uparam_names; un->name; un++)
+ if (strlen (un->name) == var_len
+ && strncmp (var, un->name, var_len) == 0)
+ {
+ if (unspec && !un->is_bool)
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "\
+%.*s: ARGP_HELP_FMT parameter requires a value"),
+ (int) var_len, var);
+ else if (val < 0)
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "\
+%.*s: ARGP_HELP_FMT parameter must be positive"),
+ (int) var_len, var);
+ else
+ *(int *)((char *)&new_params + un->uparams_offs) = val;
+ break;
+ }
+ if (! un->name)
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain, "\
+%.*s: Unknown ARGP_HELP_FMT parameter"),
+ (int) var_len, var);
+
+ var = arg;
+ if (*var == ',')
+ var++;
+ }
+ else if (*var)
+ {
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "Garbage in ARGP_HELP_FMT: %s"), var);
+ break;
+ }
+ }
+ validate_uparams (state, &new_params);
+ }
+}
+
+/* Returns true if OPT hasn't been marked invisible. Visibility only affects
+ whether OPT is displayed or used in sorting, not option shadowing. */
+#define ovisible(opt) (! ((opt)->flags & OPTION_HIDDEN))
+
+/* Returns true if OPT is an alias for an earlier option. */
+#define oalias(opt) ((opt)->flags & OPTION_ALIAS)
+
+/* Returns true if OPT is an documentation-only entry. */
+#define odoc(opt) ((opt)->flags & OPTION_DOC)
+
+/* Returns true if OPT should not be translated */
+#define onotrans(opt) ((opt)->flags & OPTION_NO_TRANS)
+
+/* Returns true if OPT is the end-of-list marker for a list of options. */
+#define oend(opt) __option_is_end (opt)
+
+/* Returns true if OPT has a short option. */
+#define oshort(opt) __option_is_short (opt)
+
+/*
+ The help format for a particular option is like:
+
+ -xARG, -yARG, --long1=ARG, --long2=ARG Documentation...
+
+ Where ARG will be omitted if there's no argument, for this option, or
+ will be surrounded by "[" and "]" appropiately if the argument is
+ optional. The documentation string is word-wrapped appropiately, and if
+ the list of options is long enough, it will be started on a separate line.
+ If there are no short options for a given option, the first long option is
+ indented slighly in a way that's supposed to make most long options appear
+ to be in a separate column.
+
+ For example, the following output (from ps):
+
+ -p PID, --pid=PID List the process PID
+ --pgrp=PGRP List processes in the process group PGRP
+ -P, -x, --no-parent Include processes without parents
+ -Q, --all-fields Don't elide unusable fields (normally if there's
+ some reason ps can't print a field for any
+ process, it's removed from the output entirely)
+ -r, --reverse, --gratuitously-long-reverse-option
+ Reverse the order of any sort
+ --session[=SID] Add the processes from the session SID (which
+ defaults to the sid of the current process)
+
+ Here are some more options:
+ -f ZOT, --foonly=ZOT Glork a foonly
+ -z, --zaza Snit a zar
+
+ -?, --help Give this help list
+ --usage Give a short usage message
+ -V, --version Print program version
+
+ The struct argp_option array for the above could look like:
+
+ {
+ {"pid", 'p', "PID", 0, "List the process PID"},
+ {"pgrp", OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"},
+ {"no-parent", 'P', 0, 0, "Include processes without parents"},
+ {0, 'x', 0, OPTION_ALIAS},
+ {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally"
+ " if there's some reason ps can't"
+ " print a field for any process, it's"
+ " removed from the output entirely)" },
+ {"reverse", 'r', 0, 0, "Reverse the order of any sort"},
+ {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS},
+ {"session", OPT_SESS, "SID", OPTION_ARG_OPTIONAL,
+ "Add the processes from the session"
+ " SID (which defaults to the sid of"
+ " the current process)" },
+
+ {0,0,0,0, "Here are some more options:"},
+ {"foonly", 'f', "ZOT", 0, "Glork a foonly"},
+ {"zaza", 'z', 0, 0, "Snit a zar"},
+
+ {0}
+ }
+
+ Note that the last three options are automatically supplied by argp_parse,
+ unless you tell it not to with ARGP_NO_HELP.
+
+*/
+
+/* Returns true if CH occurs between BEG and END. */
+static int
+find_char (char ch, char *beg, char *end)
+{
+ while (beg < end)
+ if (*beg == ch)
+ return 1;
+ else
+ beg++;
+ return 0;
+}
+
+struct hol_cluster; /* fwd decl */
+
+struct hol_entry
+{
+ /* First option. */
+ const struct argp_option *opt;
+ /* Number of options (including aliases). */
+ unsigned num;
+
+ /* A pointers into the HOL's short_options field, to the first short option
+ letter for this entry. The order of the characters following this point
+ corresponds to the order of options pointed to by OPT, and there are at
+ most NUM. A short option recorded in a option following OPT is only
+ valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's
+ probably been shadowed by some other entry). */
+ char *short_options;
+
+ /* Entries are sorted by their group first, in the order:
+ 1, 2, ..., n, 0, -m, ..., -2, -1
+ and then alphabetically within each group. The default is 0. */
+ int group;
+
+ /* The cluster of options this entry belongs to, or 0 if none. */
+ struct hol_cluster *cluster;
+
+ /* The argp from which this option came. */
+ const struct argp *argp;
+
+ /* Position in the array */
+ unsigned ord;
+};
+
+/* A cluster of entries to reflect the argp tree structure. */
+struct hol_cluster
+{
+ /* A descriptive header printed before options in this cluster. */
+ const char *header;
+
+ /* Used to order clusters within the same group with the same parent,
+ according to the order in which they occurred in the parent argp's child
+ list. */
+ int index;
+
+ /* How to sort this cluster with respect to options and other clusters at the
+ same depth (clusters always follow options in the same group). */
+ int group;
+
+ /* The cluster to which this cluster belongs, or 0 if it's at the base
+ level. */
+ struct hol_cluster *parent;
+
+ /* The argp from which this cluster is (eventually) derived. */
+ const struct argp *argp;
+
+ /* The distance this cluster is from the root. */
+ int depth;
+
+ /* Clusters in a given hol are kept in a linked list, to make freeing them
+ possible. */
+ struct hol_cluster *next;
+};
+
+/* A list of options for help. */
+struct hol
+{
+ /* An array of hol_entry's. */
+ struct hol_entry *entries;
+ /* The number of entries in this hol. If this field is zero, the others
+ are undefined. */
+ unsigned num_entries;
+
+ /* A string containing all short options in this HOL. Each entry contains
+ pointers into this string, so the order can't be messed with blindly. */
+ char *short_options;
+
+ /* Clusters of entries in this hol. */
+ struct hol_cluster *clusters;
+};
+
+/* Create a struct hol from the options in ARGP. CLUSTER is the
+ hol_cluster in which these entries occur, or 0, if at the root. */
+static struct hol *
+make_hol (const struct argp *argp, struct hol_cluster *cluster)
+{
+ char *so;
+ const struct argp_option *o;
+ const struct argp_option *opts = argp->options;
+ struct hol_entry *entry;
+ unsigned num_short_options = 0;
+ struct hol *hol = malloc (sizeof (struct hol));
+
+ assert (hol);
+
+ hol->num_entries = 0;
+ hol->clusters = 0;
+
+ if (opts)
+ {
+ int cur_group = 0;
+
+ /* The first option must not be an alias. */
+ assert (! oalias (opts));
+
+ /* Calculate the space needed. */
+ for (o = opts; ! oend (o); o++)
+ {
+ if (! oalias (o))
+ hol->num_entries++;
+ if (oshort (o))
+ num_short_options++; /* This is an upper bound. */
+ }
+
+ hol->entries = malloc (sizeof (struct hol_entry) * hol->num_entries);
+ hol->short_options = malloc (num_short_options + 1);
+
+ assert (hol->entries && hol->short_options);
+ if (SIZE_MAX <= UINT_MAX)
+ assert (hol->num_entries <= SIZE_MAX / sizeof (struct hol_entry));
+
+ /* Fill in the entries. */
+ so = hol->short_options;
+ for (o = opts, entry = hol->entries; ! oend (o); entry++)
+ {
+ entry->opt = o;
+ entry->num = 0;
+ entry->short_options = so;
+ entry->group = cur_group =
+ o->group
+ ? o->group
+ : ((!o->name && !o->key)
+ ? cur_group + 1
+ : cur_group);
+ entry->cluster = cluster;
+ entry->argp = argp;
+
+ do
+ {
+ entry->num++;
+ if (oshort (o) && ! find_char (o->key, hol->short_options, so))
+ /* O has a valid short option which hasn't already been used.*/
+ *so++ = o->key;
+ o++;
+ }
+ while (! oend (o) && oalias (o));
+ }
+ *so = '\0'; /* null terminated so we can find the length */
+ }
+
+ return hol;
+}
+
+/* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the
+ associated argp child list entry), INDEX, and PARENT, and return a pointer
+ to it. ARGP is the argp that this cluster results from. */
+static struct hol_cluster *
+hol_add_cluster (struct hol *hol, int group, const char *header, int index,
+ struct hol_cluster *parent, const struct argp *argp)
+{
+ struct hol_cluster *cl = malloc (sizeof (struct hol_cluster));
+ if (cl)
+ {
+ cl->group = group;
+ cl->header = header;
+
+ cl->index = index;
+ cl->parent = parent;
+ cl->argp = argp;
+ cl->depth = parent ? parent->depth + 1 : 0;
+
+ cl->next = hol->clusters;
+ hol->clusters = cl;
+ }
+ return cl;
+}
+
+/* Free HOL and any resources it uses. */
+static void
+hol_free (struct hol *hol)
+{
+ struct hol_cluster *cl = hol->clusters;
+
+ while (cl)
+ {
+ struct hol_cluster *next = cl->next;
+ free (cl);
+ cl = next;
+ }
+
+ if (hol->num_entries > 0)
+ {
+ free (hol->entries);
+ free (hol->short_options);
+ }
+
+ free (hol);
+}
+
+static int
+hol_entry_short_iterate (const struct hol_entry *entry,
+ int (*func)(const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie),
+ const char *domain, void *cookie)
+{
+ unsigned nopts;
+ int val = 0;
+ const struct argp_option *opt, *real = entry->opt;
+ char *so = entry->short_options;
+
+ for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
+ if (oshort (opt) && *so == opt->key)
+ {
+ if (!oalias (opt))
+ real = opt;
+ if (ovisible (opt))
+ val = (*func)(opt, real, domain, cookie);
+ so++;
+ }
+
+ return val;
+}
+
+static inline int
+__attribute__ ((always_inline))
+hol_entry_long_iterate (const struct hol_entry *entry,
+ int (*func)(const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie),
+ const char *domain, void *cookie)
+{
+ unsigned nopts;
+ int val = 0;
+ const struct argp_option *opt, *real = entry->opt;
+
+ for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
+ if (opt->name)
+ {
+ if (!oalias (opt))
+ real = opt;
+ if (ovisible (opt))
+ val = (*func)(opt, real, domain, cookie);
+ }
+
+ return val;
+}
+
+/* Iterator that returns true for the first short option. */
+static inline int
+until_short (const struct argp_option *opt, const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ return oshort (opt) ? opt->key : 0;
+}
+
+/* Returns the first valid short option in ENTRY, or 0 if there is none. */
+static char
+hol_entry_first_short (const struct hol_entry *entry)
+{
+ return hol_entry_short_iterate (entry, until_short,
+ entry->argp->argp_domain, 0);
+}
+
+/* Returns the first valid long option in ENTRY, or 0 if there is none. */
+static const char *
+hol_entry_first_long (const struct hol_entry *entry)
+{
+ const struct argp_option *opt;
+ unsigned num;
+ for (opt = entry->opt, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && ovisible (opt))
+ return opt->name;
+ return 0;
+}
+
+/* Returns the entry in HOL with the long option name NAME, or 0 if there is
+ none. */
+static struct hol_entry *
+hol_find_entry (struct hol *hol, const char *name)
+{
+ struct hol_entry *entry = hol->entries;
+ unsigned num_entries = hol->num_entries;
+
+ while (num_entries-- > 0)
+ {
+ const struct argp_option *opt = entry->opt;
+ unsigned num_opts = entry->num;
+
+ while (num_opts-- > 0)
+ if (opt->name && ovisible (opt) && strcmp (opt->name, name) == 0)
+ return entry;
+ else
+ opt++;
+
+ entry++;
+ }
+
+ return 0;
+}
+
+/* If an entry with the long option NAME occurs in HOL, set it's special
+ sort position to GROUP. */
+static void
+hol_set_group (struct hol *hol, const char *name, int group)
+{
+ struct hol_entry *entry = hol_find_entry (hol, name);
+ if (entry)
+ entry->group = group;
+}
+
+/* Order by group: 0, 1, 2, ..., n, -m, ..., -2, -1.
+ EQ is what to return if GROUP1 and GROUP2 are the same. */
+static int
+group_cmp (int group1, int group2, int eq)
+{
+ if (group1 == group2)
+ return eq;
+ else if ((group1 < 0 && group2 < 0) || (group1 >= 0 && group2 >= 0))
+ return group1 - group2;
+ else
+ return group2 - group1;
+}
+
+/* Compare clusters CL1 & CL2 by the order that they should appear in
+ output. */
+static int
+hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2)
+{
+ /* If one cluster is deeper than the other, use its ancestor at the same
+ level, so that finding the common ancestor is straightforward.
+
+ clN->depth > 0 means that clN->parent != NULL (see hol_add_cluster) */
+ while (cl1->depth > cl2->depth)
+ cl1 = cl1->parent;
+ while (cl2->depth > cl1->depth)
+ cl2 = cl2->parent;
+
+ /* Now reduce both clusters to their ancestors at the point where both have
+ a common parent; these can be directly compared. */
+ while (cl1->parent != cl2->parent)
+ cl1 = cl1->parent, cl2 = cl2->parent;
+
+ return group_cmp (cl1->group, cl2->group, cl2->index - cl1->index);
+}
+
+/* Return the ancestor of CL that's just below the root (i.e., has a parent
+ of 0). */
+static struct hol_cluster *
+hol_cluster_base (struct hol_cluster *cl)
+{
+ while (cl->parent)
+ cl = cl->parent;
+ return cl;
+}
+
+/* Return true if CL1 is a child of CL2. */
+static int
+hol_cluster_is_child (const struct hol_cluster *cl1,
+ const struct hol_cluster *cl2)
+{
+ while (cl1 && cl1 != cl2)
+ cl1 = cl1->parent;
+ return cl1 == cl2;
+}
+
+/* Given the name of a OPTION_DOC option, modifies NAME to start at the tail
+ that should be used for comparisons, and returns true iff it should be
+ treated as a non-option. */
+static int
+canon_doc_option (const char **name)
+{
+ int non_opt;
+
+ if (!*name)
+ non_opt = 1;
+ else
+ {
+ /* Skip initial whitespace. */
+ while (isspace ((unsigned char) **name))
+ (*name)++;
+ /* Decide whether this looks like an option (leading `-') or not. */
+ non_opt = (**name != '-');
+ /* Skip until part of name used for sorting. */
+ while (**name && !isalnum ((unsigned char) **name))
+ (*name)++;
+ }
+ return non_opt;
+}
+
+#define HOL_ENTRY_PTRCMP(a,b) ((a)->ord < (b)->ord ? -1 : 1)
+
+/* Order ENTRY1 & ENTRY2 by the order which they should appear in a help
+ listing. */
+static int
+hol_entry_cmp (const struct hol_entry *entry1,
+ const struct hol_entry *entry2)
+{
+ /* The group numbers by which the entries should be ordered; if either is
+ in a cluster, then this is just the group within the cluster. */
+ int group1 = entry1->group, group2 = entry2->group;
+ int rc;
+
+ if (entry1->cluster != entry2->cluster)
+ {
+ /* The entries are not within the same cluster, so we can't compare them
+ directly, we have to use the appropiate clustering level too. */
+ if (! entry1->cluster)
+ /* ENTRY1 is at the `base level', not in a cluster, so we have to
+ compare it's group number with that of the base cluster in which
+ ENTRY2 resides. Note that if they're in the same group, the
+ clustered option always comes laster. */
+ return group_cmp (group1, hol_cluster_base (entry2->cluster)->group, -1);
+ else if (! entry2->cluster)
+ /* Likewise, but ENTRY2's not in a cluster. */
+ return group_cmp (hol_cluster_base (entry1->cluster)->group, group2, 1);
+ else
+ /* Both entries are in clusters, we can just compare the clusters. */
+ return (rc = hol_cluster_cmp (entry1->cluster, entry2->cluster)) ?
+ rc : HOL_ENTRY_PTRCMP(entry1, entry2);
+ }
+ else if (group1 == group2)
+ /* The entries are both in the same cluster and group, so compare them
+ alphabetically. */
+ {
+ int short1 = hol_entry_first_short (entry1);
+ int short2 = hol_entry_first_short (entry2);
+ int doc1 = odoc (entry1->opt);
+ int doc2 = odoc (entry2->opt);
+ const char *long1 = hol_entry_first_long (entry1);
+ const char *long2 = hol_entry_first_long (entry2);
+
+ if (doc1)
+ doc1 = canon_doc_option (&long1);
+ if (doc2)
+ doc2 = canon_doc_option (&long2);
+
+ if (doc1 != doc2)
+ /* `documentation' options always follow normal options (or
+ documentation options that *look* like normal options). */
+ return doc1 - doc2;
+ else if (!short1 && !short2 && long1 && long2)
+ /* Only long options. */
+ return (rc = __strcasecmp (long1, long2)) ?
+ rc : HOL_ENTRY_PTRCMP(entry1, entry2);
+ else
+ /* Compare short/short, long/short, short/long, using the first
+ character of long options. Entries without *any* valid
+ options (such as options with OPTION_HIDDEN set) will be put
+ first, but as they're not displayed, it doesn't matter where
+ they are. */
+ {
+ char first1 = short1 ? short1 : long1 ? *long1 : 0;
+ char first2 = short2 ? short2 : long2 ? *long2 : 0;
+#ifdef _tolower
+ int lower_cmp = _tolower (first1) - _tolower (first2);
+#else
+ int lower_cmp = tolower (first1) - tolower (first2);
+#endif
+ /* Compare ignoring case, except when the options are both the
+ same letter, in which case lower-case always comes first. */
+ return lower_cmp ? lower_cmp :
+ (rc = first2 - first1) ?
+ rc : HOL_ENTRY_PTRCMP(entry1, entry2);
+ }
+ }
+ else
+ /* Within the same cluster, but not the same group, so just compare
+ groups. */
+ return group_cmp (group1, group2, HOL_ENTRY_PTRCMP(entry1, entry2));
+}
+
+/* Version of hol_entry_cmp with correct signature for qsort. */
+static int
+hol_entry_qcmp (const void *entry1_v, const void *entry2_v)
+{
+ return hol_entry_cmp (entry1_v, entry2_v);
+}
+
+/* Sort HOL by group and alphabetically by option name (with short options
+ taking precedence over long). Since the sorting is for display purposes
+ only, the shadowing of options isn't effected. */
+static void
+hol_sort (struct hol *hol)
+{
+ if (hol->num_entries > 0)
+ {
+ unsigned i;
+ struct hol_entry *e;
+ for (i = 0, e = hol->entries; i < hol->num_entries; i++, e++)
+ e->ord = i;
+ qsort (hol->entries, hol->num_entries, sizeof (struct hol_entry),
+ hol_entry_qcmp);
+ }
+}
+
+/* Append MORE to HOL, destroying MORE in the process. Options in HOL shadow
+ any in MORE with the same name. */
+static void
+hol_append (struct hol *hol, struct hol *more)
+{
+ struct hol_cluster **cl_end = &hol->clusters;
+
+ /* Steal MORE's cluster list, and add it to the end of HOL's. */
+ while (*cl_end)
+ cl_end = &(*cl_end)->next;
+ *cl_end = more->clusters;
+ more->clusters = 0;
+
+ /* Merge entries. */
+ if (more->num_entries > 0)
+ {
+ if (hol->num_entries == 0)
+ {
+ hol->num_entries = more->num_entries;
+ hol->entries = more->entries;
+ hol->short_options = more->short_options;
+ more->num_entries = 0; /* Mark MORE's fields as invalid. */
+ }
+ else
+ /* Append the entries in MORE to those in HOL, taking care to only add
+ non-shadowed SHORT_OPTIONS values. */
+ {
+ unsigned left;
+ char *so, *more_so;
+ struct hol_entry *e;
+ unsigned num_entries = hol->num_entries + more->num_entries;
+ struct hol_entry *entries =
+ malloc (num_entries * sizeof (struct hol_entry));
+ unsigned hol_so_len = strlen (hol->short_options);
+ char *short_options =
+ malloc (hol_so_len + strlen (more->short_options) + 1);
+
+ assert (entries && short_options);
+ if (SIZE_MAX <= UINT_MAX)
+ assert (num_entries <= SIZE_MAX / sizeof (struct hol_entry));
+
+ __mempcpy (__mempcpy (entries, hol->entries,
+ hol->num_entries * sizeof (struct hol_entry)),
+ more->entries,
+ more->num_entries * sizeof (struct hol_entry));
+
+ __mempcpy (short_options, hol->short_options, hol_so_len);
+
+ /* Fix up the short options pointers from HOL. */
+ for (e = entries, left = hol->num_entries; left > 0; e++, left--)
+ e->short_options += (short_options - hol->short_options);
+
+ /* Now add the short options from MORE, fixing up its entries
+ too. */
+ so = short_options + hol_so_len;
+ more_so = more->short_options;
+ for (left = more->num_entries; left > 0; e++, left--)
+ {
+ int opts_left;
+ const struct argp_option *opt;
+
+ e->short_options = so;
+
+ for (opts_left = e->num, opt = e->opt; opts_left; opt++, opts_left--)
+ {
+ int ch = *more_so;
+ if (oshort (opt) && ch == opt->key)
+ /* The next short option in MORE_SO, CH, is from OPT. */
+ {
+ if (! find_char (ch, short_options,
+ short_options + hol_so_len))
+ /* The short option CH isn't shadowed by HOL's options,
+ so add it to the sum. */
+ *so++ = ch;
+ more_so++;
+ }
+ }
+ }
+
+ *so = '\0';
+
+ free (hol->entries);
+ free (hol->short_options);
+
+ hol->entries = entries;
+ hol->num_entries = num_entries;
+ hol->short_options = short_options;
+ }
+ }
+
+ hol_free (more);
+}
+
+/* Inserts enough spaces to make sure STREAM is at column COL. */
+static void
+indent_to (argp_fmtstream_t stream, unsigned col)
+{
+ int needed = col - __argp_fmtstream_point (stream);
+ while (needed-- > 0)
+ __argp_fmtstream_putc (stream, ' ');
+}
+
+/* Output to STREAM either a space, or a newline if there isn't room for at
+ least ENSURE characters before the right margin. */
+static void
+space (argp_fmtstream_t stream, size_t ensure)
+{
+ if (__argp_fmtstream_point (stream) + ensure
+ >= __argp_fmtstream_rmargin (stream))
+ __argp_fmtstream_putc (stream, '\n');
+ else
+ __argp_fmtstream_putc (stream, ' ');
+}
+
+/* If the option REAL has an argument, we print it in using the printf
+ format REQ_FMT or OPT_FMT depending on whether it's a required or
+ optional argument. */
+static void
+arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt,
+ const char *domain, argp_fmtstream_t stream)
+{
+ if (real->arg)
+ {
+ if (real->flags & OPTION_ARG_OPTIONAL)
+ __argp_fmtstream_printf (stream, opt_fmt,
+ dgettext (domain, real->arg));
+ else
+ __argp_fmtstream_printf (stream, req_fmt,
+ dgettext (domain, real->arg));
+ }
+}
+
+/* Helper functions for hol_entry_help. */
+
+/* State used during the execution of hol_help. */
+struct hol_help_state
+{
+ /* PREV_ENTRY should contain the previous entry printed, or 0. */
+ struct hol_entry *prev_entry;
+
+ /* If an entry is in a different group from the previous one, and SEP_GROUPS
+ is true, then a blank line will be printed before any output. */
+ int sep_groups;
+
+ /* True if a duplicate option argument was suppressed (only ever set if
+ UPARAMS.dup_args is false). */
+ int suppressed_dup_arg;
+};
+
+/* Some state used while printing a help entry (used to communicate with
+ helper functions). See the doc for hol_entry_help for more info, as most
+ of the fields are copied from its arguments. */
+struct pentry_state
+{
+ const struct hol_entry *entry;
+ argp_fmtstream_t stream;
+ struct hol_help_state *hhstate;
+
+ /* True if nothing's been printed so far. */
+ int first;
+
+ /* If non-zero, the state that was used to print this help. */
+ const struct argp_state *state;
+};
+
+/* If a user doc filter should be applied to DOC, do so. */
+static const char *
+filter_doc (const char *doc, int key, const struct argp *argp,
+ const struct argp_state *state)
+{
+ if (argp->help_filter)
+ /* We must apply a user filter to this output. */
+ {
+ void *input = __argp_input (argp, state);
+ return (*argp->help_filter) (key, doc, input);
+ }
+ else
+ /* No filter. */
+ return doc;
+}
+
+/* Prints STR as a header line, with the margin lines set appropiately, and
+ notes the fact that groups should be separated with a blank line. ARGP is
+ the argp that should dictate any user doc filtering to take place. Note
+ that the previous wrap margin isn't restored, but the left margin is reset
+ to 0. */
+static void
+print_header (const char *str, const struct argp *argp,
+ struct pentry_state *pest)
+{
+ const char *tstr = dgettext (argp->argp_domain, str);
+ const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest->state);
+
+ if (fstr)
+ {
+ if (*fstr)
+ {
+ if (pest->hhstate->prev_entry)
+ /* Precede with a blank line. */
+ __argp_fmtstream_putc (pest->stream, '\n');
+ indent_to (pest->stream, uparams.header_col);
+ __argp_fmtstream_set_lmargin (pest->stream, uparams.header_col);
+ __argp_fmtstream_set_wmargin (pest->stream, uparams.header_col);
+ __argp_fmtstream_puts (pest->stream, fstr);
+ __argp_fmtstream_set_lmargin (pest->stream, 0);
+ __argp_fmtstream_putc (pest->stream, '\n');
+ }
+
+ pest->hhstate->sep_groups = 1; /* Separate subsequent groups. */
+ }
+
+ if (fstr != tstr)
+ free ((char *) fstr);
+}
+
+/* Inserts a comma if this isn't the first item on the line, and then makes
+ sure we're at least to column COL. If this *is* the first item on a line,
+ prints any pending whitespace/headers that should precede this line. Also
+ clears FIRST. */
+static void
+comma (unsigned col, struct pentry_state *pest)
+{
+ if (pest->first)
+ {
+ const struct hol_entry *pe = pest->hhstate->prev_entry;
+ const struct hol_cluster *cl = pest->entry->cluster;
+
+ if (pest->hhstate->sep_groups && pe && pest->entry->group != pe->group)
+ __argp_fmtstream_putc (pest->stream, '\n');
+
+ if (cl && cl->header && *cl->header
+ && (!pe
+ || (pe->cluster != cl
+ && !hol_cluster_is_child (pe->cluster, cl))))
+ /* If we're changing clusters, then this must be the start of the
+ ENTRY's cluster unless that is an ancestor of the previous one
+ (in which case we had just popped into a sub-cluster for a bit).
+ If so, then print the cluster's header line. */
+ {
+ int old_wm = __argp_fmtstream_wmargin (pest->stream);
+ print_header (cl->header, cl->argp, pest);
+ __argp_fmtstream_set_wmargin (pest->stream, old_wm);
+ }
+
+ pest->first = 0;
+ }
+ else
+ __argp_fmtstream_puts (pest->stream, ", ");
+
+ indent_to (pest->stream, col);
+}
+
+/* Print help for ENTRY to STREAM. */
+static void
+hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
+ argp_fmtstream_t stream, struct hol_help_state *hhstate)
+{
+ unsigned num;
+ const struct argp_option *real = entry->opt, *opt;
+ char *so = entry->short_options;
+ int have_long_opt = 0; /* We have any long options. */
+ /* Saved margins. */
+ int old_lm = __argp_fmtstream_set_lmargin (stream, 0);
+ int old_wm = __argp_fmtstream_wmargin (stream);
+ /* PEST is a state block holding some of our variables that we'd like to
+ share with helper functions. */
+ struct pentry_state pest;
+
+ pest.entry = entry;
+ pest.stream = stream;
+ pest.hhstate = hhstate;
+ pest.first = 1;
+ pest.state = state;
+
+ if (! odoc (real))
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && ovisible (opt))
+ {
+ have_long_opt = 1;
+ break;
+ }
+
+ /* First emit short options. */
+ __argp_fmtstream_set_wmargin (stream, uparams.short_opt_col); /* For truly bizarre cases. */
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (oshort (opt) && opt->key == *so)
+ /* OPT has a valid (non shadowed) short option. */
+ {
+ if (ovisible (opt))
+ {
+ comma (uparams.short_opt_col, &pest);
+ __argp_fmtstream_putc (stream, '-');
+ __argp_fmtstream_putc (stream, *so);
+ if (!have_long_opt || uparams.dup_args)
+ arg (real, " %s", "[%s]", state->root_argp->argp_domain, stream);
+ else if (real->arg)
+ hhstate->suppressed_dup_arg = 1;
+ }
+ so++;
+ }
+
+ /* Now, long options. */
+ if (odoc (real))
+ /* A `documentation' option. */
+ {
+ __argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col);
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && *opt->name && ovisible (opt))
+ {
+ comma (uparams.doc_opt_col, &pest);
+ /* Calling dgettext here isn't quite right, since sorting will
+ have been done on the original; but documentation options
+ should be pretty rare anyway... */
+ __argp_fmtstream_puts (stream,
+ onotrans (opt) ?
+ opt->name :
+ dgettext (state->root_argp->argp_domain,
+ opt->name));
+ }
+ }
+ else
+ /* A real long option. */
+ {
+ int first_long_opt = 1;
+
+ __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col);
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && ovisible (opt))
+ {
+ comma (uparams.long_opt_col, &pest);
+ __argp_fmtstream_printf (stream, "--%s", opt->name);
+ if (first_long_opt || uparams.dup_args)
+ arg (real, "=%s", "[=%s]", state->root_argp->argp_domain,
+ stream);
+ else if (real->arg)
+ hhstate->suppressed_dup_arg = 1;
+ }
+ }
+
+ /* Next, documentation strings. */
+ __argp_fmtstream_set_lmargin (stream, 0);
+
+ if (pest.first)
+ {
+ /* Didn't print any switches, what's up? */
+ if (!oshort (real) && !real->name)
+ /* This is a group header, print it nicely. */
+ print_header (real->doc, entry->argp, &pest);
+ else
+ /* Just a totally shadowed option or null header; print nothing. */
+ goto cleanup; /* Just return, after cleaning up. */
+ }
+ else
+ {
+ const char *tstr = real->doc ? dgettext (state->root_argp->argp_domain,
+ real->doc) : 0;
+ const char *fstr = filter_doc (tstr, real->key, entry->argp, state);
+ if (fstr && *fstr)
+ {
+ unsigned int col = __argp_fmtstream_point (stream);
+
+ __argp_fmtstream_set_lmargin (stream, uparams.opt_doc_col);
+ __argp_fmtstream_set_wmargin (stream, uparams.opt_doc_col);
+
+ if (col > (unsigned int) (uparams.opt_doc_col + 3))
+ __argp_fmtstream_putc (stream, '\n');
+ else if (col >= (unsigned int) uparams.opt_doc_col)
+ __argp_fmtstream_puts (stream, " ");
+ else
+ indent_to (stream, uparams.opt_doc_col);
+
+ __argp_fmtstream_puts (stream, fstr);
+ }
+ if (fstr && fstr != tstr)
+ free ((char *) fstr);
+
+ /* Reset the left margin. */
+ __argp_fmtstream_set_lmargin (stream, 0);
+ __argp_fmtstream_putc (stream, '\n');
+ }
+
+ hhstate->prev_entry = entry;
+
+cleanup:
+ __argp_fmtstream_set_lmargin (stream, old_lm);
+ __argp_fmtstream_set_wmargin (stream, old_wm);
+}
+
+/* Output a long help message about the options in HOL to STREAM. */
+static void
+hol_help (struct hol *hol, const struct argp_state *state,
+ argp_fmtstream_t stream)
+{
+ unsigned num;
+ struct hol_entry *entry;
+ struct hol_help_state hhstate = { 0, 0, 0 };
+
+ for (entry = hol->entries, num = hol->num_entries; num > 0; entry++, num--)
+ hol_entry_help (entry, state, stream, &hhstate);
+
+ if (hhstate.suppressed_dup_arg && uparams.dup_args_note)
+ {
+ const char *tstr = dgettext (state->root_argp->argp_domain, "\
+Mandatory or optional arguments to long options are also mandatory or \
+optional for any corresponding short options.");
+ const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE,
+ state ? state->root_argp : 0, state);
+ if (fstr && *fstr)
+ {
+ __argp_fmtstream_putc (stream, '\n');
+ __argp_fmtstream_puts (stream, fstr);
+ __argp_fmtstream_putc (stream, '\n');
+ }
+ if (fstr && fstr != tstr)
+ free ((char *) fstr);
+ }
+}
+
+/* Helper functions for hol_usage. */
+
+/* If OPT is a short option without an arg, append its key to the string
+ pointer pointer to by COOKIE, and advance the pointer. */
+static int
+add_argless_short_opt (const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ char **snao_end = cookie;
+ if (!(opt->arg || real->arg)
+ && !((opt->flags | real->flags) & OPTION_NO_USAGE))
+ *(*snao_end)++ = opt->key;
+ return 0;
+}
+
+/* If OPT is a short option with an arg, output a usage entry for it to the
+ stream pointed at by COOKIE. */
+static int
+usage_argful_short_opt (const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ argp_fmtstream_t stream = cookie;
+ const char *arg = opt->arg;
+ int flags = opt->flags | real->flags;
+
+ if (! arg)
+ arg = real->arg;
+
+ if (arg && !(flags & OPTION_NO_USAGE))
+ {
+ arg = dgettext (domain, arg);
+
+ if (flags & OPTION_ARG_OPTIONAL)
+ __argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg);
+ else
+ {
+ /* Manually do line wrapping so that it (probably) won't
+ get wrapped at the embedded space. */
+ space (stream, 6 + strlen (arg));
+ __argp_fmtstream_printf (stream, "[-%c %s]", opt->key, arg);
+ }
+ }
+
+ return 0;
+}
+
+/* Output a usage entry for the long option opt to the stream pointed at by
+ COOKIE. */
+static int
+usage_long_opt (const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ argp_fmtstream_t stream = cookie;
+ const char *arg = opt->arg;
+ int flags = opt->flags | real->flags;
+
+ if (! arg)
+ arg = real->arg;
+
+ if (! (flags & OPTION_NO_USAGE) && !odoc (opt))
+ {
+ if (arg)
+ {
+ arg = dgettext (domain, arg);
+ if (flags & OPTION_ARG_OPTIONAL)
+ __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg);
+ else
+ __argp_fmtstream_printf (stream, " [--%s=%s]", opt->name, arg);
+ }
+ else
+ __argp_fmtstream_printf (stream, " [--%s]", opt->name);
+ }
+
+ return 0;
+}
+
+/* Print a short usage description for the arguments in HOL to STREAM. */
+static void
+hol_usage (struct hol *hol, argp_fmtstream_t stream)
+{
+ if (hol->num_entries > 0)
+ {
+ unsigned nentries;
+ struct hol_entry *entry;
+ char *short_no_arg_opts = alloca (strlen (hol->short_options) + 1);
+ char *snao_end = short_no_arg_opts;
+
+ /* First we put a list of short options without arguments. */
+ for (entry = hol->entries, nentries = hol->num_entries
+ ; nentries > 0
+ ; entry++, nentries--)
+ hol_entry_short_iterate (entry, add_argless_short_opt,
+ entry->argp->argp_domain, &snao_end);
+ if (snao_end > short_no_arg_opts)
+ {
+ *snao_end++ = 0;
+ __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts);
+ }
+
+ /* Now a list of short options *with* arguments. */
+ for (entry = hol->entries, nentries = hol->num_entries
+ ; nentries > 0
+ ; entry++, nentries--)
+ hol_entry_short_iterate (entry, usage_argful_short_opt,
+ entry->argp->argp_domain, stream);
+
+ /* Finally, a list of long options (whew!). */
+ for (entry = hol->entries, nentries = hol->num_entries
+ ; nentries > 0
+ ; entry++, nentries--)
+ hol_entry_long_iterate (entry, usage_long_opt,
+ entry->argp->argp_domain, stream);
+ }
+}
+
+/* Make a HOL containing all levels of options in ARGP. CLUSTER is the
+ cluster in which ARGP's entries should be clustered, or 0. */
+static struct hol *
+argp_hol (const struct argp *argp, struct hol_cluster *cluster)
+{
+ const struct argp_child *child = argp->children;
+ struct hol *hol = make_hol (argp, cluster);
+ if (child)
+ while (child->argp)
+ {
+ struct hol_cluster *child_cluster =
+ ((child->group || child->header)
+ /* Put CHILD->argp within its own cluster. */
+ ? hol_add_cluster (hol, child->group, child->header,
+ child - argp->children, cluster, argp)
+ /* Just merge it into the parent's cluster. */
+ : cluster);
+ hol_append (hol, argp_hol (child->argp, child_cluster)) ;
+ child++;
+ }
+ return hol;
+}
+
+/* Calculate how many different levels with alternative args strings exist in
+ ARGP. */
+static size_t
+argp_args_levels (const struct argp *argp)
+{
+ size_t levels = 0;
+ const struct argp_child *child = argp->children;
+
+ if (argp->args_doc && strchr (argp->args_doc, '\n'))
+ levels++;
+
+ if (child)
+ while (child->argp)
+ levels += argp_args_levels ((child++)->argp);
+
+ return levels;
+}
+
+/* Print all the non-option args documented in ARGP to STREAM. Any output is
+ preceded by a space. LEVELS is a pointer to a byte vector the length
+ returned by argp_args_levels; it should be initialized to zero, and
+ updated by this routine for the next call if ADVANCE is true. True is
+ returned as long as there are more patterns to output. */
+static int
+argp_args_usage (const struct argp *argp, const struct argp_state *state,
+ char **levels, int advance, argp_fmtstream_t stream)
+{
+ char *our_level = *levels;
+ int multiple = 0;
+ const struct argp_child *child = argp->children;
+ const char *tdoc = dgettext (argp->argp_domain, argp->args_doc), *nl = 0;
+ const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state);
+
+ if (fdoc)
+ {
+ const char *cp = fdoc;
+ nl = __strchrnul (cp, '\n');
+ if (*nl != '\0')
+ /* This is a `multi-level' args doc; advance to the correct position
+ as determined by our state in LEVELS, and update LEVELS. */
+ {
+ int i;
+ multiple = 1;
+ for (i = 0; i < *our_level; i++)
+ cp = nl + 1, nl = __strchrnul (cp, '\n');
+ (*levels)++;
+ }
+
+ /* Manually do line wrapping so that it (probably) won't get wrapped at
+ any embedded spaces. */
+ space (stream, 1 + nl - cp);
+
+ __argp_fmtstream_write (stream, cp, nl - cp);
+ }
+ if (fdoc && fdoc != tdoc)
+ free ((char *)fdoc); /* Free user's modified doc string. */
+
+ if (child)
+ while (child->argp)
+ advance = !argp_args_usage ((child++)->argp, state, levels, advance, stream);
+
+ if (advance && multiple)
+ {
+ /* Need to increment our level. */
+ if (*nl)
+ /* There's more we can do here. */
+ {
+ (*our_level)++;
+ advance = 0; /* Our parent shouldn't advance also. */
+ }
+ else if (*our_level > 0)
+ /* We had multiple levels, but used them up; reset to zero. */
+ *our_level = 0;
+ }
+
+ return !advance;
+}
+
+/* Print the documentation for ARGP to STREAM; if POST is false, then
+ everything preceeding a `\v' character in the documentation strings (or
+ the whole string, for those with none) is printed, otherwise, everything
+ following the `\v' character (nothing for strings without). Each separate
+ bit of documentation is separated a blank line, and if PRE_BLANK is true,
+ then the first is as well. If FIRST_ONLY is true, only the first
+ occurrence is output. Returns true if anything was output. */
+static int
+argp_doc (const struct argp *argp, const struct argp_state *state,
+ int post, int pre_blank, int first_only,
+ argp_fmtstream_t stream)
+{
+ const char *text;
+ const char *inp_text;
+ size_t inp_text_len = 0;
+ const char *trans_text;
+ void *input = 0;
+ int anything = 0;
+ const struct argp_child *child = argp->children;
+
+ if (argp->doc)
+ {
+ char *vt = strchr (argp->doc, '\v');
+ if (vt)
+ {
+ if (post)
+ inp_text = vt + 1;
+ else
+ {
+ inp_text_len = vt - argp->doc;
+ inp_text = __strndup (argp->doc, inp_text_len);
+ }
+ }
+ else
+ inp_text = post ? 0 : argp->doc;
+ trans_text = inp_text ? dgettext (argp->argp_domain, inp_text) : NULL;
+ }
+ else
+ trans_text = inp_text = 0;
+
+ if (argp->help_filter)
+ /* We have to filter the doc strings. */
+ {
+ input = __argp_input (argp, state);
+ text =
+ (*argp->help_filter) (post
+ ? ARGP_KEY_HELP_POST_DOC
+ : ARGP_KEY_HELP_PRE_DOC,
+ trans_text, input);
+ }
+ else
+ text = (const char *) trans_text;
+
+ if (text)
+ {
+ if (pre_blank)
+ __argp_fmtstream_putc (stream, '\n');
+
+ __argp_fmtstream_puts (stream, text);
+
+ if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream))
+ __argp_fmtstream_putc (stream, '\n');
+
+ anything = 1;
+ }
+
+ if (text && text != trans_text)
+ free ((char *) text); /* Free TEXT returned from the help filter. */
+
+ if (inp_text && inp_text_len)
+ free ((char *) inp_text); /* We copied INP_TEXT, so free it now. */
+
+ if (post && argp->help_filter)
+ /* Now see if we have to output a ARGP_KEY_HELP_EXTRA text. */
+ {
+ text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input);
+ if (text)
+ {
+ if (anything || pre_blank)
+ __argp_fmtstream_putc (stream, '\n');
+ __argp_fmtstream_puts (stream, text);
+ free ((char *) text);
+ if (__argp_fmtstream_point (stream)
+ > __argp_fmtstream_lmargin (stream))
+ __argp_fmtstream_putc (stream, '\n');
+ anything = 1;
+ }
+ }
+
+ if (child)
+ while (child->argp && !(first_only && anything))
+ anything |=
+ argp_doc ((child++)->argp, state,
+ post, anything || pre_blank, first_only,
+ stream);
+
+ return anything;
+}
+
+/* Output a usage message for ARGP to STREAM. If called from
+ argp_state_help, STATE is the relevent parsing state. FLAGS are from the
+ set ARGP_HELP_*. NAME is what to use wherever a `program name' is
+ needed. */
+static void
+_help (const struct argp *argp, const struct argp_state *state, FILE *stream,
+ unsigned flags, char *name)
+{
+ int anything = 0; /* Whether we've output anything. */
+ struct hol *hol = 0;
+ argp_fmtstream_t fs;
+
+ if (! stream)
+ return;
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __flockfile (stream);
+#endif
+
+ if (! uparams.valid)
+ fill_in_uparams (state);
+
+ fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0);
+ if (! fs)
+ {
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+ return;
+ }
+
+ if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG))
+ {
+ hol = argp_hol (argp, 0);
+
+ /* If present, these options always come last. */
+ hol_set_group (hol, "help", -1);
+ hol_set_group (hol, "version", -1);
+
+ hol_sort (hol);
+ }
+
+ if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE))
+ /* Print a short `Usage:' message. */
+ {
+ int first_pattern = 1, more_patterns;
+ size_t num_pattern_levels = argp_args_levels (argp);
+ char *pattern_levels = alloca (num_pattern_levels);
+
+ memset (pattern_levels, 0, num_pattern_levels);
+
+ do
+ {
+ int old_lm;
+ int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent);
+ char *levels = pattern_levels;
+
+ if (first_pattern)
+ __argp_fmtstream_printf (fs, "%s %s",
+ dgettext (argp->argp_domain, "Usage:"),
+ name);
+ else
+ __argp_fmtstream_printf (fs, "%s %s",
+ dgettext (argp->argp_domain, " or: "),
+ name);
+
+ /* We set the lmargin as well as the wmargin, because hol_usage
+ manually wraps options with newline to avoid annoying breaks. */
+ old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent);
+
+ if (flags & ARGP_HELP_SHORT_USAGE)
+ /* Just show where the options go. */
+ {
+ if (hol->num_entries > 0)
+ __argp_fmtstream_puts (fs, dgettext (argp->argp_domain,
+ " [OPTION...]"));
+ }
+ else
+ /* Actually print the options. */
+ {
+ hol_usage (hol, fs);
+ flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once. */
+ }
+
+ more_patterns = argp_args_usage (argp, state, &levels, 1, fs);
+
+ __argp_fmtstream_set_wmargin (fs, old_wm);
+ __argp_fmtstream_set_lmargin (fs, old_lm);
+
+ __argp_fmtstream_putc (fs, '\n');
+ anything = 1;
+
+ first_pattern = 0;
+ }
+ while (more_patterns);
+ }
+
+ if (flags & ARGP_HELP_PRE_DOC)
+ anything |= argp_doc (argp, state, 0, 0, 1, fs);
+
+ if (flags & ARGP_HELP_SEE)
+ {
+ __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\
+Try `%s --help' or `%s --usage' for more information.\n"),
+ name, name);
+ anything = 1;
+ }
+
+ if (flags & ARGP_HELP_LONG)
+ /* Print a long, detailed help message. */
+ {
+ /* Print info about all the options. */
+ if (hol->num_entries > 0)
+ {
+ if (anything)
+ __argp_fmtstream_putc (fs, '\n');
+ hol_help (hol, state, fs);
+ anything = 1;
+ }
+ }
+
+ if (flags & ARGP_HELP_POST_DOC)
+ /* Print any documentation strings at the end. */
+ anything |= argp_doc (argp, state, 1, anything, 0, fs);
+
+ if ((flags & ARGP_HELP_BUG_ADDR) && argp_program_bug_address)
+ {
+ if (anything)
+ __argp_fmtstream_putc (fs, '\n');
+ __argp_fmtstream_printf (fs, dgettext (argp->argp_domain,
+ "Report bugs to %s.\n"),
+ argp_program_bug_address);
+ anything = 1;
+ }
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+
+ if (hol)
+ hol_free (hol);
+
+ __argp_fmtstream_free (fs);
+}
+
+/* Output a usage message for ARGP to STREAM. FLAGS are from the set
+ ARGP_HELP_*. NAME is what to use wherever a `program name' is needed. */
+void __argp_help (const struct argp *argp, FILE *stream,
+ unsigned flags, char *name)
+{
+ struct argp_state state;
+ memset (&state, 0, sizeof state);
+ state.root_argp = argp;
+ _help (argp, &state, stream, flags, name);
+}
+#ifdef weak_alias
+weak_alias (__argp_help, argp_help)
+#endif
+
+#if ! (defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME)
+char *
+__argp_short_program_name (void)
+{
+# if HAVE_DECL_PROGRAM_INVOCATION_NAME
+ return __argp_base_name (program_invocation_name);
+# else
+ /* FIXME: What now? Miles suggests that it is better to use NULL,
+ but currently the value is passed on directly to fputs_unlocked,
+ so that requires more changes. */
+# if __GNUC__
+# warning No reasonable value to return
+# endif /* __GNUC__ */
+ return "";
+# endif
+}
+#endif
+
+/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
+ from the set ARGP_HELP_*. */
+void
+__argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags)
+{
+ if ((!state || ! (state->flags & ARGP_NO_ERRS)) && stream)
+ {
+ if (state && (state->flags & ARGP_LONG_ONLY))
+ flags |= ARGP_HELP_LONG_ONLY;
+
+ _help (state ? state->root_argp : 0, state, stream, flags,
+ state ? state->name : __argp_short_program_name ());
+
+ if (!state || ! (state->flags & ARGP_NO_EXIT))
+ {
+ if (flags & ARGP_HELP_EXIT_ERR)
+ exit (argp_err_exit_status);
+ if (flags & ARGP_HELP_EXIT_OK)
+ exit (0);
+ }
+ }
+}
+#ifdef weak_alias
+weak_alias (__argp_state_help, argp_state_help)
+#endif
+
+/* If appropriate, print the printf string FMT and following args, preceded
+ by the program name and `:', to stderr, and followed by a `Try ... --help'
+ message, then exit (1). */
+void
+__argp_error (const struct argp_state *state, const char *fmt, ...)
+{
+ if (!state || !(state->flags & ARGP_NO_ERRS))
+ {
+ FILE *stream = state ? state->err_stream : stderr;
+
+ if (stream)
+ {
+ va_list ap;
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __flockfile (stream);
+#endif
+
+ va_start (ap, fmt);
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ {
+ char *buf;
+
+ if (__asprintf (&buf, fmt, ap) < 0)
+ buf = NULL;
+
+ __fwprintf (stream, L"%s: %s\n",
+ state ? state->name : __argp_short_program_name (),
+ buf);
+
+ free (buf);
+ }
+ else
+#endif
+ {
+ fputs_unlocked (state
+ ? state->name : __argp_short_program_name (),
+ stream);
+ putc_unlocked (':', stream);
+ putc_unlocked (' ', stream);
+
+ vfprintf (stream, fmt, ap);
+
+ putc_unlocked ('\n', stream);
+ }
+
+ __argp_state_help (state, stream, ARGP_HELP_STD_ERR);
+
+ va_end (ap);
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+ }
+ }
+}
+#ifdef weak_alias
+weak_alias (__argp_error, argp_error)
+#endif
+
+/* Similar to the standard gnu error-reporting function error(), but will
+ respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
+ to STATE->err_stream. This is useful for argument parsing code that is
+ shared between program startup (when exiting is desired) and runtime
+ option parsing (when typically an error code is returned instead). The
+ difference between this function and argp_error is that the latter is for
+ *parsing errors*, and the former is for other problems that occur during
+ parsing but don't reflect a (syntactic) problem with the input. */
+void
+__argp_failure (const struct argp_state *state, int status, int errnum,
+ const char *fmt, ...)
+{
+ if (!state || !(state->flags & ARGP_NO_ERRS))
+ {
+ FILE *stream = state ? state->err_stream : stderr;
+
+ if (stream)
+ {
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __flockfile (stream);
+#endif
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ __fwprintf (stream, L"%s",
+ state ? state->name : __argp_short_program_name ());
+ else
+#endif
+ fputs_unlocked (state
+ ? state->name : __argp_short_program_name (),
+ stream);
+
+ if (fmt)
+ {
+ va_list ap;
+
+ va_start (ap, fmt);
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ {
+ char *buf;
+
+ if (__asprintf (&buf, fmt, ap) < 0)
+ buf = NULL;
+
+ __fwprintf (stream, L": %s", buf);
+
+ free (buf);
+ }
+ else
+#endif
+ {
+ putc_unlocked (':', stream);
+ putc_unlocked (' ', stream);
+
+ vfprintf (stream, fmt, ap);
+ }
+
+ va_end (ap);
+ }
+
+ if (errnum)
+ {
+ char buf[200];
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ __fwprintf (stream, L": %s",
+ __strerror_r (errnum, buf, sizeof (buf)));
+ else
+#endif
+ {
+ char const *s = NULL;
+ putc_unlocked (':', stream);
+ putc_unlocked (' ', stream);
+#if _LIBC || (HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P)
+ s = __strerror_r (errnum, buf, sizeof buf);
+#elif HAVE_DECL_STRERROR_R
+ if (__strerror_r (errnum, buf, sizeof buf) == 0)
+ s = buf;
+#endif
+#if !_LIBC
+ if (! s && ! (s = strerror (errnum)))
+ s = dgettext (state->root_argp->argp_domain,
+ "Unknown system error");
+#endif
+ fputs (s, stream);
+ }
+ }
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ putwc_unlocked (L'\n', stream);
+ else
+#endif
+ putc_unlocked ('\n', stream);
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+
+ if (status && (!state || !(state->flags & ARGP_NO_EXIT)))
+ exit (status);
+ }
+ }
+}
+#ifdef weak_alias
+weak_alias (__argp_failure, argp_failure)
+#endif
diff --git a/lib/argp-namefrob.h b/lib/argp-namefrob.h
new file mode 100644
index 0000000..6fe99cd
--- /dev/null
+++ b/lib/argp-namefrob.h
@@ -0,0 +1,158 @@
+/* Name frobnication for compiling argp outside of glibc
+ Copyright (C) 1997, 2003, 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if !_LIBC
+/* This code is written for inclusion in gnu-libc, and uses names in the
+ namespace reserved for libc. If we're not compiling in libc, define those
+ names to be the normal ones instead. */
+
+/* argp-parse functions */
+#undef __argp_parse
+#define __argp_parse argp_parse
+#undef __option_is_end
+#define __option_is_end _option_is_end
+#undef __option_is_short
+#define __option_is_short _option_is_short
+#undef __argp_input
+#define __argp_input _argp_input
+
+/* argp-help functions */
+#undef __argp_help
+#define __argp_help argp_help
+#undef __argp_error
+#define __argp_error argp_error
+#undef __argp_failure
+#define __argp_failure argp_failure
+#undef __argp_state_help
+#define __argp_state_help argp_state_help
+#undef __argp_usage
+#define __argp_usage argp_usage
+
+/* argp-fmtstream functions */
+#undef __argp_make_fmtstream
+#define __argp_make_fmtstream argp_make_fmtstream
+#undef __argp_fmtstream_free
+#define __argp_fmtstream_free argp_fmtstream_free
+#undef __argp_fmtstream_putc
+#define __argp_fmtstream_putc argp_fmtstream_putc
+#undef __argp_fmtstream_puts
+#define __argp_fmtstream_puts argp_fmtstream_puts
+#undef __argp_fmtstream_write
+#define __argp_fmtstream_write argp_fmtstream_write
+#undef __argp_fmtstream_printf
+#define __argp_fmtstream_printf argp_fmtstream_printf
+#undef __argp_fmtstream_set_lmargin
+#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
+#undef __argp_fmtstream_set_rmargin
+#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
+#undef __argp_fmtstream_set_wmargin
+#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
+#undef __argp_fmtstream_point
+#define __argp_fmtstream_point argp_fmtstream_point
+#undef __argp_fmtstream_update
+#define __argp_fmtstream_update _argp_fmtstream_update
+#undef __argp_fmtstream_ensure
+#define __argp_fmtstream_ensure _argp_fmtstream_ensure
+#undef __argp_fmtstream_lmargin
+#define __argp_fmtstream_lmargin argp_fmtstream_lmargin
+#undef __argp_fmtstream_rmargin
+#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
+#undef __argp_fmtstream_wmargin
+#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
+
+/* normal libc functions we call */
+#undef __flockfile
+#define __flockfile flockfile
+#undef __funlockfile
+#define __funlockfile funlockfile
+#undef __mempcpy
+#define __mempcpy mempcpy
+#undef __sleep
+#define __sleep sleep
+#undef __strcasecmp
+#define __strcasecmp strcasecmp
+#undef __strchrnul
+#define __strchrnul strchrnul
+#undef __strerror_r
+#define __strerror_r strerror_r
+#undef __strndup
+#define __strndup strndup
+#undef __vsnprintf
+#define __vsnprintf vsnprintf
+
+#if defined(HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED
+# define clearerr_unlocked(x) clearerr (x)
+#endif
+#if defined(HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED
+# define feof_unlocked(x) feof (x)
+# endif
+#if defined(HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED
+# define ferror_unlocked(x) ferror (x)
+# endif
+#if defined(HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED
+# define fflush_unlocked(x) fflush (x)
+# endif
+#if defined(HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED
+# define fgets_unlocked(x,y,z) fgets (x,y,z)
+# endif
+#if defined(HAVE_DECL_FPUTC_UNLOCKED) && !HAVE_DECL_FPUTC_UNLOCKED
+# define fputc_unlocked(x,y) fputc (x,y)
+# endif
+#if defined(HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED
+# define fputs_unlocked(x,y) fputs (x,y)
+# endif
+#if defined(HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED
+# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
+# endif
+#if defined(HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED
+# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
+# endif
+#if defined(HAVE_DECL_GETC_UNLOCKED) && !HAVE_DECL_GETC_UNLOCKED
+# define getc_unlocked(x) getc (x)
+# endif
+#if defined(HAVE_DECL_GETCHAR_UNLOCKED) && !HAVE_DECL_GETCHAR_UNLOCKED
+# define getchar_unlocked() getchar ()
+# endif
+#if defined(HAVE_DECL_PUTC_UNLOCKED) && !HAVE_DECL_PUTC_UNLOCKED
+# define putc_unlocked(x,y) putc (x,y)
+# endif
+#if defined(HAVE_DECL_PUTCHAR_UNLOCKED) && !HAVE_DECL_PUTCHAR_UNLOCKED
+# define putchar_unlocked(x) putchar (x)
+# endif
+
+#endif /* !_LIBC */
+
+#ifndef __set_errno
+#define __set_errno(e) (errno = (e))
+#endif
+
+#if defined GNULIB_ARGP_DISABLE_DIRNAME
+# define __argp_base_name(arg) arg
+#elif defined GNULIB_ARGP_EXTERN_BASENAME
+extern char *__argp_base_name(const char *arg);
+#else
+# include "dirname.h"
+# define __argp_base_name base_name
+#endif
+
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+# define __argp_short_program_name() (program_invocation_short_name)
+#else
+extern char *__argp_short_program_name (void);
+#endif
diff --git a/lib/argp-parse.c b/lib/argp-parse.c
new file mode 100644
index 0000000..a7de729
--- /dev/null
+++ b/lib/argp-parse.c
@@ -0,0 +1,953 @@
+/* Hierarchial argument parsing, layered over getopt
+ Copyright (C) 1995-2000, 2002, 2003, 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <alloca.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+#include <getopt.h>
+#include <getopt_int.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+# undef dgettext
+# define dgettext(domain, msgid) \
+ INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
+#else
+# include "gettext.h"
+#endif
+#define N_(msgid) msgid
+
+#include "argp.h"
+#include "argp-namefrob.h"
+
+#define alignof(type) offsetof (struct { char c; type x; }, x)
+#define alignto(n, d) ((((n) + (d) - 1) / (d)) * (d))
+
+/* Getopt return values. */
+#define KEY_END (-1) /* The end of the options. */
+#define KEY_ARG 1 /* A non-option argument. */
+#define KEY_ERR '?' /* An error parsing the options. */
+
+/* The meta-argument used to prevent any further arguments being interpreted
+ as options. */
+#define QUOTE "--"
+
+/* The number of bits we steal in a long-option value for our own use. */
+#define GROUP_BITS CHAR_BIT
+
+/* The number of bits available for the user value. */
+#define USER_BITS ((sizeof ((struct option *)0)->val * CHAR_BIT) - GROUP_BITS)
+#define USER_MASK ((1 << USER_BITS) - 1)
+
+/* EZ alias for ARGP_ERR_UNKNOWN. */
+#define EBADKEY ARGP_ERR_UNKNOWN
+
+/* Default options. */
+
+/* When argp is given the --HANG switch, _ARGP_HANG is set and argp will sleep
+ for one second intervals, decrementing _ARGP_HANG until it's zero. Thus
+ you can force the program to continue by attaching a debugger and setting
+ it to 0 yourself. */
+static volatile int _argp_hang;
+
+#define OPT_PROGNAME -2
+#define OPT_USAGE -3
+#define OPT_HANG -4
+
+static const struct argp_option argp_default_options[] =
+{
+ {"help", '?', 0, 0, N_("give this help list"), -1},
+ {"usage", OPT_USAGE, 0, 0, N_("give a short usage message"), 0},
+ {"program-name",OPT_PROGNAME,N_("NAME"), OPTION_HIDDEN, N_("set the program name"), 0},
+ {"HANG", OPT_HANG, N_("SECS"), OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
+ N_("hang for SECS seconds (default 3600)"), 0},
+ {NULL, 0, 0, 0, NULL, 0}
+};
+
+static error_t
+argp_default_parser (int key, char *arg, struct argp_state *state)
+{
+ switch (key)
+ {
+ case '?':
+ __argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP);
+ break;
+ case OPT_USAGE:
+ __argp_state_help (state, state->out_stream,
+ ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK);
+ break;
+
+ case OPT_PROGNAME: /* Set the program name. */
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_NAME
+ program_invocation_name = arg;
+#endif
+ /* [Note that some systems only have PROGRAM_INVOCATION_SHORT_NAME (aka
+ __PROGNAME), in which case, PROGRAM_INVOCATION_NAME is just defined
+ to be that, so we have to be a bit careful here.] */
+
+ /* Update what we use for messages. */
+ state->name = __argp_base_name (arg);
+
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+ program_invocation_short_name = state->name;
+#endif
+
+ if ((state->flags & (ARGP_PARSE_ARGV0 | ARGP_NO_ERRS))
+ == ARGP_PARSE_ARGV0)
+ /* Update what getopt uses too. */
+ state->argv[0] = arg;
+
+ break;
+
+ case OPT_HANG:
+ _argp_hang = atoi (arg ? arg : "3600");
+ while (_argp_hang-- > 0)
+ __sleep (1);
+ break;
+
+ default:
+ return EBADKEY;
+ }
+ return 0;
+}
+
+static const struct argp argp_default_argp =
+ {argp_default_options, &argp_default_parser, NULL, NULL, NULL, NULL, "libc"};
+
+
+static const struct argp_option argp_version_options[] =
+{
+ {"version", 'V', 0, 0, N_("print program version"), -1},
+ {NULL, 0, 0, 0, NULL, 0}
+};
+
+static error_t
+argp_version_parser (int key, char *arg, struct argp_state *state)
+{
+ switch (key)
+ {
+ case 'V':
+ if (argp_program_version_hook)
+ (*argp_program_version_hook) (state->out_stream, state);
+ else if (argp_program_version)
+ fprintf (state->out_stream, "%s\n", argp_program_version);
+ else
+ __argp_error (state, dgettext (state->root_argp->argp_domain,
+ "(PROGRAM ERROR) No version known!?"));
+ if (! (state->flags & ARGP_NO_EXIT))
+ exit (0);
+ break;
+ default:
+ return EBADKEY;
+ }
+ return 0;
+}
+
+static const struct argp argp_version_argp =
+ {argp_version_options, &argp_version_parser, NULL, NULL, NULL, NULL, "libc"};
+
+/* Returns the offset into the getopt long options array LONG_OPTIONS of a
+ long option with called NAME, or -1 if none is found. Passing NULL as
+ NAME will return the number of options. */
+static int
+find_long_option (struct option *long_options, const char *name)
+{
+ struct option *l = long_options;
+ while (l->name != NULL)
+ if (name != NULL && strcmp (l->name, name) == 0)
+ return l - long_options;
+ else
+ l++;
+ if (name == NULL)
+ return l - long_options;
+ else
+ return -1;
+}
+
+
+/* The state of a `group' during parsing. Each group corresponds to a
+ particular argp structure from the tree of such descending from the top
+ level argp passed to argp_parse. */
+struct group
+{
+ /* This group's parsing function. */
+ argp_parser_t parser;
+
+ /* Which argp this group is from. */
+ const struct argp *argp;
+
+ /* Points to the point in SHORT_OPTS corresponding to the end of the short
+ options for this group. We use it to determine from which group a
+ particular short options is from. */
+ char *short_end;
+
+ /* The number of non-option args sucessfully handled by this parser. */
+ unsigned args_processed;
+
+ /* This group's parser's parent's group. */
+ struct group *parent;
+ unsigned parent_index; /* And the our position in the parent. */
+
+ /* These fields are swapped into and out of the state structure when
+ calling this group's parser. */
+ void *input, **child_inputs;
+ void *hook;
+};
+
+/* Call GROUP's parser with KEY and ARG, swapping any group-specific info
+ from STATE before calling, and back into state afterwards. If GROUP has
+ no parser, EBADKEY is returned. */
+static error_t
+group_parse (struct group *group, struct argp_state *state, int key, char *arg)
+{
+ if (group->parser)
+ {
+ error_t err;
+ state->hook = group->hook;
+ state->input = group->input;
+ state->child_inputs = group->child_inputs;
+ state->arg_num = group->args_processed;
+ err = (*group->parser)(key, arg, state);
+ group->hook = state->hook;
+ return err;
+ }
+ else
+ return EBADKEY;
+}
+
+struct parser
+{
+ const struct argp *argp;
+
+ /* SHORT_OPTS is the getopt short options string for the union of all the
+ groups of options. */
+ char *short_opts;
+ /* LONG_OPTS is the array of getop long option structures for the union of
+ all the groups of options. */
+ struct option *long_opts;
+ /* OPT_DATA is the getopt data used for the re-entrant getopt. */
+ struct _getopt_data opt_data;
+
+ /* States of the various parsing groups. */
+ struct group *groups;
+ /* The end of the GROUPS array. */
+ struct group *egroup;
+ /* An vector containing storage for the CHILD_INPUTS field in all groups. */
+ void **child_inputs;
+
+ /* True if we think using getopt is still useful; if false, then
+ remaining arguments are just passed verbatim with ARGP_KEY_ARG. This is
+ cleared whenever getopt returns KEY_END, but may be set again if the user
+ moves the next argument pointer backwards. */
+ int try_getopt;
+
+ /* State block supplied to parsing routines. */
+ struct argp_state state;
+
+ /* Memory used by this parser. */
+ void *storage;
+};
+
+/* The next usable entries in the various parser tables being filled in by
+ convert_options. */
+struct parser_convert_state
+{
+ struct parser *parser;
+ char *short_end;
+ struct option *long_end;
+ void **child_inputs_end;
+};
+
+/* Converts all options in ARGP (which is put in GROUP) and ancestors
+ into getopt options stored in SHORT_OPTS and LONG_OPTS; SHORT_END and
+ CVT->LONG_END are the points at which new options are added. Returns the
+ next unused group entry. CVT holds state used during the conversion. */
+static struct group *
+convert_options (const struct argp *argp,
+ struct group *parent, unsigned parent_index,
+ struct group *group, struct parser_convert_state *cvt)
+{
+ /* REAL is the most recent non-alias value of OPT. */
+ const struct argp_option *real = argp->options;
+ const struct argp_child *children = argp->children;
+
+ if (real || argp->parser)
+ {
+ const struct argp_option *opt;
+
+ if (real)
+ for (opt = real; !__option_is_end (opt); opt++)
+ {
+ if (! (opt->flags & OPTION_ALIAS))
+ /* OPT isn't an alias, so we can use values from it. */
+ real = opt;
+
+ if (! (real->flags & OPTION_DOC))
+ /* A real option (not just documentation). */
+ {
+ if (__option_is_short (opt))
+ /* OPT can be used as a short option. */
+ {
+ *cvt->short_end++ = opt->key;
+ if (real->arg)
+ {
+ *cvt->short_end++ = ':';
+ if (real->flags & OPTION_ARG_OPTIONAL)
+ *cvt->short_end++ = ':';
+ }
+ *cvt->short_end = '\0'; /* keep 0 terminated */
+ }
+
+ if (opt->name
+ && find_long_option (cvt->parser->long_opts, opt->name) < 0)
+ /* OPT can be used as a long option. */
+ {
+ cvt->long_end->name = opt->name;
+ cvt->long_end->has_arg =
+ (real->arg
+ ? (real->flags & OPTION_ARG_OPTIONAL
+ ? optional_argument
+ : required_argument)
+ : no_argument);
+ cvt->long_end->flag = 0;
+ /* we add a disambiguating code to all the user's
+ values (which is removed before we actually call
+ the function to parse the value); this means that
+ the user loses use of the high 8 bits in all his
+ values (the sign of the lower bits is preserved
+ however)... */
+ cvt->long_end->val =
+ ((opt->key | real->key) & USER_MASK)
+ + (((group - cvt->parser->groups) + 1) << USER_BITS);
+
+ /* Keep the LONG_OPTS list terminated. */
+ (++cvt->long_end)->name = NULL;
+ }
+ }
+ }
+
+ group->parser = argp->parser;
+ group->argp = argp;
+ group->short_end = cvt->short_end;
+ group->args_processed = 0;
+ group->parent = parent;
+ group->parent_index = parent_index;
+ group->input = 0;
+ group->hook = 0;
+ group->child_inputs = 0;
+
+ if (children)
+ /* Assign GROUP's CHILD_INPUTS field some space from
+ CVT->child_inputs_end.*/
+ {
+ unsigned num_children = 0;
+ while (children[num_children].argp)
+ num_children++;
+ group->child_inputs = cvt->child_inputs_end;
+ cvt->child_inputs_end += num_children;
+ }
+
+ parent = group++;
+ }
+ else
+ parent = 0;
+
+ if (children)
+ {
+ unsigned index = 0;
+ while (children->argp)
+ group =
+ convert_options (children++->argp, parent, index++, group, cvt);
+ }
+
+ return group;
+}
+
+/* Find the merged set of getopt options, with keys appropiately prefixed. */
+static void
+parser_convert (struct parser *parser, const struct argp *argp, int flags)
+{
+ struct parser_convert_state cvt;
+
+ cvt.parser = parser;
+ cvt.short_end = parser->short_opts;
+ cvt.long_end = parser->long_opts;
+ cvt.child_inputs_end = parser->child_inputs;
+
+ if (flags & ARGP_IN_ORDER)
+ *cvt.short_end++ = '-';
+ else if (flags & ARGP_NO_ARGS)
+ *cvt.short_end++ = '+';
+ *cvt.short_end = '\0';
+
+ cvt.long_end->name = NULL;
+
+ parser->argp = argp;
+
+ if (argp)
+ parser->egroup = convert_options (argp, 0, 0, parser->groups, &cvt);
+ else
+ parser->egroup = parser->groups; /* No parsers at all! */
+}
+
+/* Lengths of various parser fields which we will allocated. */
+struct parser_sizes
+{
+ size_t short_len; /* Getopt short options string. */
+ size_t long_len; /* Getopt long options vector. */
+ size_t num_groups; /* Group structures we allocate. */
+ size_t num_child_inputs; /* Child input slots. */
+};
+
+/* For ARGP, increments the NUM_GROUPS field in SZS by the total number of
+ argp structures descended from it, and the SHORT_LEN & LONG_LEN fields by
+ the maximum lengths of the resulting merged getopt short options string and
+ long-options array, respectively. */
+static void
+calc_sizes (const struct argp *argp, struct parser_sizes *szs)
+{
+ const struct argp_child *child = argp->children;
+ const struct argp_option *opt = argp->options;
+
+ if (opt || argp->parser)
+ {
+ szs->num_groups++;
+ if (opt)
+ {
+ int num_opts = 0;
+ while (!__option_is_end (opt++))
+ num_opts++;
+ szs->short_len += num_opts * 3; /* opt + up to 2 `:'s */
+ szs->long_len += num_opts;
+ }
+ }
+
+ if (child)
+ while (child->argp)
+ {
+ calc_sizes ((child++)->argp, szs);
+ szs->num_child_inputs++;
+ }
+}
+
+/* Initializes PARSER to parse ARGP in a manner described by FLAGS. */
+static error_t
+parser_init (struct parser *parser, const struct argp *argp,
+ int argc, char **argv, int flags, void *input)
+{
+ error_t err = 0;
+ struct group *group;
+ struct parser_sizes szs;
+ struct _getopt_data opt_data = _GETOPT_DATA_INITIALIZER;
+ char *storage;
+ size_t glen, gsum;
+ size_t clen, csum;
+ size_t llen, lsum;
+ size_t slen, ssum;
+
+ szs.short_len = (flags & ARGP_NO_ARGS) ? 0 : 1;
+ szs.long_len = 0;
+ szs.num_groups = 0;
+ szs.num_child_inputs = 0;
+
+ if (argp)
+ calc_sizes (argp, &szs);
+
+ /* Lengths of the various bits of storage used by PARSER. */
+ glen = (szs.num_groups + 1) * sizeof (struct group);
+ clen = szs.num_child_inputs * sizeof (void *);
+ llen = (szs.long_len + 1) * sizeof (struct option);
+ slen = szs.short_len + 1;
+
+ /* Sums of previous lengths, properly aligned. There's no need to
+ align gsum, since struct group is aligned at least as strictly as
+ void * (since it contains a void * member). And there's no need
+ to align lsum, since struct option is aligned at least as
+ strictly as char. */
+ gsum = glen;
+ csum = alignto (gsum + clen, alignof (struct option));
+ lsum = csum + llen;
+ ssum = lsum + slen;
+
+ parser->storage = malloc (ssum);
+ if (! parser->storage)
+ return ENOMEM;
+
+ storage = parser->storage;
+ parser->groups = parser->storage;
+ parser->child_inputs = (void **) (storage + gsum);
+ parser->long_opts = (struct option *) (storage + csum);
+ parser->short_opts = storage + lsum;
+ parser->opt_data = opt_data;
+
+ memset (parser->child_inputs, 0, clen);
+ parser_convert (parser, argp, flags);
+
+ memset (&parser->state, 0, sizeof (struct argp_state));
+ parser->state.root_argp = parser->argp;
+ parser->state.argc = argc;
+ parser->state.argv = argv;
+ parser->state.flags = flags;
+ parser->state.err_stream = stderr;
+ parser->state.out_stream = stdout;
+ parser->state.next = 0; /* Tell getopt to initialize. */
+ parser->state.pstate = parser;
+
+ parser->try_getopt = 1;
+
+ /* Call each parser for the first time, giving it a chance to propagate
+ values to child parsers. */
+ if (parser->groups < parser->egroup)
+ parser->groups->input = input;
+ for (group = parser->groups;
+ group < parser->egroup && (!err || err == EBADKEY);
+ group++)
+ {
+ if (group->parent)
+ /* If a child parser, get the initial input value from the parent. */
+ group->input = group->parent->child_inputs[group->parent_index];
+
+ if (!group->parser
+ && group->argp->children && group->argp->children->argp)
+ /* For the special case where no parsing function is supplied for an
+ argp, propagate its input to its first child, if any (this just
+ makes very simple wrapper argps more convenient). */
+ group->child_inputs[0] = group->input;
+
+ err = group_parse (group, &parser->state, ARGP_KEY_INIT, 0);
+ }
+ if (err == EBADKEY)
+ err = 0; /* Some parser didn't understand. */
+
+ if (err)
+ return err;
+
+ if (parser->state.flags & ARGP_NO_ERRS)
+ {
+ parser->opt_data.opterr = 0;
+ if (parser->state.flags & ARGP_PARSE_ARGV0)
+ /* getopt always skips ARGV[0], so we have to fake it out. As long
+ as OPTERR is 0, then it shouldn't actually try to access it. */
+ parser->state.argv--, parser->state.argc++;
+ }
+ else
+ parser->opt_data.opterr = 1; /* Print error messages. */
+
+ if (parser->state.argv == argv && argv[0])
+ /* There's an argv[0]; use it for messages. */
+ parser->state.name = __argp_base_name (argv[0]);
+ else
+ parser->state.name = __argp_short_program_name ();
+
+ return 0;
+}
+
+/* Free any storage consumed by PARSER (but not PARSER itself). */
+static error_t
+parser_finalize (struct parser *parser,
+ error_t err, int arg_ebadkey, int *end_index)
+{
+ struct group *group;
+
+ if (err == EBADKEY && arg_ebadkey)
+ /* Suppress errors generated by unparsed arguments. */
+ err = 0;
+
+ if (! err)
+ {
+ if (parser->state.next == parser->state.argc)
+ /* We successfully parsed all arguments! Call all the parsers again,
+ just a few more times... */
+ {
+ for (group = parser->groups;
+ group < parser->egroup && (!err || err==EBADKEY);
+ group++)
+ if (group->args_processed == 0)
+ err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0);
+ for (group = parser->egroup - 1;
+ group >= parser->groups && (!err || err==EBADKEY);
+ group--)
+ err = group_parse (group, &parser->state, ARGP_KEY_END, 0);
+
+ if (err == EBADKEY)
+ err = 0; /* Some parser didn't understand. */
+
+ /* Tell the user that all arguments are parsed. */
+ if (end_index)
+ *end_index = parser->state.next;
+ }
+ else if (end_index)
+ /* Return any remaining arguments to the user. */
+ *end_index = parser->state.next;
+ else
+ /* No way to return the remaining arguments, they must be bogus. */
+ {
+ if (!(parser->state.flags & ARGP_NO_ERRS)
+ && parser->state.err_stream)
+ fprintf (parser->state.err_stream,
+ dgettext (parser->argp->argp_domain,
+ "%s: Too many arguments\n"),
+ parser->state.name);
+ err = EBADKEY;
+ }
+ }
+
+ /* Okay, we're all done, with either an error or success; call the parsers
+ to indicate which one. */
+
+ if (err)
+ {
+ /* Maybe print an error message. */
+ if (err == EBADKEY)
+ /* An appropriate message describing what the error was should have
+ been printed earlier. */
+ __argp_state_help (&parser->state, parser->state.err_stream,
+ ARGP_HELP_STD_ERR);
+
+ /* Since we didn't exit, give each parser an error indication. */
+ for (group = parser->groups; group < parser->egroup; group++)
+ group_parse (group, &parser->state, ARGP_KEY_ERROR, 0);
+ }
+ else
+ /* Notify parsers of success, and propagate back values from parsers. */
+ {
+ /* We pass over the groups in reverse order so that child groups are
+ given a chance to do there processing before passing back a value to
+ the parent. */
+ for (group = parser->egroup - 1
+ ; group >= parser->groups && (!err || err == EBADKEY)
+ ; group--)
+ err = group_parse (group, &parser->state, ARGP_KEY_SUCCESS, 0);
+ if (err == EBADKEY)
+ err = 0; /* Some parser didn't understand. */
+ }
+
+ /* Call parsers once more, to do any final cleanup. Errors are ignored. */
+ for (group = parser->egroup - 1; group >= parser->groups; group--)
+ group_parse (group, &parser->state, ARGP_KEY_FINI, 0);
+
+ if (err == EBADKEY)
+ err = EINVAL;
+
+ free (parser->storage);
+
+ return err;
+}
+
+/* Call the user parsers to parse the non-option argument VAL, at the current
+ position, returning any error. The state NEXT pointer is assumed to have
+ been adjusted (by getopt) to point after this argument; this function will
+ adjust it correctly to reflect however many args actually end up being
+ consumed. */
+static error_t
+parser_parse_arg (struct parser *parser, char *val)
+{
+ /* Save the starting value of NEXT, first adjusting it so that the arg
+ we're parsing is again the front of the arg vector. */
+ int index = --parser->state.next;
+ error_t err = EBADKEY;
+ struct group *group;
+ int key = 0; /* Which of ARGP_KEY_ARG[S] we used. */
+
+ /* Try to parse the argument in each parser. */
+ for (group = parser->groups
+ ; group < parser->egroup && err == EBADKEY
+ ; group++)
+ {
+ parser->state.next++; /* For ARGP_KEY_ARG, consume the arg. */
+ key = ARGP_KEY_ARG;
+ err = group_parse (group, &parser->state, key, val);
+
+ if (err == EBADKEY)
+ /* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */
+ {
+ parser->state.next--; /* For ARGP_KEY_ARGS, put back the arg. */
+ key = ARGP_KEY_ARGS;
+ err = group_parse (group, &parser->state, key, 0);
+ }
+ }
+
+ if (! err)
+ {
+ if (key == ARGP_KEY_ARGS)
+ /* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't
+ changed by the user, *all* arguments should be considered
+ consumed. */
+ parser->state.next = parser->state.argc;
+
+ if (parser->state.next > index)
+ /* Remember that we successfully processed a non-option
+ argument -- but only if the user hasn't gotten tricky and set
+ the clock back. */
+ (--group)->args_processed += (parser->state.next - index);
+ else
+ /* The user wants to reparse some args, give getopt another try. */
+ parser->try_getopt = 1;
+ }
+
+ return err;
+}
+
+/* Call the user parsers to parse the option OPT, with argument VAL, at the
+ current position, returning any error. */
+static error_t
+parser_parse_opt (struct parser *parser, int opt, char *val)
+{
+ /* The group key encoded in the high bits; 0 for short opts or
+ group_number + 1 for long opts. */
+ int group_key = opt >> USER_BITS;
+ error_t err = EBADKEY;
+
+ if (group_key == 0)
+ /* A short option. By comparing OPT's position in SHORT_OPTS to the
+ various starting positions in each group's SHORT_END field, we can
+ determine which group OPT came from. */
+ {
+ struct group *group;
+ char *short_index = strchr (parser->short_opts, opt);
+
+ if (short_index)
+ for (group = parser->groups; group < parser->egroup; group++)
+ if (group->short_end > short_index)
+ {
+ err = group_parse (group, &parser->state, opt,
+ parser->opt_data.optarg);
+ break;
+ }
+ }
+ else
+ /* A long option. We use shifts instead of masking for extracting
+ the user value in order to preserve the sign. */
+ err =
+ group_parse (&parser->groups[group_key - 1], &parser->state,
+ (opt << GROUP_BITS) >> GROUP_BITS,
+ parser->opt_data.optarg);
+
+ if (err == EBADKEY)
+ /* At least currently, an option not recognized is an error in the
+ parser, because we pre-compute which parser is supposed to deal
+ with each option. */
+ {
+ static const char bad_key_err[] =
+ N_("(PROGRAM ERROR) Option should have been recognized!?");
+ if (group_key == 0)
+ __argp_error (&parser->state, "-%c: %s", opt,
+ dgettext (parser->argp->argp_domain, bad_key_err));
+ else
+ {
+ struct option *long_opt = parser->long_opts;
+ while (long_opt->val != opt && long_opt->name)
+ long_opt++;
+ __argp_error (&parser->state, "--%s: %s",
+ long_opt->name ? long_opt->name : "???",
+ dgettext (parser->argp->argp_domain, bad_key_err));
+ }
+ }
+
+ return err;
+}
+
+/* Parse the next argument in PARSER (as indicated by PARSER->state.next).
+ Any error from the parsers is returned, and *ARGP_EBADKEY indicates
+ whether a value of EBADKEY is due to an unrecognized argument (which is
+ generally not fatal). */
+static error_t
+parser_parse_next (struct parser *parser, int *arg_ebadkey)
+{
+ int opt;
+ error_t err = 0;
+
+ if (parser->state.quoted && parser->state.next < parser->state.quoted)
+ /* The next argument pointer has been moved to before the quoted
+ region, so pretend we never saw the quoting `--', and give getopt
+ another chance. If the user hasn't removed it, getopt will just
+ process it again. */
+ parser->state.quoted = 0;
+
+ if (parser->try_getopt && !parser->state.quoted)
+ /* Give getopt a chance to parse this. */
+ {
+ /* Put it back in OPTIND for getopt. */
+ parser->opt_data.optind = parser->state.next;
+ /* Distinguish KEY_ERR from a real option. */
+ parser->opt_data.optopt = KEY_END;
+ if (parser->state.flags & ARGP_LONG_ONLY)
+ opt = _getopt_long_only_r (parser->state.argc, parser->state.argv,
+ parser->short_opts, parser->long_opts, 0,
+ &parser->opt_data);
+ else
+ opt = _getopt_long_r (parser->state.argc, parser->state.argv,
+ parser->short_opts, parser->long_opts, 0,
+ &parser->opt_data);
+ /* And see what getopt did. */
+ parser->state.next = parser->opt_data.optind;
+
+ if (opt == KEY_END)
+ /* Getopt says there are no more options, so stop using
+ getopt; we'll continue if necessary on our own. */
+ {
+ parser->try_getopt = 0;
+ if (parser->state.next > 1
+ && strcmp (parser->state.argv[parser->state.next - 1], QUOTE)
+ == 0)
+ /* Not only is this the end of the options, but it's a
+ `quoted' region, which may have args that *look* like
+ options, so we definitely shouldn't try to use getopt past
+ here, whatever happens. */
+ parser->state.quoted = parser->state.next;
+ }
+ else if (opt == KEY_ERR && parser->opt_data.optopt != KEY_END)
+ /* KEY_ERR can have the same value as a valid user short
+ option, but in the case of a real error, getopt sets OPTOPT
+ to the offending character, which can never be KEY_END. */
+ {
+ *arg_ebadkey = 0;
+ return EBADKEY;
+ }
+ }
+ else
+ opt = KEY_END;
+
+ if (opt == KEY_END)
+ {
+ /* We're past what getopt considers the options. */
+ if (parser->state.next >= parser->state.argc
+ || (parser->state.flags & ARGP_NO_ARGS))
+ /* Indicate that we're done. */
+ {
+ *arg_ebadkey = 1;
+ return EBADKEY;
+ }
+ else
+ /* A non-option arg; simulate what getopt might have done. */
+ {
+ opt = KEY_ARG;
+ parser->opt_data.optarg = parser->state.argv[parser->state.next++];
+ }
+ }
+
+ if (opt == KEY_ARG)
+ /* A non-option argument; try each parser in turn. */
+ err = parser_parse_arg (parser, parser->opt_data.optarg);
+ else
+ err = parser_parse_opt (parser, opt, parser->opt_data.optarg);
+
+ if (err == EBADKEY)
+ *arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
+
+ return err;
+}
+
+/* Parse the options strings in ARGC & ARGV according to the argp in ARGP.
+ FLAGS is one of the ARGP_ flags above. If END_INDEX is non-NULL, the
+ index in ARGV of the first unparsed option is returned in it. If an
+ unknown option is present, EINVAL is returned; if some parser routine
+ returned a non-zero value, it is returned; otherwise 0 is returned. */
+error_t
+__argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags,
+ int *end_index, void *input)
+{
+ error_t err;
+ struct parser parser;
+
+ /* If true, then err == EBADKEY is a result of a non-option argument failing
+ to be parsed (which in some cases isn't actually an error). */
+ int arg_ebadkey = 0;
+
+#ifndef _LIBC
+ if (!(flags & ARGP_PARSE_ARGV0))
+ {
+#ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
+ if (!program_invocation_name)
+ program_invocation_name = argv[0];
+#endif
+#ifdef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+ if (!program_invocation_short_name)
+ program_invocation_short_name = __argp_base_name (argv[0]);
+#endif
+ }
+#endif
+
+ if (! (flags & ARGP_NO_HELP))
+ /* Add our own options. */
+ {
+ struct argp_child *child = alloca (4 * sizeof (struct argp_child));
+ struct argp *top_argp = alloca (sizeof (struct argp));
+
+ /* TOP_ARGP has no options, it just serves to group the user & default
+ argps. */
+ memset (top_argp, 0, sizeof (*top_argp));
+ top_argp->children = child;
+
+ memset (child, 0, 4 * sizeof (struct argp_child));
+
+ if (argp)
+ (child++)->argp = argp;
+ (child++)->argp = &argp_default_argp;
+ if (argp_program_version || argp_program_version_hook)
+ (child++)->argp = &argp_version_argp;
+ child->argp = 0;
+
+ argp = top_argp;
+ }
+
+ /* Construct a parser for these arguments. */
+ err = parser_init (&parser, argp, argc, argv, flags, input);
+
+ if (! err)
+ /* Parse! */
+ {
+ while (! err)
+ err = parser_parse_next (&parser, &arg_ebadkey);
+ err = parser_finalize (&parser, err, arg_ebadkey, end_index);
+ }
+
+ return err;
+}
+#ifdef weak_alias
+weak_alias (__argp_parse, argp_parse)
+#endif
+
+/* Return the input field for ARGP in the parser corresponding to STATE; used
+ by the help routines. */
+void *
+__argp_input (const struct argp *argp, const struct argp_state *state)
+{
+ if (state)
+ {
+ struct group *group;
+ struct parser *parser = state->pstate;
+
+ for (group = parser->groups; group < parser->egroup; group++)
+ if (group->argp == argp)
+ return group->input;
+ }
+
+ return 0;
+}
+#ifdef weak_alias
+weak_alias (__argp_input, _argp_input)
+#endif
diff --git a/lib/argp-pin.c b/lib/argp-pin.c
new file mode 100644
index 0000000..852c6d6
--- /dev/null
+++ b/lib/argp-pin.c
@@ -0,0 +1,28 @@
+/* Full and short program names for argp module
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME
+char *program_invocation_short_name = 0;
+#endif
+#ifndef HAVE_PROGRAM_INVOCATION_NAME
+char *program_invocation_name = 0;
+#endif
+
diff --git a/lib/argp-pv.c b/lib/argp-pv.c
new file mode 100644
index 0000000..a11298b
--- /dev/null
+++ b/lib/argp-pv.c
@@ -0,0 +1,24 @@
+/* Default definition for ARGP_PROGRAM_VERSION.
+ Copyright (C) 1996, 1997, 1999, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* If set by the user program to a non-zero value, then a default option
+ --version is added (unless the ARGP_NO_HELP flag is used), which will
+ print this string followed by a newline and exit (unless the
+ ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
+const char *argp_program_version;
diff --git a/lib/argp-pvh.c b/lib/argp-pvh.c
new file mode 100644
index 0000000..6bf7c49
--- /dev/null
+++ b/lib/argp-pvh.c
@@ -0,0 +1,31 @@
+/* Default definition for ARGP_PROGRAM_VERSION_HOOK.
+ Copyright (C) 1996, 1997, 1999, 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "argp.h"
+
+/* If set by the user program to a non-zero value, then a default option
+ --version is added (unless the ARGP_NO_HELP flag is used), which calls
+ this function with a stream to print the version to and a pointer to the
+ current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
+ used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
+void (*argp_program_version_hook) (FILE *stream, struct argp_state *state) = NULL;
diff --git a/lib/argp-xinl.c b/lib/argp-xinl.c
new file mode 100644
index 0000000..a6afb1f
--- /dev/null
+++ b/lib/argp-xinl.c
@@ -0,0 +1,43 @@
+/* Real definitions for extern inline functions in argp.h
+ Copyright (C) 1997, 1998, 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined _LIBC || defined HAVE_FEATURES_H
+# include <features.h>
+#endif
+
+#ifndef __USE_EXTERN_INLINES
+# define __USE_EXTERN_INLINES 1
+#endif
+#define ARGP_EI
+#undef __OPTIMIZE__
+#define __OPTIMIZE__ 1
+#include "argp.h"
+
+/* Add weak aliases. */
+#if _LIBC - 0 && defined (weak_alias)
+
+weak_alias (__argp_usage, argp_usage)
+weak_alias (__option_is_short, _option_is_short)
+weak_alias (__option_is_end, _option_is_end)
+
+#endif
diff --git a/lib/argp.h b/lib/argp.h
new file mode 100644
index 0000000..1c4e06f
--- /dev/null
+++ b/lib/argp.h
@@ -0,0 +1,622 @@
+/* Hierarchial argument parsing, layered over getopt.
+ Copyright (C) 1995-1999,2003-2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _ARGP_H
+#define _ARGP_H
+
+#include <stdio.h>
+#include <ctype.h>
+#include <getopt.h>
+#include <limits.h>
+
+#define __need_error_t
+#include <errno.h>
+
+#ifndef __THROW
+# define __THROW
+#endif
+#ifndef __NTH
+# define __NTH(fct) fct __THROW
+#endif
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# define __attribute__(Spec) /* empty */
+# endif
+/* The __-protected variants of `format' and `printf' attributes
+ are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) || __STRICT_ANSI__
+# define __format__ format
+# define __printf__ printf
+# endif
+#endif
+
+/* 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. */
+#ifndef __restrict
+# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
+# if 199901L <= __STDC_VERSION__
+# define __restrict restrict
+# else
+# define __restrict
+# endif
+# endif
+#endif
+
+#ifndef __error_t_defined
+typedef int error_t;
+# define __error_t_defined
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* A description of a particular option. A pointer to an array of
+ these is passed in the OPTIONS field of an argp structure. Each option
+ entry can correspond to one long option and/or one short option; more
+ names for the same option can be added by following an entry in an option
+ array with options having the OPTION_ALIAS flag set. */
+struct argp_option
+{
+ /* The long option name. For more than one name for the same option, you
+ can use following options with the OPTION_ALIAS flag set. */
+ const char *name;
+
+ /* What key is returned for this option. If > 0 and printable, then it's
+ also accepted as a short option. */
+ int key;
+
+ /* If non-NULL, this is the name of the argument associated with this
+ option, which is required unless the OPTION_ARG_OPTIONAL flag is set. */
+ const char *arg;
+
+ /* OPTION_ flags. */
+ int flags;
+
+ /* The doc string for this option. If both NAME and KEY are 0, This string
+ will be printed outdented from the normal option column, making it
+ useful as a group header (it will be the first thing printed in its
+ group); in this usage, it's conventional to end the string with a `:'.
+
+ Write the initial value as N_("TEXT") if you want xgettext to collect
+ it into a POT file. */
+ const char *doc;
+
+ /* The group this option is in. In a long help message, options are sorted
+ alphabetically within each group, and the groups presented in the order
+ 0, 1, 2, ..., n, -m, ..., -2, -1. Every entry in an options array with
+ if this field 0 will inherit the group number of the previous entry, or
+ zero if it's the first one, unless its a group header (NAME and KEY both
+ 0), in which case, the previous entry + 1 is the default. Automagic
+ options such as --help are put into group -1. */
+ int group;
+};
+
+/* The argument associated with this option is optional. */
+#define OPTION_ARG_OPTIONAL 0x1
+
+/* This option isn't displayed in any help messages. */
+#define OPTION_HIDDEN 0x2
+
+/* This option is an alias for the closest previous non-alias option. This
+ means that it will be displayed in the same help entry, and will inherit
+ fields other than NAME and KEY from the aliased option. */
+#define OPTION_ALIAS 0x4
+
+/* This option isn't actually an option (and so should be ignored by the
+ actual option parser), but rather an arbitrary piece of documentation that
+ should be displayed in much the same manner as the options. If this flag
+ is set, then the option NAME field is displayed unmodified (e.g., no `--'
+ prefix is added) at the left-margin (where a *short* option would normally
+ be displayed), and the documentation string in the normal place. The NAME
+ field will be translated using gettext, unless OPTION_NO_TRANS is set (see
+ below). For purposes of sorting, any leading whitespace and punctuation is
+ ignored, except that if the first non-whitespace character is not `-', this
+ entry is displayed after all options (and OPTION_DOC entries with a leading
+ `-') in the same group. */
+#define OPTION_DOC 0x8
+
+/* This option shouldn't be included in `long' usage messages (but is still
+ included in help messages). This is mainly intended for options that are
+ completely documented in an argp's ARGS_DOC field, in which case including
+ the option in the generic usage list would be redundant. For instance,
+ if ARGS_DOC is "FOO BAR\n-x BLAH", and the `-x' option's purpose is to
+ distinguish these two cases, -x should probably be marked
+ OPTION_NO_USAGE. */
+#define OPTION_NO_USAGE 0x10
+
+/* Valid only in conjunction with OPTION_DOC. This option disables translation
+ of option name. */
+#define OPTION_NO_TRANS 0x20
+
+
+struct argp; /* fwd declare this type */
+struct argp_state; /* " */
+struct argp_child; /* " */
+
+/* The type of a pointer to an argp parsing function. */
+typedef error_t (*argp_parser_t) (int key, char *arg,
+ struct argp_state *state);
+
+/* What to return for unrecognized keys. For special ARGP_KEY_ keys, such
+ returns will simply be ignored. For user keys, this error will be turned
+ into EINVAL (if the call to argp_parse is such that errors are propagated
+ back to the user instead of exiting); returning EINVAL itself would result
+ in an immediate stop to parsing in *all* cases. */
+#define ARGP_ERR_UNKNOWN E2BIG /* Hurd should never need E2BIG. XXX */
+
+/* Special values for the KEY argument to an argument parsing function.
+ ARGP_ERR_UNKNOWN should be returned if they aren't understood.
+
+ The sequence of keys to a parsing function is either (where each
+ uppercased word should be prefixed by `ARGP_KEY_' and opt is a user key):
+
+ INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all
+ or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed
+ or INIT (opt | ARG)... SUCCESS -- Some non-option arg unrecognized
+
+ The third case is where every parser returned ARGP_KEY_UNKNOWN for an
+ argument, in which case parsing stops at that argument (returning the
+ unparsed arguments to the caller of argp_parse if requested, or stopping
+ with an error message if not).
+
+ If an error occurs (either detected by argp, or because the parsing
+ function returned an error value), then the parser is called with
+ ARGP_KEY_ERROR, and no further calls are made. */
+
+/* This is not an option at all, but rather a command line argument. If a
+ parser receiving this key returns success, the fact is recorded, and the
+ ARGP_KEY_NO_ARGS case won't be used. HOWEVER, if while processing the
+ argument, a parser function decrements the NEXT field of the state it's
+ passed, the option won't be considered processed; this is to allow you to
+ actually modify the argument (perhaps into an option), and have it
+ processed again. */
+#define ARGP_KEY_ARG 0
+/* There are remaining arguments not parsed by any parser, which may be found
+ starting at (STATE->argv + STATE->next). If success is returned, but
+ STATE->next left untouched, it's assumed that all arguments were consume,
+ otherwise, the parser should adjust STATE->next to reflect any arguments
+ consumed. */
+#define ARGP_KEY_ARGS 0x1000006
+/* There are no more command line arguments at all. */
+#define ARGP_KEY_END 0x1000001
+/* Because it's common to want to do some special processing if there aren't
+ any non-option args, user parsers are called with this key if they didn't
+ successfully process any non-option arguments. Called just before
+ ARGP_KEY_END (where more general validity checks on previously parsed
+ arguments can take place). */
+#define ARGP_KEY_NO_ARGS 0x1000002
+/* Passed in before any parsing is done. Afterwards, the values of each
+ element of the CHILD_INPUT field, if any, in the state structure is
+ copied to each child's state to be the initial value of the INPUT field. */
+#define ARGP_KEY_INIT 0x1000003
+/* Use after all other keys, including SUCCESS & END. */
+#define ARGP_KEY_FINI 0x1000007
+/* Passed in when parsing has successfully been completed (even if there are
+ still arguments remaining). */
+#define ARGP_KEY_SUCCESS 0x1000004
+/* Passed in if an error occurs. */
+#define ARGP_KEY_ERROR 0x1000005
+
+/* An argp structure contains a set of options declarations, a function to
+ deal with parsing one, documentation string, a possible vector of child
+ argp's, and perhaps a function to filter help output. When actually
+ parsing options, getopt is called with the union of all the argp
+ structures chained together through their CHILD pointers, with conflicts
+ being resolved in favor of the first occurrence in the chain. */
+struct argp
+{
+ /* An array of argp_option structures, terminated by an entry with both
+ NAME and KEY having a value of 0. */
+ const struct argp_option *options;
+
+ /* What to do with an option from this structure. KEY is the key
+ associated with the option, and ARG is any associated argument (NULL if
+ none was supplied). If KEY isn't understood, ARGP_ERR_UNKNOWN should be
+ returned. If a non-zero, non-ARGP_ERR_UNKNOWN value is returned, then
+ parsing is stopped immediately, and that value is returned from
+ argp_parse(). For special (non-user-supplied) values of KEY, see the
+ ARGP_KEY_ definitions below. */
+ argp_parser_t parser;
+
+ /* A string describing what other arguments are wanted by this program. It
+ is only used by argp_usage to print the `Usage:' message. If it
+ contains newlines, the strings separated by them are considered
+ alternative usage patterns, and printed on separate lines (lines after
+ the first are prefix by ` or: ' instead of `Usage:'). */
+ const char *args_doc;
+
+ /* If non-NULL, a string containing extra text to be printed before and
+ after the options in a long help message (separated by a vertical tab
+ `\v' character).
+ Write the initial value as N_("BEFORE-TEXT") "\v" N_("AFTER-TEXT") if
+ you want xgettext to collect the two pieces of text into a POT file. */
+ const char *doc;
+
+ /* A vector of argp_children structures, terminated by a member with a 0
+ argp field, pointing to child argps should be parsed with this one. Any
+ conflicts are resolved in favor of this argp, or early argps in the
+ CHILDREN list. This field is useful if you use libraries that supply
+ their own argp structure, which you want to use in conjunction with your
+ own. */
+ const struct argp_child *children;
+
+ /* If non-zero, this should be a function to filter the output of help
+ messages. KEY is either a key from an option, in which case TEXT is
+ that option's help text, or a special key from the ARGP_KEY_HELP_
+ defines, below, describing which other help text TEXT is. The function
+ should return either TEXT, if it should be used as-is, a replacement
+ string, which should be malloced, and will be freed by argp, or NULL,
+ meaning `print nothing'. The value for TEXT is *after* any translation
+ has been done, so if any of the replacement text also needs translation,
+ that should be done by the filter function. INPUT is either the input
+ supplied to argp_parse, or NULL, if argp_help was called directly. */
+ char *(*help_filter) (int __key, const char *__text, void *__input);
+
+ /* If non-zero the strings used in the argp library are translated using
+ the domain described by this string. Otherwise the currently installed
+ default domain is used. */
+ const char *argp_domain;
+};
+
+/* Possible KEY arguments to a help filter function. */
+#define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceeding options. */
+#define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */
+#define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */
+#define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation;
+ TEXT is NULL for this key. */
+/* Explanatory note emitted when duplicate option arguments have been
+ suppressed. */
+#define ARGP_KEY_HELP_DUP_ARGS_NOTE 0x2000005
+#define ARGP_KEY_HELP_ARGS_DOC 0x2000006 /* Argument doc string. */
+
+/* When an argp has a non-zero CHILDREN field, it should point to a vector of
+ argp_child structures, each of which describes a subsidiary argp. */
+struct argp_child
+{
+ /* The child parser. */
+ const struct argp *argp;
+
+ /* Flags for this child. */
+ int flags;
+
+ /* If non-zero, an optional header to be printed in help output before the
+ child options. As a side-effect, a non-zero value forces the child
+ options to be grouped together; to achieve this effect without actually
+ printing a header string, use a value of "". */
+ const char *header;
+
+ /* Where to group the child options relative to the other (`consolidated')
+ options in the parent argp; the values are the same as the GROUP field
+ in argp_option structs, but all child-groupings follow parent options at
+ a particular group level. If both this field and HEADER are zero, then
+ they aren't grouped at all, but rather merged with the parent options
+ (merging the child's grouping levels with the parents). */
+ int group;
+};
+
+/* Parsing state. This is provided to parsing functions called by argp,
+ which may examine and, as noted, modify fields. */
+struct argp_state
+{
+ /* The top level ARGP being parsed. */
+ const struct argp *root_argp;
+
+ /* The argument vector being parsed. May be modified. */
+ int argc;
+ char **argv;
+
+ /* The index in ARGV of the next arg that to be parsed. May be modified. */
+ int next;
+
+ /* The flags supplied to argp_parse. May be modified. */
+ unsigned flags;
+
+ /* While calling a parsing function with a key of ARGP_KEY_ARG, this is the
+ number of the current arg, starting at zero, and incremented after each
+ such call returns. At all other times, this is the number of such
+ arguments that have been processed. */
+ unsigned arg_num;
+
+ /* If non-zero, the index in ARGV of the first argument following a special
+ `--' argument (which prevents anything following being interpreted as an
+ option). Only set once argument parsing has proceeded past this point. */
+ int quoted;
+
+ /* An arbitrary pointer passed in from the user. */
+ void *input;
+ /* Values to pass to child parsers. This vector will be the same length as
+ the number of children for the current parser. */
+ void **child_inputs;
+
+ /* For the parser's use. Initialized to 0. */
+ void *hook;
+
+ /* The name used when printing messages. This is initialized to ARGV[0],
+ or PROGRAM_INVOCATION_NAME if that is unavailable. */
+ char *name;
+
+ /* Streams used when argp prints something. */
+ FILE *err_stream; /* For errors; initialized to stderr. */
+ FILE *out_stream; /* For information; initialized to stdout. */
+
+ void *pstate; /* Private, for use by argp. */
+};
+
+/* Flags for argp_parse (note that the defaults are those that are
+ convenient for program command line parsing): */
+
+/* Don't ignore the first element of ARGV. Normally (and always unless
+ ARGP_NO_ERRS is set) the first element of the argument vector is
+ skipped for option parsing purposes, as it corresponds to the program name
+ in a command line. */
+#define ARGP_PARSE_ARGV0 0x01
+
+/* Don't print error messages for unknown options to stderr; unless this flag
+ is set, ARGP_PARSE_ARGV0 is ignored, as ARGV[0] is used as the program
+ name in the error messages. This flag implies ARGP_NO_EXIT (on the
+ assumption that silent exiting upon errors is bad behaviour). */
+#define ARGP_NO_ERRS 0x02
+
+/* Don't parse any non-option args. Normally non-option args are parsed by
+ calling the parse functions with a key of ARGP_KEY_ARG, and the actual arg
+ as the value. Since it's impossible to know which parse function wants to
+ handle it, each one is called in turn, until one returns 0 or an error
+ other than ARGP_ERR_UNKNOWN; if an argument is handled by no one, the
+ argp_parse returns prematurely (but with a return value of 0). If all
+ args have been parsed without error, all parsing functions are called one
+ last time with a key of ARGP_KEY_END. This flag needn't normally be set,
+ as the normal behavior is to stop parsing as soon as some argument can't
+ be handled. */
+#define ARGP_NO_ARGS 0x04
+
+/* Parse options and arguments in the same order they occur on the command
+ line -- normally they're rearranged so that all options come first. */
+#define ARGP_IN_ORDER 0x08
+
+/* Don't provide the standard long option --help, which causes usage and
+ option help information to be output to stdout, and exit (0) called. */
+#define ARGP_NO_HELP 0x10
+
+/* Don't exit on errors (they may still result in error messages). */
+#define ARGP_NO_EXIT 0x20
+
+/* Use the gnu getopt `long-only' rules for parsing arguments. */
+#define ARGP_LONG_ONLY 0x40
+
+/* Turns off any message-printing/exiting options. */
+#define ARGP_SILENT (ARGP_NO_EXIT | ARGP_NO_ERRS | ARGP_NO_HELP)
+
+/* Parse the options strings in ARGC & ARGV according to the options in ARGP.
+ FLAGS is one of the ARGP_ flags above. If ARG_INDEX is non-NULL, the
+ index in ARGV of the first unparsed option is returned in it. If an
+ unknown option is present, ARGP_ERR_UNKNOWN is returned; if some parser
+ routine returned a non-zero value, it is returned; otherwise 0 is
+ returned. This function may also call exit unless the ARGP_NO_HELP flag
+ is set. INPUT is a pointer to a value to be passed in to the parser. */
+extern error_t argp_parse (const struct argp *__restrict __argp,
+ int /*argc*/, char **__restrict /*argv*/,
+ unsigned __flags, int *__restrict __arg_index,
+ void *__restrict __input);
+extern error_t __argp_parse (const struct argp *__restrict __argp,
+ int /*argc*/, char **__restrict /*argv*/,
+ unsigned __flags, int *__restrict __arg_index,
+ void *__restrict __input);
+
+/* Global variables. */
+
+/* GNULIB makes sure both program_invocation_name and
+ program_invocation_short_name are available */
+#ifdef GNULIB_PROGRAM_INVOCATION_NAME
+extern char *program_invocation_name;
+# undef HAVE_DECL_PROGRAM_INVOCATION_NAME
+# define HAVE_DECL_PROGRAM_INVOCATION_NAME 1
+#endif
+
+#ifdef GNULIB_PROGRAM_INVOCATION_SHORT_NAME
+extern char *program_invocation_short_name;
+# undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+# define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1
+#endif
+
+/* If defined or set by the user program to a non-zero value, then a default
+ option --version is added (unless the ARGP_NO_HELP flag is used), which
+ will print this string followed by a newline and exit (unless the
+ ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
+extern const char *argp_program_version;
+
+/* If defined or set by the user program to a non-zero value, then a default
+ option --version is added (unless the ARGP_NO_HELP flag is used), which
+ calls this function with a stream to print the version to and a pointer to
+ the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
+ used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
+extern void (*argp_program_version_hook) (FILE *__restrict __stream,
+ struct argp_state *__restrict
+ __state);
+
+/* If defined or set by the user program, it should point to string that is
+ the bug-reporting address for the program. It will be printed by
+ argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various
+ standard help messages), embedded in a sentence that says something like
+ `Report bugs to ADDR.'. */
+extern const char *argp_program_bug_address;
+
+/* The exit status that argp will use when exiting due to a parsing error.
+ If not defined or set by the user program, this defaults to EX_USAGE from
+ <sysexits.h>. */
+extern error_t argp_err_exit_status;
+
+/* Flags for argp_help. */
+#define ARGP_HELP_USAGE 0x01 /* a Usage: message. */
+#define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */
+#define ARGP_HELP_SEE 0x04 /* a `Try ... for more help' message. */
+#define ARGP_HELP_LONG 0x08 /* a long help message. */
+#define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */
+#define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */
+#define ARGP_HELP_DOC (ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)
+#define ARGP_HELP_BUG_ADDR 0x40 /* bug report address */
+#define ARGP_HELP_LONG_ONLY 0x80 /* modify output appropriately to
+ reflect ARGP_LONG_ONLY mode. */
+
+/* These ARGP_HELP flags are only understood by argp_state_help. */
+#define ARGP_HELP_EXIT_ERR 0x100 /* Call exit(1) instead of returning. */
+#define ARGP_HELP_EXIT_OK 0x200 /* Call exit(0) instead of returning. */
+
+/* The standard thing to do after a program command line parsing error, if an
+ error message has already been printed. */
+#define ARGP_HELP_STD_ERR \
+ (ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
+/* The standard thing to do after a program command line parsing error, if no
+ more specific error message has been printed. */
+#define ARGP_HELP_STD_USAGE \
+ (ARGP_HELP_SHORT_USAGE | ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
+/* The standard thing to do in response to a --help option. */
+#define ARGP_HELP_STD_HELP \
+ (ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_EXIT_OK \
+ | ARGP_HELP_DOC | ARGP_HELP_BUG_ADDR)
+
+/* Output a usage message for ARGP to STREAM. FLAGS are from the set
+ ARGP_HELP_*. */
+extern void argp_help (const struct argp *__restrict __argp,
+ FILE *__restrict __stream,
+ unsigned __flags, char *__restrict __name);
+extern void __argp_help (const struct argp *__restrict __argp,
+ FILE *__restrict __stream, unsigned __flags,
+ char *__name);
+
+/* The following routines are intended to be called from within an argp
+ parsing routine (thus taking an argp_state structure as the first
+ argument). They may or may not print an error message and exit, depending
+ on the flags in STATE -- in any case, the caller should be prepared for
+ them *not* to exit, and should return an appropiate error after calling
+ them. [argp_usage & argp_error should probably be called argp_state_...,
+ but they're used often enough that they should be short] */
+
+/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
+ from the set ARGP_HELP_*. */
+extern void argp_state_help (const struct argp_state *__restrict __state,
+ FILE *__restrict __stream,
+ unsigned int __flags);
+extern void __argp_state_help (const struct argp_state *__restrict __state,
+ FILE *__restrict __stream,
+ unsigned int __flags);
+
+/* Possibly output the standard usage message for ARGP to stderr and exit. */
+extern void argp_usage (const struct argp_state *__state);
+extern void __argp_usage (const struct argp_state *__state);
+
+/* If appropriate, print the printf string FMT and following args, preceded
+ by the program name and `:', to stderr, and followed by a `Try ... --help'
+ message, then exit (1). */
+extern void argp_error (const struct argp_state *__restrict __state,
+ const char *__restrict __fmt, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
+extern void __argp_error (const struct argp_state *__restrict __state,
+ const char *__restrict __fmt, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
+
+/* Similar to the standard gnu error-reporting function error(), but will
+ respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
+ to STATE->err_stream. This is useful for argument parsing code that is
+ shared between program startup (when exiting is desired) and runtime
+ option parsing (when typically an error code is returned instead). The
+ difference between this function and argp_error is that the latter is for
+ *parsing errors*, and the former is for other problems that occur during
+ parsing but don't reflect a (syntactic) problem with the input. */
+extern void argp_failure (const struct argp_state *__restrict __state,
+ int __status, int __errnum,
+ const char *__restrict __fmt, ...)
+ __attribute__ ((__format__ (__printf__, 4, 5)));
+extern void __argp_failure (const struct argp_state *__restrict __state,
+ int __status, int __errnum,
+ const char *__restrict __fmt, ...)
+ __attribute__ ((__format__ (__printf__, 4, 5)));
+
+/* Returns true if the option OPT is a valid short option. */
+extern int _option_is_short (const struct argp_option *__opt) __THROW;
+extern int __option_is_short (const struct argp_option *__opt) __THROW;
+
+/* Returns true if the option OPT is in fact the last (unused) entry in an
+ options array. */
+extern int _option_is_end (const struct argp_option *__opt) __THROW;
+extern int __option_is_end (const struct argp_option *__opt) __THROW;
+
+/* Return the input field for ARGP in the parser corresponding to STATE; used
+ by the help routines. */
+extern void *_argp_input (const struct argp *__restrict __argp,
+ const struct argp_state *__restrict __state)
+ __THROW;
+extern void *__argp_input (const struct argp *__restrict __argp,
+ const struct argp_state *__restrict __state)
+ __THROW;
+
+#ifdef __USE_EXTERN_INLINES
+
+# if !_LIBC
+# define __argp_usage argp_usage
+# define __argp_state_help argp_state_help
+# define __option_is_short _option_is_short
+# define __option_is_end _option_is_end
+# endif
+
+# ifndef ARGP_EI
+# define ARGP_EI extern __inline__
+# endif
+
+ARGP_EI void
+__argp_usage (const struct argp_state *__state)
+{
+ __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE);
+}
+
+ARGP_EI int
+__NTH (__option_is_short (const struct argp_option *__opt))
+{
+ if (__opt->flags & OPTION_DOC)
+ return 0;
+ else
+ {
+ int __key = __opt->key;
+ return __key > 0 && __key <= UCHAR_MAX && isprint (__key);
+ }
+}
+
+ARGP_EI int
+__NTH (__option_is_end (const struct argp_option *__opt))
+{
+ return !__opt->key && !__opt->name && !__opt->doc && !__opt->group;
+}
+
+# if !_LIBC
+# undef __argp_usage
+# undef __argp_state_help
+# undef __option_is_short
+# undef __option_is_end
+# endif
+#endif /* Use extern inlines. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* argp.h */
diff --git a/lib/asnprintf.c b/lib/asnprintf.c
new file mode 100644
index 0000000..26c3988
--- /dev/null
+++ b/lib/asnprintf.c
@@ -0,0 +1,35 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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/at-func.c b/lib/at-func.c
new file mode 100644
index 0000000..f98c207
--- /dev/null
+++ b/lib/at-func.c
@@ -0,0 +1,86 @@
+/* Define an at-style functions like fstatat, unlinkat, fchownat, etc.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#define CALL_FUNC(F) \
+ (AT_FUNC_USE_F1_COND \
+ ? AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS) \
+ : AT_FUNC_F2 (F AT_FUNC_POST_FILE_ARGS))
+
+/* Call AT_FUNC_F1 or AT_FUNC_F2 (testing AT_FUNC_USE_F1_COND to
+ determine which) to operate on FILE, which is in the directory
+ open on descriptor FD. 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. */
+int
+AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS)
+{
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ int err;
+
+ if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
+ return CALL_FUNC (file);
+
+ {
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, file);
+ if (proc_file)
+ {
+ int proc_result = CALL_FUNC (proc_file);
+ int proc_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 <= 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 (fchdir (fd) != 0)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+
+ err = CALL_FUNC (file);
+ saved_errno = (err < 0 ? errno : 0);
+
+ if (restore_cwd (&saved_cwd) != 0)
+ openat_restore_fail (errno);
+
+ free_cwd (&saved_cwd);
+
+ if (saved_errno)
+ errno = saved_errno;
+ return err;
+}
+#undef CALL_FUNC
diff --git a/lib/backupfile.c b/lib/backupfile.c
new file mode 100644
index 0000000..adfc0e5
--- /dev/null
+++ b/lib/backupfile.c
@@ -0,0 +1,364 @@
+/* backupfile.c -- make Emacs style backup file names
+
+ Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING.
+ If not, write to the Free Software Foundation,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert and David MacKenzie.
+ Some algorithms adapted from GNU Emacs. */
+
+#include <config.h>
+
+#include "backupfile.h"
+
+#include "argmatch.h"
+#include "dirname.h"
+#include "xalloc.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <limits.h>
+
+#include <unistd.h>
+
+#include <dirent.h>
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
+#endif
+#if D_INO_IN_DIRENT
+# define REAL_DIR_ENTRY(dp) ((dp)->d_ino != 0)
+#else
+# define REAL_DIR_ENTRY(dp) 1
+#endif
+
+#if ! (HAVE_PATHCONF && defined _PC_NAME_MAX)
+# define pathconf(file, option) (errno = -1)
+#endif
+
+#ifndef _POSIX_NAME_MAX
+# define _POSIX_NAME_MAX 14
+#endif
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#if defined _XOPEN_NAME_MAX
+# define NAME_MAX_MINIMUM _XOPEN_NAME_MAX
+#else
+# define NAME_MAX_MINIMUM _POSIX_NAME_MAX
+#endif
+
+#ifndef HAVE_DOS_FILE_NAMES
+# define HAVE_DOS_FILE_NAMES 0
+#endif
+#ifndef HAVE_LONG_FILE_NAMES
+# define HAVE_LONG_FILE_NAMES 0
+#endif
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ ISDIGIT unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef opendir
+#undef closedir
+
+/* The extension added to file names to produce a simple (as opposed
+ to numbered) backup file name. */
+char const *simple_backup_suffix = "~";
+
+
+/* If FILE (which was of length FILELEN before an extension was
+ appended to it) is too long, replace the extension with the single
+ char E. If the result is still too long, remove the char just
+ before E. */
+
+static void
+check_extension (char *file, size_t filelen, char e)
+{
+ char *base = last_component (file);
+ size_t baselen = base_len (base);
+ size_t baselen_max = HAVE_LONG_FILE_NAMES ? 255 : NAME_MAX_MINIMUM;
+
+ if (HAVE_DOS_FILE_NAMES || NAME_MAX_MINIMUM < baselen)
+ {
+ /* The new base name is long enough to require a pathconf check. */
+ long name_max;
+
+ /* Temporarily modify the buffer into its parent directory name,
+ invoke pathconf on the directory, and then restore the buffer. */
+ char tmp[sizeof "."];
+ memcpy (tmp, base, sizeof ".");
+ strcpy (base, ".");
+ errno = 0;
+ name_max = pathconf (file, _PC_NAME_MAX);
+ if (0 <= name_max || errno == 0)
+ {
+ long size = baselen_max = name_max;
+ if (name_max != size)
+ baselen_max = SIZE_MAX;
+ }
+ memcpy (base, tmp, sizeof ".");
+ }
+
+ if (HAVE_DOS_FILE_NAMES && baselen_max <= 12)
+ {
+ /* Live within DOS's 8.3 limit. */
+ char *dot = strchr (base, '.');
+ if (!dot)
+ baselen_max = 8;
+ else
+ {
+ char const *second_dot = strchr (dot + 1, '.');
+ baselen_max = (second_dot
+ ? second_dot - base
+ : dot + 1 - base + 3);
+ }
+ }
+
+ if (baselen_max < baselen)
+ {
+ baselen = file + filelen - base;
+ if (baselen_max <= baselen)
+ baselen = baselen_max - 1;
+ base[baselen] = e;
+ base[baselen + 1] = '\0';
+ }
+}
+
+/* Returned values for NUMBERED_BACKUP. */
+
+enum numbered_backup_result
+ {
+ /* The new backup name is the same length as an existing backup
+ name, so it's valid for that directory. */
+ BACKUP_IS_SAME_LENGTH,
+
+ /* Some backup names already exist, but the returned name is longer
+ than any of them, and its length should be checked. */
+ BACKUP_IS_LONGER,
+
+ /* There are no existing backup names. The new name's length
+ should be checked. */
+ BACKUP_IS_NEW
+ };
+
+/* *BUFFER contains a file name. Store into *BUFFER the next backup
+ name for the named file, with a version number greater than all the
+ existing numbered backups. Reallocate *BUFFER as necessary; its
+ initial allocated size is BUFFER_SIZE, which must be at least 4
+ bytes longer than the file name to make room for the initially
+ appended ".~1". FILELEN is the length of the original file name.
+ The returned value indicates what kind of backup was found. If an
+ I/O or other read error occurs, use the highest backup number that
+ was found. */
+
+static enum numbered_backup_result
+numbered_backup (char **buffer, size_t buffer_size, size_t filelen)
+{
+ enum numbered_backup_result result = BACKUP_IS_NEW;
+ DIR *dirp;
+ struct dirent *dp;
+ char *buf = *buffer;
+ size_t versionlenmax = 1;
+ char *base = last_component (buf);
+ size_t base_offset = base - buf;
+ size_t baselen = base_len (base);
+
+ /* Temporarily modify the buffer into its parent directory name,
+ open the directory, and then restore the buffer. */
+ char tmp[sizeof "."];
+ memcpy (tmp, base, sizeof ".");
+ strcpy (base, ".");
+ dirp = opendir (buf);
+ memcpy (base, tmp, sizeof ".");
+ strcpy (base + baselen, ".~1~");
+
+ if (!dirp)
+ return result;
+
+ while ((dp = readdir (dirp)) != NULL)
+ {
+ char const *p;
+ char *q;
+ bool all_9s;
+ size_t versionlen;
+ size_t new_buflen;
+
+ if (! REAL_DIR_ENTRY (dp) || _D_EXACT_NAMLEN (dp) < baselen + 4)
+ continue;
+
+ if (memcmp (buf + base_offset, dp->d_name, baselen + 2) != 0)
+ continue;
+
+ p = dp->d_name + baselen + 2;
+
+ /* Check whether this file has a version number and if so,
+ whether it is larger. Use string operations rather than
+ integer arithmetic, to avoid problems with integer overflow. */
+
+ if (! ('1' <= *p && *p <= '9'))
+ continue;
+ all_9s = (*p == '9');
+ for (versionlen = 1; ISDIGIT (p[versionlen]); versionlen++)
+ all_9s &= (p[versionlen] == '9');
+
+ if (! (p[versionlen] == '~' && !p[versionlen + 1]
+ && (versionlenmax < versionlen
+ || (versionlenmax == versionlen
+ && memcmp (buf + filelen + 2, p, versionlen) <= 0))))
+ continue;
+
+ /* This directory has the largest version number seen so far.
+ Append this highest numbered extension to the file name,
+ prepending '0' to the number if it is all 9s. */
+
+ versionlenmax = all_9s + versionlen;
+ result = (all_9s ? BACKUP_IS_LONGER : BACKUP_IS_SAME_LENGTH);
+ new_buflen = filelen + 2 + versionlenmax + 1;
+ if (buffer_size <= new_buflen)
+ {
+ buf = xnrealloc (buf, 2, new_buflen);
+ buffer_size = new_buflen * 2;
+ }
+ q = buf + filelen;
+ *q++ = '.';
+ *q++ = '~';
+ *q = '0';
+ q += all_9s;
+ memcpy (q, p, versionlen + 2);
+
+ /* Add 1 to the version number. */
+
+ q += versionlen;
+ while (*--q == '9')
+ *q = '0';
+ ++*q;
+ }
+
+ closedir (dirp);
+ *buffer = buf;
+ return result;
+}
+
+/* Return the name of the new backup file for the existing file FILE,
+ allocated with malloc. Report an error and fail if out of memory.
+ Do not call this function if backup_type == no_backups. */
+
+char *
+find_backup_file_name (char const *file, enum backup_type backup_type)
+{
+ size_t filelen = strlen (file);
+ char *s;
+ size_t ssize;
+ bool simple = true;
+
+ /* Allow room for simple or ".~N~" backups. The guess must be at
+ least sizeof ".~1~", but otherwise will be adjusted as needed. */
+ size_t simple_backup_suffix_size = strlen (simple_backup_suffix) + 1;
+ size_t backup_suffix_size_guess = simple_backup_suffix_size;
+ enum { GUESS = sizeof ".~12345~" };
+ if (backup_suffix_size_guess < GUESS)
+ backup_suffix_size_guess = GUESS;
+
+ ssize = filelen + backup_suffix_size_guess + 1;
+ s = xmalloc (ssize);
+ memcpy (s, file, filelen + 1);
+
+ if (backup_type != simple_backups)
+ switch (numbered_backup (&s, ssize, filelen))
+ {
+ case BACKUP_IS_SAME_LENGTH:
+ return s;
+
+ case BACKUP_IS_LONGER:
+ simple = false;
+ break;
+
+ case BACKUP_IS_NEW:
+ simple = (backup_type == numbered_existing_backups);
+ break;
+ }
+
+ if (simple)
+ memcpy (s + filelen, simple_backup_suffix, simple_backup_suffix_size);
+ check_extension (s, filelen, '~');
+ return s;
+}
+
+static char const * const backup_args[] =
+{
+ /* In a series of synonyms, present the most meaningful first, so
+ that argmatch_valid be more readable. */
+ "none", "off",
+ "simple", "never",
+ "existing", "nil",
+ "numbered", "t",
+ NULL
+};
+
+static const enum backup_type backup_types[] =
+{
+ no_backups, no_backups,
+ simple_backups, simple_backups,
+ numbered_existing_backups, numbered_existing_backups,
+ numbered_backups, numbered_backups
+};
+
+/* Ensure that these two vectors have the same number of elements,
+ not counting the final NULL in the first one. */
+ARGMATCH_VERIFY (backup_args, backup_types);
+
+/* Return the type of backup specified by VERSION.
+ If VERSION is NULL or the empty string, return numbered_existing_backups.
+ If VERSION is invalid or ambiguous, fail with a diagnostic appropriate
+ for the specified CONTEXT. Unambiguous abbreviations are accepted. */
+
+enum backup_type
+get_version (char const *context, char const *version)
+{
+ if (version == 0 || *version == 0)
+ return numbered_existing_backups;
+ else
+ return XARGMATCH (context, version, backup_args, backup_types);
+}
+
+
+/* Return the type of backup specified by VERSION.
+ If VERSION is NULL, use the value of the envvar VERSION_CONTROL.
+ If the specified string is invalid or ambiguous, fail with a diagnostic
+ appropriate for the specified CONTEXT.
+ Unambiguous abbreviations are accepted. */
+
+enum backup_type
+xget_version (char const *context, char const *version)
+{
+ if (version && *version)
+ return get_version (context, version);
+ else
+ return get_version ("$VERSION_CONTROL", getenv ("VERSION_CONTROL"));
+}
diff --git a/lib/backupfile.h b/lib/backupfile.h
new file mode 100644
index 0000000..7b44e58
--- /dev/null
+++ b/lib/backupfile.h
@@ -0,0 +1,61 @@
+/* backupfile.h -- declarations for making Emacs style backup file names
+
+ Copyright (C) 1990, 1991, 1992, 1997, 1998, 1999, 2003, 2004 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can 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; see the file COPYING.
+ If not, write to the Free Software Foundation,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef BACKUPFILE_H_
+# define BACKUPFILE_H_
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+
+/* When to make backup files. */
+enum backup_type
+{
+ /* Never make backups. */
+ no_backups,
+
+ /* Make simple backups of every file. */
+ simple_backups,
+
+ /* Make numbered backups of files that already have numbered backups,
+ and simple backups of the others. */
+ numbered_existing_backups,
+
+ /* Make numbered backups of every file. */
+ numbered_backups
+};
+
+# define VALID_BACKUP_TYPE(Type) \
+ ((unsigned int) (Type) <= numbered_backups)
+
+extern char const *simple_backup_suffix;
+
+char *find_backup_file_name (char const *, enum backup_type);
+enum backup_type get_version (char const *context, char const *arg);
+enum backup_type xget_version (char const *context, char const *arg);
+void addext (char *, char const *, int);
+
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* ! BACKUPFILE_H_ */
diff --git a/lib/basename.c b/lib/basename.c
new file mode 100644
index 0000000..fbe17ff
--- /dev/null
+++ b/lib/basename.c
@@ -0,0 +1,129 @@
+/* basename.c -- return the last element in a file name
+
+ Copyright (C) 1990, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <string.h>
+#include "xalloc.h"
+#include "xstrndup.h"
+
+/* Return the address of the last file name component of NAME. If
+ NAME has no relative file name components because it is a file
+ system root, return the empty string. */
+
+char *
+last_component (char const *name)
+{
+ char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
+ char const *p;
+ bool saw_slash = false;
+
+ while (ISSLASH (*base))
+ base++;
+
+ for (p = base; *p; p++)
+ {
+ if (ISSLASH (*p))
+ saw_slash = true;
+ else if (saw_slash)
+ {
+ base = p;
+ saw_slash = false;
+ }
+ }
+
+ return (char *) base;
+}
+
+
+/* In general, we can't use the builtin `basename' function if available,
+ since it has different meanings in different environments.
+ In some environments the builtin `basename' modifies its argument.
+
+ Return the last file name component of NAME, allocated with
+ xmalloc. On systems with drive letters, a leading "./"
+ distinguishes relative names that would otherwise look like a drive
+ letter. Unlike POSIX basename(), NAME cannot be NULL,
+ base_name("") returns "", and the first trailing slash is not
+ stripped.
+
+ If lstat (NAME) would succeed, then { chdir (dir_name (NAME));
+ lstat (base_name (NAME)); } will access the same file. Likewise,
+ if the sequence { chdir (dir_name (NAME));
+ rename (base_name (NAME), "foo"); } succeeds, you have renamed NAME
+ to "foo" in the same directory NAME was in. */
+
+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);
+}
+
+/* Return the length of the basename NAME. Typically NAME is the
+ value returned by base_name or last_component. Act like strlen
+ (NAME), except omit all trailing slashes. */
+
+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/canonicalize-lgpl.c b/lib/canonicalize-lgpl.c
new file mode 100644
index 0000000..05ced11
--- /dev/null
+++ b/lib/canonicalize-lgpl.c
@@ -0,0 +1,353 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2003, 2005-2006 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Avoid a clash of our rpl_realpath() function with the prototype in
+ <stdlib.h> on Solaris 2.5.1. */
+#undef realpath
+
+#if !HAVE_CANONICALIZE_FILE_NAME || defined _LIBC
+
+#include <alloca.h>
+
+/* Specification. */
+#include "canonicalize.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include <limits.h>
+
+#if HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+#ifndef MAXSYMLINKS
+# define MAXSYMLINKS 20
+#endif
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#ifndef _LIBC
+# define __set_errno(e) errno = (e)
+# ifndef ENAMETOOLONG
+# define ENAMETOOLONG EINVAL
+# endif
+#endif
+
+#ifdef _LIBC
+# include <shlib-compat.h>
+#else
+# define SHLIB_COMPAT(lib, introduced, obsoleted) 0
+# define versioned_symbol(lib, local, symbol, version)
+# define compat_symbol(lib, local, symbol, version)
+# define weak_alias(local, symbol)
+# define __canonicalize_file_name canonicalize_file_name
+# define __realpath rpl_realpath
+# include "pathmax.h"
+# include "allocsa.h"
+# if HAVE_GETCWD
+# ifdef VMS
+ /* We want the directory in Unix syntax, not in VMS syntax. */
+# define __getcwd(buf, max) getcwd (buf, max, 0)
+# else
+# define __getcwd getcwd
+# endif
+# else
+# define __getcwd(buf, max) getwd (buf)
+# endif
+# define __readlink readlink
+ /* On systems without symbolic links, call stat() instead of lstat(). */
+# if !defined S_ISNLK && !HAVE_READLINK
+# define lstat stat
+# endif
+#endif
+
+/* Return the canonical absolute name of file NAME. A canonical name
+ does not contain any `.', `..' components nor any repeated path
+ separators ('/') or symlinks. All path components must exist. If
+ RESOLVED is null, the result is malloc'd; otherwise, if the
+ canonical name is PATH_MAX chars or more, returns null with `errno'
+ set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
+ returns the name in RESOLVED. If the name cannot be resolved and
+ RESOLVED is non-NULL, it contains the path of the first component
+ that cannot be resolved. If the path can be resolved, RESOLVED
+ holds the same value as the value returned. */
+
+char *
+__realpath (const char *name, char *resolved)
+{
+ char *rpath, *dest, *extra_buf = NULL;
+ const char *start, *end, *rpath_limit;
+ long int path_max;
+#if HAVE_READLINK
+ int num_links = 0;
+#endif
+
+ if (name == NULL)
+ {
+ /* As per Single Unix Specification V2 we must return an error if
+ either parameter is a null pointer. We extend this to allow
+ the RESOLVED parameter to be NULL in case the we are expected to
+ allocate the room for the return value. */
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ if (name[0] == '\0')
+ {
+ /* As per Single Unix Specification V2 we must return an error if
+ the name argument points to an empty string. */
+ __set_errno (ENOENT);
+ return NULL;
+ }
+
+#ifdef PATH_MAX
+ path_max = PATH_MAX;
+#else
+ path_max = pathconf (name, _PC_PATH_MAX);
+ if (path_max <= 0)
+ path_max = 1024;
+#endif
+
+ if (resolved == NULL)
+ {
+ rpath = malloc (path_max);
+ if (rpath == NULL)
+ return NULL;
+ }
+ else
+ rpath = resolved;
+ rpath_limit = rpath + path_max;
+
+ if (name[0] != '/')
+ {
+ if (!__getcwd (rpath, path_max))
+ {
+ rpath[0] = '\0';
+ goto error;
+ }
+ dest = strchr (rpath, '\0');
+ }
+ else
+ {
+ rpath[0] = '/';
+ dest = rpath + 1;
+ }
+
+ for (start = end = name; *start; start = end)
+ {
+#ifdef _LIBC
+ struct stat64 st;
+#else
+ struct stat st;
+#endif
+
+ /* Skip sequence of multiple path-separators. */
+ while (*start == '/')
+ ++start;
+
+ /* Find end of path component. */
+ for (end = start; *end && *end != '/'; ++end)
+ /* Nothing. */;
+
+ if (end - start == 0)
+ break;
+ else if (end - start == 1 && start[0] == '.')
+ /* nothing */;
+ else if (end - start == 2 && start[0] == '.' && start[1] == '.')
+ {
+ /* Back up to previous component, ignore if at root already. */
+ if (dest > rpath + 1)
+ while ((--dest)[-1] != '/');
+ }
+ else
+ {
+ size_t new_size;
+
+ if (dest[-1] != '/')
+ *dest++ = '/';
+
+ if (dest + (end - start) >= rpath_limit)
+ {
+ ptrdiff_t dest_offset = dest - rpath;
+ char *new_rpath;
+
+ if (resolved)
+ {
+ __set_errno (ENAMETOOLONG);
+ if (dest > rpath + 1)
+ dest--;
+ *dest = '\0';
+ goto error;
+ }
+ new_size = rpath_limit - rpath;
+ if (end - start + 1 > path_max)
+ new_size += end - start + 1;
+ else
+ new_size += path_max;
+ new_rpath = (char *) realloc (rpath, new_size);
+ if (new_rpath == NULL)
+ goto error;
+ rpath = new_rpath;
+ rpath_limit = rpath + new_size;
+
+ dest = rpath + dest_offset;
+ }
+
+#ifdef _LIBC
+ dest = __mempcpy (dest, start, end - start);
+#else
+ memcpy (dest, start, end - start);
+ dest += end - start;
+#endif
+ *dest = '\0';
+
+#ifdef _LIBC
+ if (__lxstat64 (_STAT_VER, rpath, &st) < 0)
+#else
+ if (lstat (rpath, &st) < 0)
+#endif
+ goto error;
+
+#if HAVE_READLINK
+ if (S_ISLNK (st.st_mode))
+ {
+ char *buf;
+ size_t len;
+ int n;
+
+ if (++num_links > MAXSYMLINKS)
+ {
+ __set_errno (ELOOP);
+ goto error;
+ }
+
+ buf = allocsa (path_max);
+ if (!buf)
+ {
+ errno = ENOMEM;
+ goto error;
+ }
+
+ n = __readlink (rpath, buf, path_max);
+ if (n < 0)
+ {
+ int saved_errno = errno;
+ freesa (buf);
+ errno = saved_errno;
+ goto error;
+ }
+ buf[n] = '\0';
+
+ if (!extra_buf)
+ {
+ extra_buf = allocsa (path_max);
+ if (!extra_buf)
+ {
+ freesa (buf);
+ errno = ENOMEM;
+ goto error;
+ }
+ }
+
+ len = strlen (end);
+ if ((long int) (n + len) >= path_max)
+ {
+ freesa (buf);
+ __set_errno (ENAMETOOLONG);
+ goto error;
+ }
+
+ /* Careful here, end may be a pointer into extra_buf... */
+ memmove (&extra_buf[n], end, len + 1);
+ name = end = memcpy (extra_buf, buf, n);
+
+ if (buf[0] == '/')
+ dest = rpath + 1; /* It's an absolute symlink */
+ else
+ /* Back up to previous component, ignore if at root already: */
+ if (dest > rpath + 1)
+ while ((--dest)[-1] != '/');
+ }
+#endif
+ }
+ }
+ if (dest > rpath + 1 && dest[-1] == '/')
+ --dest;
+ *dest = '\0';
+
+ if (extra_buf)
+ freesa (extra_buf);
+
+ return resolved ? memcpy (resolved, rpath, dest - rpath + 1) : rpath;
+
+error:
+ {
+ int saved_errno = errno;
+ if (extra_buf)
+ freesa (extra_buf);
+ if (resolved)
+ strcpy (resolved, rpath);
+ else
+ free (rpath);
+ errno = saved_errno;
+ }
+ return NULL;
+}
+#ifdef _LIBC
+versioned_symbol (libc, __realpath, realpath, GLIBC_2_3);
+#endif
+
+
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3)
+char *
+__old_realpath (const char *name, char *resolved)
+{
+ if (resolved == NULL)
+ {
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ return __realpath (name, resolved);
+}
+compat_symbol (libc, __old_realpath, realpath, GLIBC_2_0);
+#endif
+
+
+char *
+__canonicalize_file_name (const char *name)
+{
+ return __realpath (name, NULL);
+}
+weak_alias (__canonicalize_file_name, canonicalize_file_name)
+
+#else
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#endif
diff --git a/lib/canonicalize.h b/lib/canonicalize.h
new file mode 100644
index 0000000..5c4d3f1
--- /dev/null
+++ b/lib/canonicalize.h
@@ -0,0 +1,54 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can 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; see the file COPYING.
+ If not, write to the Free Software Foundation,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef CANONICALIZE_H_
+# define CANONICALIZE_H_
+
+# if GNULIB_CANONICALIZE
+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
+ };
+typedef enum canonicalize_mode_t canonicalize_mode_t;
+
+/* Return a malloc'd string containing the canonical absolute name of
+ the named file. This acts like canonicalize_file_name, except that
+ whether components must exist depends on the canonicalize_mode_t
+ argument. */
+char *canonicalize_filename_mode (const char *, canonicalize_mode_t);
+# endif
+
+# if HAVE_DECL_CANONICALIZE_FILE_NAME
+# include <stdlib.h>
+# else
+/* Return a malloc'd string containing the canonical absolute name of
+ the named file. If any file name component does not exist or is a
+ symlink to a nonexistent file, return NULL. A canonical name does
+ not contain any `.', `..' components nor any repeated file name
+ separators ('/') or symlinks. */
+char *canonicalize_file_name (const char *);
+# endif
+
+#endif /* !CANONICALIZE_H_ */
diff --git a/lib/chdir-long.c b/lib/chdir-long.c
new file mode 100644
index 0000000..3fc7ef2
--- /dev/null
+++ b/lib/chdir-long.c
@@ -0,0 +1,265 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+ Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "chdir-long.h"
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "openat.h"
+
+#ifndef PATH_MAX
+# error "compile this file only if your system defines PATH_MAX"
+#endif
+
+struct cd_buf
+{
+ int fd;
+};
+
+static inline void
+cdb_init (struct cd_buf *cdb)
+{
+ cdb->fd = AT_FDCWD;
+}
+
+static inline int
+cdb_fchdir (struct cd_buf const *cdb)
+{
+ return fchdir (cdb->fd);
+}
+
+static inline void
+cdb_free (struct cd_buf const *cdb)
+{
+ if (0 <= cdb->fd)
+ {
+ bool close_fail = close (cdb->fd);
+ assert (! 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_RDONLY | 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 inline char *
+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. */
+ assert (0 < len);
+ assert (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;
+ }
+
+ assert (*dir != '/');
+ assert (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';
+ assert (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 <stdio.h>
+# include "closeout.h"
+# include "error.h"
+
+char *program_name;
+
+int
+main (int argc, char *argv[])
+{
+ char *line = NULL;
+ size_t n = 0;
+ int len;
+
+ program_name = argv[0];
+ 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..4852b40
--- /dev/null
+++ b/lib/chdir-long.h
@@ -0,0 +1,35 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+ Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#include <unistd.h>
+#include <limits.h>
+
+#ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# endif
+#endif
+
+/* 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/chown.c b/lib/chown.c
new file mode 100644
index 0000000..b7786f6
--- /dev/null
+++ b/lib/chown.c
@@ -0,0 +1,104 @@
+/* provide consistent interface to chown for systems that don't interpret
+ an ID of -1 as meaning `don't change the corresponding ID'.
+
+ Copyright (C) 1997, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <stdbool.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+
+/* Below we refer to the system's chown(). */
+#undef chown
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+/* Provide a more-closely POSIX-conforming version of chown on
+ systems with one or both of the following problems:
+ - chown doesn't treat an ID of -1 as meaning
+ `don't change the corresponding ID'.
+ - chown doesn't dereference symlinks. */
+
+int
+rpl_chown (const char *file, uid_t uid, gid_t gid)
+{
+#if CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE
+ if (gid == (gid_t) -1 || uid == (uid_t) -1)
+ {
+ struct stat file_stats;
+
+ /* Stat file to get id(s) that should remain unchanged. */
+ if (stat (file, &file_stats))
+ return -1;
+
+ if (gid == (gid_t) -1)
+ gid = file_stats.st_gid;
+
+ if (uid == (uid_t) -1)
+ uid = file_stats.st_uid;
+ }
+#endif
+
+#if CHOWN_MODIFIES_SYMLINK
+ {
+ /* Handle the case in which the system-supplied chown function
+ does *not* follow symlinks. Instead, it changes permissions
+ on the symlink itself. To work around that, we open the
+ file (but this can fail due to lack of read or write permission) and
+ use fchown on the resulting descriptor. */
+ int open_flags = O_NONBLOCK | O_NOCTTY;
+ int fd = open (file, O_RDONLY | open_flags);
+ if (0 <= fd
+ || (errno == EACCES
+ && 0 <= (fd = open (file, O_WRONLY | open_flags))))
+ {
+ int result = fchown (fd, uid, gid);
+ int saved_errno = errno;
+
+ /* POSIX says fchown can fail with errno == EINVAL on sockets,
+ so fall back on chown in that case. */
+ struct stat sb;
+ bool fchown_socket_failure =
+ (result != 0 && saved_errno == EINVAL
+ && fstat (fd, &sb) == 0 && S_ISFIFO (sb.st_mode));
+
+ close (fd);
+
+ if (! fchown_socket_failure)
+ {
+ errno = saved_errno;
+ return result;
+ }
+ }
+ else if (errno != EACCES)
+ return -1;
+ }
+#endif
+
+ return chown (file, uid, gid);
+}
diff --git a/lib/close-stream.c b/lib/close-stream.c
new file mode 100644
index 0000000..72d0d68
--- /dev/null
+++ b/lib/close-stream.c
@@ -0,0 +1,76 @@
+/* Close a stream, with nicer error checking than fclose's.
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include "close-stream.h"
+
+#include <errno.h>
+#include <stdbool.h>
+
+#include "__fpending.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Close STREAM. Return 0 if successful, EOF (setting errno)
+ otherwise. A failure might set errno to 0 if the error number
+ cannot be determined.
+
+ If a program writes *anything* to STREAM, that program should close
+ STREAM and make sure that it succeeds before exiting. Otherwise,
+ suppose that you go to the extreme of checking the return status
+ of every function that does an explicit write to STREAM. The last
+ printf can succeed in writing to the internal stream buffer, and yet
+ the fclose(STREAM) could still fail (due e.g., to a disk full error)
+ when it tries to write out that buffered data. Thus, you would be
+ left with an incomplete output file and the offending program would
+ exit successfully. Even calling fflush is not always sufficient,
+ since some file systems (NFS and CODA) buffer written/flushed data
+ until an actual close call.
+
+ Besides, it's wasteful to check the return value from every call
+ that writes to STREAM -- just let the internal stream state record
+ the failure. That's what the ferror test is checking below. */
+
+int
+close_stream (FILE *stream)
+{
+ bool some_pending = (__fpending (stream) != 0);
+ bool prev_fail = (ferror (stream) != 0);
+ bool fclose_fail = (fclose (stream) != 0);
+
+ /* Return an error indication if there was a previous failure or if
+ fclose failed, with one exception: ignore an fclose failure if
+ there was no previous error, no data remains to be flushed, and
+ fclose failed with EBADF. That can happen when a program like cp
+ is invoked like this `cp a b >&-' (i.e., with standard output
+ closed) and doesn't generate any output (hence no previous error
+ and nothing to be flushed). */
+
+ if (prev_fail || (fclose_fail && (some_pending || errno != EBADF)))
+ {
+ if (! fclose_fail)
+ errno = 0;
+ return EOF;
+ }
+
+ return 0;
+}
diff --git a/lib/close-stream.h b/lib/close-stream.h
new file mode 100644
index 0000000..be3d419
--- /dev/null
+++ b/lib/close-stream.h
@@ -0,0 +1,2 @@
+#include <stdio.h>
+int close_stream (FILE *stream);
diff --git a/lib/closeout.c b/lib/closeout.c
new file mode 100644
index 0000000..830f16f
--- /dev/null
+++ b/lib/closeout.c
@@ -0,0 +1,86 @@
+/* Close standard output and standard error, exiting with a diagnostic on error.
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include "closeout.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "close-stream.h"
+#include "error.h"
+#include "exitfail.h"
+#include "quotearg.h"
+
+static const char *file_name;
+
+/* Set the file name to be reported in the event an error is detected
+ by close_stdout. */
+void
+close_stdout_set_file_name (const char *file)
+{
+ file_name = file;
+}
+
+/* Close standard output. On error, issue a diagnostic and _exit
+ with status 'exit_failure'.
+
+ Also close standard error. On error, _exit with status 'exit_failure'.
+
+ Since close_stdout is commonly registered via 'atexit', POSIX
+ and the C standard both say that it should not call 'exit',
+ because the behavior is undefined if 'exit' is called more than
+ once. So it calls '_exit' instead of 'exit'. If close_stdout
+ is registered via atexit before other functions are registered,
+ the other functions can act before this _exit is invoked.
+
+ Applications that use close_stdout should flush any streams
+ other than stdout and stderr before exiting, since the call to
+ _exit will bypass other buffer flushing. Applications should
+ be flushing and closing other streams anyway, to check for I/O
+ errors. Also, applications should not use tmpfile, since _exit
+ can bypass the removal of these files.
+
+ It's important to detect such failures and exit nonzero because many
+ tools (most notably `make' and other build-management systems) depend
+ on being able to detect failure in other tools via their exit status. */
+
+void
+close_stdout (void)
+{
+ if (close_stream (stdout) != 0)
+ {
+ char const *write_error = _("write error");
+ if (file_name)
+ error (0, errno, "%s: %s", quotearg_colon (file_name),
+ write_error);
+ else
+ error (0, errno, "%s", write_error);
+
+ _exit (exit_failure);
+ }
+
+ if (close_stream (stderr) != 0)
+ _exit (exit_failure);
+}
diff --git a/lib/closeout.h b/lib/closeout.h
new file mode 100644
index 0000000..8bed23b
--- /dev/null
+++ b/lib/closeout.h
@@ -0,0 +1,33 @@
+/* Close standard output and standard error.
+
+ Copyright (C) 1998, 2000, 2003, 2004, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef CLOSEOUT_H
+# define CLOSEOUT_H 1
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+void close_stdout_set_file_name (const char *file);
+void close_stdout (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/lib/config.charset b/lib/config.charset
new file mode 100755
index 0000000..148ea44
--- /dev/null
+++ b/lib/config.charset
@@ -0,0 +1,639 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+# Copyright (C) 2000-2004, 2006 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# The table consists of lines of the form
+# ALIAS CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+# name MIME? used by which systems
+# ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin
+# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd darwin
+# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd darwin
+# ISO-8859-3 Y glibc solaris
+# ISO-8859-4 Y osf solaris freebsd netbsd darwin
+# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd darwin
+# ISO-8859-6 Y glibc aix hpux solaris
+# ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd darwin
+# ISO-8859-8 Y glibc aix hpux osf solaris
+# ISO-8859-9 Y glibc aix hpux irix osf solaris darwin
+# ISO-8859-13 glibc netbsd darwin
+# ISO-8859-14 glibc
+# ISO-8859-15 glibc aix osf solaris freebsd darwin
+# KOI8-R Y glibc solaris freebsd netbsd darwin
+# KOI8-U Y glibc freebsd netbsd darwin
+# KOI8-T glibc
+# CP437 dos
+# CP775 dos
+# CP850 aix osf dos
+# CP852 dos
+# CP855 dos
+# CP856 aix
+# CP857 dos
+# CP861 dos
+# CP862 dos
+# CP864 dos
+# CP865 dos
+# CP866 freebsd netbsd darwin dos
+# CP869 dos
+# CP874 woe32 dos
+# CP922 aix
+# CP932 aix woe32 dos
+# CP943 aix
+# CP949 osf woe32 dos
+# CP950 woe32 dos
+# CP1046 aix
+# CP1124 aix
+# CP1125 dos
+# CP1129 aix
+# CP1250 woe32
+# CP1251 glibc solaris netbsd darwin woe32
+# CP1252 aix woe32
+# CP1253 woe32
+# CP1254 woe32
+# CP1255 glibc woe32
+# CP1256 woe32
+# CP1257 woe32
+# GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin
+# EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin
+# EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin
+# EUC-TW glibc aix hpux irix osf solaris netbsd
+# BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin
+# BIG5-HKSCS glibc solaris
+# GBK glibc aix osf solaris woe32 dos
+# GB18030 glibc solaris netbsd
+# SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin
+# JOHAB glibc solaris woe32
+# TIS-620 glibc aix hpux osf solaris
+# VISCII Y glibc
+# TCVN5712-1 glibc
+# GEORGIAN-PS glibc
+# HP-ROMAN8 hpux
+# HP-ARABIC8 hpux
+# HP-GREEK8 hpux
+# HP-HEBREW8 hpux
+# HP-TURKISH8 hpux
+# HP-KANA8 hpux
+# DEC-KANJI osf
+# DEC-HANYU osf
+# UTF-8 Y glibc aix hpux osf solaris netbsd darwin
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+ linux-gnulibc1*)
+ # Linux libc5 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ echo "POSIX ASCII"
+ for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \
+ en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \
+ en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \
+ es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \
+ et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \
+ fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \
+ it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \
+ sv_FI sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.iso-8859-1 ISO-8859-1"
+ echo "$l.iso-8859-15 ISO-8859-15"
+ echo "$l.iso-8859-15@euro ISO-8859-15"
+ echo "$l@euro ISO-8859-15"
+ echo "$l.cp-437 CP437"
+ echo "$l.cp-850 CP850"
+ echo "$l.cp-1252 CP1252"
+ echo "$l.cp-1252@euro CP1252"
+ #echo "$l.atari-st ATARI-ST" # not a commonly used encoding
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \
+ sl_SI sr sr_CS sr_YU; do
+ echo "$l ISO-8859-2"
+ echo "$l.iso-8859-2 ISO-8859-2"
+ echo "$l.cp-852 CP852"
+ echo "$l.cp-1250 CP1250"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in mk mk_MK ru ru_RU; do
+ echo "$l ISO-8859-5"
+ echo "$l.iso-8859-5 ISO-8859-5"
+ echo "$l.koi8-r KOI8-R"
+ echo "$l.cp-866 CP866"
+ echo "$l.cp-1251 CP1251"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in ar ar_SA; do
+ echo "$l ISO-8859-6"
+ echo "$l.iso-8859-6 ISO-8859-6"
+ echo "$l.cp-864 CP864"
+ #echo "$l.cp-868 CP868" # not a commonly used encoding
+ echo "$l.cp-1256 CP1256"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in el el_GR gr gr_GR; do
+ echo "$l ISO-8859-7"
+ echo "$l.iso-8859-7 ISO-8859-7"
+ echo "$l.cp-869 CP869"
+ echo "$l.cp-1253 CP1253"
+ echo "$l.cp-1253@euro CP1253"
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in he he_IL iw iw_IL; do
+ echo "$l ISO-8859-8"
+ echo "$l.iso-8859-8 ISO-8859-8"
+ echo "$l.cp-862 CP862"
+ echo "$l.cp-1255 CP1255"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in tr tr_TR; do
+ echo "$l ISO-8859-9"
+ echo "$l.iso-8859-9 ISO-8859-9"
+ echo "$l.cp-857 CP857"
+ echo "$l.cp-1254 CP1254"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in lt lt_LT lv lv_LV; do
+ #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name
+ echo "$l ISO-8859-13"
+ done
+ for l in ru_UA uk uk_UA; do
+ echo "$l KOI8-U"
+ done
+ for l in zh zh_CN; do
+ #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name
+ echo "$l GB2312"
+ done
+ for l in ja ja_JP ja_JP.EUC; do
+ echo "$l EUC-JP"
+ done
+ for l in ko ko_KR; do
+ echo "$l EUC-KR"
+ done
+ for l in th th_TH; do
+ echo "$l TIS-620"
+ done
+ for l in fa fa_IR; do
+ #echo "$l ISIRI-3342" # a broken encoding
+ echo "$l.utf-8 UTF-8"
+ done
+ ;;
+ linux* | *-gnu*)
+ # With glibc-2.1 or newer, we don't need any canonicalization,
+ # because glibc has iconv and both glibc and libiconv support all
+ # GNU canonical names directly. Therefore, the Makefile does not
+ # need to install the alias file at all.
+ # The following applies only to glibc-2.0.x and older libcs.
+ echo "ISO_646.IRV:1983 ASCII"
+ ;;
+ aix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "IBM-850 CP850"
+ echo "IBM-856 CP856"
+ echo "IBM-921 ISO-8859-13"
+ echo "IBM-922 CP922"
+ echo "IBM-932 CP932"
+ echo "IBM-943 CP943"
+ echo "IBM-1046 CP1046"
+ echo "IBM-1124 CP1124"
+ echo "IBM-1129 CP1129"
+ echo "IBM-1252 CP1252"
+ echo "IBM-eucCN GB2312"
+ echo "IBM-eucJP EUC-JP"
+ echo "IBM-eucKR EUC-KR"
+ echo "IBM-eucTW EUC-TW"
+ echo "big5 BIG5"
+ echo "GBK GBK"
+ echo "TIS-620 TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ hpux*)
+ echo "iso88591 ISO-8859-1"
+ echo "iso88592 ISO-8859-2"
+ echo "iso88595 ISO-8859-5"
+ echo "iso88596 ISO-8859-6"
+ echo "iso88597 ISO-8859-7"
+ echo "iso88598 ISO-8859-8"
+ echo "iso88599 ISO-8859-9"
+ echo "iso885915 ISO-8859-15"
+ echo "roman8 HP-ROMAN8"
+ echo "arabic8 HP-ARABIC8"
+ echo "greek8 HP-GREEK8"
+ echo "hebrew8 HP-HEBREW8"
+ echo "turkish8 HP-TURKISH8"
+ echo "kana8 HP-KANA8"
+ echo "tis620 TIS-620"
+ echo "big5 BIG5"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "hp15CN GB2312"
+ #echo "ccdc ?" # what is this?
+ echo "SJIS SHIFT_JIS"
+ echo "utf8 UTF-8"
+ ;;
+ irix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ ;;
+ osf*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "cp850 CP850"
+ echo "big5 BIG5"
+ echo "dechanyu DEC-HANYU"
+ echo "dechanzi GB2312"
+ echo "deckanji DEC-KANJI"
+ echo "deckorean EUC-KR"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "GBK GBK"
+ echo "KSC5601 CP949"
+ echo "sdeckanji EUC-JP"
+ echo "SJIS SHIFT_JIS"
+ echo "TACTIS TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ solaris*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-3 ISO-8859-3"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "koi8-r KOI8-R"
+ echo "ansi-1251 CP1251"
+ echo "BIG5 BIG5"
+ echo "Big5-HKSCS BIG5-HKSCS"
+ echo "gb2312 GB2312"
+ echo "GBK GBK"
+ echo "GB18030 GB18030"
+ echo "cns11643 EUC-TW"
+ echo "5601 EUC-KR"
+ echo "ko_KR.johap92 JOHAB"
+ echo "eucJP EUC-JP"
+ echo "PCK SHIFT_JIS"
+ echo "TIS620.2533 TIS-620"
+ #echo "sun_eu_greek ?" # what is this?
+ echo "UTF-8 UTF-8"
+ ;;
+ freebsd* | os2*)
+ # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
+ # reuse FreeBSD's locale data for OS/2.
+ echo "C ASCII"
+ echo "US-ASCII ASCII"
+ for l in la_LN lt_LN; do
+ echo "$l.ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+ echo "$l.ISO_8859-1 ISO-8859-1"
+ echo "$l.DIS_8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+ echo "$l.ISO_8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO_8859-4 ISO-8859-4"
+ done
+ for l in ru_RU ru_SU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO_8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ja_JP.Shift_JIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ netbsd*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "BIG5 BIG5"
+ echo "SJIS SHIFT_JIS"
+ ;;
+ darwin[56]*)
+ # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ for l in en_AU en_CA en_GB en_US la_LN; do
+ echo "$l.US-ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \
+ nl_NL no_NO pt_PT sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in la_LN; do
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do
+ echo "$l.ISO8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO8859-4 ISO-8859-4"
+ done
+ for l in ru_RU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ for l in bg_BG; do
+ echo "$l.CP1251 CP1251"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ darwin*)
+ # Darwin 7.5 has nl_langinfo(CODESET), but it is useless:
+ # - It returns the empty string when LANG is set to a locale of the
+ # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8
+ # LC_CTYPE file.
+ # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by
+ # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case.
+ # - The documentation says:
+ # "... all code that calls BSD system routines should ensure
+ # that the const *char parameters of these routines are in UTF-8
+ # encoding. All BSD system functions expect their string
+ # parameters to be in UTF-8 encoding and nothing else."
+ # It also says
+ # "An additional caveat is that string parameters for files,
+ # paths, and other file-system entities must be in canonical
+ # UTF-8. In a canonical UTF-8 Unicode string, all decomposable
+ # characters are decomposed ..."
+ # but this is not true: You can pass non-decomposed UTF-8 strings
+ # to file system functions, and it is the OS which will convert
+ # them to decomposed UTF-8 before accessing the file system.
+ # - The Apple Terminal application displays UTF-8 by default.
+ # - However, other applications are free to use different encodings:
+ # - xterm uses ISO-8859-1 by default.
+ # - TextEdit uses MacRoman by default.
+ # We prefer UTF-8 over decomposed UTF-8-MAC because one should
+ # minimize the use of decomposed Unicode. Unfortunately, through the
+ # Darwin file system, decomposed UTF-8 strings are leaked into user
+ # space nevertheless.
+ echo "* UTF-8"
+ ;;
+ beos*)
+ # BeOS has a single locale, and it has UTF-8 encoding.
+ echo "* UTF-8"
+ ;;
+ msdosdjgpp*)
+ # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "#"
+ echo "# The encodings given here may not all be correct."
+ echo "# If you find that the encoding given for your language and"
+ echo "# country is not the one your DOS machine actually uses, just"
+ echo "# correct it in this file, and send a mail to"
+ echo "# Juan Manuel Guerrero <juan.guerrero@gmx.de>"
+ echo "# and Bruno Haible <bruno@clisp.org>."
+ echo "#"
+ echo "C ASCII"
+ # ISO-8859-1 languages
+ echo "ca CP850"
+ echo "ca_ES CP850"
+ echo "da CP865" # not CP850 ??
+ echo "da_DK CP865" # not CP850 ??
+ echo "de CP850"
+ echo "de_AT CP850"
+ echo "de_CH CP850"
+ echo "de_DE CP850"
+ echo "en CP850"
+ echo "en_AU CP850" # not CP437 ??
+ echo "en_CA CP850"
+ echo "en_GB CP850"
+ echo "en_NZ CP437"
+ echo "en_US CP437"
+ echo "en_ZA CP850" # not CP437 ??
+ echo "es CP850"
+ echo "es_AR CP850"
+ echo "es_BO CP850"
+ echo "es_CL CP850"
+ echo "es_CO CP850"
+ echo "es_CR CP850"
+ echo "es_CU CP850"
+ echo "es_DO CP850"
+ echo "es_EC CP850"
+ echo "es_ES CP850"
+ echo "es_GT CP850"
+ echo "es_HN CP850"
+ echo "es_MX CP850"
+ echo "es_NI CP850"
+ echo "es_PA CP850"
+ echo "es_PY CP850"
+ echo "es_PE CP850"
+ echo "es_SV CP850"
+ echo "es_UY CP850"
+ echo "es_VE CP850"
+ echo "et CP850"
+ echo "et_EE CP850"
+ echo "eu CP850"
+ echo "eu_ES CP850"
+ echo "fi CP850"
+ echo "fi_FI CP850"
+ echo "fr CP850"
+ echo "fr_BE CP850"
+ echo "fr_CA CP850"
+ echo "fr_CH CP850"
+ echo "fr_FR CP850"
+ echo "ga CP850"
+ echo "ga_IE CP850"
+ echo "gd CP850"
+ echo "gd_GB CP850"
+ echo "gl CP850"
+ echo "gl_ES CP850"
+ echo "id CP850" # not CP437 ??
+ echo "id_ID CP850" # not CP437 ??
+ echo "is CP861" # not CP850 ??
+ echo "is_IS CP861" # not CP850 ??
+ echo "it CP850"
+ echo "it_CH CP850"
+ echo "it_IT CP850"
+ echo "lt CP775"
+ echo "lt_LT CP775"
+ echo "lv CP775"
+ echo "lv_LV CP775"
+ echo "nb CP865" # not CP850 ??
+ echo "nb_NO CP865" # not CP850 ??
+ echo "nl CP850"
+ echo "nl_BE CP850"
+ echo "nl_NL CP850"
+ echo "nn CP865" # not CP850 ??
+ echo "nn_NO CP865" # not CP850 ??
+ echo "no CP865" # not CP850 ??
+ echo "no_NO CP865" # not CP850 ??
+ echo "pt CP850"
+ echo "pt_BR CP850"
+ echo "pt_PT CP850"
+ echo "sv CP850"
+ echo "sv_SE CP850"
+ # ISO-8859-2 languages
+ echo "cs CP852"
+ echo "cs_CZ CP852"
+ echo "hr CP852"
+ echo "hr_HR CP852"
+ echo "hu CP852"
+ echo "hu_HU CP852"
+ echo "pl CP852"
+ echo "pl_PL CP852"
+ echo "ro CP852"
+ echo "ro_RO CP852"
+ echo "sk CP852"
+ echo "sk_SK CP852"
+ echo "sl CP852"
+ echo "sl_SI CP852"
+ echo "sq CP852"
+ echo "sq_AL CP852"
+ echo "sr CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_CS CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+ # ISO-8859-3 languages
+ echo "mt CP850"
+ echo "mt_MT CP850"
+ # ISO-8859-5 languages
+ echo "be CP866"
+ echo "be_BE CP866"
+ echo "bg CP866" # not CP855 ??
+ echo "bg_BG CP866" # not CP855 ??
+ echo "mk CP866" # not CP855 ??
+ echo "mk_MK CP866" # not CP855 ??
+ echo "ru CP866"
+ echo "ru_RU CP866"
+ echo "uk CP1125"
+ echo "uk_UA CP1125"
+ # ISO-8859-6 languages
+ echo "ar CP864"
+ echo "ar_AE CP864"
+ echo "ar_DZ CP864"
+ echo "ar_EG CP864"
+ echo "ar_IQ CP864"
+ echo "ar_IR CP864"
+ echo "ar_JO CP864"
+ echo "ar_KW CP864"
+ echo "ar_MA CP864"
+ echo "ar_OM CP864"
+ echo "ar_QA CP864"
+ echo "ar_SA CP864"
+ echo "ar_SY CP864"
+ # ISO-8859-7 languages
+ echo "el CP869"
+ echo "el_GR CP869"
+ # ISO-8859-8 languages
+ echo "he CP862"
+ echo "he_IL CP862"
+ # ISO-8859-9 languages
+ echo "tr CP857"
+ echo "tr_TR CP857"
+ # Japanese
+ echo "ja CP932"
+ echo "ja_JP CP932"
+ # Chinese
+ echo "zh_CN GBK"
+ echo "zh_TW CP950" # not CP938 ??
+ # Korean
+ echo "kr CP949" # not CP934 ??
+ echo "kr_KR CP949" # not CP934 ??
+ # Thai
+ echo "th CP874"
+ echo "th_TH CP874"
+ # Other
+ echo "eo CP850"
+ echo "eo_EO CP850"
+ ;;
+esac
diff --git a/lib/creat-safer.c b/lib/creat-safer.c
new file mode 100644
index 0000000..f4a2e59
--- /dev/null
+++ b/lib/creat-safer.c
@@ -0,0 +1,32 @@
+/* Invoke creat, but avoid some glitches.
+
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "fcntl-safer.h"
+
+#include <fcntl.h>
+#include "unistd-safer.h"
+
+int
+creat_safer (char const *file, mode_t mode)
+{
+ return fd_safer (creat (file, mode));
+}
diff --git a/lib/dirent_.h b/lib/dirent_.h
new file mode 100644
index 0000000..94e44fc
--- /dev/null
+++ b/lib/dirent_.h
@@ -0,0 +1,50 @@
+/* Wrapper around <dirent.h>.
+ Copyright (C) 2006-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_DIRENT_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_INCLUDE_NEXT@
+# include_next <dirent.h>
+#else
+# include @ABSOLUTE_DIRENT_H@
+#endif
+
+#ifndef _GL_DIRENT_H
+#define _GL_DIRENT_H
+
+
+/* Declare overridden functions. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @REPLACE_FCHDIR@
+# define opendir rpl_opendir
+extern DIR * opendir (const char *);
+# define closedir rpl_closedir
+extern int closedir (DIR *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_DIRENT_H */
+#endif /* _GL_DIRENT_H */
diff --git a/lib/dirfd.c b/lib/dirfd.c
new file mode 100644
index 0000000..06cb3c4
--- /dev/null
+++ b/lib/dirfd.c
@@ -0,0 +1,29 @@
+/* dirfd.c -- return the file descriptor associated with an open DIR*
+
+ Copyright (C) 2001, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "dirfd.h"
+
+int
+dirfd (DIR const *dir_p)
+{
+ return DIR_TO_FD (dir_p);
+}
diff --git a/lib/dirfd.h b/lib/dirfd.h
new file mode 100644
index 0000000..05b7777
--- /dev/null
+++ b/lib/dirfd.h
@@ -0,0 +1,29 @@
+/* Declare dirfd, if necessary.
+ Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ Written by Jim Meyering. */
+
+#include <sys/types.h>
+
+#include <dirent.h>
+
+#ifndef HAVE_DECL_DIRFD
+"this configure-time declaration test was not run"
+#endif
+#if !HAVE_DECL_DIRFD && !defined dirfd
+int dirfd (DIR const *);
+#endif
diff --git a/lib/dirname.c b/lib/dirname.c
new file mode 100644
index 0000000..16552c6
--- /dev/null
+++ b/lib/dirname.c
@@ -0,0 +1,85 @@
+/* dirname.c -- return all but the last element in a file name
+
+ Copyright (C) 1990, 1998, 2000, 2001, 2003, 2004, 2005, 2006 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <string.h>
+#include "xalloc.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 xmalloc.
+ Works properly even if there are trailing slashes (by effectively
+ ignoring them). Unlike POSIX dirname(), FILE cannot be NULL.
+
+ 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 *
+dir_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 = xmalloc (length + append_dot + 1);
+ memcpy (dir, file, length);
+ if (append_dot)
+ dir[length++] = '.';
+ dir[length] = '\0';
+ return dir;
+}
diff --git a/lib/dirname.h b/lib/dirname.h
new file mode 100644
index 0000000..91e7ed3
--- /dev/null
+++ b/lib/dirname.h
@@ -0,0 +1,70 @@
+/* Take file names apart into directory and base names.
+
+ Copyright (C) 1998, 2001, 2003-2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef DIRNAME_H_
+# define DIRNAME_H_ 1
+
+# include <stdbool.h>
+# include <stddef.h>
+
+# ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+# endif
+
+# ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+# endif
+
+# ifndef FILE_SYSTEM_PREFIX_LEN
+# if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
+ /* This internal macro assumes ASCII, but all hosts that support drive
+ letters use ASCII. */
+# define _IS_DRIVE_LETTER(c) (((unsigned int) (c) | ('a' - 'A')) - 'a' \
+ <= 'z' - 'a')
+# define FILE_SYSTEM_PREFIX_LEN(Filename) \
+ (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
+# else
+# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
+# endif
+# endif
+
+# ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
+# endif
+
+# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+# endif
+
+# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
+# else
+# define IS_ABSOLUTE_FILE_NAME(F) \
+ (ISSLASH ((F)[0]) || 0 < FILE_SYSTEM_PREFIX_LEN (F))
+# endif
+# define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
+
+char *base_name (char const *file);
+char *dir_name (char const *file);
+size_t base_len (char const *file);
+size_t dir_len (char const *file);
+char *last_component (char const *file);
+
+bool strip_trailing_slashes (char *file);
+
+#endif /* not DIRNAME_H_ */
diff --git a/lib/dup-safer.c b/lib/dup-safer.c
new file mode 100644
index 0000000..7b12b61
--- /dev/null
+++ b/lib/dup-safer.c
@@ -0,0 +1,45 @@
+/* Invoke dup, but avoid some glitches.
+
+ Copyright (C) 2001, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <fcntl.h>
+
+#include <unistd.h>
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+
+int
+dup_safer (int fd)
+{
+#if defined F_DUPFD && !defined FCHDIR_REPLACEMENT
+ return fcntl (fd, F_DUPFD, STDERR_FILENO + 1);
+#else
+ /* fd_safer calls us back, but eventually the recursion unwinds and
+ does the right thing. */
+ return fd_safer (dup (fd));
+#endif
+}
diff --git a/lib/dup2.c b/lib/dup2.c
new file mode 100644
index 0000000..8894481
--- /dev/null
+++ b/lib/dup2.c
@@ -0,0 +1,58 @@
+/* Duplicate an open file descriptor to a specified file descriptor.
+
+ Copyright (C) 1999, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#ifndef F_DUPFD
+static int
+dupfd (int fd, int desired_fd)
+{
+ int duplicated_fd = dup (fd);
+ if (duplicated_fd < 0 || duplicated_fd == desired_fd)
+ return duplicated_fd;
+ else
+ {
+ int r = dupfd (fd, desired_fd);
+ int e = errno;
+ close (duplicated_fd);
+ errno = e;
+ return r;
+ }
+}
+#endif
+
+int
+dup2 (int fd, int desired_fd)
+{
+ if (fd == desired_fd)
+ return fd;
+ close (desired_fd);
+#ifdef F_DUPFD
+ return fcntl (fd, F_DUPFD, desired_fd);
+#else
+ return dupfd (fd, desired_fd);
+#endif
+}
diff --git a/lib/error.c b/lib/error.c
new file mode 100644
index 0000000..cf86343
--- /dev/null
+++ b/lib/error.c
@@ -0,0 +1,338 @@
+/* Error handler for noninteractive utilities
+ Copyright (C) 1990-1998, 2000-2005, 2006 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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"
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+# include <stdbool.h>
+# include <stdint.h>
+# include <wchar.h>
+# define mbsrtowcs __mbsrtowcs
+#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) INTUSE(_IO_fflush) (s)
+# undef putc
+# define putc(c, fp) INTUSE(_IO_putc) (c, fp)
+
+# include <bits/libc-lock.h>
+
+#else /* not _LIBC */
+
+# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P
+# ifndef HAVE_DECL_STRERROR_R
+"this configure-time declaration test was not run"
+# endif
+char *strerror_r ();
+# endif
+
+/* The calling program should define program_name and set it to the
+ name of the executing program. */
+extern char *program_name;
+
+# if HAVE_STRERROR_R || defined strerror_r
+# define __strerror_r strerror_r
+# endif /* HAVE_STRERROR_R || defined strerror_r */
+#endif /* not _LIBC */
+
+static void
+print_errno_message (int errnum)
+{
+ char const *s;
+
+#if defined HAVE_STRERROR_R || _LIBC
+ char errbuf[1024];
+# if STRERROR_R_CHAR_P || _LIBC
+ 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
+error_tail (int status, int errnum, const char *message, va_list args)
+{
+#if _LIBC
+ if (_IO_fwide (stderr, 0) > 0)
+ {
+# define ALLOCA_LIMIT 2000
+ 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 / 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);
+ va_end (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
+
+ fflush (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);
+
+#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
+ || 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
+
+ fflush (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:%d: " : " ",
+ file_name, line_number);
+#else
+ fprintf (stderr, file_name != NULL ? "%s:%d: " : " ",
+ file_name, line_number);
+#endif
+
+ va_start (args, message);
+ error_tail (status, errnum, message, 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..5a5f247
--- /dev/null
+++ b/lib/error.h
@@ -0,0 +1,66 @@
+/* Declaration for error-reporting function
+ Copyright (C) 1995, 1996, 1997, 2003, 2006 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _ERROR_H
+#define _ERROR_H 1
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# define __attribute__(Spec) /* empty */
+# endif
+/* The __-protected variants of `format' and `printf' attributes
+ are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __format__ format
+# define __printf__ printf
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 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, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+
+extern void error_at_line (int __status, int __errnum, const char *__fname,
+ unsigned int __lineno, const char *__format, ...)
+ __attribute__ ((__format__ (__printf__, 5, 6)));
+
+/* 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/exclude.c b/lib/exclude.c
new file mode 100644
index 0000000..ed34d0f
--- /dev/null
+++ b/lib/exclude.c
@@ -0,0 +1,275 @@
+/* exclude.c -- exclude file names
+
+ Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003,
+ 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING.
+ If not, write to the Free Software Foundation,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#include <config.h>
+
+#include <stdbool.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "exclude.h"
+#include "fnmatch.h"
+#include "xalloc.h"
+#include "verify.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Non-GNU systems lack these options, so we don't need to check them. */
+#ifndef FNM_CASEFOLD
+# define FNM_CASEFOLD 0
+#endif
+#ifndef FNM_EXTMATCH
+# define FNM_EXTMATCH 0
+#endif
+#ifndef FNM_LEADING_DIR
+# define FNM_LEADING_DIR 0
+#endif
+
+verify (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS)
+ & (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR
+ | FNM_CASEFOLD | FNM_EXTMATCH))
+ == 0);
+
+/* An exclude pattern-options pair. The options are fnmatch options
+ ORed with EXCLUDE_* options. */
+
+struct patopts
+ {
+ char const *pattern;
+ int options;
+ };
+
+/* An exclude list, of pattern-options pairs. */
+
+struct exclude
+ {
+ struct patopts *exclude;
+ size_t exclude_alloc;
+ size_t exclude_count;
+ };
+
+/* Return a newly allocated and empty exclude list. */
+
+struct exclude *
+new_exclude (void)
+{
+ return xzalloc (sizeof *new_exclude ());
+}
+
+/* Free the storage associated with an exclude list. */
+
+void
+free_exclude (struct exclude *ex)
+{
+ free (ex->exclude);
+ free (ex);
+}
+
+/* Return zero if PATTERN matches F, obeying OPTIONS, except that
+ (unlike fnmatch) wildcards are disabled in PATTERN. */
+
+static int
+fnmatch_no_wildcards (char const *pattern, char const *f, int options)
+{
+ if (! (options & FNM_LEADING_DIR))
+ return ((options & FNM_CASEFOLD)
+ ? mbscasecmp (pattern, f)
+ : strcmp (pattern, f));
+ else if (! (options & FNM_CASEFOLD))
+ {
+ size_t patlen = strlen (pattern);
+ int r = strncmp (pattern, f, patlen);
+ if (! r)
+ {
+ r = f[patlen];
+ if (r == '/')
+ r = 0;
+ }
+ return r;
+ }
+ else
+ {
+ /* Walk through a copy of F, seeing whether P matches any prefix
+ of F.
+
+ FIXME: This is an O(N**2) algorithm; it should be O(N).
+ Also, the copy should not be necessary. However, fixing this
+ will probably involve a change to the mbs* API. */
+
+ char *fcopy = xstrdup (f);
+ char *p;
+ int r;
+ for (p = fcopy; ; *p++ = '/')
+ {
+ p = strchr (p, '/');
+ if (p)
+ *p = '\0';
+ r = mbscasecmp (pattern, fcopy);
+ if (!p || r <= 0)
+ break;
+ }
+ free (fcopy);
+ return r;
+ }
+}
+
+bool
+exclude_fnmatch (char const *pattern, char const *f, int options)
+{
+ int (*matcher) (char const *, char const *, int) =
+ (options & EXCLUDE_WILDCARDS
+ ? fnmatch
+ : fnmatch_no_wildcards);
+ bool matched = ((*matcher) (pattern, f, options) == 0);
+ char const *p;
+
+ if (! (options & EXCLUDE_ANCHORED))
+ for (p = f; *p && ! matched; p++)
+ if (*p == '/' && p[1] != '/')
+ matched = ((*matcher) (pattern, p + 1, options) == 0);
+
+ return matched;
+}
+
+/* Return true if EX excludes F. */
+
+bool
+excluded_file_name (struct exclude const *ex, char const *f)
+{
+ size_t exclude_count = ex->exclude_count;
+
+ /* If no options are given, the default is to include. */
+ if (exclude_count == 0)
+ return false;
+ else
+ {
+ struct patopts const *exclude = ex->exclude;
+ size_t i;
+
+ /* Otherwise, the default is the opposite of the first option. */
+ bool excluded = !! (exclude[0].options & EXCLUDE_INCLUDE);
+
+ /* Scan through the options, seeing whether they change F from
+ excluded to included or vice versa. */
+ for (i = 0; i < exclude_count; i++)
+ {
+ char const *pattern = exclude[i].pattern;
+ int options = exclude[i].options;
+ if (excluded == !! (options & EXCLUDE_INCLUDE))
+ excluded ^= exclude_fnmatch (pattern, f, options);
+ }
+
+ return excluded;
+ }
+}
+
+/* Append to EX the exclusion PATTERN with OPTIONS. */
+
+void
+add_exclude (struct exclude *ex, char const *pattern, int options)
+{
+ struct patopts *patopts;
+
+ if (ex->exclude_count == ex->exclude_alloc)
+ ex->exclude = x2nrealloc (ex->exclude, &ex->exclude_alloc,
+ sizeof *ex->exclude);
+
+ patopts = &ex->exclude[ex->exclude_count++];
+ patopts->pattern = pattern;
+ patopts->options = options;
+}
+
+/* Use ADD_FUNC to append to EX the patterns in FILE_NAME, each with
+ OPTIONS. LINE_END terminates each pattern in the file. If
+ LINE_END is a space character, ignore trailing spaces and empty
+ lines in FILE. Return -1 on failure, 0 on success. */
+
+int
+add_exclude_file (void (*add_func) (struct exclude *, char const *, int),
+ struct exclude *ex, char const *file_name, int options,
+ char line_end)
+{
+ bool use_stdin = file_name[0] == '-' && !file_name[1];
+ FILE *in;
+ char *buf = NULL;
+ char *p;
+ char const *pattern;
+ char const *lim;
+ size_t buf_alloc = 0;
+ size_t buf_count = 0;
+ int c;
+ int e = 0;
+
+ if (use_stdin)
+ in = stdin;
+ else if (! (in = fopen (file_name, "r")))
+ return -1;
+
+ while ((c = getc (in)) != EOF)
+ {
+ if (buf_count == buf_alloc)
+ buf = x2realloc (buf, &buf_alloc);
+ buf[buf_count++] = c;
+ }
+
+ if (ferror (in))
+ e = errno;
+
+ if (!use_stdin && fclose (in) != 0)
+ e = errno;
+
+ buf = xrealloc (buf, buf_count + 1);
+ buf[buf_count] = line_end;
+ lim = buf + buf_count + ! (buf_count == 0 || buf[buf_count - 1] == line_end);
+ pattern = buf;
+
+ for (p = buf; p < lim; p++)
+ if (*p == line_end)
+ {
+ char *pattern_end = p;
+
+ if (isspace ((unsigned char) line_end))
+ {
+ for (; ; pattern_end--)
+ if (pattern_end == pattern)
+ goto next_pattern;
+ else if (! isspace ((unsigned char) pattern_end[-1]))
+ break;
+ }
+
+ *pattern_end = '\0';
+ (*add_func) (ex, pattern, options);
+
+ next_pattern:
+ pattern = p + 1;
+ }
+
+ errno = e;
+ return e ? -1 : 0;
+}
diff --git a/lib/exclude.h b/lib/exclude.h
new file mode 100644
index 0000000..203e384
--- /dev/null
+++ b/lib/exclude.h
@@ -0,0 +1,44 @@
+/* exclude.h -- declarations for excluding file names
+
+ Copyright (C) 1992, 1993, 1994, 1997, 1999, 2001, 2002, 2003, 2005,
+ 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING.
+ If not, write to the Free Software Foundation,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+/* Exclude options, which can be ORed with fnmatch options. */
+
+/* Patterns must match the start of file names, instead of matching
+ anywhere after a '/'. */
+#define EXCLUDE_ANCHORED (1 << 30)
+
+/* Include instead of exclude. */
+#define EXCLUDE_INCLUDE (1 << 29)
+
+/* '?', '*', '[', and '\\' are special in patterns. Without this
+ option, these characters are ordinary and fnmatch is not used. */
+#define EXCLUDE_WILDCARDS (1 << 28)
+
+struct exclude;
+
+struct exclude *new_exclude (void);
+void free_exclude (struct exclude *);
+void add_exclude (struct exclude *, char const *, int);
+int add_exclude_file (void (*) (struct exclude *, char const *, int),
+ struct exclude *, char const *, int, char);
+bool excluded_file_name (struct exclude const *, char const *);
+bool exclude_fnmatch (char const *pattern, char const *f, int options);
diff --git a/lib/exitfail.c b/lib/exitfail.c
new file mode 100644
index 0000000..373d325
--- /dev/null
+++ b/lib/exitfail.c
@@ -0,0 +1,26 @@
+/* Failure exit status
+
+ Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING.
+ If not, write to the Free Software Foundation,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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..e46cf9c
--- /dev/null
+++ b/lib/exitfail.h
@@ -0,0 +1,20 @@
+/* Failure exit status
+
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+ This program is free software; you can 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; see the file COPYING.
+ If not, write to the Free Software Foundation,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+extern int volatile exit_failure;
diff --git a/lib/fchdir.c b/lib/fchdir.c
new file mode 100644
index 0000000..e3ec2fc
--- /dev/null
+++ b/lib/fchdir.c
@@ -0,0 +1,279 @@
+/* fchdir replacement.
+ Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+
+#include "canonicalize.h"
+#include "dirfd.h"
+
+/* This replacement assumes that a directory is not renamed while opened
+ through a file descriptor. */
+
+/* Array of file descriptors opened. If it points to a directory, it stores
+ info about this directory; otherwise it stores an errno value of ENOTDIR. */
+typedef struct
+{
+ char *name; /* Absolute name of the directory, or NULL. */
+ int saved_errno; /* If name == NULL: The error code describing the failure
+ reason. */
+} 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. */
+static void
+ensure_dirs_slot (size_t fd)
+{
+ if (fd >= dirs_allocated)
+ {
+ size_t new_allocated;
+ dir_info_t *new_dirs;
+ size_t i;
+
+ 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 (dir_info_t))
+ : (dir_info_t *) malloc (new_allocated * sizeof (dir_info_t)));
+ if (new_dirs != NULL)
+ {
+ for (i = dirs_allocated; i < new_allocated; i++)
+ {
+ new_dirs[i].name = NULL;
+ new_dirs[i].saved_errno = ENOTDIR;
+ }
+ dirs = new_dirs;
+ dirs_allocated = new_allocated;
+ }
+ }
+}
+
+/* Override open() and close(), to keep track of the open file descriptors. */
+
+int
+close (int fd)
+#undef close
+{
+ int retval = close (fd);
+
+ if (retval >= 0 && fd >= 0 && fd < dirs_allocated)
+ {
+ if (dirs[fd].name != NULL)
+ free (dirs[fd].name);
+ dirs[fd].name = NULL;
+ dirs[fd].saved_errno = ENOTDIR;
+ }
+ return retval;
+}
+
+int
+open (const char *filename, int flags, ...)
+#undef open
+{
+ mode_t mode;
+ int fd;
+ struct stat statbuf;
+
+ mode = 0;
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* If mode_t is narrower than int, use the promoted type (int),
+ not mode_t. Use sizeof to guess whether mode_t is narrower;
+ we don't know of any practical counterexamples. */
+ mode = (sizeof (mode_t) < sizeof (int)
+ ? va_arg (arg, int)
+ : va_arg (arg, mode_t));
+
+ va_end (arg);
+ }
+ fd = open (filename, flags, mode);
+ if (fd >= 0)
+ {
+ ensure_dirs_slot (fd);
+ if (fd < dirs_allocated
+ && fstat (fd, &statbuf) >= 0 && S_ISDIR (statbuf.st_mode))
+ {
+ dirs[fd].name = canonicalize_file_name (filename);
+ if (dirs[fd].name == NULL)
+ dirs[fd].saved_errno = errno;
+ }
+ }
+ return fd;
+}
+
+/* Override opendir() and closedir(), to keep track of the open file
+ descriptors. Needed because there is a function dirfd(). */
+
+int
+closedir (DIR *dp)
+#undef closedir
+{
+ int fd = dirfd (dp);
+ int retval = closedir (dp);
+
+ if (retval >= 0 && fd >= 0 && fd < dirs_allocated)
+ {
+ if (dirs[fd].name != NULL)
+ free (dirs[fd].name);
+ dirs[fd].name = NULL;
+ dirs[fd].saved_errno = ENOTDIR;
+ }
+ return retval;
+}
+
+DIR *
+opendir (const char *filename)
+#undef opendir
+{
+ DIR *dp;
+
+ dp = opendir (filename);
+ if (dp != NULL)
+ {
+ int fd = dirfd (dp);
+ if (fd >= 0)
+ {
+ ensure_dirs_slot (fd);
+ if (fd < dirs_allocated)
+ {
+ dirs[fd].name = canonicalize_file_name (filename);
+ if (dirs[fd].name == NULL)
+ dirs[fd].saved_errno = errno;
+ }
+ }
+ }
+ return dp;
+}
+
+/* Override dup() and dup2(), to keep track of open file descriptors. */
+
+int
+dup (int oldfd)
+#undef dup
+{
+ int newfd = dup (oldfd);
+
+ if (oldfd >= 0 && newfd >= 0)
+ {
+ ensure_dirs_slot (newfd);
+ if (newfd < dirs_allocated)
+ {
+ if (oldfd < dirs_allocated)
+ {
+ if (dirs[oldfd].name != NULL)
+ {
+ dirs[newfd].name = strdup (dirs[oldfd].name);
+ if (dirs[newfd].name == NULL)
+ dirs[newfd].saved_errno = ENOMEM;
+ }
+ else
+ {
+ dirs[newfd].name = NULL;
+ dirs[newfd].saved_errno = dirs[oldfd].saved_errno;
+ }
+ }
+ else
+ {
+ dirs[newfd].name = NULL;
+ dirs[newfd].saved_errno = ENOMEM;
+ }
+ }
+ }
+ return newfd;
+}
+
+int
+dup2 (int oldfd, int newfd)
+#undef dup2
+{
+ int retval = dup2 (oldfd, newfd);
+
+ if (retval >= 0 && oldfd >= 0 && newfd >= 0 && newfd != oldfd)
+ {
+ ensure_dirs_slot (newfd);
+ if (newfd < dirs_allocated)
+ {
+ if (oldfd < dirs_allocated)
+ {
+ if (dirs[oldfd].name != NULL)
+ {
+ dirs[newfd].name = strdup (dirs[oldfd].name);
+ if (dirs[newfd].name == NULL)
+ dirs[newfd].saved_errno = ENOMEM;
+ }
+ else
+ {
+ dirs[newfd].name = NULL;
+ dirs[newfd].saved_errno = dirs[oldfd].saved_errno;
+ }
+ }
+ else
+ {
+ dirs[newfd].name = NULL;
+ dirs[newfd].saved_errno = ENOMEM;
+ }
+ }
+ }
+ return retval;
+}
+
+/* Implement fchdir() in terms of chdir(). */
+
+int
+fchdir (int fd)
+{
+ if (fd >= 0)
+ {
+ if (fd < dirs_allocated)
+ {
+ if (dirs[fd].name != NULL)
+ return chdir (dirs[fd].name);
+ else
+ {
+ errno = dirs[fd].saved_errno;
+ return -1;
+ }
+ }
+ else
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ else
+ {
+ errno = EBADF;
+ return -1;
+ }
+}
diff --git a/lib/fchmodat.c b/lib/fchmodat.c
new file mode 100644
index 0000000..2598b70
--- /dev/null
+++ b/lib/fchmodat.c
@@ -0,0 +1,50 @@
+/* Change the protections of file relative to an open directory.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "openat.h"
+#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "save-cwd.h"
+#include "openat-priv.h"
+
+#ifndef HAVE_LCHMOD
+/* Use a different name, to avoid conflicting with any
+ system-supplied declaration. */
+# undef lchmod
+# define lchmod lchmod_rpl
+static int lchmod (char const *f, mode_t m) { errno = ENOSYS; return -1; }
+#endif
+
+/* Solaris 10 has no function like this.
+ Invoke chmod or lchmod on file, FILE, using mode MODE, in the directory
+ open on descriptor FD. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then mkdir/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero.
+ Note that an attempt to use a FLAG value of AT_SYMLINK_NOFOLLOW
+ on a system without lchmod support causes this function to fail. */
+
+#define AT_FUNC_NAME fchmodat
+#define AT_FUNC_F1 lchmod
+#define AT_FUNC_F2 chmod
+#define AT_FUNC_USE_F1_COND flag == AT_SYMLINK_NOFOLLOW
+#define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode, int flag
+#define AT_FUNC_POST_FILE_ARGS , mode
+#include "at-func.c"
diff --git a/lib/fchown-stub.c b/lib/fchown-stub.c
new file mode 100644
index 0000000..6be750b
--- /dev/null
+++ b/lib/fchown-stub.c
@@ -0,0 +1,16 @@
+#include <config.h>
+
+#include <sys/types.h>
+#include <errno.h>
+
+/* A trivial substitute for `fchown'.
+
+ DJGPP 2.03 and earlier (and perhaps later) don't have `fchown',
+ so we pretend no-one has permission for this operation. */
+
+int
+fchown (int fd, uid_t uid, gid_t gid)
+{
+ errno = EPERM;
+ return -1;
+}
diff --git a/lib/fchownat.c b/lib/fchownat.c
new file mode 100644
index 0000000..801c92a
--- /dev/null
+++ b/lib/fchownat.c
@@ -0,0 +1,50 @@
+/* This function serves as replacement for a missing fchownat function,
+ as well as a work around for the fchownat bug in glibc-2.4:
+ <http://lists.ubuntu.com/archives/ubuntu-users/2006-September/093218.html>
+ when the buggy fchownat-with-AT_SYMLINK_NOFOLLOW operates on a symlink, it
+ mistakenly affects the symlink referent, rather than the symlink itself.
+
+ Copyright (C) 2006-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "openat.h"
+
+#include <unistd.h>
+
+#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "lchown.h"
+#include "save-cwd.h"
+#include "openat-priv.h"
+
+/* Replacement for Solaris' function by the same name.
+ Invoke chown or lchown on file, FILE, using OWNER and GROUP, in the
+ directory open on descriptor FD. If FLAG is AT_SYMLINK_NOFOLLOW, then
+ use lchown, otherwise, use chown. If possible, do it without changing
+ the working directory. Otherwise, resort to using save_cwd/fchdir,
+ then mkdir/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+#define AT_FUNC_NAME fchownat
+#define AT_FUNC_F1 lchown
+#define AT_FUNC_F2 chown
+#define AT_FUNC_USE_F1_COND flag == AT_SYMLINK_NOFOLLOW
+#define AT_FUNC_POST_FILE_PARAM_DECLS , uid_t owner, gid_t group, int flag
+#define AT_FUNC_POST_FILE_ARGS , owner, group
+#include "at-func.c"
diff --git a/lib/fcntl--.h b/lib/fcntl--.h
new file mode 100644
index 0000000..51b869e
--- /dev/null
+++ b/lib/fcntl--.h
@@ -0,0 +1,28 @@
+/* Like fcntl.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <fcntl.h>
+#include "fcntl-safer.h"
+
+#undef open
+#define open open_safer
+
+#undef creat
+#define creat creat_safer
diff --git a/lib/fcntl-safer.h b/lib/fcntl-safer.h
new file mode 100644
index 0000000..cab6aab
--- /dev/null
+++ b/lib/fcntl-safer.h
@@ -0,0 +1,24 @@
+/* Invoke fcntl-like functions, but avoid some glitches.
+
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <sys/types.h>
+
+int open_safer (char const *, int, ...);
+int creat_safer (char const *, mode_t);
diff --git a/lib/fcntl_.h b/lib/fcntl_.h
new file mode 100644
index 0000000..1330cde
--- /dev/null
+++ b/lib/fcntl_.h
@@ -0,0 +1,125 @@
+/* Like <fcntl.h>, but with non-working flags defined to 0.
+
+ Copyright (C) 2006-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Paul Eggert */
+
+#ifndef _GL_FCNTL_H
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_INCLUDE_NEXT@
+# include_next <fcntl.h>
+#else
+# include @ABSOLUTE_FCNTL_H@
+#endif
+
+#ifndef _GL_FCNTL_H
+#define _GL_FCNTL_H
+
+
+/* Declare overridden functions. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef FCHDIR_REPLACEMENT
+# define open rpl_open
+extern int open (const char *, int, ...);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* Fix up the O_* macros. */
+
+#if !defined O_DIRECT && defined O_DIRECTIO
+/* Tru64 spells it `O_DIRECTIO'. */
+# define O_DIRECT O_DIRECTIO
+#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_NDELAY
+# define O_NDELAY 0
+#endif
+
+#ifndef O_NOATIME
+# define O_NOATIME 0
+#endif
+
+#ifndef O_NONBLOCK
+# define O_NONBLOCK O_NDELAY
+#endif
+
+#ifndef O_NOCTTY
+# define O_NOCTTY 0
+#endif
+
+#ifndef O_NOFOLLOW
+# define O_NOFOLLOW 0
+#endif
+
+#ifndef O_NOLINKS
+# define O_NOLINKS 0
+#endif
+
+#ifndef O_RSYNC
+# define O_RSYNC 0
+#endif
+
+#ifndef O_SYNC
+# define O_SYNC 0
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+ O_BINARY is usually declared in fcntl.h */
+#if !defined O_BINARY && defined _O_BINARY
+ /* For MSC-compatible compilers. */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+
+#ifdef __BEOS__
+ /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+
+#ifndef O_BINARY
+# define O_BINARY 0
+# define O_TEXT 0
+#endif
+
+
+#endif /* _GL_FCNTL_H */
+#endif /* _GL_FCNTL_H */
diff --git a/lib/fd-safer.c b/lib/fd-safer.c
new file mode 100644
index 0000000..256bfa4
--- /dev/null
+++ b/lib/fd-safer.c
@@ -0,0 +1,57 @@
+/* Return a safer copy of a file descriptor.
+
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <errno.h>
+
+#include <unistd.h>
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* 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/fileblocks.c b/lib/fileblocks.c
new file mode 100644
index 0000000..4024d1e
--- /dev/null
+++ b/lib/fileblocks.c
@@ -0,0 +1,75 @@
+/* Convert file size to number of blocks on System V-like machines.
+
+ Copyright (C) 1990, 1997, 1998, 1999, 2004, 2005, 2006 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Brian L. Matthews, blm@6sceng.UUCP. */
+
+#include <config.h>
+
+#include <sys/types.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if !HAVE_STRUCT_STAT_ST_BLOCKS && !defined _POSIX_SOURCE && defined BSIZE
+
+# include <unistd.h>
+
+# ifndef NINDIR
+
+# if defined __DJGPP__
+typedef long daddr_t; /* for disk address */
+# endif
+
+/* Some SysV's, like Irix, seem to lack this. Hope it's correct. */
+/* Number of inode pointers per indirect block. */
+# define NINDIR (BSIZE / sizeof (daddr_t))
+# endif /* !NINDIR */
+
+/* Number of direct block addresses in an inode. */
+# define NDIR 10
+
+/* Return the number of 512-byte blocks in a file of SIZE bytes. */
+
+off_t
+st_blocks (off_t size)
+{
+ off_t datablks = size / 512 + (size % 512 != 0);
+ off_t indrblks = 0;
+
+ if (datablks > NDIR)
+ {
+ indrblks = (datablks - NDIR - 1) / NINDIR + 1;
+
+ if (datablks > NDIR + NINDIR)
+ {
+ indrblks += (datablks - NDIR - NINDIR - 1) / (NINDIR * NINDIR) + 1;
+
+ if (datablks > NDIR + NINDIR + NINDIR * NINDIR)
+ indrblks++;
+ }
+ }
+
+ return datablks + indrblks;
+}
+#else
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int textutils_fileblocks_unused;
+#endif
diff --git a/lib/float+.h b/lib/float+.h
new file mode 100644
index 0000000..4de25a9
--- /dev/null
+++ b/lib/float+.h
@@ -0,0 +1,148 @@
+/* Supplemental information about the floating-point formats.
+ Copyright (C) 2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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[2 * (SIZEOF_FLT <= sizeof (float)) - 1];
+typedef int verify_sizeof_dbl[2 * (SIZEOF_DBL <= sizeof (double)) - 1];
+typedef int verify_sizeof_ldbl[2 * (SIZEOF_LDBL <= sizeof (long double)) - 1];
+
+#endif /* _FLOATPLUS_H */
diff --git a/lib/float_.h b/lib/float_.h
new file mode 100644
index 0000000..d898d85
--- /dev/null
+++ b/lib/float_.h
@@ -0,0 +1,63 @@
+/* A correct <float.h>.
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_FLOAT_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_INCLUDE_NEXT@
+# include_next <float.h>
+#else
+# include @ABSOLUTE_FLOAT_H@
+#endif
+
+#ifndef _GL_FLOAT_H
+#define _GL_FLOAT_H
+
+/* 'long double' properties. */
+#if defined __i386__ && defined __BEOS__
+/* 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
+
+#endif /* _GL_FLOAT_H */
+#endif /* _GL_FLOAT_H */
diff --git a/lib/fnmatch.c b/lib/fnmatch.c
new file mode 100644
index 0000000..02dd365
--- /dev/null
+++ b/lib/fnmatch.c
@@ -0,0 +1,354 @@
+/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Enable GNU extensions in fnmatch.h. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#if ! defined __builtin_expect && __GNUC__ < 3
+# define __builtin_expect(expr, expected) (expr)
+#endif
+
+#include <fnmatch.h>
+
+#include <alloca.h>
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define WIDE_CHAR_SUPPORT \
+ (HAVE_WCTYPE_H && HAVE_BTOWC && HAVE_ISWCTYPE \
+ && HAVE_WMEMCHR && (HAVE_WMEMCPY || HAVE_WMEMPCPY))
+
+/* For platform which support the ISO C amendement 1 functionality we
+ support user defined character classes. */
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+# include <wctype.h>
+# include <wchar.h>
+#endif
+
+/* 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/elem-hash.h"
+# include "../locale/coll-lookup.h"
+# include <shlib-compat.h>
+
+# define CONCAT(a,b) __CONCAT(a,b)
+# define mbsrtowcs __mbsrtowcs
+# define fnmatch __fnmatch
+extern int fnmatch (const char *pattern, const char *string, int flags);
+#endif
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#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))
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself, and have not detected a bug
+ in the library. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined _LIBC || !defined __GNU_LIBRARY__ || !HAVE_FNMATCH_GNU
+
+
+# if ! (defined isblank || HAVE_DECL_ISBLANK)
+# define isblank(c) ((c) == ' ' || (c) == '\t')
+# endif
+
+# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+# if defined _LIBC || WIDE_CHAR_SUPPORT
+/* The GNU C library provides support for user-defined character classes
+ and the functions from ISO C amendement 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
+
+# ifdef _LIBC
+# define IS_CHAR_CLASS(string) __wctype (string)
+# else
+# define IS_CHAR_CLASS(string) wctype (string)
+# endif
+
+# ifdef _LIBC
+# define ISWCTYPE(WC, WT) __iswctype (WC, WT)
+# else
+# define ISWCTYPE(WC, WT) iswctype (WC, WT)
+# endif
+
+# if (HAVE_MBSTATE_T && HAVE_MBSRTOWCS) || _LIBC
+/* In this case we are implementing the multibyte character handling. */
+# define HANDLE_MULTIBYTE 1
+# endif
+
+# else
+# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
+
+# define IS_CHAR_CLASS(string) \
+ (STREQ (string, "alpha") || STREQ (string, "upper") \
+ || STREQ (string, "lower") || STREQ (string, "digit") \
+ || STREQ (string, "alnum") || STREQ (string, "xdigit") \
+ || STREQ (string, "space") || STREQ (string, "print") \
+ || STREQ (string, "punct") || STREQ (string, "graph") \
+ || STREQ (string, "cntrl") || STREQ (string, "blank"))
+# endif
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+/* Global variable. */
+static int posixly_correct;
+
+# ifndef internal_function
+/* Inside GNU libc we mark some function in a special way. In other
+ environments simply ignore the marking. */
+# define internal_function
+# endif
+
+/* 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 L_(CS) CS
+# ifdef _LIBC
+# define BTOWC(C) __btowc (C)
+# else
+# define BTOWC(C) btowc (C)
+# endif
+# define STRLEN(S) strlen (S)
+# define STRCAT(D, S) strcat (D, S)
+# ifdef _LIBC
+# define MEMPCPY(D, S, N) __mempcpy (D, S, N)
+# else
+# if HAVE_MEMPCPY
+# define MEMPCPY(D, S, N) mempcpy (D, S, N)
+# else
+# define MEMPCPY(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
+# endif
+# endif
+# define MEMCHR(S, C, N) memchr (S, C, N)
+# define STRCOLL(S1, S2) strcoll (S1, S2)
+# include "fnmatch_loop.c"
+
+
+# if HANDLE_MULTIBYTE
+# 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)
+# ifdef _LIBC
+# define STRLEN(S) __wcslen (S)
+# define STRCAT(D, S) __wcscat (D, S)
+# define MEMPCPY(D, S, N) __wmempcpy (D, S, N)
+# else
+# define STRLEN(S) wcslen (S)
+# define STRCAT(D, S) wcscat (D, S)
+# if HAVE_WMEMPCPY
+# define MEMPCPY(D, S, N) wmempcpy (D, S, N)
+# else
+# define MEMPCPY(D, S, N) (wmemcpy (D, S, N) + (N))
+# endif
+# endif
+# define MEMCHR(S, C, N) wmemchr (S, C, N)
+# define STRCOLL(S1, S2) wcscoll (S1, S2)
+# define WIDE_CHAR_VERSION 1
+
+# 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';
+
+# ifdef _LIBC
+ return __wctype (s);
+# else
+ return wctype (s);
+# endif
+}
+# define IS_CHAR_CLASS(string) is_char_class (string)
+
+# include "fnmatch_loop.c"
+# endif
+
+
+int
+fnmatch (const char *pattern, const char *string, int flags)
+{
+# if HANDLE_MULTIBYTE
+# define ALLOCA_LIMIT 2000
+ if (__builtin_expect (MB_CUR_MAX, 1) != 1)
+ {
+ mbstate_t ps;
+ size_t patsize;
+ size_t strsize;
+ size_t totsize;
+ wchar_t *wpattern;
+ wchar_t *wstring;
+ int res;
+
+ /* Calculate the size needed to convert the strings to
+ wide characters. */
+ memset (&ps, '\0', sizeof (ps));
+ patsize = mbsrtowcs (NULL, &pattern, 0, &ps) + 1;
+ if (__builtin_expect (patsize != 0, 1))
+ {
+ assert (mbsinit (&ps));
+ strsize = mbsrtowcs (NULL, &string, 0, &ps) + 1;
+ if (__builtin_expect (strsize != 0, 1))
+ {
+ assert (mbsinit (&ps));
+ totsize = patsize + strsize;
+ if (__builtin_expect (! (patsize <= totsize
+ && totsize <= SIZE_MAX / sizeof (wchar_t)),
+ 0))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ /* Allocate room for the wide characters. */
+ if (__builtin_expect (totsize < ALLOCA_LIMIT, 1))
+ wpattern = (wchar_t *) alloca (totsize * sizeof (wchar_t));
+ else
+ {
+ wpattern = malloc (totsize * sizeof (wchar_t));
+ if (__builtin_expect (! wpattern, 0))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ wstring = wpattern + patsize;
+
+ /* Convert the strings into wide characters. */
+ mbsrtowcs (wpattern, &pattern, patsize, &ps);
+ assert (mbsinit (&ps));
+ mbsrtowcs (wstring, &string, strsize, &ps);
+
+ res = internal_fnwmatch (wpattern, wstring, wstring + strsize - 1,
+ flags & FNM_PERIOD, flags);
+
+ if (__builtin_expect (! (totsize < ALLOCA_LIMIT), 0))
+ free (wpattern);
+ return res;
+ }
+ }
+ }
+
+# endif /* HANDLE_MULTIBYTE */
+
+ return internal_fnmatch (pattern, string, string + strlen (string),
+ flags & FNM_PERIOD, flags);
+}
+
+# ifdef _LIBC
+# 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)
+# endif
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
diff --git a/lib/fnmatch_.h b/lib/fnmatch_.h
new file mode 100644
index 0000000..b086b45
--- /dev/null
+++ b/lib/fnmatch_.h
@@ -0,0 +1,65 @@
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2001, 2002, 2003,
+ 2005, 2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _FNMATCH_H
+#define _FNMATCH_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 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
+
+/* Match NAME against the file name pattern PATTERN,
+ returning zero if it matches, FNM_NOMATCH if not. */
+extern int fnmatch (const char *__pattern, const char *__name,
+ int __flags);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* fnmatch.h */
diff --git a/lib/fnmatch_loop.c b/lib/fnmatch_loop.c
new file mode 100644
index 0000000..d1008c2
--- /dev/null
+++ b/lib/fnmatch_loop.c
@@ -0,0 +1,1210 @@
+/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006
+ 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Match STRING against the file name pattern PATTERN, returning zero if
+ it matches, nonzero if not. */
+static int EXT (INT opt, const CHAR *pattern, const CHAR *string,
+ const CHAR *string_end, bool no_leading_period, int flags)
+ internal_function;
+static const CHAR *END (const CHAR *patternp) internal_function;
+
+static int
+internal_function
+FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
+ bool no_leading_period, int flags)
+{
+ register const CHAR *p = pattern, *n = string;
+ register 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 (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
+ {
+ int res;
+
+ res = EXT (c, p, n, string_end, no_leading_period,
+ flags);
+ 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 (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
+ {
+ int res;
+
+ res = EXT (c, p, n, string_end, no_leading_period,
+ flags);
+ if (res != -1)
+ return res;
+ }
+
+ 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_('/')
+ && __builtin_expect (flags & FNM_FILE_NAME, 0))
+ /* 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;
+
+ endp = MEMCHR (n, (flags & FNM_FILE_NAME) ? L_('/') : L_('\0'),
+ string_end - n);
+ if (endp == NULL)
+ endp = string_end;
+
+ if (c == L_('[')
+ || (__builtin_expect (flags & FNM_EXTMATCH, 0) != 0
+ && (c == L_('@') || c == L_('+') || c == L_('!'))
+ && *p == L_('(')))
+ {
+ int flags2 = ((flags & FNM_FILE_NAME)
+ ? flags : (flags & ~FNM_PERIOD));
+ bool no_leading_period2 = no_leading_period;
+
+ for (--p; n < endp; ++n, no_leading_period2 = false)
+ if (FCT (p, n, string_end, no_leading_period2, flags2)
+ == 0)
+ return 0;
+ }
+ 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)
+ == 0))
+ return 0;
+ }
+ else
+ {
+ int flags2 = ((flags & FNM_FILE_NAME)
+ ? flags : (flags & ~FNM_PERIOD));
+ int no_leading_period2 = no_leading_period;
+
+ if (c == L_('\\') && !(flags & FNM_NOESCAPE))
+ c = *p;
+ c = FOLD (c);
+ for (--p; n < endp; ++n, no_leading_period2 = false)
+ if (FOLD ((UCHAR) *n) == c
+ && (FCT (p, n, string_end, no_leading_period2, flags2)
+ == 0))
+ return 0;
+ }
+ }
+
+ /* 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. */
+ register 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;
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+ wctype_t wt;
+#endif
+ 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');
+
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+ 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
+#else
+ if ((STREQ (str, L_("alnum")) && isalnum ((UCHAR) *n))
+ || (STREQ (str, L_("alpha")) && isalpha ((UCHAR) *n))
+ || (STREQ (str, L_("blank")) && isblank ((UCHAR) *n))
+ || (STREQ (str, L_("cntrl")) && iscntrl ((UCHAR) *n))
+ || (STREQ (str, L_("digit")) && isdigit ((UCHAR) *n))
+ || (STREQ (str, L_("graph")) && isgraph ((UCHAR) *n))
+ || (STREQ (str, L_("lower")) && islower ((UCHAR) *n))
+ || (STREQ (str, L_("print")) && isprint ((UCHAR) *n))
+ || (STREQ (str, L_("punct")) && ispunct ((UCHAR) *n))
+ || (STREQ (str, L_("space")) && isspace ((UCHAR) *n))
+ || (STREQ (str, L_("upper")) && isupper ((UCHAR) *n))
+ || (STREQ (str, L_("xdigit")) && isxdigit ((UCHAR) *n)))
+ goto matched;
+#endif
+ c = *p++;
+ }
+#ifdef _LIBC
+ else if (c == L_('[') && *p == L_('='))
+ {
+ UCHAR str[1];
+ 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[0] = 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[0])
+ goto matched;
+ }
+ else
+ {
+ const int32_t *table;
+# if WIDE_CHAR_VERSION
+ const int32_t *weights;
+ const int32_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;
+
+ /* This #include defines a local function! */
+# if WIDE_CHAR_VERSION
+# include <locale/weightwc.h>
+# else
+# include <locale/weight.h>
+# endif
+
+# 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 int32_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 (&cp);
+ if (idx != 0)
+ {
+ /* We found a table entry. Now see whether the
+ character we are currently at has the same
+ equivalance class value. */
+ int len = weights[idx];
+ int32_t idx2;
+ const UCHAR *np = (const UCHAR *) n;
+
+ idx2 = findidx (&np);
+ if (idx2 != 0 && len == weights[idx2])
+ {
+ int cnt = 0;
+
+ 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) loses. */
+ return FNM_NOMATCH;
+ 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;
+# ifdef WIDE_CHAR_VERSION
+ char str[c1];
+ size_t strcnt;
+# else
+# define str (startp + 1)
+# endif
+ const unsigned char *extra;
+ int32_t idx;
+ int32_t elem;
+ int32_t second;
+ int32_t hash;
+
+# ifdef WIDE_CHAR_VERSION
+ /* We have to convert the name to a single-byte
+ string. This is possible since the names
+ consist of ASCII characters and the internal
+ representation is UCS4. */
+ for (strcnt = 0; strcnt < c1; ++strcnt)
+ str[strcnt] = startp[1 + strcnt];
+# 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);
+
+ /* Locate the character in the hashing table. */
+ hash = elem_hash (str, c1);
+
+ idx = 0;
+ elem = hash % table_size;
+ if (symb_table[2 * elem] != 0)
+ {
+ second = hash % (table_size - 2) + 1;
+
+ do
+ {
+ /* First compare the hashing value. */
+ if (symb_table[2 * elem] == hash
+ && (c1
+ == extra[symb_table[2 * elem + 1]])
+ && memcmp (str,
+ &extra[symb_table[2 * elem
+ + 1]
+ + 1], c1) == 0)
+ {
+ /* Yep, this is the entry. */
+ idx = symb_table[2 * elem + 1];
+ idx += 1 + extra[idx];
+ break;
+ }
+
+ /* Next entry. */
+ elem += second;
+ }
+ while (symb_table[2 * elem] != 0);
+ }
+
+ if (symb_table[2 * elem] != 0)
+ {
+ /* Compare the byte sequence but only if
+ this is not part of a range. */
+# ifdef WIDE_CHAR_VERSION
+ int32_t *wextra;
+
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+
+ wextra = (int32_t *) &extra[idx + 4];
+# endif
+
+ if (! is_range)
+ {
+# ifdef WIDE_CHAR_VERSION
+ for (c1 = 0;
+ (int32_t) c1 < wextra[idx];
+ ++c1)
+ if (n[c1] != wextra[1 + c1])
+ break;
+
+ if ((int32_t) c1 == wextra[idx])
+ goto matched;
+# else
+ for (c1 = 0; c1 < extra[idx]; ++c1)
+ if (n[c1] != extra[1 + c1])
+ break;
+
+ if (c1 == extra[idx])
+ goto matched;
+# endif
+ }
+
+ /* Get the collation sequence value. */
+ is_seqval = true;
+# ifdef WIDE_CHAR_VERSION
+ cold = wextra[1 + wextra[idx]];
+# else
+ /* Adjust for the alignment. */
+ idx += 1 + extra[idx];
+ idx = (idx + 3) & ~4;
+ 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 == str[0])
+ goto matched;
+
+ cold = str[0];
+ c = *p++;
+ }
+ else
+ return FNM_NOMATCH;
+ }
+ }
+ else
+# undef str
+#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++;
+
+# ifdef 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;
+# ifdef WIDE_CHAR_VERSION
+ char str[c1];
+ size_t strcnt;
+# else
+# define str (startp + 1)
+# endif
+ const unsigned char *extra;
+ int32_t idx;
+ int32_t elem;
+ int32_t second;
+ int32_t hash;
+
+# ifdef WIDE_CHAR_VERSION
+ /* We have to convert the name to a single-byte
+ string. This is possible since the names
+ consist of ASCII characters and the internal
+ representation is UCS4. */
+ for (strcnt = 0; strcnt < c1; ++strcnt)
+ str[strcnt] = startp[1 + strcnt];
+# 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);
+
+ /* Locate the character in the hashing
+ table. */
+ hash = elem_hash (str, c1);
+
+ idx = 0;
+ elem = hash % table_size;
+ if (symb_table[2 * elem] != 0)
+ {
+ second = hash % (table_size - 2) + 1;
+
+ do
+ {
+ /* First compare the hashing value. */
+ if (symb_table[2 * elem] == hash
+ && (c1
+ == extra[symb_table[2 * elem + 1]])
+ && memcmp (str,
+ &extra[symb_table[2 * elem + 1]
+ + 1], c1) == 0)
+ {
+ /* Yep, this is the entry. */
+ idx = symb_table[2 * elem + 1];
+ idx += 1 + extra[idx];
+ break;
+ }
+
+ /* Next entry. */
+ elem += second;
+ }
+ while (symb_table[2 * elem] != 0);
+ }
+
+ if (symb_table[2 * elem] != 0)
+ {
+ /* Compare the byte sequence but only if
+ this is not part of a range. */
+# ifdef WIDE_CHAR_VERSION
+ int32_t *wextra;
+
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~4;
+
+ wextra = (int32_t *) &extra[idx + 4];
+# endif
+ /* Get the collation sequence value. */
+ is_seqval = true;
+# ifdef WIDE_CHAR_VERSION
+ cend = wextra[1 + wextra[idx]];
+# else
+ /* Adjust for the alignment. */
+ idx += 1 + extra[idx];
+ idx = (idx + 3) & ~4;
+ cend = *((int32_t *) &extra[idx]);
+# endif
+ }
+ else if (symb_table[2 * elem] != 0 && c1 == 1)
+ {
+ cend = str[0];
+ c = *p++;
+ }
+ else
+ return FNM_NOMATCH;
+ }
+# undef str
+ }
+ 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 (
+# ifdef 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
+ {
+# ifdef 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;
+ }
+# ifdef 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 (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. */
+ do
+ {
+ ignore_next:
+ c = *p++;
+
+ 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;
+ goto ignore_next;
+ }
+ }
+ p += 2;
+ c = *p++;
+ }
+ 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;
+ c = *p++;
+ }
+ else if (c == L_('[') && *p == L_('.'))
+ {
+ ++p;
+ while (1)
+ {
+ c = *++p;
+ if (c == '\0')
+ return FNM_NOMATCH;
+
+ if (*p == L_('.') && p[1] == L_(']'))
+ break;
+ }
+ p += 2;
+ c = *p++;
+ }
+ }
+ while (c != L_(']'));
+ if (not)
+ return FNM_NOMATCH;
+ }
+ break;
+
+ case L_('+'):
+ case L_('@'):
+ case L_('!'):
+ if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
+ {
+ int res;
+
+ res = EXT (c, p, n, string_end, no_leading_period, flags);
+ 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 *
+internal_function
+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);
+ else if (*p == L_(')'))
+ break;
+
+ return p + 1;
+}
+
+
+static int
+internal_function
+EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
+ bool no_leading_period, int flags)
+{
+ const CHAR *startp;
+ size_t level;
+ struct patternlist
+ {
+ struct patternlist *next;
+ CHAR str[1];
+ } *list = NULL;
+ struct patternlist **lastp = &list;
+ size_t pattern_len = STRLEN (pattern);
+ const CHAR *p;
+ const CHAR *rs;
+ enum { ALLOCA_LIMIT = 8000 };
+
+ /* 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. */
+ return -1;
+ 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 -1;
+ }
+ 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; \
+ size_t plensize; \
+ size_t newpsize; \
+ \
+ plen = (opt == L_('?') || opt == L_('@') \
+ ? pattern_len \
+ : p - startp + 1); \
+ plensize = plen * sizeof (CHAR); \
+ newpsize = offsetof (struct patternlist, str) + plensize; \
+ if ((size_t) -1 / sizeof (CHAR) < plen \
+ || newpsize < offsetof (struct patternlist, str) \
+ || ALLOCA_LIMIT <= newpsize) \
+ return -1; \
+ newp = (struct patternlist *) alloca (newpsize); \
+ *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L_('\0'); \
+ newp->next = NULL; \
+ *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) == 0)
+ return 0;
+ /* 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) == 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) == 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) == 0)))
+ /* It worked. Signal success. */
+ return 0;
+ }
+ while ((list = list->next) != NULL);
+
+ /* None of the patterns lead to a match. */
+ return FNM_NOMATCH;
+
+ case L_('?'):
+ if (FCT (p, string, string_end, no_leading_period, flags) == 0)
+ return 0;
+ /* 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) == 0)
+ /* It worked. Signal success. */
+ return 0;
+ while ((list = list->next) != NULL);
+
+ /* None of the patterns lead to a match. */
+ return FNM_NOMATCH;
+
+ 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) == 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)
+ == 0))
+ /* This is successful. */
+ return 0;
+ }
+
+ /* None of the patterns together with the rest of the pattern
+ lead to a match. */
+ return FNM_NOMATCH;
+
+ default:
+ assert (! "Invalid extended matching operator");
+ break;
+ }
+
+ return -1;
+}
+
+
+#undef FOLD
+#undef CHAR
+#undef UCHAR
+#undef INT
+#undef FCT
+#undef EXT
+#undef END
+#undef MEMPCPY
+#undef MEMCHR
+#undef STRCOLL
+#undef STRLEN
+#undef STRCAT
+#undef L_
+#undef BTOWC
diff --git a/lib/fstatat.c b/lib/fstatat.c
new file mode 100644
index 0000000..92a5164
--- /dev/null
+++ b/lib/fstatat.c
@@ -0,0 +1,57 @@
+/* Work around an fstatat bug on Solaris 9.
+
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#include <config.h>
+
+#define COMPILING_FSTATAT 1
+#include "openat.h"
+
+#include <errno.h>
+#include <string.h>
+
+/* fstatat should always follow symbolic links that end in /, but on
+ Solaris 9 it doesn't if AT_SYMLINK_NOFOLLOW is specified. This is
+ the same problem that lstat.c addresses, so solve it in a similar
+ way. */
+
+int
+rpl_fstatat (int fd, char const *file, struct stat *st, int flag)
+{
+ int result = fstatat (fd, file, st, flag);
+
+ if (result == 0 && (flag & AT_SYMLINK_NOFOLLOW) && S_ISLNK (st->st_mode)
+ && file[strlen (file) - 1] == '/')
+ {
+ /* FILE refers to a symbolic link and the name ends with a slash.
+ Get info about the link's referent. */
+ result = fstatat (fd, file, st, flag & ~AT_SYMLINK_NOFOLLOW);
+ if (result == 0 && ! S_ISDIR (st->st_mode))
+ {
+ /* fstatat succeeded and FILE references a non-directory.
+ But it was specified via a name including a trailing
+ slash. Fail with errno set to ENOTDIR to indicate the
+ contradiction. */
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+
+ return result;
+}
diff --git a/lib/ftruncate.c b/lib/ftruncate.c
new file mode 100644
index 0000000..ff7d11b
--- /dev/null
+++ b/lib/ftruncate.c
@@ -0,0 +1,90 @@
+/* ftruncate emulations that work on some System V's.
+ This file is in the public domain. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <fcntl.h>
+
+#ifdef F_CHSIZE
+
+int
+ftruncate (int fd, off_t length)
+{
+ return fcntl (fd, F_CHSIZE, length);
+}
+
+#else /* not F_CHSIZE */
+# ifdef F_FREESP
+
+/* By William Kucharski <kucharsk@netcom.com>. */
+
+# include <sys/stat.h>
+# include <errno.h>
+
+int
+ftruncate (int fd, off_t length)
+{
+ struct flock fl;
+ struct stat filebuf;
+
+ if (fstat (fd, &filebuf) < 0)
+ return -1;
+
+ if (filebuf.st_size < length)
+ {
+ /* Extend file length. */
+ if (lseek (fd, (length - 1), SEEK_SET) < 0)
+ return -1;
+
+ /* Write a "0" byte. */
+ if (write (fd, "", 1) != 1)
+ return -1;
+ }
+ else
+ {
+
+ /* Truncate length. */
+
+ fl.l_whence = 0;
+ fl.l_len = 0;
+ fl.l_start = length;
+ fl.l_type = F_WRLCK; /* write lock on file space */
+
+ /* This relies on the *undocumented* F_FREESP argument to fcntl,
+ which truncates the file so that it ends at the position
+ indicated by fl.l_start. Will minor miracles never cease? */
+
+ if (fcntl (fd, F_FREESP, &fl) < 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+# else /* not F_CHSIZE nor F_FREESP */
+# if HAVE_CHSIZE /* native Windows, e.g. mingw */
+
+int
+ftruncate (int fd, off_t length)
+{
+ return chsize (fd, length);
+}
+
+# else /* not F_CHSIZE nor F_FREESP nor HAVE_CHSIZE */
+
+# include <errno.h>
+
+int
+ftruncate (int fd, off_t length)
+{
+ errno = EIO;
+ return -1;
+}
+
+# endif /* not HAVE_CHSIZE */
+# endif /* not F_FREESP */
+#endif /* not F_CHSIZE */
diff --git a/lib/full-write.c b/lib/full-write.c
new file mode 100644
index 0000000..cc16872
--- /dev/null
+++ b/lib/full-write.c
@@ -0,0 +1,81 @@
+/* An interface to read and write that retries (if necessary) until complete.
+
+ Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+ 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef FULL_READ
+# include "full-read.h"
+#else
+# include "full-write.h"
+#endif
+
+#include <errno.h>
+
+#ifdef FULL_READ
+# include "safe-read.h"
+# define safe_rw safe_read
+# define full_rw full_read
+# undef const
+# define const /* empty */
+#else
+# include "safe-write.h"
+# define safe_rw safe_write
+# define full_rw full_write
+#endif
+
+#ifdef FULL_READ
+/* Set errno to zero upon EOF. */
+# define ZERO_BYTE_TRANSFER_ERRNO 0
+#else
+/* Some buggy drivers return 0 when one tries to write beyond
+ a device's end. (Example: Linux 1.2.13 on /dev/fd0.)
+ Set errno to ENOSPC so they get a sensible diagnostic. */
+# define ZERO_BYTE_TRANSFER_ERRNO ENOSPC
+#endif
+
+/* Write(read) COUNT bytes at BUF to(from) descriptor FD, retrying if
+ interrupted or if a partial write(read) occurs. Return the number
+ of bytes transferred.
+ When writing, set errno if fewer than COUNT bytes are written.
+ When reading, if fewer than COUNT bytes are read, you must examine
+ errno to distinguish failure from EOF (errno == 0). */
+size_t
+full_rw (int fd, const void *buf, size_t count)
+{
+ size_t total = 0;
+ const char *ptr = (const char *) buf;
+
+ while (count > 0)
+ {
+ size_t n_rw = safe_rw (fd, ptr, count);
+ if (n_rw == (size_t) -1)
+ break;
+ if (n_rw == 0)
+ {
+ errno = ZERO_BYTE_TRANSFER_ERRNO;
+ break;
+ }
+ total += n_rw;
+ ptr += n_rw;
+ count -= n_rw;
+ }
+
+ return total;
+}
diff --git a/lib/full-write.h b/lib/full-write.h
new file mode 100644
index 0000000..d20d2fe
--- /dev/null
+++ b/lib/full-write.h
@@ -0,0 +1,35 @@
+/* An interface to write() that writes all it is asked to write.
+
+ Copyright (C) 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <stddef.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Write COUNT bytes at BUF to descriptor FD, retrying if interrupted
+ or if partial writes occur. Return the number of bytes successfully
+ written, setting errno if that is less than COUNT. */
+extern size_t full_write (int fd, const void *buf, size_t count);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/lib/getcwd.c b/lib/getcwd.c
new file mode 100644
index 0000000..23b35de
--- /dev/null
+++ b/lib/getcwd.c
@@ -0,0 +1,428 @@
+/* Copyright (C) 1991,92,93,94,95,96,97,98,99,2004,2005,2006,2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if !_LIBC
+# include <config.h>
+# include <unistd.h>
+# include "dirfd.h"
+#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. */
+
+#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
+
+#include <limits.h>
+
+/* 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 0 < AT_FDCWD && AT_FDCWD == 0xffd19553
+# undef AT_FDCWD
+# define AT_FDCWD (-3041965)
+#endif
+
+#ifdef ENAMETOOLONG
+# define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
+#else
+# define is_ENAMETOOLONG(x) 0
+#endif
+
+#ifndef MAX
+# define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef MIN
+# define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+#ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# else
+# define PATH_MAX 1024
+# endif
+#endif
+
+#if D_INO_IN_DIRENT
+# define MATCHING_INO(dp, ino) ((dp)->d_ino == (ino))
+#else
+# define MATCHING_INO(dp, ino) true
+#endif
+
+#if !_LIBC
+# define __getcwd getcwd
+# define __lstat lstat
+# define __closedir closedir
+# define __opendir opendir
+# define __readdir readdir
+#endif
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ therefore save some unnecessary recursion in fchdir.c. */
+#undef opendir
+#undef closedir
+
+/* 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 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. */
+
+char *
+__getcwd (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
+ };
+
+#ifdef AT_FDCWD
+ 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 stat st;
+ size_t allocated = size;
+ size_t used;
+
+#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
+ 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. */
+
+# undef getcwd
+ dir = getcwd (buf, size);
+ if (dir || (errno != ERANGE && !is_ENAMETOOLONG (errno) && errno != ENOENT))
+ return dir;
+#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 (__lstat (".", &st) < 0)
+ goto lose;
+ thisdev = st.st_dev;
+ thisino = st.st_ino;
+
+ if (__lstat ("/", &st) < 0)
+ goto lose;
+ rootdev = st.st_dev;
+ rootino = st.st_ino;
+
+ while (!(thisdev == rootdev && thisino == rootino))
+ {
+ struct dirent *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. */
+#ifdef AT_FDCWD
+ fd = openat (fd, "..", O_RDONLY);
+ if (fd < 0)
+ goto lose;
+ fd_needs_closing = true;
+ parent_status = fstat (fd, &st);
+#else
+ dotlist[dotlen++] = '.';
+ dotlist[dotlen++] = '.';
+ dotlist[dotlen] = '\0';
+ parent_status = __lstat (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. */
+#ifdef AT_FDCWD
+ dirstream = fdopendir (fd);
+ if (dirstream == NULL)
+ goto lose;
+ /* Reset fd. It may have been closed by fdopendir. */
+ fd = dirfd (dirstream);
+ 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 = __readdir (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 = __readdir (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;
+#ifdef AT_FDCWD
+ entry_status = fstatat (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 = __lstat (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 = '/';
+
+#ifndef AT_FDCWD
+ 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 = realloc (dir, used);
+
+ 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);
+#ifdef AT_FDCWD
+ if (fd_needs_closing)
+ close (fd);
+#else
+ if (dotlist != dots)
+ free (dotlist);
+#endif
+ if (buf == NULL)
+ free (dir);
+ __set_errno (save);
+ }
+ return NULL;
+}
+
+#ifdef weak_alias
+weak_alias (__getcwd, getcwd)
+#endif
diff --git a/lib/getdate.c b/lib/getdate.c
new file mode 100644
index 0000000..dca83d8
--- /dev/null
+++ b/lib/getdate.c
@@ -0,0 +1,3289 @@
+/* A Bison parser, made by GNU Bison 2.3. */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Bison version. */
+#define YYBISON_VERSION "2.3"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 1
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ tAGO = 258,
+ tDST = 259,
+ tYEAR_UNIT = 260,
+ tMONTH_UNIT = 261,
+ tHOUR_UNIT = 262,
+ tMINUTE_UNIT = 263,
+ tSEC_UNIT = 264,
+ tDAY_UNIT = 265,
+ tDAY = 266,
+ tDAYZONE = 267,
+ tLOCAL_ZONE = 268,
+ tMERIDIAN = 269,
+ tMONTH = 270,
+ tORDINAL = 271,
+ tZONE = 272,
+ tSNUMBER = 273,
+ tUNUMBER = 274,
+ tSDECIMAL_NUMBER = 275,
+ tUDECIMAL_NUMBER = 276
+ };
+#endif
+/* Tokens. */
+#define tAGO 258
+#define tDST 259
+#define tYEAR_UNIT 260
+#define tMONTH_UNIT 261
+#define tHOUR_UNIT 262
+#define tMINUTE_UNIT 263
+#define tSEC_UNIT 264
+#define tDAY_UNIT 265
+#define tDAY 266
+#define tDAYZONE 267
+#define tLOCAL_ZONE 268
+#define tMERIDIAN 269
+#define tMONTH 270
+#define tORDINAL 271
+#define tZONE 272
+#define tSNUMBER 273
+#define tUNUMBER 274
+#define tSDECIMAL_NUMBER 275
+#define tUDECIMAL_NUMBER 276
+
+
+
+
+/* Copy the first part of user declarations. */
+#line 1 "getdate.y"
+
+/* Parse a string into an internal time stamp.
+
+ Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Originally written by Steven M. Bellovin <smb@research.att.com> while
+ at the University of North Carolina at Chapel Hill. Later tweaked by
+ a couple of people on Usenet. Completely overhauled by Rich $alz
+ <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990.
+
+ Modified by Paul Eggert <eggert@twinsun.com> in August 1999 to do
+ the right thing about local DST. Also modified by Paul Eggert
+ <eggert@cs.ucla.edu> in February 2004 to support
+ nanosecond-resolution time stamps, and in October 2004 to support
+ TZ strings in dates. */
+
+/* FIXME: Check for arithmetic overflow in all cases, not just
+ some of them. */
+
+#include <config.h>
+
+#include "getdate.h"
+#include "timespec.h"
+
+/* There's no need to extend the stack, so there's no need to involve
+ alloca. */
+#define YYSTACK_USE_ALLOCA 0
+
+/* Tell Bison how much stack space is needed. 20 should be plenty for
+ this grammar, which is not right recursive. Beware setting it too
+ high, since that might cause problems on machines whose
+ implementations have lame stack-overflow checking. */
+#define YYMAXDEPTH 20
+#define YYINITDEPTH YYMAXDEPTH
+
+/* Since the code of getdate.y is not included in the Emacs executable
+ itself, there is no need to #define static in this file. Even if
+ the code were included in the Emacs executable, it probably
+ wouldn't do any harm to #undef it here; this will only cause
+ problems if we try to write to a static variable, which I don't
+ think this code needs to do. */
+#ifdef emacs
+# undef static
+#endif
+
+#include <ctype.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "setenv.h"
+#include "xalloc.h"
+
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+#ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
+# define __attribute__(x)
+# endif
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. A and B should be free of side
+ effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
+ INT_BITS is the number of useful bits in an int. GNU code can
+ assume that 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. */
+#define SHR(a, b) \
+ (-1 >> 1 == -1 \
+ ? (a) >> (b) \
+ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
+
+#define EPOCH_YEAR 1970
+#define TM_YEAR_BASE 1900
+
+#define HOUR(x) ((x) * 60)
+
+/* An integer value, and the number of digits in its textual
+ representation. */
+typedef struct
+{
+ bool negative;
+ long int value;
+ size_t digits;
+} textint;
+
+/* An entry in the lexical lookup table. */
+typedef struct
+{
+ char const *name;
+ int type;
+ int value;
+} table;
+
+/* Meridian: am, pm, or 24-hour style. */
+enum { MERam, MERpm, MER24 };
+
+enum { BILLION = 1000000000, LOG10_BILLION = 9 };
+
+/* Relative times. */
+typedef struct
+{
+ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */
+ long int year;
+ long int month;
+ long int day;
+ long int hour;
+ long int minutes;
+ long int seconds;
+ long int ns;
+} relative_time;
+
+#if HAVE_COMPOUND_LITERALS
+# define RELATIVE_TIME_0 ((relative_time) { 0, 0, 0, 0, 0, 0, 0 })
+#else
+static relative_time const RELATIVE_TIME_0;
+#endif
+
+/* Information passed to and from the parser. */
+typedef struct
+{
+ /* The input string remaining to be parsed. */
+ const char *input;
+
+ /* N, if this is the Nth Tuesday. */
+ long int day_ordinal;
+
+ /* Day of week; Sunday is 0. */
+ int day_number;
+
+ /* tm_isdst flag for the local zone. */
+ int local_isdst;
+
+ /* Time zone, in minutes east of UTC. */
+ long int time_zone;
+
+ /* Style used for time. */
+ int meridian;
+
+ /* Gregorian year, month, day, hour, minutes, seconds, and nanoseconds. */
+ textint year;
+ long int month;
+ long int day;
+ long int hour;
+ long int minutes;
+ struct timespec seconds; /* includes nanoseconds */
+
+ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */
+ relative_time rel;
+
+ /* Presence or counts of nonterminals of various flavors parsed so far. */
+ bool timespec_seen;
+ bool rels_seen;
+ size_t dates_seen;
+ size_t days_seen;
+ size_t local_zones_seen;
+ size_t dsts_seen;
+ size_t times_seen;
+ size_t zones_seen;
+
+ /* Table of local time zone abbrevations, terminated by a null entry. */
+ table local_time_zone_table[3];
+} parser_control;
+
+union YYSTYPE;
+static int yylex (union YYSTYPE *, parser_control *);
+static int yyerror (parser_control const *, char const *);
+static long int time_zone_hhmm (textint, long int);
+
+
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table. */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 214 "getdate.y"
+{
+ long int intval;
+ textint textintval;
+ struct timespec timespec;
+ relative_time rel;
+}
+/* Line 187 of yacc.c. */
+#line 348 "getdate.c"
+ YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations. */
+
+
+/* Line 216 of yacc.c. */
+#line 361 "getdate.c"
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(msgid) dgettext ("bison-runtime", msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions. */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int i)
+#else
+static int
+YYID (i)
+ int i;
+#endif
+{
+ return i;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef _STDLIB_H
+# define _STDLIB_H 1
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined _STDLIB_H \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef _STDLIB_H
+# define _STDLIB_H 1
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yytype_int16 yyss;
+ YYSTYPE yyvs;
+ };
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (YYID (0))
+# endif
+# endif
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack, Stack, yysize); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 12
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 91
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 26
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 19
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 78
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 96
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 276
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const yytype_uint8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 24, 2, 2, 25, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 23, 2,
+ 2, 2, 2, 2, 22, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const yytype_uint8 yyprhs[] =
+{
+ 0, 0, 3, 5, 7, 10, 11, 14, 16, 18,
+ 20, 22, 24, 26, 28, 31, 36, 42, 49, 57,
+ 59, 62, 64, 67, 71, 73, 76, 78, 81, 84,
+ 87, 91, 97, 101, 105, 109, 112, 117, 120, 124,
+ 127, 129, 132, 135, 137, 140, 143, 145, 148, 151,
+ 153, 156, 159, 161, 164, 167, 169, 172, 175, 178,
+ 181, 183, 185, 188, 191, 194, 197, 200, 203, 205,
+ 207, 209, 211, 213, 215, 217, 218, 221, 222
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yytype_int8 yyrhs[] =
+{
+ 27, 0, -1, 28, -1, 29, -1, 22, 39, -1,
+ -1, 29, 30, -1, 31, -1, 32, -1, 33, -1,
+ 35, -1, 34, -1, 36, -1, 42, -1, 19, 14,
+ -1, 19, 23, 19, 44, -1, 19, 23, 19, 18,
+ 43, -1, 19, 23, 19, 23, 41, 44, -1, 19,
+ 23, 19, 23, 41, 18, 43, -1, 13, -1, 13,
+ 4, -1, 17, -1, 17, 38, -1, 17, 18, 43,
+ -1, 12, -1, 17, 4, -1, 11, -1, 11, 24,
+ -1, 16, 11, -1, 19, 11, -1, 19, 25, 19,
+ -1, 19, 25, 19, 25, 19, -1, 19, 18, 18,
+ -1, 19, 15, 18, -1, 15, 18, 18, -1, 15,
+ 19, -1, 15, 19, 24, 19, -1, 19, 15, -1,
+ 19, 15, 19, -1, 37, 3, -1, 37, -1, 16,
+ 5, -1, 19, 5, -1, 5, -1, 16, 6, -1,
+ 19, 6, -1, 6, -1, 16, 10, -1, 19, 10,
+ -1, 10, -1, 16, 7, -1, 19, 7, -1, 7,
+ -1, 16, 8, -1, 19, 8, -1, 8, -1, 16,
+ 9, -1, 19, 9, -1, 20, 9, -1, 21, 9,
+ -1, 9, -1, 38, -1, 18, 5, -1, 18, 6,
+ -1, 18, 10, -1, 18, 7, -1, 18, 8, -1,
+ 18, 9, -1, 40, -1, 41, -1, 20, -1, 18,
+ -1, 21, -1, 19, -1, 19, -1, -1, 23, 19,
+ -1, -1, 14, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const yytype_uint16 yyrline[] =
+{
+ 0, 240, 240, 241, 245, 252, 254, 258, 260, 262,
+ 264, 266, 268, 270, 274, 282, 290, 300, 307, 319,
+ 324, 332, 334, 344, 346, 348, 353, 358, 363, 368,
+ 376, 381, 401, 408, 416, 424, 429, 435, 440, 449,
+ 459, 472, 474, 476, 478, 480, 482, 484, 486, 488,
+ 490, 492, 494, 496, 498, 500, 502, 504, 506, 508,
+ 510, 512, 516, 518, 520, 522, 524, 526, 530, 530,
+ 533, 534, 539, 540, 545, 583, 584, 590, 591
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "tAGO", "tDST", "tYEAR_UNIT",
+ "tMONTH_UNIT", "tHOUR_UNIT", "tMINUTE_UNIT", "tSEC_UNIT", "tDAY_UNIT",
+ "tDAY", "tDAYZONE", "tLOCAL_ZONE", "tMERIDIAN", "tMONTH", "tORDINAL",
+ "tZONE", "tSNUMBER", "tUNUMBER", "tSDECIMAL_NUMBER", "tUDECIMAL_NUMBER",
+ "'@'", "':'", "','", "'/'", "$accept", "spec", "timespec", "items",
+ "item", "time", "local_zone", "zone", "day", "date", "rel", "relunit",
+ "relunit_snumber", "seconds", "signed_seconds", "unsigned_seconds",
+ "number", "o_colon_minutes", "o_merid", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const yytype_uint16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 64, 58, 44, 47
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_uint8 yyr1[] =
+{
+ 0, 26, 27, 27, 28, 29, 29, 30, 30, 30,
+ 30, 30, 30, 30, 31, 31, 31, 31, 31, 32,
+ 32, 33, 33, 33, 33, 33, 34, 34, 34, 34,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 36,
+ 36, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 38, 38, 38, 38, 38, 38, 39, 39,
+ 40, 40, 41, 41, 42, 43, 43, 44, 44
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const yytype_uint8 yyr2[] =
+{
+ 0, 2, 1, 1, 2, 0, 2, 1, 1, 1,
+ 1, 1, 1, 1, 2, 4, 5, 6, 7, 1,
+ 2, 1, 2, 3, 1, 2, 1, 2, 2, 2,
+ 3, 5, 3, 3, 3, 2, 4, 2, 3, 2,
+ 1, 2, 2, 1, 2, 2, 1, 2, 2, 1,
+ 2, 2, 1, 2, 2, 1, 2, 2, 2, 2,
+ 1, 1, 2, 2, 2, 2, 2, 2, 1, 1,
+ 1, 1, 1, 1, 1, 0, 2, 0, 1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const yytype_uint8 yydefact[] =
+{
+ 5, 0, 0, 2, 3, 71, 73, 70, 72, 4,
+ 68, 69, 1, 43, 46, 52, 55, 60, 49, 26,
+ 24, 19, 0, 0, 21, 0, 74, 0, 0, 6,
+ 7, 8, 9, 11, 10, 12, 40, 61, 13, 27,
+ 20, 0, 35, 41, 44, 50, 53, 56, 47, 28,
+ 25, 75, 22, 62, 63, 65, 66, 67, 64, 42,
+ 45, 51, 54, 57, 48, 29, 14, 37, 0, 0,
+ 0, 58, 59, 39, 34, 0, 0, 23, 33, 38,
+ 32, 77, 30, 36, 76, 78, 75, 0, 15, 0,
+ 16, 77, 31, 75, 17, 18
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int8 yydefgoto[] =
+{
+ -1, 2, 3, 4, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 9, 10, 11, 38, 77, 88
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -79
+static const yytype_int8 yypact[] =
+{
+ -10, 47, 27, -79, 25, -79, -79, -79, -79, -79,
+ -79, -79, -79, -79, -79, -79, -79, -79, -79, 5,
+ -79, 59, 43, 42, 10, 49, -5, 62, 63, -79,
+ -79, -79, -79, -79, -79, -79, 70, -79, -79, -79,
+ -79, 56, 52, -79, -79, -79, -79, -79, -79, -79,
+ -79, 16, -79, -79, -79, -79, -79, -79, -79, -79,
+ -79, -79, -79, -79, -79, -79, -79, 51, 57, 58,
+ 60, -79, -79, -79, -79, 61, 64, -79, -79, -79,
+ -79, -7, 53, -79, -79, -79, 65, -2, -79, 66,
+ -79, 46, -79, 65, -79, -79
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -79, -79, -79, -79, -79, -79, -79, -79, -79, -79,
+ -79, -79, 67, -79, -79, -6, -79, -78, -9
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -1
+static const yytype_uint8 yytable[] =
+{
+ 59, 60, 61, 62, 63, 64, 65, 85, 90, 66,
+ 67, 86, 1, 68, 50, 95, 87, 6, 69, 8,
+ 70, 53, 54, 55, 56, 57, 58, 12, 51, 39,
+ 13, 14, 15, 16, 17, 18, 19, 20, 21, 76,
+ 22, 23, 24, 25, 26, 27, 28, 43, 44, 45,
+ 46, 47, 48, 49, 53, 54, 55, 56, 57, 58,
+ 85, 41, 42, 40, 93, 5, 6, 7, 8, 78,
+ 79, 71, 72, 73, 74, 80, 75, 81, 89, 82,
+ 83, 91, 94, 84, 0, 92, 0, 0, 76, 0,
+ 0, 52
+};
+
+static const yytype_int8 yycheck[] =
+{
+ 5, 6, 7, 8, 9, 10, 11, 14, 86, 14,
+ 15, 18, 22, 18, 4, 93, 23, 19, 23, 21,
+ 25, 5, 6, 7, 8, 9, 10, 0, 18, 24,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 23,
+ 15, 16, 17, 18, 19, 20, 21, 5, 6, 7,
+ 8, 9, 10, 11, 5, 6, 7, 8, 9, 10,
+ 14, 18, 19, 4, 18, 18, 19, 20, 21, 18,
+ 19, 9, 9, 3, 18, 18, 24, 19, 25, 19,
+ 19, 87, 91, 19, -1, 19, -1, -1, 23, -1,
+ -1, 24
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_uint8 yystos[] =
+{
+ 0, 22, 27, 28, 29, 18, 19, 20, 21, 39,
+ 40, 41, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 15, 16, 17, 18, 19, 20, 21, 30,
+ 31, 32, 33, 34, 35, 36, 37, 38, 42, 24,
+ 4, 18, 19, 5, 6, 7, 8, 9, 10, 11,
+ 4, 18, 38, 5, 6, 7, 8, 9, 10, 5,
+ 6, 7, 8, 9, 10, 11, 14, 15, 18, 23,
+ 25, 9, 9, 3, 18, 24, 23, 43, 18, 19,
+ 18, 19, 19, 19, 19, 14, 18, 23, 44, 25,
+ 43, 41, 19, 18, 44, 43
+};
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+
+#define YYFAIL goto yyerrlab
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yytoken = YYTRANSLATE (yychar); \
+ YYPOPSTACK (1); \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (pc, YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+while (YYID (0))
+
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+ If N is 0, then set CURRENT to the empty location which ends
+ the previous symbol: RHS[0] (always defined). */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (YYID (N)) \
+ { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ } \
+ else \
+ { \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ } \
+ while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+ This macro was not mandated originally: define only if we know
+ we won't break user code: when these are the locations we know. */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+# define YY_LOCATION_PRINT(File, Loc) \
+ fprintf (File, "%d.%d-%d.%d", \
+ (Loc).first_line, (Loc).first_column, \
+ (Loc).last_line, (Loc).last_column)
+# else
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+#else
+# define YYLEX yylex (&yylval, pc)
+#endif
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Type, Value, pc); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_control *pc)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep, pc)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+ parser_control *pc;
+#endif
+{
+ if (!yyvaluep)
+ return;
+ YYUSE (pc);
+# ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+ YYUSE (yyoutput);
+# endif
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_control *pc)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep, pc)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+ parser_control *pc;
+#endif
+{
+ if (yytype < YYNTOKENS)
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+ yy_symbol_value_print (yyoutput, yytype, yyvaluep, pc);
+ YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
+#else
+static void
+yy_stack_print (bottom, top)
+ yytype_int16 *bottom;
+ yytype_int16 *top;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; bottom <= top; ++bottom)
+ YYFPRINTF (stderr, " %d", *bottom);
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule, parser_control *pc)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule, pc)
+ YYSTYPE *yyvsp;
+ int yyrule;
+ parser_control *pc;
+#endif
+{
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ unsigned long int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ fprintf (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+ &(yyvsp[(yyi + 1) - (yynrhs)])
+ , pc);
+ fprintf (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyvsp, Rule, pc); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+ const char *yystr;
+#endif
+{
+ YYSIZE_T yylen;
+ for (yylen = 0; yystr[yylen]; yylen++)
+ continue;
+ return yylen;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+#endif
+{
+ char *yyd = yydest;
+ const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+ quotes and backslashes, so that it's suitable for yyerror. The
+ heuristic is that double-quoting is unnecessary unless the string
+ contains an apostrophe, a comma, or backslash (other than
+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
+ null, do not copy; instead, return the length of what the result
+ would have been. */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+ if (*yystr == '"')
+ {
+ YYSIZE_T yyn = 0;
+ char const *yyp = yystr;
+
+ for (;;)
+ switch (*++yyp)
+ {
+ case '\'':
+ case ',':
+ goto do_not_strip_quotes;
+
+ case '\\':
+ if (*++yyp != '\\')
+ goto do_not_strip_quotes;
+ /* Fall through. */
+ default:
+ if (yyres)
+ yyres[yyn] = *yyp;
+ yyn++;
+ break;
+
+ case '"':
+ if (yyres)
+ yyres[yyn] = '\0';
+ return yyn;
+ }
+ do_not_strip_quotes: ;
+ }
+
+ if (! yyres)
+ return yystrlen (yystr);
+
+ return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+ YYCHAR while in state YYSTATE. Return the number of bytes copied,
+ including the terminating null byte. If YYRESULT is null, do not
+ copy anything; just return the number of bytes that would be
+ copied. As a special case, return 0 if an ordinary "syntax error"
+ message will do. Return YYSIZE_MAXIMUM if overflow occurs during
+ size calculation. */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+ int yyn = yypact[yystate];
+
+ if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+ return 0;
+ else
+ {
+ int yytype = YYTRANSLATE (yychar);
+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+ YYSIZE_T yysize = yysize0;
+ YYSIZE_T yysize1;
+ int yysize_overflow = 0;
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ int yyx;
+
+# if 0
+ /* This is so xgettext sees the translatable formats that are
+ constructed on the fly. */
+ YY_("syntax error, unexpected %s");
+ YY_("syntax error, unexpected %s, expecting %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+ char *yyfmt;
+ char const *yyf;
+ static char const yyunexpected[] = "syntax error, unexpected %s";
+ static char const yyexpecting[] = ", expecting %s";
+ static char const yyor[] = " or %s";
+ char yyformat[sizeof yyunexpected
+ + sizeof yyexpecting - 1
+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+ * (sizeof yyor - 1))];
+ char const *yyprefix = yyexpecting;
+
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn + 1;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yycount = 1;
+
+ yyarg[0] = yytname[yytype];
+ yyfmt = yystpcpy (yyformat, yyunexpected);
+
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+ {
+ yycount = 1;
+ yysize = yysize0;
+ yyformat[sizeof yyunexpected - 1] = '\0';
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+ yysize_overflow |= (yysize1 < yysize);
+ yysize = yysize1;
+ yyfmt = yystpcpy (yyfmt, yyprefix);
+ yyprefix = yyor;
+ }
+
+ yyf = YY_(yyformat);
+ yysize1 = yysize + yystrlen (yyf);
+ yysize_overflow |= (yysize1 < yysize);
+ yysize = yysize1;
+
+ if (yysize_overflow)
+ return YYSIZE_MAXIMUM;
+
+ if (yyresult)
+ {
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ char *yyp = yyresult;
+ int yyi = 0;
+ while ((*yyp = *yyf) != '\0')
+ {
+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+ {
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
+ yyf += 2;
+ }
+ else
+ {
+ yyp++;
+ yyf++;
+ }
+ }
+ }
+ return yysize;
+ }
+}
+#endif /* YYERROR_VERBOSE */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, parser_control *pc)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep, pc)
+ const char *yymsg;
+ int yytype;
+ YYSTYPE *yyvaluep;
+ parser_control *pc;
+#endif
+{
+ YYUSE (yyvaluep);
+ YYUSE (pc);
+
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes. */
+
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (parser_control *pc);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (parser_control *pc)
+#else
+int
+yyparse (pc)
+ parser_control *pc;
+#endif
+#endif
+{
+ /* The look-ahead symbol. */
+int yychar;
+
+/* The semantic value of the look-ahead symbol. */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far. */
+int yynerrs;
+
+ int yystate;
+ int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Look-ahead token as an internal (translated) token number. */
+ int yytoken = 0;
+#if YYERROR_VERBOSE
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ yytype_int16 yyssa[YYINITDEPTH];
+ yytype_int16 *yyss = yyssa;
+ yytype_int16 *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ yytype_int16 *yyss1 = yyss;
+
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yytype_int16 *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss);
+ YYSTACK_RELOCATE (yyvs);
+
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+ /* Do appropriate processing given the current state. Read a
+ look-ahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to look-ahead token. */
+ yyn = yypact[yystate];
+ if (yyn == YYPACT_NINF)
+ goto yydefault;
+
+ /* Not known => get a look-ahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yyn == 0 || yyn == YYTABLE_NINF)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the look-ahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+ /* Discard the shifted token unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ yystate = yyn;
+ *++yyvsp = yylval;
+
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 4:
+#line 246 "getdate.y"
+ {
+ pc->seconds = (yyvsp[(2) - (2)].timespec);
+ pc->timespec_seen = true;
+ }
+ break;
+
+ case 7:
+#line 259 "getdate.y"
+ { pc->times_seen++; }
+ break;
+
+ case 8:
+#line 261 "getdate.y"
+ { pc->local_zones_seen++; }
+ break;
+
+ case 9:
+#line 263 "getdate.y"
+ { pc->zones_seen++; }
+ break;
+
+ case 10:
+#line 265 "getdate.y"
+ { pc->dates_seen++; }
+ break;
+
+ case 11:
+#line 267 "getdate.y"
+ { pc->days_seen++; }
+ break;
+
+ case 12:
+#line 269 "getdate.y"
+ { pc->rels_seen = true; }
+ break;
+
+ case 14:
+#line 275 "getdate.y"
+ {
+ pc->hour = (yyvsp[(1) - (2)].textintval).value;
+ pc->minutes = 0;
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = (yyvsp[(2) - (2)].intval);
+ }
+ break;
+
+ case 15:
+#line 283 "getdate.y"
+ {
+ pc->hour = (yyvsp[(1) - (4)].textintval).value;
+ pc->minutes = (yyvsp[(3) - (4)].textintval).value;
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = (yyvsp[(4) - (4)].intval);
+ }
+ break;
+
+ case 16:
+#line 291 "getdate.y"
+ {
+ pc->hour = (yyvsp[(1) - (5)].textintval).value;
+ pc->minutes = (yyvsp[(3) - (5)].textintval).value;
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = MER24;
+ pc->zones_seen++;
+ pc->time_zone = time_zone_hhmm ((yyvsp[(4) - (5)].textintval), (yyvsp[(5) - (5)].intval));
+ }
+ break;
+
+ case 17:
+#line 301 "getdate.y"
+ {
+ pc->hour = (yyvsp[(1) - (6)].textintval).value;
+ pc->minutes = (yyvsp[(3) - (6)].textintval).value;
+ pc->seconds = (yyvsp[(5) - (6)].timespec);
+ pc->meridian = (yyvsp[(6) - (6)].intval);
+ }
+ break;
+
+ case 18:
+#line 308 "getdate.y"
+ {
+ pc->hour = (yyvsp[(1) - (7)].textintval).value;
+ pc->minutes = (yyvsp[(3) - (7)].textintval).value;
+ pc->seconds = (yyvsp[(5) - (7)].timespec);
+ pc->meridian = MER24;
+ pc->zones_seen++;
+ pc->time_zone = time_zone_hhmm ((yyvsp[(6) - (7)].textintval), (yyvsp[(7) - (7)].intval));
+ }
+ break;
+
+ case 19:
+#line 320 "getdate.y"
+ {
+ pc->local_isdst = (yyvsp[(1) - (1)].intval);
+ pc->dsts_seen += (0 < (yyvsp[(1) - (1)].intval));
+ }
+ break;
+
+ case 20:
+#line 325 "getdate.y"
+ {
+ pc->local_isdst = 1;
+ pc->dsts_seen += (0 < (yyvsp[(1) - (2)].intval)) + 1;
+ }
+ break;
+
+ case 21:
+#line 333 "getdate.y"
+ { pc->time_zone = (yyvsp[(1) - (1)].intval); }
+ break;
+
+ case 22:
+#line 335 "getdate.y"
+ { pc->time_zone = (yyvsp[(1) - (2)].intval);
+ pc->rel.ns += (yyvsp[(2) - (2)].rel).ns;
+ pc->rel.seconds += (yyvsp[(2) - (2)].rel).seconds;
+ pc->rel.minutes += (yyvsp[(2) - (2)].rel).minutes;
+ pc->rel.hour += (yyvsp[(2) - (2)].rel).hour;
+ pc->rel.day += (yyvsp[(2) - (2)].rel).day;
+ pc->rel.month += (yyvsp[(2) - (2)].rel).month;
+ pc->rel.year += (yyvsp[(2) - (2)].rel).year;
+ pc->rels_seen = true; }
+ break;
+
+ case 23:
+#line 345 "getdate.y"
+ { pc->time_zone = (yyvsp[(1) - (3)].intval) + time_zone_hhmm ((yyvsp[(2) - (3)].textintval), (yyvsp[(3) - (3)].intval)); }
+ break;
+
+ case 24:
+#line 347 "getdate.y"
+ { pc->time_zone = (yyvsp[(1) - (1)].intval) + 60; }
+ break;
+
+ case 25:
+#line 349 "getdate.y"
+ { pc->time_zone = (yyvsp[(1) - (2)].intval) + 60; }
+ break;
+
+ case 26:
+#line 354 "getdate.y"
+ {
+ pc->day_ordinal = 1;
+ pc->day_number = (yyvsp[(1) - (1)].intval);
+ }
+ break;
+
+ case 27:
+#line 359 "getdate.y"
+ {
+ pc->day_ordinal = 1;
+ pc->day_number = (yyvsp[(1) - (2)].intval);
+ }
+ break;
+
+ case 28:
+#line 364 "getdate.y"
+ {
+ pc->day_ordinal = (yyvsp[(1) - (2)].intval);
+ pc->day_number = (yyvsp[(2) - (2)].intval);
+ }
+ break;
+
+ case 29:
+#line 369 "getdate.y"
+ {
+ pc->day_ordinal = (yyvsp[(1) - (2)].textintval).value;
+ pc->day_number = (yyvsp[(2) - (2)].intval);
+ }
+ break;
+
+ case 30:
+#line 377 "getdate.y"
+ {
+ pc->month = (yyvsp[(1) - (3)].textintval).value;
+ pc->day = (yyvsp[(3) - (3)].textintval).value;
+ }
+ break;
+
+ case 31:
+#line 382 "getdate.y"
+ {
+ /* Interpret as YYYY/MM/DD if the first value has 4 or more digits,
+ otherwise as MM/DD/YY.
+ The goal in recognizing YYYY/MM/DD is solely to support legacy
+ machine-generated dates like those in an RCS log listing. If
+ you want portability, use the ISO 8601 format. */
+ if (4 <= (yyvsp[(1) - (5)].textintval).digits)
+ {
+ pc->year = (yyvsp[(1) - (5)].textintval);
+ pc->month = (yyvsp[(3) - (5)].textintval).value;
+ pc->day = (yyvsp[(5) - (5)].textintval).value;
+ }
+ else
+ {
+ pc->month = (yyvsp[(1) - (5)].textintval).value;
+ pc->day = (yyvsp[(3) - (5)].textintval).value;
+ pc->year = (yyvsp[(5) - (5)].textintval);
+ }
+ }
+ break;
+
+ case 32:
+#line 402 "getdate.y"
+ {
+ /* ISO 8601 format. YYYY-MM-DD. */
+ pc->year = (yyvsp[(1) - (3)].textintval);
+ pc->month = -(yyvsp[(2) - (3)].textintval).value;
+ pc->day = -(yyvsp[(3) - (3)].textintval).value;
+ }
+ break;
+
+ case 33:
+#line 409 "getdate.y"
+ {
+ /* e.g. 17-JUN-1992. */
+ pc->day = (yyvsp[(1) - (3)].textintval).value;
+ pc->month = (yyvsp[(2) - (3)].intval);
+ pc->year.value = -(yyvsp[(3) - (3)].textintval).value;
+ pc->year.digits = (yyvsp[(3) - (3)].textintval).digits;
+ }
+ break;
+
+ case 34:
+#line 417 "getdate.y"
+ {
+ /* e.g. JUN-17-1992. */
+ pc->month = (yyvsp[(1) - (3)].intval);
+ pc->day = -(yyvsp[(2) - (3)].textintval).value;
+ pc->year.value = -(yyvsp[(3) - (3)].textintval).value;
+ pc->year.digits = (yyvsp[(3) - (3)].textintval).digits;
+ }
+ break;
+
+ case 35:
+#line 425 "getdate.y"
+ {
+ pc->month = (yyvsp[(1) - (2)].intval);
+ pc->day = (yyvsp[(2) - (2)].textintval).value;
+ }
+ break;
+
+ case 36:
+#line 430 "getdate.y"
+ {
+ pc->month = (yyvsp[(1) - (4)].intval);
+ pc->day = (yyvsp[(2) - (4)].textintval).value;
+ pc->year = (yyvsp[(4) - (4)].textintval);
+ }
+ break;
+
+ case 37:
+#line 436 "getdate.y"
+ {
+ pc->day = (yyvsp[(1) - (2)].textintval).value;
+ pc->month = (yyvsp[(2) - (2)].intval);
+ }
+ break;
+
+ case 38:
+#line 441 "getdate.y"
+ {
+ pc->day = (yyvsp[(1) - (3)].textintval).value;
+ pc->month = (yyvsp[(2) - (3)].intval);
+ pc->year = (yyvsp[(3) - (3)].textintval);
+ }
+ break;
+
+ case 39:
+#line 450 "getdate.y"
+ {
+ pc->rel.ns -= (yyvsp[(1) - (2)].rel).ns;
+ pc->rel.seconds -= (yyvsp[(1) - (2)].rel).seconds;
+ pc->rel.minutes -= (yyvsp[(1) - (2)].rel).minutes;
+ pc->rel.hour -= (yyvsp[(1) - (2)].rel).hour;
+ pc->rel.day -= (yyvsp[(1) - (2)].rel).day;
+ pc->rel.month -= (yyvsp[(1) - (2)].rel).month;
+ pc->rel.year -= (yyvsp[(1) - (2)].rel).year;
+ }
+ break;
+
+ case 40:
+#line 460 "getdate.y"
+ {
+ pc->rel.ns += (yyvsp[(1) - (1)].rel).ns;
+ pc->rel.seconds += (yyvsp[(1) - (1)].rel).seconds;
+ pc->rel.minutes += (yyvsp[(1) - (1)].rel).minutes;
+ pc->rel.hour += (yyvsp[(1) - (1)].rel).hour;
+ pc->rel.day += (yyvsp[(1) - (1)].rel).day;
+ pc->rel.month += (yyvsp[(1) - (1)].rel).month;
+ pc->rel.year += (yyvsp[(1) - (1)].rel).year;
+ }
+ break;
+
+ case 41:
+#line 473 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = (yyvsp[(1) - (2)].intval); }
+ break;
+
+ case 42:
+#line 475 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 43:
+#line 477 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = 1; }
+ break;
+
+ case 44:
+#line 479 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = (yyvsp[(1) - (2)].intval); }
+ break;
+
+ case 45:
+#line 481 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 46:
+#line 483 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = 1; }
+ break;
+
+ case 47:
+#line 485 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (2)].intval) * (yyvsp[(2) - (2)].intval); }
+ break;
+
+ case 48:
+#line 487 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); }
+ break;
+
+ case 49:
+#line 489 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (1)].intval); }
+ break;
+
+ case 50:
+#line 491 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = (yyvsp[(1) - (2)].intval); }
+ break;
+
+ case 51:
+#line 493 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 52:
+#line 495 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = 1; }
+ break;
+
+ case 53:
+#line 497 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = (yyvsp[(1) - (2)].intval); }
+ break;
+
+ case 54:
+#line 499 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 55:
+#line 501 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = 1; }
+ break;
+
+ case 56:
+#line 503 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].intval); }
+ break;
+
+ case 57:
+#line 505 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 58:
+#line 507 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].timespec).tv_sec; (yyval.rel).ns = (yyvsp[(1) - (2)].timespec).tv_nsec; }
+ break;
+
+ case 59:
+#line 509 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].timespec).tv_sec; (yyval.rel).ns = (yyvsp[(1) - (2)].timespec).tv_nsec; }
+ break;
+
+ case 60:
+#line 511 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = 1; }
+ break;
+
+ case 62:
+#line 517 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 63:
+#line 519 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 64:
+#line 521 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); }
+ break;
+
+ case 65:
+#line 523 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 66:
+#line 525 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 67:
+#line 527 "getdate.y"
+ { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].textintval).value; }
+ break;
+
+ case 71:
+#line 535 "getdate.y"
+ { (yyval.timespec).tv_sec = (yyvsp[(1) - (1)].textintval).value; (yyval.timespec).tv_nsec = 0; }
+ break;
+
+ case 73:
+#line 541 "getdate.y"
+ { (yyval.timespec).tv_sec = (yyvsp[(1) - (1)].textintval).value; (yyval.timespec).tv_nsec = 0; }
+ break;
+
+ case 74:
+#line 546 "getdate.y"
+ {
+ if (pc->dates_seen && ! pc->year.digits
+ && ! pc->rels_seen && (pc->times_seen || 2 < (yyvsp[(1) - (1)].textintval).digits))
+ pc->year = (yyvsp[(1) - (1)].textintval);
+ else
+ {
+ if (4 < (yyvsp[(1) - (1)].textintval).digits)
+ {
+ pc->dates_seen++;
+ pc->day = (yyvsp[(1) - (1)].textintval).value % 100;
+ pc->month = ((yyvsp[(1) - (1)].textintval).value / 100) % 100;
+ pc->year.value = (yyvsp[(1) - (1)].textintval).value / 10000;
+ pc->year.digits = (yyvsp[(1) - (1)].textintval).digits - 4;
+ }
+ else
+ {
+ pc->times_seen++;
+ if ((yyvsp[(1) - (1)].textintval).digits <= 2)
+ {
+ pc->hour = (yyvsp[(1) - (1)].textintval).value;
+ pc->minutes = 0;
+ }
+ else
+ {
+ pc->hour = (yyvsp[(1) - (1)].textintval).value / 100;
+ pc->minutes = (yyvsp[(1) - (1)].textintval).value % 100;
+ }
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = MER24;
+ }
+ }
+ }
+ break;
+
+ case 75:
+#line 583 "getdate.y"
+ { (yyval.intval) = -1; }
+ break;
+
+ case 76:
+#line 585 "getdate.y"
+ { (yyval.intval) = (yyvsp[(2) - (2)].textintval).value; }
+ break;
+
+ case 77:
+#line 590 "getdate.y"
+ { (yyval.intval) = MER24; }
+ break;
+
+ case 78:
+#line 592 "getdate.y"
+ { (yyval.intval) = (yyvsp[(1) - (1)].intval); }
+ break;
+
+
+/* Line 1267 of yacc.c. */
+#line 2149 "getdate.c"
+ default: break;
+ }
+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if ! YYERROR_VERBOSE
+ yyerror (pc, YY_("syntax error"));
+#else
+ {
+ YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+ if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+ {
+ YYSIZE_T yyalloc = 2 * yysize;
+ if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+ yyalloc = YYSTACK_ALLOC_MAXIMUM;
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+ if (yymsg)
+ yymsg_alloc = yyalloc;
+ else
+ {
+ yymsg = yymsgbuf;
+ yymsg_alloc = sizeof yymsgbuf;
+ }
+ }
+
+ if (0 < yysize && yysize <= yymsg_alloc)
+ {
+ (void) yysyntax_error (yymsg, yystate, yychar);
+ yyerror (pc, yymsg);
+ }
+ else
+ {
+ yyerror (pc, YY_("syntax error"));
+ if (yysize != 0)
+ goto yyexhaustedlab;
+ }
+ }
+#endif
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse look-ahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval, pc);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse look-ahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+ /* Pacify compilers like GCC when the user code never invokes
+ YYERROR and the label yyerrorlab therefore never appears in user
+ code. */
+ if (/*CONSTCOND*/ 0)
+ goto yyerrorlab;
+
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (yyn != YYPACT_NINF)
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ yystos[yystate], yyvsp, pc);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ *++yyvsp = yylval;
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#ifndef yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (pc, YY_("memory exhausted"));
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+ if (yychar != YYEOF && yychar != YYEMPTY)
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval, pc);
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ yystos[*yyssp], yyvsp, pc);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+#endif
+ /* Make sure YYID is used. */
+ return YYID (yyresult);
+}
+
+
+#line 595 "getdate.y"
+
+
+static table const meridian_table[] =
+{
+ { "AM", tMERIDIAN, MERam },
+ { "A.M.", tMERIDIAN, MERam },
+ { "PM", tMERIDIAN, MERpm },
+ { "P.M.", tMERIDIAN, MERpm },
+ { NULL, 0, 0 }
+};
+
+static table const dst_table[] =
+{
+ { "DST", tDST, 0 }
+};
+
+static table const month_and_day_table[] =
+{
+ { "JANUARY", tMONTH, 1 },
+ { "FEBRUARY", tMONTH, 2 },
+ { "MARCH", tMONTH, 3 },
+ { "APRIL", tMONTH, 4 },
+ { "MAY", tMONTH, 5 },
+ { "JUNE", tMONTH, 6 },
+ { "JULY", tMONTH, 7 },
+ { "AUGUST", tMONTH, 8 },
+ { "SEPTEMBER",tMONTH, 9 },
+ { "SEPT", tMONTH, 9 },
+ { "OCTOBER", tMONTH, 10 },
+ { "NOVEMBER", tMONTH, 11 },
+ { "DECEMBER", tMONTH, 12 },
+ { "SUNDAY", tDAY, 0 },
+ { "MONDAY", tDAY, 1 },
+ { "TUESDAY", tDAY, 2 },
+ { "TUES", tDAY, 2 },
+ { "WEDNESDAY",tDAY, 3 },
+ { "WEDNES", tDAY, 3 },
+ { "THURSDAY", tDAY, 4 },
+ { "THUR", tDAY, 4 },
+ { "THURS", tDAY, 4 },
+ { "FRIDAY", tDAY, 5 },
+ { "SATURDAY", tDAY, 6 },
+ { NULL, 0, 0 }
+};
+
+static table const time_units_table[] =
+{
+ { "YEAR", tYEAR_UNIT, 1 },
+ { "MONTH", tMONTH_UNIT, 1 },
+ { "FORTNIGHT",tDAY_UNIT, 14 },
+ { "WEEK", tDAY_UNIT, 7 },
+ { "DAY", tDAY_UNIT, 1 },
+ { "HOUR", tHOUR_UNIT, 1 },
+ { "MINUTE", tMINUTE_UNIT, 1 },
+ { "MIN", tMINUTE_UNIT, 1 },
+ { "SECOND", tSEC_UNIT, 1 },
+ { "SEC", tSEC_UNIT, 1 },
+ { NULL, 0, 0 }
+};
+
+/* Assorted relative-time words. */
+static table const relative_time_table[] =
+{
+ { "TOMORROW", tDAY_UNIT, 1 },
+ { "YESTERDAY",tDAY_UNIT, -1 },
+ { "TODAY", tDAY_UNIT, 0 },
+ { "NOW", tDAY_UNIT, 0 },
+ { "LAST", tORDINAL, -1 },
+ { "THIS", tORDINAL, 0 },
+ { "NEXT", tORDINAL, 1 },
+ { "FIRST", tORDINAL, 1 },
+/*{ "SECOND", tORDINAL, 2 }, */
+ { "THIRD", tORDINAL, 3 },
+ { "FOURTH", tORDINAL, 4 },
+ { "FIFTH", tORDINAL, 5 },
+ { "SIXTH", tORDINAL, 6 },
+ { "SEVENTH", tORDINAL, 7 },
+ { "EIGHTH", tORDINAL, 8 },
+ { "NINTH", tORDINAL, 9 },
+ { "TENTH", tORDINAL, 10 },
+ { "ELEVENTH", tORDINAL, 11 },
+ { "TWELFTH", tORDINAL, 12 },
+ { "AGO", tAGO, 1 },
+ { NULL, 0, 0 }
+};
+
+/* The universal time zone table. These labels can be used even for
+ time stamps that would not otherwise be valid, e.g., GMT time
+ stamps in London during summer. */
+static table const universal_time_zone_table[] =
+{
+ { "GMT", tZONE, HOUR ( 0) }, /* Greenwich Mean */
+ { "UT", tZONE, HOUR ( 0) }, /* Universal (Coordinated) */
+ { "UTC", tZONE, HOUR ( 0) },
+ { NULL, 0, 0 }
+};
+
+/* The time zone table. This table is necessarily incomplete, as time
+ zone abbreviations are ambiguous; e.g. Australians interpret "EST"
+ as Eastern time in Australia, not as US Eastern Standard Time.
+ You cannot rely on getdate to handle arbitrary time zone
+ abbreviations; use numeric abbreviations like `-0500' instead. */
+static table const time_zone_table[] =
+{
+ { "WET", tZONE, HOUR ( 0) }, /* Western European */
+ { "WEST", tDAYZONE, HOUR ( 0) }, /* Western European Summer */
+ { "BST", tDAYZONE, HOUR ( 0) }, /* British Summer */
+ { "ART", tZONE, -HOUR ( 3) }, /* Argentina */
+ { "BRT", tZONE, -HOUR ( 3) }, /* Brazil */
+ { "BRST", tDAYZONE, -HOUR ( 3) }, /* Brazil Summer */
+ { "NST", tZONE, -(HOUR ( 3) + 30) }, /* Newfoundland Standard */
+ { "NDT", tDAYZONE,-(HOUR ( 3) + 30) }, /* Newfoundland Daylight */
+ { "AST", tZONE, -HOUR ( 4) }, /* Atlantic Standard */
+ { "ADT", tDAYZONE, -HOUR ( 4) }, /* Atlantic Daylight */
+ { "CLT", tZONE, -HOUR ( 4) }, /* Chile */
+ { "CLST", tDAYZONE, -HOUR ( 4) }, /* Chile Summer */
+ { "EST", tZONE, -HOUR ( 5) }, /* Eastern Standard */
+ { "EDT", tDAYZONE, -HOUR ( 5) }, /* Eastern Daylight */
+ { "CST", tZONE, -HOUR ( 6) }, /* Central Standard */
+ { "CDT", tDAYZONE, -HOUR ( 6) }, /* Central Daylight */
+ { "MST", tZONE, -HOUR ( 7) }, /* Mountain Standard */
+ { "MDT", tDAYZONE, -HOUR ( 7) }, /* Mountain Daylight */
+ { "PST", tZONE, -HOUR ( 8) }, /* Pacific Standard */
+ { "PDT", tDAYZONE, -HOUR ( 8) }, /* Pacific Daylight */
+ { "AKST", tZONE, -HOUR ( 9) }, /* Alaska Standard */
+ { "AKDT", tDAYZONE, -HOUR ( 9) }, /* Alaska Daylight */
+ { "HST", tZONE, -HOUR (10) }, /* Hawaii Standard */
+ { "HAST", tZONE, -HOUR (10) }, /* Hawaii-Aleutian Standard */
+ { "HADT", tDAYZONE, -HOUR (10) }, /* Hawaii-Aleutian Daylight */
+ { "SST", tZONE, -HOUR (12) }, /* Samoa Standard */
+ { "WAT", tZONE, HOUR ( 1) }, /* West Africa */
+ { "CET", tZONE, HOUR ( 1) }, /* Central European */
+ { "CEST", tDAYZONE, HOUR ( 1) }, /* Central European Summer */
+ { "MET", tZONE, HOUR ( 1) }, /* Middle European */
+ { "MEZ", tZONE, HOUR ( 1) }, /* Middle European */
+ { "MEST", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */
+ { "MESZ", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */
+ { "EET", tZONE, HOUR ( 2) }, /* Eastern European */
+ { "EEST", tDAYZONE, HOUR ( 2) }, /* Eastern European Summer */
+ { "CAT", tZONE, HOUR ( 2) }, /* Central Africa */
+ { "SAST", tZONE, HOUR ( 2) }, /* South Africa Standard */
+ { "EAT", tZONE, HOUR ( 3) }, /* East Africa */
+ { "MSK", tZONE, HOUR ( 3) }, /* Moscow */
+ { "MSD", tDAYZONE, HOUR ( 3) }, /* Moscow Daylight */
+ { "IST", tZONE, (HOUR ( 5) + 30) }, /* India Standard */
+ { "SGT", tZONE, HOUR ( 8) }, /* Singapore */
+ { "KST", tZONE, HOUR ( 9) }, /* Korea Standard */
+ { "JST", tZONE, HOUR ( 9) }, /* Japan Standard */
+ { "GST", tZONE, HOUR (10) }, /* Guam Standard */
+ { "NZST", tZONE, HOUR (12) }, /* New Zealand Standard */
+ { "NZDT", tDAYZONE, HOUR (12) }, /* New Zealand Daylight */
+ { NULL, 0, 0 }
+};
+
+/* Military time zone table. */
+static table const military_table[] =
+{
+ { "A", tZONE, -HOUR ( 1) },
+ { "B", tZONE, -HOUR ( 2) },
+ { "C", tZONE, -HOUR ( 3) },
+ { "D", tZONE, -HOUR ( 4) },
+ { "E", tZONE, -HOUR ( 5) },
+ { "F", tZONE, -HOUR ( 6) },
+ { "G", tZONE, -HOUR ( 7) },
+ { "H", tZONE, -HOUR ( 8) },
+ { "I", tZONE, -HOUR ( 9) },
+ { "K", tZONE, -HOUR (10) },
+ { "L", tZONE, -HOUR (11) },
+ { "M", tZONE, -HOUR (12) },
+ { "N", tZONE, HOUR ( 1) },
+ { "O", tZONE, HOUR ( 2) },
+ { "P", tZONE, HOUR ( 3) },
+ { "Q", tZONE, HOUR ( 4) },
+ { "R", tZONE, HOUR ( 5) },
+ { "S", tZONE, HOUR ( 6) },
+ { "T", tZONE, HOUR ( 7) },
+ { "U", tZONE, HOUR ( 8) },
+ { "V", tZONE, HOUR ( 9) },
+ { "W", tZONE, HOUR (10) },
+ { "X", tZONE, HOUR (11) },
+ { "Y", tZONE, HOUR (12) },
+ { "Z", tZONE, HOUR ( 0) },
+ { NULL, 0, 0 }
+};
+
+
+
+/* Convert a time zone expressed as HH:MM into an integer count of
+ minutes. If MM is negative, then S is of the form HHMM and needs
+ to be picked apart; otherwise, S is of the form HH. */
+
+static long int
+time_zone_hhmm (textint s, long int mm)
+{
+ if (mm < 0)
+ return (s.value / 100) * 60 + s.value % 100;
+ else
+ return s.value * 60 + (s.negative ? -mm : mm);
+}
+
+static int
+to_hour (long int hours, int meridian)
+{
+ switch (meridian)
+ {
+ default: /* Pacify GCC. */
+ case MER24:
+ return 0 <= hours && hours < 24 ? hours : -1;
+ case MERam:
+ return 0 < hours && hours < 12 ? hours : hours == 12 ? 0 : -1;
+ case MERpm:
+ return 0 < hours && hours < 12 ? hours + 12 : hours == 12 ? 12 : -1;
+ }
+}
+
+static long int
+to_year (textint textyear)
+{
+ long int year = textyear.value;
+
+ if (year < 0)
+ year = -year;
+
+ /* XPG4 suggests that years 00-68 map to 2000-2068, and
+ years 69-99 map to 1969-1999. */
+ else if (textyear.digits == 2)
+ year += year < 69 ? 2000 : 1900;
+
+ return year;
+}
+
+static table const *
+lookup_zone (parser_control const *pc, char const *name)
+{
+ table const *tp;
+
+ for (tp = universal_time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ /* Try local zone abbreviations before those in time_zone_table, as
+ the local ones are more likely to be right. */
+ for (tp = pc->local_time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ for (tp = time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ return NULL;
+}
+
+#if ! HAVE_TM_GMTOFF
+/* Yield the difference between *A and *B,
+ measured in seconds, ignoring leap seconds.
+ The body of this function is taken directly from the GNU C Library;
+ see src/strftime.c. */
+static long int
+tm_diff (struct tm const *a, struct tm const *b)
+{
+ /* Compute intervening leap days correctly even if year is negative.
+ Take care to avoid int overflow in leap day calculations. */
+ int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3);
+ int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3);
+ int a100 = a4 / 25 - (a4 % 25 < 0);
+ int b100 = b4 / 25 - (b4 % 25 < 0);
+ int a400 = SHR (a100, 2);
+ int b400 = SHR (b100, 2);
+ int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+ long int ayear = a->tm_year;
+ long int years = ayear - b->tm_year;
+ long int days = (365 * years + intervening_leap_days
+ + (a->tm_yday - b->tm_yday));
+ return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
+ + (a->tm_min - b->tm_min))
+ + (a->tm_sec - b->tm_sec));
+}
+#endif /* ! HAVE_TM_GMTOFF */
+
+static table const *
+lookup_word (parser_control const *pc, char *word)
+{
+ char *p;
+ char *q;
+ size_t wordlen;
+ table const *tp;
+ bool period_found;
+ bool abbrev;
+
+ /* Make it uppercase. */
+ for (p = word; *p; p++)
+ {
+ unsigned char ch = *p;
+ *p = toupper (ch);
+ }
+
+ for (tp = meridian_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* See if we have an abbreviation for a month. */
+ wordlen = strlen (word);
+ abbrev = wordlen == 3 || (wordlen == 4 && word[3] == '.');
+
+ for (tp = month_and_day_table; tp->name; tp++)
+ if ((abbrev ? strncmp (word, tp->name, 3) : strcmp (word, tp->name)) == 0)
+ return tp;
+
+ if ((tp = lookup_zone (pc, word)))
+ return tp;
+
+ if (strcmp (word, dst_table[0].name) == 0)
+ return dst_table;
+
+ for (tp = time_units_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* Strip off any plural and try the units table again. */
+ if (word[wordlen - 1] == 'S')
+ {
+ word[wordlen - 1] = '\0';
+ for (tp = time_units_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+ word[wordlen - 1] = 'S'; /* For "this" in relative_time_table. */
+ }
+
+ for (tp = relative_time_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* Military time zones. */
+ if (wordlen == 1)
+ for (tp = military_table; tp->name; tp++)
+ if (word[0] == tp->name[0])
+ return tp;
+
+ /* Drop out any periods and try the time zone table again. */
+ for (period_found = false, p = q = word; (*p = *q); q++)
+ if (*q == '.')
+ period_found = true;
+ else
+ p++;
+ if (period_found && (tp = lookup_zone (pc, word)))
+ return tp;
+
+ return NULL;
+}
+
+static int
+yylex (YYSTYPE *lvalp, parser_control *pc)
+{
+ unsigned char c;
+ size_t count;
+
+ for (;;)
+ {
+ while (c = *pc->input, isspace (c))
+ pc->input++;
+
+ if (ISDIGIT (c) || c == '-' || c == '+')
+ {
+ char const *p;
+ int sign;
+ unsigned long int value;
+ if (c == '-' || c == '+')
+ {
+ sign = c == '-' ? -1 : 1;
+ while (c = *++pc->input, isspace (c))
+ continue;
+ if (! ISDIGIT (c))
+ /* skip the '-' sign */
+ continue;
+ }
+ else
+ sign = 0;
+ p = pc->input;
+ for (value = 0; ; value *= 10)
+ {
+ unsigned long int value1 = value + (c - '0');
+ if (value1 < value)
+ return '?';
+ value = value1;
+ c = *++p;
+ if (! ISDIGIT (c))
+ break;
+ if (ULONG_MAX / 10 < value)
+ return '?';
+ }
+ if ((c == '.' || c == ',') && ISDIGIT (p[1]))
+ {
+ time_t s;
+ int ns;
+ int digits;
+ unsigned long int value1;
+
+ /* Check for overflow when converting value to time_t. */
+ if (sign < 0)
+ {
+ s = - value;
+ if (0 < s)
+ return '?';
+ value1 = -s;
+ }
+ else
+ {
+ s = value;
+ if (s < 0)
+ return '?';
+ value1 = s;
+ }
+ if (value != value1)
+ return '?';
+
+ /* Accumulate fraction, to ns precision. */
+ p++;
+ ns = *p++ - '0';
+ for (digits = 2; digits <= LOG10_BILLION; digits++)
+ {
+ ns *= 10;
+ if (ISDIGIT (*p))
+ ns += *p++ - '0';
+ }
+
+ /* Skip excess digits, truncating toward -Infinity. */
+ if (sign < 0)
+ for (; ISDIGIT (*p); p++)
+ if (*p != '0')
+ {
+ ns++;
+ break;
+ }
+ while (ISDIGIT (*p))
+ p++;
+
+ /* Adjust to the timespec convention, which is that
+ tv_nsec is always a positive offset even if tv_sec is
+ negative. */
+ if (sign < 0 && ns)
+ {
+ s--;
+ if (! (s < 0))
+ return '?';
+ ns = BILLION - ns;
+ }
+
+ lvalp->timespec.tv_sec = s;
+ lvalp->timespec.tv_nsec = ns;
+ pc->input = p;
+ return sign ? tSDECIMAL_NUMBER : tUDECIMAL_NUMBER;
+ }
+ else
+ {
+ lvalp->textintval.negative = sign < 0;
+ if (sign < 0)
+ {
+ lvalp->textintval.value = - value;
+ if (0 < lvalp->textintval.value)
+ return '?';
+ }
+ else
+ {
+ lvalp->textintval.value = value;
+ if (lvalp->textintval.value < 0)
+ return '?';
+ }
+ lvalp->textintval.digits = p - pc->input;
+ pc->input = p;
+ return sign ? tSNUMBER : tUNUMBER;
+ }
+ }
+
+ if (isalpha (c))
+ {
+ char buff[20];
+ char *p = buff;
+ table const *tp;
+
+ do
+ {
+ if (p < buff + sizeof buff - 1)
+ *p++ = c;
+ c = *++pc->input;
+ }
+ while (isalpha (c) || c == '.');
+
+ *p = '\0';
+ tp = lookup_word (pc, buff);
+ if (! tp)
+ return '?';
+ lvalp->intval = tp->value;
+ return tp->type;
+ }
+
+ if (c != '(')
+ return *pc->input++;
+ count = 0;
+ do
+ {
+ c = *pc->input++;
+ if (c == '\0')
+ return c;
+ if (c == '(')
+ count++;
+ else if (c == ')')
+ count--;
+ }
+ while (count != 0);
+ }
+}
+
+/* Do nothing if the parser reports an error. */
+static int
+yyerror (parser_control const *pc ATTRIBUTE_UNUSED,
+ char const *s ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
+/* If *TM0 is the old and *TM1 is the new value of a struct tm after
+ passing it to mktime, return true if it's OK that mktime returned T.
+ It's not OK if *TM0 has out-of-range members. */
+
+static bool
+mktime_ok (struct tm const *tm0, struct tm const *tm1, time_t t)
+{
+ if (t == (time_t) -1)
+ {
+ /* Guard against falsely reporting an error when parsing a time
+ stamp that happens to equal (time_t) -1, on a host that
+ supports such a time stamp. */
+ tm1 = localtime (&t);
+ if (!tm1)
+ return false;
+ }
+
+ return ! ((tm0->tm_sec ^ tm1->tm_sec)
+ | (tm0->tm_min ^ tm1->tm_min)
+ | (tm0->tm_hour ^ tm1->tm_hour)
+ | (tm0->tm_mday ^ tm1->tm_mday)
+ | (tm0->tm_mon ^ tm1->tm_mon)
+ | (tm0->tm_year ^ tm1->tm_year));
+}
+
+/* A reasonable upper bound for the size of ordinary TZ strings.
+ Use heap allocation if TZ's length exceeds this. */
+enum { TZBUFSIZE = 100 };
+
+/* Return a copy of TZ, stored in TZBUF if it fits, and heap-allocated
+ otherwise. */
+static char *
+get_tz (char tzbuf[TZBUFSIZE])
+{
+ char *tz = getenv ("TZ");
+ if (tz)
+ {
+ size_t tzsize = strlen (tz) + 1;
+ tz = (tzsize <= TZBUFSIZE
+ ? memcpy (tzbuf, tz, tzsize)
+ : xmemdup (tz, tzsize));
+ }
+ return tz;
+}
+
+/* Parse a date/time string, storing the resulting time value into *RESULT.
+ The string itself is pointed to by P. Return true if successful.
+ P can be an incomplete or relative time specification; if so, use
+ *NOW as the basis for the returned time. */
+bool
+get_date (struct timespec *result, char const *p, struct timespec const *now)
+{
+ time_t Start;
+ long int Start_ns;
+ struct tm const *tmp;
+ struct tm tm;
+ struct tm tm0;
+ parser_control pc;
+ struct timespec gettime_buffer;
+ unsigned char c;
+ bool tz_was_altered = false;
+ char *tz0 = NULL;
+ char tz0buf[TZBUFSIZE];
+ bool ok = true;
+
+ if (! now)
+ {
+ gettime (&gettime_buffer);
+ now = &gettime_buffer;
+ }
+
+ Start = now->tv_sec;
+ Start_ns = now->tv_nsec;
+
+ tmp = localtime (&now->tv_sec);
+ if (! tmp)
+ return false;
+
+ while (c = *p, isspace (c))
+ p++;
+
+ if (strncmp (p, "TZ=\"", 4) == 0)
+ {
+ char const *tzbase = p + 4;
+ size_t tzsize = 1;
+ char const *s;
+
+ for (s = tzbase; *s; s++, tzsize++)
+ if (*s == '\\')
+ {
+ s++;
+ if (! (*s == '\\' || *s == '"'))
+ break;
+ }
+ else if (*s == '"')
+ {
+ char *z;
+ char *tz1;
+ char tz1buf[TZBUFSIZE];
+ bool large_tz = TZBUFSIZE < tzsize;
+ bool setenv_ok;
+ tz0 = get_tz (tz0buf);
+ z = tz1 = large_tz ? xmalloc (tzsize) : tz1buf;
+ for (s = tzbase; *s != '"'; s++)
+ *z++ = *(s += *s == '\\');
+ *z = '\0';
+ setenv_ok = setenv ("TZ", tz1, 1) == 0;
+ if (large_tz)
+ free (tz1);
+ if (!setenv_ok)
+ goto fail;
+ tz_was_altered = true;
+ p = s + 1;
+ }
+ }
+
+ pc.input = p;
+ pc.year.value = tmp->tm_year;
+ pc.year.value += TM_YEAR_BASE;
+ pc.year.digits = 0;
+ pc.month = tmp->tm_mon + 1;
+ pc.day = tmp->tm_mday;
+ pc.hour = tmp->tm_hour;
+ pc.minutes = tmp->tm_min;
+ pc.seconds.tv_sec = tmp->tm_sec;
+ pc.seconds.tv_nsec = Start_ns;
+ tm.tm_isdst = tmp->tm_isdst;
+
+ pc.meridian = MER24;
+ pc.rel = RELATIVE_TIME_0;
+ pc.timespec_seen = false;
+ pc.rels_seen = false;
+ pc.dates_seen = 0;
+ pc.days_seen = 0;
+ pc.times_seen = 0;
+ pc.local_zones_seen = 0;
+ pc.dsts_seen = 0;
+ pc.zones_seen = 0;
+
+#if HAVE_STRUCT_TM_TM_ZONE
+ pc.local_time_zone_table[0].name = tmp->tm_zone;
+ pc.local_time_zone_table[0].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[0].value = tmp->tm_isdst;
+ pc.local_time_zone_table[1].name = NULL;
+
+ /* Probe the names used in the next three calendar quarters, looking
+ for a tm_isdst different from the one we already have. */
+ {
+ int quarter;
+ for (quarter = 1; quarter <= 3; quarter++)
+ {
+ time_t probe = Start + quarter * (90 * 24 * 60 * 60);
+ struct tm const *probe_tm = localtime (&probe);
+ if (probe_tm && probe_tm->tm_zone
+ && probe_tm->tm_isdst != pc.local_time_zone_table[0].value)
+ {
+ {
+ pc.local_time_zone_table[1].name = probe_tm->tm_zone;
+ pc.local_time_zone_table[1].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[1].value = probe_tm->tm_isdst;
+ pc.local_time_zone_table[2].name = NULL;
+ }
+ break;
+ }
+ }
+ }
+#else
+#if HAVE_TZNAME
+ {
+# ifndef tzname
+ extern char *tzname[];
+# endif
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ pc.local_time_zone_table[i].name = tzname[i];
+ pc.local_time_zone_table[i].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[i].value = i;
+ }
+ pc.local_time_zone_table[i].name = NULL;
+ }
+#else
+ pc.local_time_zone_table[0].name = NULL;
+#endif
+#endif
+
+ if (pc.local_time_zone_table[0].name && pc.local_time_zone_table[1].name
+ && ! strcmp (pc.local_time_zone_table[0].name,
+ pc.local_time_zone_table[1].name))
+ {
+ /* This locale uses the same abbrevation for standard and
+ daylight times. So if we see that abbreviation, we don't
+ know whether it's daylight time. */
+ pc.local_time_zone_table[0].value = -1;
+ pc.local_time_zone_table[1].name = NULL;
+ }
+
+ if (yyparse (&pc) != 0)
+ goto fail;
+
+ if (pc.timespec_seen)
+ *result = pc.seconds;
+ else
+ {
+ if (1 < (pc.times_seen | pc.dates_seen | pc.days_seen | pc.dsts_seen
+ | (pc.local_zones_seen + pc.zones_seen)))
+ goto fail;
+
+ tm.tm_year = to_year (pc.year) - TM_YEAR_BASE;
+ tm.tm_mon = pc.month - 1;
+ tm.tm_mday = pc.day;
+ if (pc.times_seen || (pc.rels_seen && ! pc.dates_seen && ! pc.days_seen))
+ {
+ tm.tm_hour = to_hour (pc.hour, pc.meridian);
+ if (tm.tm_hour < 0)
+ goto fail;
+ tm.tm_min = pc.minutes;
+ tm.tm_sec = pc.seconds.tv_sec;
+ }
+ else
+ {
+ tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+ pc.seconds.tv_nsec = 0;
+ }
+
+ /* Let mktime deduce tm_isdst if we have an absolute time stamp. */
+ if (pc.dates_seen | pc.days_seen | pc.times_seen)
+ tm.tm_isdst = -1;
+
+ /* But if the input explicitly specifies local time with or without
+ DST, give mktime that information. */
+ if (pc.local_zones_seen)
+ tm.tm_isdst = pc.local_isdst;
+
+ tm0 = tm;
+
+ Start = mktime (&tm);
+
+ if (! mktime_ok (&tm0, &tm, Start))
+ {
+ if (! pc.zones_seen)
+ goto fail;
+ else
+ {
+ /* Guard against falsely reporting errors near the time_t
+ boundaries when parsing times in other time zones. For
+ example, suppose the input string "1969-12-31 23:00:00 -0100",
+ the current time zone is 8 hours ahead of UTC, and the min
+ time_t value is 1970-01-01 00:00:00 UTC. Then the min
+ localtime value is 1970-01-01 08:00:00, and mktime will
+ therefore fail on 1969-12-31 23:00:00. To work around the
+ problem, set the time zone to 1 hour behind UTC temporarily
+ by setting TZ="XXX1:00" and try mktime again. */
+
+ long int time_zone = pc.time_zone;
+ long int abs_time_zone = time_zone < 0 ? - time_zone : time_zone;
+ long int abs_time_zone_hour = abs_time_zone / 60;
+ int abs_time_zone_min = abs_time_zone % 60;
+ char tz1buf[sizeof "XXX+0:00"
+ + sizeof pc.time_zone * CHAR_BIT / 3];
+ if (!tz_was_altered)
+ tz0 = get_tz (tz0buf);
+ sprintf (tz1buf, "XXX%s%ld:%02d", "-" + (time_zone < 0),
+ abs_time_zone_hour, abs_time_zone_min);
+ if (setenv ("TZ", tz1buf, 1) != 0)
+ goto fail;
+ tz_was_altered = true;
+ tm = tm0;
+ Start = mktime (&tm);
+ if (! mktime_ok (&tm0, &tm, Start))
+ goto fail;
+ }
+ }
+
+ if (pc.days_seen && ! pc.dates_seen)
+ {
+ tm.tm_mday += ((pc.day_number - tm.tm_wday + 7) % 7
+ + 7 * (pc.day_ordinal - (0 < pc.day_ordinal)));
+ tm.tm_isdst = -1;
+ Start = mktime (&tm);
+ if (Start == (time_t) -1)
+ goto fail;
+ }
+
+ if (pc.zones_seen)
+ {
+ long int delta = pc.time_zone * 60;
+ time_t t1;
+#ifdef HAVE_TM_GMTOFF
+ delta -= tm.tm_gmtoff;
+#else
+ time_t t = Start;
+ struct tm const *gmt = gmtime (&t);
+ if (! gmt)
+ goto fail;
+ delta -= tm_diff (&tm, gmt);
+#endif
+ t1 = Start - delta;
+ if ((Start < t1) != (delta < 0))
+ goto fail; /* time_t overflow */
+ Start = t1;
+ }
+
+ /* Add relative date. */
+ if (pc.rel.year | pc.rel.month | pc.rel.day)
+ {
+ int year = tm.tm_year + pc.rel.year;
+ int month = tm.tm_mon + pc.rel.month;
+ int day = tm.tm_mday + pc.rel.day;
+ if (((year < tm.tm_year) ^ (pc.rel.year < 0))
+ | ((month < tm.tm_mon) ^ (pc.rel.month < 0))
+ | ((day < tm.tm_mday) ^ (pc.rel.day < 0)))
+ goto fail;
+ tm.tm_year = year;
+ tm.tm_mon = month;
+ tm.tm_mday = day;
+ tm.tm_hour = tm0.tm_hour;
+ tm.tm_min = tm0.tm_min;
+ tm.tm_sec = tm0.tm_sec;
+ tm.tm_isdst = tm0.tm_isdst;
+ Start = mktime (&tm);
+ if (Start == (time_t) -1)
+ goto fail;
+ }
+
+ /* Add relative hours, minutes, and seconds. On hosts that support
+ leap seconds, ignore the possibility of leap seconds; e.g.,
+ "+ 10 minutes" adds 600 seconds, even if one of them is a
+ leap second. Typically this is not what the user wants, but it's
+ too hard to do it the other way, because the time zone indicator
+ must be applied before relative times, and if mktime is applied
+ again the time zone will be lost. */
+ {
+ long int sum_ns = pc.seconds.tv_nsec + pc.rel.ns;
+ long int normalized_ns = (sum_ns % BILLION + BILLION) % BILLION;
+ time_t t0 = Start;
+ long int d1 = 60 * 60 * pc.rel.hour;
+ time_t t1 = t0 + d1;
+ long int d2 = 60 * pc.rel.minutes;
+ time_t t2 = t1 + d2;
+ long int d3 = pc.rel.seconds;
+ time_t t3 = t2 + d3;
+ long int d4 = (sum_ns - normalized_ns) / BILLION;
+ time_t t4 = t3 + d4;
+
+ if ((d1 / (60 * 60) ^ pc.rel.hour)
+ | (d2 / 60 ^ pc.rel.minutes)
+ | ((t1 < t0) ^ (d1 < 0))
+ | ((t2 < t1) ^ (d2 < 0))
+ | ((t3 < t2) ^ (d3 < 0))
+ | ((t4 < t3) ^ (d4 < 0)))
+ goto fail;
+
+ result->tv_sec = t4;
+ result->tv_nsec = normalized_ns;
+ }
+ }
+
+ goto done;
+
+ fail:
+ ok = false;
+ done:
+ if (tz_was_altered)
+ ok &= (tz0 ? setenv ("TZ", tz0, 1) : unsetenv ("TZ")) == 0;
+ if (tz0 != tz0buf)
+ free (tz0);
+ return ok;
+}
+
+#if TEST
+
+int
+main (int ac, char **av)
+{
+ char buff[BUFSIZ];
+
+ printf ("Enter date, or blank line to exit.\n\t> ");
+ fflush (stdout);
+
+ buff[BUFSIZ - 1] = '\0';
+ while (fgets (buff, BUFSIZ - 1, stdin) && buff[0])
+ {
+ struct timespec d;
+ struct tm const *tm;
+ if (! get_date (&d, buff, NULL))
+ printf ("Bad format - couldn't convert.\n");
+ else if (! (tm = localtime (&d.tv_sec)))
+ {
+ long int sec = d.tv_sec;
+ printf ("localtime (%ld) failed\n", sec);
+ }
+ else
+ {
+ int ns = d.tv_nsec;
+ printf ("%04ld-%02d-%02d %02d:%02d:%02d.%09d\n",
+ tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec, ns);
+ }
+ printf ("\t> ");
+ fflush (stdout);
+ }
+ return 0;
+}
+#endif /* TEST */
+
diff --git a/lib/getdate.h b/lib/getdate.h
new file mode 100644
index 0000000..142231e
--- /dev/null
+++ b/lib/getdate.h
@@ -0,0 +1,23 @@
+/* Parse a string into an internal time stamp.
+
+ Copyright (C) 1995, 1997, 1998, 2003, 2004, 2007 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <stdbool.h>
+#include <time.h>
+
+bool get_date (struct timespec *, char const *, struct timespec const *);
diff --git a/lib/getdate.y b/lib/getdate.y
new file mode 100644
index 0000000..cbf3ca1
--- /dev/null
+++ b/lib/getdate.y
@@ -0,0 +1,1520 @@
+%{
+/* Parse a string into an internal time stamp.
+
+ Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Originally written by Steven M. Bellovin <smb@research.att.com> while
+ at the University of North Carolina at Chapel Hill. Later tweaked by
+ a couple of people on Usenet. Completely overhauled by Rich $alz
+ <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990.
+
+ Modified by Paul Eggert <eggert@twinsun.com> in August 1999 to do
+ the right thing about local DST. Also modified by Paul Eggert
+ <eggert@cs.ucla.edu> in February 2004 to support
+ nanosecond-resolution time stamps, and in October 2004 to support
+ TZ strings in dates. */
+
+/* FIXME: Check for arithmetic overflow in all cases, not just
+ some of them. */
+
+#include <config.h>
+
+#include "getdate.h"
+#include "timespec.h"
+
+/* There's no need to extend the stack, so there's no need to involve
+ alloca. */
+#define YYSTACK_USE_ALLOCA 0
+
+/* Tell Bison how much stack space is needed. 20 should be plenty for
+ this grammar, which is not right recursive. Beware setting it too
+ high, since that might cause problems on machines whose
+ implementations have lame stack-overflow checking. */
+#define YYMAXDEPTH 20
+#define YYINITDEPTH YYMAXDEPTH
+
+/* Since the code of getdate.y is not included in the Emacs executable
+ itself, there is no need to #define static in this file. Even if
+ the code were included in the Emacs executable, it probably
+ wouldn't do any harm to #undef it here; this will only cause
+ problems if we try to write to a static variable, which I don't
+ think this code needs to do. */
+#ifdef emacs
+# undef static
+#endif
+
+#include <ctype.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "setenv.h"
+#include "xalloc.h"
+
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+#ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
+# define __attribute__(x)
+# endif
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. A and B should be free of side
+ effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
+ INT_BITS is the number of useful bits in an int. GNU code can
+ assume that 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. */
+#define SHR(a, b) \
+ (-1 >> 1 == -1 \
+ ? (a) >> (b) \
+ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
+
+#define EPOCH_YEAR 1970
+#define TM_YEAR_BASE 1900
+
+#define HOUR(x) ((x) * 60)
+
+/* An integer value, and the number of digits in its textual
+ representation. */
+typedef struct
+{
+ bool negative;
+ long int value;
+ size_t digits;
+} textint;
+
+/* An entry in the lexical lookup table. */
+typedef struct
+{
+ char const *name;
+ int type;
+ int value;
+} table;
+
+/* Meridian: am, pm, or 24-hour style. */
+enum { MERam, MERpm, MER24 };
+
+enum { BILLION = 1000000000, LOG10_BILLION = 9 };
+
+/* Relative times. */
+typedef struct
+{
+ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */
+ long int year;
+ long int month;
+ long int day;
+ long int hour;
+ long int minutes;
+ long int seconds;
+ long int ns;
+} relative_time;
+
+#if HAVE_COMPOUND_LITERALS
+# define RELATIVE_TIME_0 ((relative_time) { 0, 0, 0, 0, 0, 0, 0 })
+#else
+static relative_time const RELATIVE_TIME_0;
+#endif
+
+/* Information passed to and from the parser. */
+typedef struct
+{
+ /* The input string remaining to be parsed. */
+ const char *input;
+
+ /* N, if this is the Nth Tuesday. */
+ long int day_ordinal;
+
+ /* Day of week; Sunday is 0. */
+ int day_number;
+
+ /* tm_isdst flag for the local zone. */
+ int local_isdst;
+
+ /* Time zone, in minutes east of UTC. */
+ long int time_zone;
+
+ /* Style used for time. */
+ int meridian;
+
+ /* Gregorian year, month, day, hour, minutes, seconds, and nanoseconds. */
+ textint year;
+ long int month;
+ long int day;
+ long int hour;
+ long int minutes;
+ struct timespec seconds; /* includes nanoseconds */
+
+ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */
+ relative_time rel;
+
+ /* Presence or counts of nonterminals of various flavors parsed so far. */
+ bool timespec_seen;
+ bool rels_seen;
+ size_t dates_seen;
+ size_t days_seen;
+ size_t local_zones_seen;
+ size_t dsts_seen;
+ size_t times_seen;
+ size_t zones_seen;
+
+ /* Table of local time zone abbrevations, terminated by a null entry. */
+ table local_time_zone_table[3];
+} parser_control;
+
+union YYSTYPE;
+static int yylex (union YYSTYPE *, parser_control *);
+static int yyerror (parser_control const *, char const *);
+static long int time_zone_hhmm (textint, long int);
+
+%}
+
+/* We want a reentrant parser, even if the TZ manipulation and the calls to
+ localtime and gmtime are not reentrant. */
+%pure-parser
+%parse-param { parser_control *pc }
+%lex-param { parser_control *pc }
+
+/* This grammar has 20 shift/reduce conflicts. */
+%expect 20
+
+%union
+{
+ long int intval;
+ textint textintval;
+ struct timespec timespec;
+ relative_time rel;
+}
+
+%token tAGO tDST
+
+%token tYEAR_UNIT tMONTH_UNIT tHOUR_UNIT tMINUTE_UNIT tSEC_UNIT
+%token <intval> tDAY_UNIT
+
+%token <intval> tDAY tDAYZONE tLOCAL_ZONE tMERIDIAN
+%token <intval> tMONTH tORDINAL tZONE
+
+%token <textintval> tSNUMBER tUNUMBER
+%token <timespec> tSDECIMAL_NUMBER tUDECIMAL_NUMBER
+
+%type <intval> o_colon_minutes o_merid
+%type <timespec> seconds signed_seconds unsigned_seconds
+
+%type <rel> relunit relunit_snumber
+
+%%
+
+spec:
+ timespec
+ | items
+ ;
+
+timespec:
+ '@' seconds
+ {
+ pc->seconds = $2;
+ pc->timespec_seen = true;
+ }
+ ;
+
+items:
+ /* empty */
+ | items item
+ ;
+
+item:
+ time
+ { pc->times_seen++; }
+ | local_zone
+ { pc->local_zones_seen++; }
+ | zone
+ { pc->zones_seen++; }
+ | date
+ { pc->dates_seen++; }
+ | day
+ { pc->days_seen++; }
+ | rel
+ { pc->rels_seen = true; }
+ | number
+ ;
+
+time:
+ tUNUMBER tMERIDIAN
+ {
+ pc->hour = $1.value;
+ pc->minutes = 0;
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = $2;
+ }
+ | tUNUMBER ':' tUNUMBER o_merid
+ {
+ pc->hour = $1.value;
+ pc->minutes = $3.value;
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = $4;
+ }
+ | tUNUMBER ':' tUNUMBER tSNUMBER o_colon_minutes
+ {
+ pc->hour = $1.value;
+ pc->minutes = $3.value;
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = MER24;
+ pc->zones_seen++;
+ pc->time_zone = time_zone_hhmm ($4, $5);
+ }
+ | tUNUMBER ':' tUNUMBER ':' unsigned_seconds o_merid
+ {
+ pc->hour = $1.value;
+ pc->minutes = $3.value;
+ pc->seconds = $5;
+ pc->meridian = $6;
+ }
+ | tUNUMBER ':' tUNUMBER ':' unsigned_seconds tSNUMBER o_colon_minutes
+ {
+ pc->hour = $1.value;
+ pc->minutes = $3.value;
+ pc->seconds = $5;
+ pc->meridian = MER24;
+ pc->zones_seen++;
+ pc->time_zone = time_zone_hhmm ($6, $7);
+ }
+ ;
+
+local_zone:
+ tLOCAL_ZONE
+ {
+ pc->local_isdst = $1;
+ pc->dsts_seen += (0 < $1);
+ }
+ | tLOCAL_ZONE tDST
+ {
+ pc->local_isdst = 1;
+ pc->dsts_seen += (0 < $1) + 1;
+ }
+ ;
+
+zone:
+ tZONE
+ { pc->time_zone = $1; }
+ | tZONE relunit_snumber
+ { pc->time_zone = $1;
+ pc->rel.ns += $2.ns;
+ pc->rel.seconds += $2.seconds;
+ pc->rel.minutes += $2.minutes;
+ pc->rel.hour += $2.hour;
+ pc->rel.day += $2.day;
+ pc->rel.month += $2.month;
+ pc->rel.year += $2.year;
+ pc->rels_seen = true; }
+ | tZONE tSNUMBER o_colon_minutes
+ { pc->time_zone = $1 + time_zone_hhmm ($2, $3); }
+ | tDAYZONE
+ { pc->time_zone = $1 + 60; }
+ | tZONE tDST
+ { pc->time_zone = $1 + 60; }
+ ;
+
+day:
+ tDAY
+ {
+ pc->day_ordinal = 1;
+ pc->day_number = $1;
+ }
+ | tDAY ','
+ {
+ pc->day_ordinal = 1;
+ pc->day_number = $1;
+ }
+ | tORDINAL tDAY
+ {
+ pc->day_ordinal = $1;
+ pc->day_number = $2;
+ }
+ | tUNUMBER tDAY
+ {
+ pc->day_ordinal = $1.value;
+ pc->day_number = $2;
+ }
+ ;
+
+date:
+ tUNUMBER '/' tUNUMBER
+ {
+ pc->month = $1.value;
+ pc->day = $3.value;
+ }
+ | tUNUMBER '/' tUNUMBER '/' tUNUMBER
+ {
+ /* Interpret as YYYY/MM/DD if the first value has 4 or more digits,
+ otherwise as MM/DD/YY.
+ The goal in recognizing YYYY/MM/DD is solely to support legacy
+ machine-generated dates like those in an RCS log listing. If
+ you want portability, use the ISO 8601 format. */
+ if (4 <= $1.digits)
+ {
+ pc->year = $1;
+ pc->month = $3.value;
+ pc->day = $5.value;
+ }
+ else
+ {
+ pc->month = $1.value;
+ pc->day = $3.value;
+ pc->year = $5;
+ }
+ }
+ | tUNUMBER tSNUMBER tSNUMBER
+ {
+ /* ISO 8601 format. YYYY-MM-DD. */
+ pc->year = $1;
+ pc->month = -$2.value;
+ pc->day = -$3.value;
+ }
+ | tUNUMBER tMONTH tSNUMBER
+ {
+ /* e.g. 17-JUN-1992. */
+ pc->day = $1.value;
+ pc->month = $2;
+ pc->year.value = -$3.value;
+ pc->year.digits = $3.digits;
+ }
+ | tMONTH tSNUMBER tSNUMBER
+ {
+ /* e.g. JUN-17-1992. */
+ pc->month = $1;
+ pc->day = -$2.value;
+ pc->year.value = -$3.value;
+ pc->year.digits = $3.digits;
+ }
+ | tMONTH tUNUMBER
+ {
+ pc->month = $1;
+ pc->day = $2.value;
+ }
+ | tMONTH tUNUMBER ',' tUNUMBER
+ {
+ pc->month = $1;
+ pc->day = $2.value;
+ pc->year = $4;
+ }
+ | tUNUMBER tMONTH
+ {
+ pc->day = $1.value;
+ pc->month = $2;
+ }
+ | tUNUMBER tMONTH tUNUMBER
+ {
+ pc->day = $1.value;
+ pc->month = $2;
+ pc->year = $3;
+ }
+ ;
+
+rel:
+ relunit tAGO
+ {
+ pc->rel.ns -= $1.ns;
+ pc->rel.seconds -= $1.seconds;
+ pc->rel.minutes -= $1.minutes;
+ pc->rel.hour -= $1.hour;
+ pc->rel.day -= $1.day;
+ pc->rel.month -= $1.month;
+ pc->rel.year -= $1.year;
+ }
+ | relunit
+ {
+ pc->rel.ns += $1.ns;
+ pc->rel.seconds += $1.seconds;
+ pc->rel.minutes += $1.minutes;
+ pc->rel.hour += $1.hour;
+ pc->rel.day += $1.day;
+ pc->rel.month += $1.month;
+ pc->rel.year += $1.year;
+ }
+ ;
+
+relunit:
+ tORDINAL tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = $1; }
+ | tUNUMBER tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = $1.value; }
+ | tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = 1; }
+ | tORDINAL tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = $1; }
+ | tUNUMBER tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = $1.value; }
+ | tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = 1; }
+ | tORDINAL tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1 * $2; }
+ | tUNUMBER tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1.value * $2; }
+ | tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1; }
+ | tORDINAL tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = $1; }
+ | tUNUMBER tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = $1.value; }
+ | tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = 1; }
+ | tORDINAL tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = $1; }
+ | tUNUMBER tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = $1.value; }
+ | tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = 1; }
+ | tORDINAL tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1; }
+ | tUNUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.value; }
+ | tSDECIMAL_NUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.tv_sec; $$.ns = $1.tv_nsec; }
+ | tUDECIMAL_NUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.tv_sec; $$.ns = $1.tv_nsec; }
+ | tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = 1; }
+ | relunit_snumber
+ ;
+
+relunit_snumber:
+ tSNUMBER tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = $1.value; }
+ | tSNUMBER tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = $1.value; }
+ | tSNUMBER tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1.value * $2; }
+ | tSNUMBER tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = $1.value; }
+ | tSNUMBER tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = $1.value; }
+ | tSNUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.value; }
+ ;
+
+seconds: signed_seconds | unsigned_seconds;
+
+signed_seconds:
+ tSDECIMAL_NUMBER
+ | tSNUMBER
+ { $$.tv_sec = $1.value; $$.tv_nsec = 0; }
+ ;
+
+unsigned_seconds:
+ tUDECIMAL_NUMBER
+ | tUNUMBER
+ { $$.tv_sec = $1.value; $$.tv_nsec = 0; }
+ ;
+
+number:
+ tUNUMBER
+ {
+ if (pc->dates_seen && ! pc->year.digits
+ && ! pc->rels_seen && (pc->times_seen || 2 < $1.digits))
+ pc->year = $1;
+ else
+ {
+ if (4 < $1.digits)
+ {
+ pc->dates_seen++;
+ pc->day = $1.value % 100;
+ pc->month = ($1.value / 100) % 100;
+ pc->year.value = $1.value / 10000;
+ pc->year.digits = $1.digits - 4;
+ }
+ else
+ {
+ pc->times_seen++;
+ if ($1.digits <= 2)
+ {
+ pc->hour = $1.value;
+ pc->minutes = 0;
+ }
+ else
+ {
+ pc->hour = $1.value / 100;
+ pc->minutes = $1.value % 100;
+ }
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = MER24;
+ }
+ }
+ }
+ ;
+
+o_colon_minutes:
+ /* empty */
+ { $$ = -1; }
+ | ':' tUNUMBER
+ { $$ = $2.value; }
+ ;
+
+o_merid:
+ /* empty */
+ { $$ = MER24; }
+ | tMERIDIAN
+ { $$ = $1; }
+ ;
+
+%%
+
+static table const meridian_table[] =
+{
+ { "AM", tMERIDIAN, MERam },
+ { "A.M.", tMERIDIAN, MERam },
+ { "PM", tMERIDIAN, MERpm },
+ { "P.M.", tMERIDIAN, MERpm },
+ { NULL, 0, 0 }
+};
+
+static table const dst_table[] =
+{
+ { "DST", tDST, 0 }
+};
+
+static table const month_and_day_table[] =
+{
+ { "JANUARY", tMONTH, 1 },
+ { "FEBRUARY", tMONTH, 2 },
+ { "MARCH", tMONTH, 3 },
+ { "APRIL", tMONTH, 4 },
+ { "MAY", tMONTH, 5 },
+ { "JUNE", tMONTH, 6 },
+ { "JULY", tMONTH, 7 },
+ { "AUGUST", tMONTH, 8 },
+ { "SEPTEMBER",tMONTH, 9 },
+ { "SEPT", tMONTH, 9 },
+ { "OCTOBER", tMONTH, 10 },
+ { "NOVEMBER", tMONTH, 11 },
+ { "DECEMBER", tMONTH, 12 },
+ { "SUNDAY", tDAY, 0 },
+ { "MONDAY", tDAY, 1 },
+ { "TUESDAY", tDAY, 2 },
+ { "TUES", tDAY, 2 },
+ { "WEDNESDAY",tDAY, 3 },
+ { "WEDNES", tDAY, 3 },
+ { "THURSDAY", tDAY, 4 },
+ { "THUR", tDAY, 4 },
+ { "THURS", tDAY, 4 },
+ { "FRIDAY", tDAY, 5 },
+ { "SATURDAY", tDAY, 6 },
+ { NULL, 0, 0 }
+};
+
+static table const time_units_table[] =
+{
+ { "YEAR", tYEAR_UNIT, 1 },
+ { "MONTH", tMONTH_UNIT, 1 },
+ { "FORTNIGHT",tDAY_UNIT, 14 },
+ { "WEEK", tDAY_UNIT, 7 },
+ { "DAY", tDAY_UNIT, 1 },
+ { "HOUR", tHOUR_UNIT, 1 },
+ { "MINUTE", tMINUTE_UNIT, 1 },
+ { "MIN", tMINUTE_UNIT, 1 },
+ { "SECOND", tSEC_UNIT, 1 },
+ { "SEC", tSEC_UNIT, 1 },
+ { NULL, 0, 0 }
+};
+
+/* Assorted relative-time words. */
+static table const relative_time_table[] =
+{
+ { "TOMORROW", tDAY_UNIT, 1 },
+ { "YESTERDAY",tDAY_UNIT, -1 },
+ { "TODAY", tDAY_UNIT, 0 },
+ { "NOW", tDAY_UNIT, 0 },
+ { "LAST", tORDINAL, -1 },
+ { "THIS", tORDINAL, 0 },
+ { "NEXT", tORDINAL, 1 },
+ { "FIRST", tORDINAL, 1 },
+/*{ "SECOND", tORDINAL, 2 }, */
+ { "THIRD", tORDINAL, 3 },
+ { "FOURTH", tORDINAL, 4 },
+ { "FIFTH", tORDINAL, 5 },
+ { "SIXTH", tORDINAL, 6 },
+ { "SEVENTH", tORDINAL, 7 },
+ { "EIGHTH", tORDINAL, 8 },
+ { "NINTH", tORDINAL, 9 },
+ { "TENTH", tORDINAL, 10 },
+ { "ELEVENTH", tORDINAL, 11 },
+ { "TWELFTH", tORDINAL, 12 },
+ { "AGO", tAGO, 1 },
+ { NULL, 0, 0 }
+};
+
+/* The universal time zone table. These labels can be used even for
+ time stamps that would not otherwise be valid, e.g., GMT time
+ stamps in London during summer. */
+static table const universal_time_zone_table[] =
+{
+ { "GMT", tZONE, HOUR ( 0) }, /* Greenwich Mean */
+ { "UT", tZONE, HOUR ( 0) }, /* Universal (Coordinated) */
+ { "UTC", tZONE, HOUR ( 0) },
+ { NULL, 0, 0 }
+};
+
+/* The time zone table. This table is necessarily incomplete, as time
+ zone abbreviations are ambiguous; e.g. Australians interpret "EST"
+ as Eastern time in Australia, not as US Eastern Standard Time.
+ You cannot rely on getdate to handle arbitrary time zone
+ abbreviations; use numeric abbreviations like `-0500' instead. */
+static table const time_zone_table[] =
+{
+ { "WET", tZONE, HOUR ( 0) }, /* Western European */
+ { "WEST", tDAYZONE, HOUR ( 0) }, /* Western European Summer */
+ { "BST", tDAYZONE, HOUR ( 0) }, /* British Summer */
+ { "ART", tZONE, -HOUR ( 3) }, /* Argentina */
+ { "BRT", tZONE, -HOUR ( 3) }, /* Brazil */
+ { "BRST", tDAYZONE, -HOUR ( 3) }, /* Brazil Summer */
+ { "NST", tZONE, -(HOUR ( 3) + 30) }, /* Newfoundland Standard */
+ { "NDT", tDAYZONE,-(HOUR ( 3) + 30) }, /* Newfoundland Daylight */
+ { "AST", tZONE, -HOUR ( 4) }, /* Atlantic Standard */
+ { "ADT", tDAYZONE, -HOUR ( 4) }, /* Atlantic Daylight */
+ { "CLT", tZONE, -HOUR ( 4) }, /* Chile */
+ { "CLST", tDAYZONE, -HOUR ( 4) }, /* Chile Summer */
+ { "EST", tZONE, -HOUR ( 5) }, /* Eastern Standard */
+ { "EDT", tDAYZONE, -HOUR ( 5) }, /* Eastern Daylight */
+ { "CST", tZONE, -HOUR ( 6) }, /* Central Standard */
+ { "CDT", tDAYZONE, -HOUR ( 6) }, /* Central Daylight */
+ { "MST", tZONE, -HOUR ( 7) }, /* Mountain Standard */
+ { "MDT", tDAYZONE, -HOUR ( 7) }, /* Mountain Daylight */
+ { "PST", tZONE, -HOUR ( 8) }, /* Pacific Standard */
+ { "PDT", tDAYZONE, -HOUR ( 8) }, /* Pacific Daylight */
+ { "AKST", tZONE, -HOUR ( 9) }, /* Alaska Standard */
+ { "AKDT", tDAYZONE, -HOUR ( 9) }, /* Alaska Daylight */
+ { "HST", tZONE, -HOUR (10) }, /* Hawaii Standard */
+ { "HAST", tZONE, -HOUR (10) }, /* Hawaii-Aleutian Standard */
+ { "HADT", tDAYZONE, -HOUR (10) }, /* Hawaii-Aleutian Daylight */
+ { "SST", tZONE, -HOUR (12) }, /* Samoa Standard */
+ { "WAT", tZONE, HOUR ( 1) }, /* West Africa */
+ { "CET", tZONE, HOUR ( 1) }, /* Central European */
+ { "CEST", tDAYZONE, HOUR ( 1) }, /* Central European Summer */
+ { "MET", tZONE, HOUR ( 1) }, /* Middle European */
+ { "MEZ", tZONE, HOUR ( 1) }, /* Middle European */
+ { "MEST", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */
+ { "MESZ", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */
+ { "EET", tZONE, HOUR ( 2) }, /* Eastern European */
+ { "EEST", tDAYZONE, HOUR ( 2) }, /* Eastern European Summer */
+ { "CAT", tZONE, HOUR ( 2) }, /* Central Africa */
+ { "SAST", tZONE, HOUR ( 2) }, /* South Africa Standard */
+ { "EAT", tZONE, HOUR ( 3) }, /* East Africa */
+ { "MSK", tZONE, HOUR ( 3) }, /* Moscow */
+ { "MSD", tDAYZONE, HOUR ( 3) }, /* Moscow Daylight */
+ { "IST", tZONE, (HOUR ( 5) + 30) }, /* India Standard */
+ { "SGT", tZONE, HOUR ( 8) }, /* Singapore */
+ { "KST", tZONE, HOUR ( 9) }, /* Korea Standard */
+ { "JST", tZONE, HOUR ( 9) }, /* Japan Standard */
+ { "GST", tZONE, HOUR (10) }, /* Guam Standard */
+ { "NZST", tZONE, HOUR (12) }, /* New Zealand Standard */
+ { "NZDT", tDAYZONE, HOUR (12) }, /* New Zealand Daylight */
+ { NULL, 0, 0 }
+};
+
+/* Military time zone table. */
+static table const military_table[] =
+{
+ { "A", tZONE, -HOUR ( 1) },
+ { "B", tZONE, -HOUR ( 2) },
+ { "C", tZONE, -HOUR ( 3) },
+ { "D", tZONE, -HOUR ( 4) },
+ { "E", tZONE, -HOUR ( 5) },
+ { "F", tZONE, -HOUR ( 6) },
+ { "G", tZONE, -HOUR ( 7) },
+ { "H", tZONE, -HOUR ( 8) },
+ { "I", tZONE, -HOUR ( 9) },
+ { "K", tZONE, -HOUR (10) },
+ { "L", tZONE, -HOUR (11) },
+ { "M", tZONE, -HOUR (12) },
+ { "N", tZONE, HOUR ( 1) },
+ { "O", tZONE, HOUR ( 2) },
+ { "P", tZONE, HOUR ( 3) },
+ { "Q", tZONE, HOUR ( 4) },
+ { "R", tZONE, HOUR ( 5) },
+ { "S", tZONE, HOUR ( 6) },
+ { "T", tZONE, HOUR ( 7) },
+ { "U", tZONE, HOUR ( 8) },
+ { "V", tZONE, HOUR ( 9) },
+ { "W", tZONE, HOUR (10) },
+ { "X", tZONE, HOUR (11) },
+ { "Y", tZONE, HOUR (12) },
+ { "Z", tZONE, HOUR ( 0) },
+ { NULL, 0, 0 }
+};
+
+
+
+/* Convert a time zone expressed as HH:MM into an integer count of
+ minutes. If MM is negative, then S is of the form HHMM and needs
+ to be picked apart; otherwise, S is of the form HH. */
+
+static long int
+time_zone_hhmm (textint s, long int mm)
+{
+ if (mm < 0)
+ return (s.value / 100) * 60 + s.value % 100;
+ else
+ return s.value * 60 + (s.negative ? -mm : mm);
+}
+
+static int
+to_hour (long int hours, int meridian)
+{
+ switch (meridian)
+ {
+ default: /* Pacify GCC. */
+ case MER24:
+ return 0 <= hours && hours < 24 ? hours : -1;
+ case MERam:
+ return 0 < hours && hours < 12 ? hours : hours == 12 ? 0 : -1;
+ case MERpm:
+ return 0 < hours && hours < 12 ? hours + 12 : hours == 12 ? 12 : -1;
+ }
+}
+
+static long int
+to_year (textint textyear)
+{
+ long int year = textyear.value;
+
+ if (year < 0)
+ year = -year;
+
+ /* XPG4 suggests that years 00-68 map to 2000-2068, and
+ years 69-99 map to 1969-1999. */
+ else if (textyear.digits == 2)
+ year += year < 69 ? 2000 : 1900;
+
+ return year;
+}
+
+static table const *
+lookup_zone (parser_control const *pc, char const *name)
+{
+ table const *tp;
+
+ for (tp = universal_time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ /* Try local zone abbreviations before those in time_zone_table, as
+ the local ones are more likely to be right. */
+ for (tp = pc->local_time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ for (tp = time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ return NULL;
+}
+
+#if ! HAVE_TM_GMTOFF
+/* Yield the difference between *A and *B,
+ measured in seconds, ignoring leap seconds.
+ The body of this function is taken directly from the GNU C Library;
+ see src/strftime.c. */
+static long int
+tm_diff (struct tm const *a, struct tm const *b)
+{
+ /* Compute intervening leap days correctly even if year is negative.
+ Take care to avoid int overflow in leap day calculations. */
+ int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3);
+ int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3);
+ int a100 = a4 / 25 - (a4 % 25 < 0);
+ int b100 = b4 / 25 - (b4 % 25 < 0);
+ int a400 = SHR (a100, 2);
+ int b400 = SHR (b100, 2);
+ int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+ long int ayear = a->tm_year;
+ long int years = ayear - b->tm_year;
+ long int days = (365 * years + intervening_leap_days
+ + (a->tm_yday - b->tm_yday));
+ return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
+ + (a->tm_min - b->tm_min))
+ + (a->tm_sec - b->tm_sec));
+}
+#endif /* ! HAVE_TM_GMTOFF */
+
+static table const *
+lookup_word (parser_control const *pc, char *word)
+{
+ char *p;
+ char *q;
+ size_t wordlen;
+ table const *tp;
+ bool period_found;
+ bool abbrev;
+
+ /* Make it uppercase. */
+ for (p = word; *p; p++)
+ {
+ unsigned char ch = *p;
+ *p = toupper (ch);
+ }
+
+ for (tp = meridian_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* See if we have an abbreviation for a month. */
+ wordlen = strlen (word);
+ abbrev = wordlen == 3 || (wordlen == 4 && word[3] == '.');
+
+ for (tp = month_and_day_table; tp->name; tp++)
+ if ((abbrev ? strncmp (word, tp->name, 3) : strcmp (word, tp->name)) == 0)
+ return tp;
+
+ if ((tp = lookup_zone (pc, word)))
+ return tp;
+
+ if (strcmp (word, dst_table[0].name) == 0)
+ return dst_table;
+
+ for (tp = time_units_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* Strip off any plural and try the units table again. */
+ if (word[wordlen - 1] == 'S')
+ {
+ word[wordlen - 1] = '\0';
+ for (tp = time_units_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+ word[wordlen - 1] = 'S'; /* For "this" in relative_time_table. */
+ }
+
+ for (tp = relative_time_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* Military time zones. */
+ if (wordlen == 1)
+ for (tp = military_table; tp->name; tp++)
+ if (word[0] == tp->name[0])
+ return tp;
+
+ /* Drop out any periods and try the time zone table again. */
+ for (period_found = false, p = q = word; (*p = *q); q++)
+ if (*q == '.')
+ period_found = true;
+ else
+ p++;
+ if (period_found && (tp = lookup_zone (pc, word)))
+ return tp;
+
+ return NULL;
+}
+
+static int
+yylex (YYSTYPE *lvalp, parser_control *pc)
+{
+ unsigned char c;
+ size_t count;
+
+ for (;;)
+ {
+ while (c = *pc->input, isspace (c))
+ pc->input++;
+
+ if (ISDIGIT (c) || c == '-' || c == '+')
+ {
+ char const *p;
+ int sign;
+ unsigned long int value;
+ if (c == '-' || c == '+')
+ {
+ sign = c == '-' ? -1 : 1;
+ while (c = *++pc->input, isspace (c))
+ continue;
+ if (! ISDIGIT (c))
+ /* skip the '-' sign */
+ continue;
+ }
+ else
+ sign = 0;
+ p = pc->input;
+ for (value = 0; ; value *= 10)
+ {
+ unsigned long int value1 = value + (c - '0');
+ if (value1 < value)
+ return '?';
+ value = value1;
+ c = *++p;
+ if (! ISDIGIT (c))
+ break;
+ if (ULONG_MAX / 10 < value)
+ return '?';
+ }
+ if ((c == '.' || c == ',') && ISDIGIT (p[1]))
+ {
+ time_t s;
+ int ns;
+ int digits;
+ unsigned long int value1;
+
+ /* Check for overflow when converting value to time_t. */
+ if (sign < 0)
+ {
+ s = - value;
+ if (0 < s)
+ return '?';
+ value1 = -s;
+ }
+ else
+ {
+ s = value;
+ if (s < 0)
+ return '?';
+ value1 = s;
+ }
+ if (value != value1)
+ return '?';
+
+ /* Accumulate fraction, to ns precision. */
+ p++;
+ ns = *p++ - '0';
+ for (digits = 2; digits <= LOG10_BILLION; digits++)
+ {
+ ns *= 10;
+ if (ISDIGIT (*p))
+ ns += *p++ - '0';
+ }
+
+ /* Skip excess digits, truncating toward -Infinity. */
+ if (sign < 0)
+ for (; ISDIGIT (*p); p++)
+ if (*p != '0')
+ {
+ ns++;
+ break;
+ }
+ while (ISDIGIT (*p))
+ p++;
+
+ /* Adjust to the timespec convention, which is that
+ tv_nsec is always a positive offset even if tv_sec is
+ negative. */
+ if (sign < 0 && ns)
+ {
+ s--;
+ if (! (s < 0))
+ return '?';
+ ns = BILLION - ns;
+ }
+
+ lvalp->timespec.tv_sec = s;
+ lvalp->timespec.tv_nsec = ns;
+ pc->input = p;
+ return sign ? tSDECIMAL_NUMBER : tUDECIMAL_NUMBER;
+ }
+ else
+ {
+ lvalp->textintval.negative = sign < 0;
+ if (sign < 0)
+ {
+ lvalp->textintval.value = - value;
+ if (0 < lvalp->textintval.value)
+ return '?';
+ }
+ else
+ {
+ lvalp->textintval.value = value;
+ if (lvalp->textintval.value < 0)
+ return '?';
+ }
+ lvalp->textintval.digits = p - pc->input;
+ pc->input = p;
+ return sign ? tSNUMBER : tUNUMBER;
+ }
+ }
+
+ if (isalpha (c))
+ {
+ char buff[20];
+ char *p = buff;
+ table const *tp;
+
+ do
+ {
+ if (p < buff + sizeof buff - 1)
+ *p++ = c;
+ c = *++pc->input;
+ }
+ while (isalpha (c) || c == '.');
+
+ *p = '\0';
+ tp = lookup_word (pc, buff);
+ if (! tp)
+ return '?';
+ lvalp->intval = tp->value;
+ return tp->type;
+ }
+
+ if (c != '(')
+ return *pc->input++;
+ count = 0;
+ do
+ {
+ c = *pc->input++;
+ if (c == '\0')
+ return c;
+ if (c == '(')
+ count++;
+ else if (c == ')')
+ count--;
+ }
+ while (count != 0);
+ }
+}
+
+/* Do nothing if the parser reports an error. */
+static int
+yyerror (parser_control const *pc ATTRIBUTE_UNUSED,
+ char const *s ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
+/* If *TM0 is the old and *TM1 is the new value of a struct tm after
+ passing it to mktime, return true if it's OK that mktime returned T.
+ It's not OK if *TM0 has out-of-range members. */
+
+static bool
+mktime_ok (struct tm const *tm0, struct tm const *tm1, time_t t)
+{
+ if (t == (time_t) -1)
+ {
+ /* Guard against falsely reporting an error when parsing a time
+ stamp that happens to equal (time_t) -1, on a host that
+ supports such a time stamp. */
+ tm1 = localtime (&t);
+ if (!tm1)
+ return false;
+ }
+
+ return ! ((tm0->tm_sec ^ tm1->tm_sec)
+ | (tm0->tm_min ^ tm1->tm_min)
+ | (tm0->tm_hour ^ tm1->tm_hour)
+ | (tm0->tm_mday ^ tm1->tm_mday)
+ | (tm0->tm_mon ^ tm1->tm_mon)
+ | (tm0->tm_year ^ tm1->tm_year));
+}
+
+/* A reasonable upper bound for the size of ordinary TZ strings.
+ Use heap allocation if TZ's length exceeds this. */
+enum { TZBUFSIZE = 100 };
+
+/* Return a copy of TZ, stored in TZBUF if it fits, and heap-allocated
+ otherwise. */
+static char *
+get_tz (char tzbuf[TZBUFSIZE])
+{
+ char *tz = getenv ("TZ");
+ if (tz)
+ {
+ size_t tzsize = strlen (tz) + 1;
+ tz = (tzsize <= TZBUFSIZE
+ ? memcpy (tzbuf, tz, tzsize)
+ : xmemdup (tz, tzsize));
+ }
+ return tz;
+}
+
+/* Parse a date/time string, storing the resulting time value into *RESULT.
+ The string itself is pointed to by P. Return true if successful.
+ P can be an incomplete or relative time specification; if so, use
+ *NOW as the basis for the returned time. */
+bool
+get_date (struct timespec *result, char const *p, struct timespec const *now)
+{
+ time_t Start;
+ long int Start_ns;
+ struct tm const *tmp;
+ struct tm tm;
+ struct tm tm0;
+ parser_control pc;
+ struct timespec gettime_buffer;
+ unsigned char c;
+ bool tz_was_altered = false;
+ char *tz0 = NULL;
+ char tz0buf[TZBUFSIZE];
+ bool ok = true;
+
+ if (! now)
+ {
+ gettime (&gettime_buffer);
+ now = &gettime_buffer;
+ }
+
+ Start = now->tv_sec;
+ Start_ns = now->tv_nsec;
+
+ tmp = localtime (&now->tv_sec);
+ if (! tmp)
+ return false;
+
+ while (c = *p, isspace (c))
+ p++;
+
+ if (strncmp (p, "TZ=\"", 4) == 0)
+ {
+ char const *tzbase = p + 4;
+ size_t tzsize = 1;
+ char const *s;
+
+ for (s = tzbase; *s; s++, tzsize++)
+ if (*s == '\\')
+ {
+ s++;
+ if (! (*s == '\\' || *s == '"'))
+ break;
+ }
+ else if (*s == '"')
+ {
+ char *z;
+ char *tz1;
+ char tz1buf[TZBUFSIZE];
+ bool large_tz = TZBUFSIZE < tzsize;
+ bool setenv_ok;
+ tz0 = get_tz (tz0buf);
+ z = tz1 = large_tz ? xmalloc (tzsize) : tz1buf;
+ for (s = tzbase; *s != '"'; s++)
+ *z++ = *(s += *s == '\\');
+ *z = '\0';
+ setenv_ok = setenv ("TZ", tz1, 1) == 0;
+ if (large_tz)
+ free (tz1);
+ if (!setenv_ok)
+ goto fail;
+ tz_was_altered = true;
+ p = s + 1;
+ }
+ }
+
+ pc.input = p;
+ pc.year.value = tmp->tm_year;
+ pc.year.value += TM_YEAR_BASE;
+ pc.year.digits = 0;
+ pc.month = tmp->tm_mon + 1;
+ pc.day = tmp->tm_mday;
+ pc.hour = tmp->tm_hour;
+ pc.minutes = tmp->tm_min;
+ pc.seconds.tv_sec = tmp->tm_sec;
+ pc.seconds.tv_nsec = Start_ns;
+ tm.tm_isdst = tmp->tm_isdst;
+
+ pc.meridian = MER24;
+ pc.rel = RELATIVE_TIME_0;
+ pc.timespec_seen = false;
+ pc.rels_seen = false;
+ pc.dates_seen = 0;
+ pc.days_seen = 0;
+ pc.times_seen = 0;
+ pc.local_zones_seen = 0;
+ pc.dsts_seen = 0;
+ pc.zones_seen = 0;
+
+#if HAVE_STRUCT_TM_TM_ZONE
+ pc.local_time_zone_table[0].name = tmp->tm_zone;
+ pc.local_time_zone_table[0].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[0].value = tmp->tm_isdst;
+ pc.local_time_zone_table[1].name = NULL;
+
+ /* Probe the names used in the next three calendar quarters, looking
+ for a tm_isdst different from the one we already have. */
+ {
+ int quarter;
+ for (quarter = 1; quarter <= 3; quarter++)
+ {
+ time_t probe = Start + quarter * (90 * 24 * 60 * 60);
+ struct tm const *probe_tm = localtime (&probe);
+ if (probe_tm && probe_tm->tm_zone
+ && probe_tm->tm_isdst != pc.local_time_zone_table[0].value)
+ {
+ {
+ pc.local_time_zone_table[1].name = probe_tm->tm_zone;
+ pc.local_time_zone_table[1].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[1].value = probe_tm->tm_isdst;
+ pc.local_time_zone_table[2].name = NULL;
+ }
+ break;
+ }
+ }
+ }
+#else
+#if HAVE_TZNAME
+ {
+# ifndef tzname
+ extern char *tzname[];
+# endif
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ pc.local_time_zone_table[i].name = tzname[i];
+ pc.local_time_zone_table[i].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[i].value = i;
+ }
+ pc.local_time_zone_table[i].name = NULL;
+ }
+#else
+ pc.local_time_zone_table[0].name = NULL;
+#endif
+#endif
+
+ if (pc.local_time_zone_table[0].name && pc.local_time_zone_table[1].name
+ && ! strcmp (pc.local_time_zone_table[0].name,
+ pc.local_time_zone_table[1].name))
+ {
+ /* This locale uses the same abbrevation for standard and
+ daylight times. So if we see that abbreviation, we don't
+ know whether it's daylight time. */
+ pc.local_time_zone_table[0].value = -1;
+ pc.local_time_zone_table[1].name = NULL;
+ }
+
+ if (yyparse (&pc) != 0)
+ goto fail;
+
+ if (pc.timespec_seen)
+ *result = pc.seconds;
+ else
+ {
+ if (1 < (pc.times_seen | pc.dates_seen | pc.days_seen | pc.dsts_seen
+ | (pc.local_zones_seen + pc.zones_seen)))
+ goto fail;
+
+ tm.tm_year = to_year (pc.year) - TM_YEAR_BASE;
+ tm.tm_mon = pc.month - 1;
+ tm.tm_mday = pc.day;
+ if (pc.times_seen || (pc.rels_seen && ! pc.dates_seen && ! pc.days_seen))
+ {
+ tm.tm_hour = to_hour (pc.hour, pc.meridian);
+ if (tm.tm_hour < 0)
+ goto fail;
+ tm.tm_min = pc.minutes;
+ tm.tm_sec = pc.seconds.tv_sec;
+ }
+ else
+ {
+ tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+ pc.seconds.tv_nsec = 0;
+ }
+
+ /* Let mktime deduce tm_isdst if we have an absolute time stamp. */
+ if (pc.dates_seen | pc.days_seen | pc.times_seen)
+ tm.tm_isdst = -1;
+
+ /* But if the input explicitly specifies local time with or without
+ DST, give mktime that information. */
+ if (pc.local_zones_seen)
+ tm.tm_isdst = pc.local_isdst;
+
+ tm0 = tm;
+
+ Start = mktime (&tm);
+
+ if (! mktime_ok (&tm0, &tm, Start))
+ {
+ if (! pc.zones_seen)
+ goto fail;
+ else
+ {
+ /* Guard against falsely reporting errors near the time_t
+ boundaries when parsing times in other time zones. For
+ example, suppose the input string "1969-12-31 23:00:00 -0100",
+ the current time zone is 8 hours ahead of UTC, and the min
+ time_t value is 1970-01-01 00:00:00 UTC. Then the min
+ localtime value is 1970-01-01 08:00:00, and mktime will
+ therefore fail on 1969-12-31 23:00:00. To work around the
+ problem, set the time zone to 1 hour behind UTC temporarily
+ by setting TZ="XXX1:00" and try mktime again. */
+
+ long int time_zone = pc.time_zone;
+ long int abs_time_zone = time_zone < 0 ? - time_zone : time_zone;
+ long int abs_time_zone_hour = abs_time_zone / 60;
+ int abs_time_zone_min = abs_time_zone % 60;
+ char tz1buf[sizeof "XXX+0:00"
+ + sizeof pc.time_zone * CHAR_BIT / 3];
+ if (!tz_was_altered)
+ tz0 = get_tz (tz0buf);
+ sprintf (tz1buf, "XXX%s%ld:%02d", "-" + (time_zone < 0),
+ abs_time_zone_hour, abs_time_zone_min);
+ if (setenv ("TZ", tz1buf, 1) != 0)
+ goto fail;
+ tz_was_altered = true;
+ tm = tm0;
+ Start = mktime (&tm);
+ if (! mktime_ok (&tm0, &tm, Start))
+ goto fail;
+ }
+ }
+
+ if (pc.days_seen && ! pc.dates_seen)
+ {
+ tm.tm_mday += ((pc.day_number - tm.tm_wday + 7) % 7
+ + 7 * (pc.day_ordinal - (0 < pc.day_ordinal)));
+ tm.tm_isdst = -1;
+ Start = mktime (&tm);
+ if (Start == (time_t) -1)
+ goto fail;
+ }
+
+ if (pc.zones_seen)
+ {
+ long int delta = pc.time_zone * 60;
+ time_t t1;
+#ifdef HAVE_TM_GMTOFF
+ delta -= tm.tm_gmtoff;
+#else
+ time_t t = Start;
+ struct tm const *gmt = gmtime (&t);
+ if (! gmt)
+ goto fail;
+ delta -= tm_diff (&tm, gmt);
+#endif
+ t1 = Start - delta;
+ if ((Start < t1) != (delta < 0))
+ goto fail; /* time_t overflow */
+ Start = t1;
+ }
+
+ /* Add relative date. */
+ if (pc.rel.year | pc.rel.month | pc.rel.day)
+ {
+ int year = tm.tm_year + pc.rel.year;
+ int month = tm.tm_mon + pc.rel.month;
+ int day = tm.tm_mday + pc.rel.day;
+ if (((year < tm.tm_year) ^ (pc.rel.year < 0))
+ | ((month < tm.tm_mon) ^ (pc.rel.month < 0))
+ | ((day < tm.tm_mday) ^ (pc.rel.day < 0)))
+ goto fail;
+ tm.tm_year = year;
+ tm.tm_mon = month;
+ tm.tm_mday = day;
+ tm.tm_hour = tm0.tm_hour;
+ tm.tm_min = tm0.tm_min;
+ tm.tm_sec = tm0.tm_sec;
+ tm.tm_isdst = tm0.tm_isdst;
+ Start = mktime (&tm);
+ if (Start == (time_t) -1)
+ goto fail;
+ }
+
+ /* Add relative hours, minutes, and seconds. On hosts that support
+ leap seconds, ignore the possibility of leap seconds; e.g.,
+ "+ 10 minutes" adds 600 seconds, even if one of them is a
+ leap second. Typically this is not what the user wants, but it's
+ too hard to do it the other way, because the time zone indicator
+ must be applied before relative times, and if mktime is applied
+ again the time zone will be lost. */
+ {
+ long int sum_ns = pc.seconds.tv_nsec + pc.rel.ns;
+ long int normalized_ns = (sum_ns % BILLION + BILLION) % BILLION;
+ time_t t0 = Start;
+ long int d1 = 60 * 60 * pc.rel.hour;
+ time_t t1 = t0 + d1;
+ long int d2 = 60 * pc.rel.minutes;
+ time_t t2 = t1 + d2;
+ long int d3 = pc.rel.seconds;
+ time_t t3 = t2 + d3;
+ long int d4 = (sum_ns - normalized_ns) / BILLION;
+ time_t t4 = t3 + d4;
+
+ if ((d1 / (60 * 60) ^ pc.rel.hour)
+ | (d2 / 60 ^ pc.rel.minutes)
+ | ((t1 < t0) ^ (d1 < 0))
+ | ((t2 < t1) ^ (d2 < 0))
+ | ((t3 < t2) ^ (d3 < 0))
+ | ((t4 < t3) ^ (d4 < 0)))
+ goto fail;
+
+ result->tv_sec = t4;
+ result->tv_nsec = normalized_ns;
+ }
+ }
+
+ goto done;
+
+ fail:
+ ok = false;
+ done:
+ if (tz_was_altered)
+ ok &= (tz0 ? setenv ("TZ", tz0, 1) : unsetenv ("TZ")) == 0;
+ if (tz0 != tz0buf)
+ free (tz0);
+ return ok;
+}
+
+#if TEST
+
+int
+main (int ac, char **av)
+{
+ char buff[BUFSIZ];
+
+ printf ("Enter date, or blank line to exit.\n\t> ");
+ fflush (stdout);
+
+ buff[BUFSIZ - 1] = '\0';
+ while (fgets (buff, BUFSIZ - 1, stdin) && buff[0])
+ {
+ struct timespec d;
+ struct tm const *tm;
+ if (! get_date (&d, buff, NULL))
+ printf ("Bad format - couldn't convert.\n");
+ else if (! (tm = localtime (&d.tv_sec)))
+ {
+ long int sec = d.tv_sec;
+ printf ("localtime (%ld) failed\n", sec);
+ }
+ else
+ {
+ int ns = d.tv_nsec;
+ printf ("%04ld-%02d-%02d %02d:%02d:%02d.%09d\n",
+ tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec, ns);
+ }
+ printf ("\t> ");
+ fflush (stdout);
+ }
+ return 0;
+}
+#endif /* TEST */
diff --git a/lib/getdelim.c b/lib/getdelim.c
new file mode 100644
index 0000000..e0b8a70
--- /dev/null
+++ b/lib/getdelim.c
@@ -0,0 +1,126 @@
+/* getdelim.c --- Implementation of replacement getdelim function.
+ Copyright (C) 1994, 1996, 1997, 1998, 2001, 2003, 2005, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+/* Ported from glibc by Simon Josefsson. */
+
+#include <config.h>
+
+#include "getdelim.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+#if !HAVE_FLOCKFILE
+# undef flockfile
+# define flockfile(x) ((void) 0)
+#endif
+#if !HAVE_FUNLOCKFILE
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+#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)
+ {
+ *n = 120;
+ *lineptr = (char *) malloc (*n);
+ if (*lineptr == NULL)
+ {
+ result = -1;
+ goto unlock_return;
+ }
+ }
+
+ for (;;)
+ {
+ int i;
+
+ i = getc (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;
+ goto unlock_return;
+ }
+
+ new_lineptr = (char *) realloc (*lineptr, needed);
+ if (new_lineptr == NULL)
+ {
+ 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);
+ return result;
+}
diff --git a/lib/getdelim.h b/lib/getdelim.h
new file mode 100644
index 0000000..8bc6130
--- /dev/null
+++ b/lib/getdelim.h
@@ -0,0 +1,28 @@
+/* getdelim.h --- Prototype for replacement getdelim function.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+/* Get size_t, FILE, ssize_t. And getdelim, if available. */
+# include <stddef.h>
+# include <stdio.h>
+# include <sys/types.h>
+
+#if !HAVE_DECL_GETDELIM
+ssize_t getdelim (char **lineptr, size_t *n, int delimiter, FILE *stream);
+#endif /* !HAVE_GETDELIM */
diff --git a/lib/getline.c b/lib/getline.c
new file mode 100644
index 0000000..c8c9244
--- /dev/null
+++ b/lib/getline.c
@@ -0,0 +1,30 @@
+/* getline.c --- Implementation of replacement getline function.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "getdelim.h"
+#include "getline.h"
+
+ssize_t
+getline (char **lineptr, size_t *n, FILE *stream)
+{
+ return getdelim (lineptr, n, '\n', stream);
+}
diff --git a/lib/getline.h b/lib/getline.h
new file mode 100644
index 0000000..f0f61c4
--- /dev/null
+++ b/lib/getline.h
@@ -0,0 +1,28 @@
+/* getline.h --- Prototype for replacement getline function.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+/* Get size_t, FILE, ssize_t. And getline, if available. */
+# include <stddef.h>
+# include <stdio.h>
+# include <sys/types.h>
+
+#if !HAVE_DECL_GETLINE
+ssize_t getline (char **lineptr, size_t *n, FILE *stream);
+#endif /* !HAVE_GETLINE */
diff --git a/lib/getopt.c b/lib/getopt.c
new file mode 100644
index 0000000..3580ad8
--- /dev/null
+++ b/lib/getopt.c
@@ -0,0 +1,1191 @@
+/* Getopt for GNU.
+ NOTE: getopt is now part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to drepper@gnu.org
+ before changing it!
+ Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002,2003,2004,2006
+ 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include "getopt.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef __VMS
+# include <unixlib.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+# include <wchar.h>
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* Unlike standard Unix `getopt', functions like `getopt_long'
+ let the user intersperse the options with the other arguments.
+
+ As `getopt_long' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Using `getopt' or setting the environment variable POSIXLY_CORRECT
+ disables permutation.
+ Then the application's behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#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;
+
+
+#if defined HAVE_DECL_GETENV && !HAVE_DECL_GETENV
+extern char *getenv ();
+#endif
+
+#ifdef _LIBC
+/* Stored original parameters.
+ XXX This is no good solution. We should rather copy the args so
+ that we can compare them later. But we must not use malloc(3). */
+extern int __libc_argc;
+extern char **__libc_argv;
+
+/* Bash 2.0 gives us an environment variable containing flags
+ indicating ARGV elements that should not be considered arguments. */
+
+# ifdef USE_NONOPTION_FLAGS
+/* Defined in getopt_init.c */
+extern char *__getopt_nonoption_flags;
+# endif
+
+# ifdef USE_NONOPTION_FLAGS
+# define SWAP_FLAGS(ch1, ch2) \
+ if (d->__nonoption_flags_len > 0) \
+ { \
+ char __tmp = __getopt_nonoption_flags[ch1]; \
+ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
+ __getopt_nonoption_flags[ch2] = __tmp; \
+ }
+# else
+# define SWAP_FLAGS(ch1, ch2)
+# endif
+#else /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* 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. */
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ /* First make sure the handling of the `__getopt_nonoption_flags'
+ string can work normally. Our top argument must be in the range
+ of the string. */
+ if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
+ {
+ /* We must extend the array. The user plays games with us and
+ presents new arguments. */
+ char *new_str = malloc (top + 1);
+ if (new_str == NULL)
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
+ else
+ {
+ memset (__mempcpy (new_str, __getopt_nonoption_flags,
+ d->__nonoption_flags_max_len),
+ '\0', top + 1 - d->__nonoption_flags_max_len);
+ d->__nonoption_flags_max_len = top + 1;
+ __getopt_nonoption_flags = new_str;
+ }
+ }
+#endif
+
+ while (top > middle && middle > bottom)
+ {
+ if (top - middle > middle - bottom)
+ {
+ /* Bottom segment is the short one. */
+ int len = middle - bottom;
+ register 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;
+ SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+ }
+ /* Exclude the moved bottom segment from further swapping. */
+ top -= len;
+ }
+ else
+ {
+ /* Top segment is the short one. */
+ int len = top - middle;
+ register 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;
+ SWAP_FLAGS (bottom + i, middle + i);
+ }
+ /* 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;
+}
+
+/* Initialize the internal data when the first call is made. */
+
+static const char *
+_getopt_initialize (int argc, char **argv, const char *optstring,
+ int posixly_correct, struct _getopt_data *d)
+{
+ /* 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. */
+
+ d->__first_nonopt = d->__last_nonopt = d->optind;
+
+ d->__nextchar = NULL;
+
+ d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT");
+
+ /* 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 (d->__posixly_correct)
+ d->__ordering = REQUIRE_ORDER;
+ else
+ d->__ordering = PERMUTE;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ if (!d->__posixly_correct
+ && argc == __libc_argc && argv == __libc_argv)
+ {
+ if (d->__nonoption_flags_max_len == 0)
+ {
+ if (__getopt_nonoption_flags == NULL
+ || __getopt_nonoption_flags[0] == '\0')
+ d->__nonoption_flags_max_len = -1;
+ else
+ {
+ const char *orig_str = __getopt_nonoption_flags;
+ int len = d->__nonoption_flags_max_len = strlen (orig_str);
+ if (d->__nonoption_flags_max_len < argc)
+ d->__nonoption_flags_max_len = argc;
+ __getopt_nonoption_flags =
+ (char *) malloc (d->__nonoption_flags_max_len);
+ if (__getopt_nonoption_flags == NULL)
+ d->__nonoption_flags_max_len = -1;
+ else
+ memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+ '\0', d->__nonoption_flags_max_len - len);
+ }
+ }
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len;
+ }
+ else
+ d->__nonoption_flags_len = 0;
+#endif
+
+ 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.
+
+ 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.
+
+ If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT
+ environment variable were set. */
+
+int
+_getopt_internal_r (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind,
+ int long_only, int posixly_correct, struct _getopt_data *d)
+{
+ int print_errors = d->opterr;
+ if (optstring[0] == ':')
+ print_errors = 0;
+
+ if (argc < 1)
+ return -1;
+
+ d->optarg = NULL;
+
+ if (d->optind == 0 || !d->__initialized)
+ {
+ if (d->optind == 0)
+ d->optind = 1; /* Don't scan ARGV[0], the program name. */
+ optstring = _getopt_initialize (argc, argv, optstring,
+ posixly_correct, d);
+ d->__initialized = 1;
+ }
+
+ /* Test whether ARGV[optind] points to a non-option argument.
+ Either it does not have option syntax, or there is an environment flag
+ from the shell indicating it is not an option. The later information
+ is only used when the used in the GNU libc. */
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
+ || (d->optind < d->__nonoption_flags_len \
+ && __getopt_nonoption_flags[d->optind] == '1'))
+#else
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
+#endif
+
+ 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 ((char **) 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 ((char **) 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.
+ Skip the initial punctuation. */
+
+ d->__nextchar = (argv[d->optind] + 1
+ + (longopts != NULL && argv[d->optind][1] == '-'));
+ }
+
+ /* Decode the current option-ARGV-element. */
+
+ /* Check whether the ARGV-element is a long option.
+
+ 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 (longopts != NULL
+ && (argv[d->optind][1] == '-'
+ || (long_only && (argv[d->optind][2]
+ || !strchr (optstring, argv[d->optind][1])))))
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound = -1;
+ int option_index;
+
+ for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+ {
+ if ((unsigned int) (nameend - d->__nextchar)
+ == (unsigned int) strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else 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. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"),
+ argv[0], argv[d->optind]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
+ argv[0], argv[d->optind]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ d->optind++;
+ 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)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind - 1][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option `--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option `--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option `%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option `%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+
+ d->optopt = pfound->val;
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option `%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option `%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optopt = pfound->val;
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+
+ /* 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.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[d->optind][1] == '-'
+ || strchr (optstring, *d->__nextchar) == NULL)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"),
+ argv[0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
+ argv[0], d->__nextchar);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->__nextchar = (char *) "";
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+ }
+
+ /* Look at and handle the next short option-character. */
+
+ {
+ char c = *d->__nextchar++;
+ 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 == ':')
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (d->__posixly_correct)
+ {
+ /* 1003.2 specifies the format of this message. */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: illegal option -- %c\n"),
+ argv[0], c);
+#else
+ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c);
+#endif
+ }
+ else
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: invalid option -- %c\n"),
+ argv[0], c);
+#else
+ fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->optopt = c;
+ return '?';
+ }
+ /* Convenience. Treat POSIX -W foo same as long option --foo */
+ if (temp[0] == 'W' && temp[1] == ';')
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound = 0;
+ int option_index;
+
+ /* 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)
+ {
+ /* 1003.2 specifies the format of this message. */
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf,
+ _("%s: option requires an argument -- %c\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+ argv[0], c);
+#endif
+ }
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ return c;
+ }
+ else
+ /* We already incremented `d->optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+
+ /* optarg is now the argument, see if it's in the
+ table of longopts. */
+
+ for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';
+ nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+ {
+ if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second or later nonexact match found. */
+ ambig = 1;
+ }
+ if (ambig && !exact)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"),
+ argv[0], argv[d->optind]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
+ argv[0], argv[d->optind]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ return '?';
+ }
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ 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)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option `-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("\
+%s: option `-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option `%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option `%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+ d->__nextchar = NULL;
+ return 'W'; /* Let the application handle it. */
+ }
+ 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)
+ {
+ /* 1003.2 specifies the format of this message. */
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option requires an argument -- %c\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option requires an argument -- %c\n"),
+ argv[0], c);
+#endif
+ }
+ 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, posixly_correct, &getopt_data);
+
+ optind = getopt_data.optind;
+ optarg = getopt_data.optarg;
+ optopt = getopt_data.optopt;
+
+ return result;
+}
+
+/* glibc gets a LSB-compliant getopt.
+ Standalone applications get a POSIX-compliant getopt. */
+#if _LIBC
+enum { POSIXLY_CORRECT = 0 };
+#else
+enum { POSIXLY_CORRECT = 1 };
+#endif
+
+int
+getopt (int argc, char *const *argv, const char *optstring)
+{
+ return _getopt_internal (argc, (char **) argv, optstring, NULL, NULL, 0,
+ POSIXLY_CORRECT);
+}
+
+
+#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/getopt1.c b/lib/getopt1.c
new file mode 100644
index 0000000..cc0746e
--- /dev/null
+++ b/lib/getopt1.c
@@ -0,0 +1,171 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+ Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004,2006
+ 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef _LIBC
+# include <getopt.h>
+#else
+# include <config.h>
+# include "getopt.h"
+#endif
+#include "getopt_int.h"
+
+#include <stdio.h>
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+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, 0, d);
+}
+
+/* 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, 0, d);
+}
+
+
+#ifdef TEST
+
+#include <stdio.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 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_.h b/lib/getopt_.h
new file mode 100644
index 0000000..615ef9a
--- /dev/null
+++ b/lib/getopt_.h
@@ -0,0 +1,226 @@
+/* Declarations for getopt.
+ Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2005,2006,2007
+ 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GETOPT_H
+
+#ifndef __need_getopt
+# define _GETOPT_H 1
+#endif
+
+/* Standalone applications should #define __GETOPT_PREFIX to an
+ identifier that prefixes the external functions and variables
+ defined in this header. When this happens, include the
+ headers that might declare getopt so that they will not cause
+ confusion if included after this file. Then systematically rename
+ identifiers so that they do not collide with the system functions
+ and variables. Renaming avoids problems with some compilers and
+ linkers. */
+#if defined __GETOPT_PREFIX && !defined __need_getopt
+# include <stdlib.h>
+# include <stdio.h>
+# include <unistd.h>
+# undef __need_getopt
+# undef getopt
+# undef getopt_long
+# undef getopt_long_only
+# undef optarg
+# undef opterr
+# undef optind
+# undef optopt
+# 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)
+# define getopt __GETOPT_ID (getopt)
+# define getopt_long __GETOPT_ID (getopt_long)
+# define getopt_long_only __GETOPT_ID (getopt_long_only)
+# define optarg __GETOPT_ID (optarg)
+# define opterr __GETOPT_ID (opterr)
+# define optind __GETOPT_ID (optind)
+# define optopt __GETOPT_ID (optopt)
+#endif
+
+/* Standalone applications get correct prototypes for getopt_long and
+ getopt_long_only; they declare "char **argv". libc uses prototypes
+ with "char *const *argv" that are incorrect because getopt_long and
+ getopt_long_only can permute argv; this is required for backward
+ compatibility (e.g., for LSB 2.0.1).
+
+ This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt',
+ but it caused redefinition warnings if both unistd.h and getopt.h were
+ included, since unistd.h includes getopt.h having previously defined
+ __need_getopt.
+
+ The only place where __getopt_argv_const is used is in definitions
+ of getopt_long and getopt_long_only below, but these are visible
+ only if __need_getopt is not defined, so it is quite safe to rewrite
+ the conditional as follows:
+*/
+#if !defined __need_getopt
+# if defined __GETOPT_PREFIX
+# define __getopt_argv_const /* empty */
+# else
+# define __getopt_argv_const const
+# endif
+#endif
+
+/* If __GNU_LIBRARY__ is not already defined, either we are being used
+ standalone, or this is the first header included in the source file.
+ If we are being used with glibc, we need to include <features.h>, but
+ that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
+ not defined, include <ctype.h>, which will pull in <features.h> for us
+ if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
+ doesn't flood the namespace with stuff the way some other headers do.) */
+#if !defined __GNU_LIBRARY__
+# include <ctype.h>
+#endif
+
+#ifndef __THROW
+# ifndef __GNUC_PREREQ
+# define __GNUC_PREREQ(maj, min) (0)
+# endif
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# define __THROW throw ()
+# else
+# define __THROW
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 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;
+
+#ifndef __need_getopt
+/* 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
+#endif /* need getopt */
+
+
+/* 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. */
+
+extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
+ __THROW;
+
+#ifndef __need_getopt
+extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW;
+extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW;
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations. */
+#undef __need_getopt
+
+#endif /* getopt.h */
diff --git a/lib/getopt_int.h b/lib/getopt_int.h
new file mode 100644
index 0000000..401579f
--- /dev/null
+++ b/lib/getopt_int.h
@@ -0,0 +1,131 @@
+/* Internal declarations for getopt.
+ Copyright (C) 1989-1994,1996-1999,2001,2003,2004
+ 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GETOPT_INT_H
+#define _GETOPT_INT_H 1
+
+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. */
+
+/* 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;
+
+ /* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using `+' as the first character
+ of the list of option characters, or by calling getopt.
+
+ PERMUTE is the default. We 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. Using `-' as the first character of the
+ list of option characters selects this mode of operation.
+
+ 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
+ {
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+ } __ordering;
+
+ /* If the POSIXLY_CORRECT environment variable is set
+ or getopt was called. */
+ int __posixly_correct;
+
+
+ /* 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;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ int __nonoption_flags_max_len;
+ int __nonoption_flags_len;
+# endif
+};
+
+/* 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, int __posixly_correct,
+ struct _getopt_data *__data);
+
+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/getpagesize.h b/lib/getpagesize.h
new file mode 100644
index 0000000..8863336
--- /dev/null
+++ b/lib/getpagesize.h
@@ -0,0 +1,68 @@
+/* Emulate getpagesize on systems that lack it.
+ Copyright (C) 1999, 2000, 2004, 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+#ifndef HAVE_GETPAGESIZE
+
+#include <unistd.h>
+
+#if !defined getpagesize && defined _SC_PAGESIZE
+# if ! (defined __VMS && __VMS_VER < 70000000)
+# define getpagesize() sysconf (_SC_PAGESIZE)
+# endif
+#endif
+
+#if !defined getpagesize && defined __VMS
+# ifdef __ALPHA
+# define getpagesize() 8192
+# else
+# define getpagesize() 512
+# endif
+#endif
+
+/* This is for BeOS. */
+#if !defined getpagesize && HAVE_OS_H
+# include <OS.h>
+# if defined B_PAGE_SIZE
+# define getpagesize() B_PAGE_SIZE
+# endif
+#endif
+
+/* This is for AmigaOS4.0. */
+#if !defined getpagesize && defined __amigaos4__
+# define getpagesize() 2048
+#endif
+
+#if !defined getpagesize && HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else
+# ifdef NBPG
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif
+# define getpagesize() (NBPG * CLSIZE)
+# else
+# ifdef NBPC
+# define getpagesize() NBPC
+# endif
+# endif
+# endif
+#endif
+
+#endif /* not HAVE_GETPAGESIZE */
diff --git a/lib/gettext.h b/lib/gettext.h
new file mode 100644
index 0000000..9d76ec9
--- /dev/null
+++ b/lib/gettext.h
@@ -0,0 +1,270 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+ Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option. */
+#if 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) || _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". */
+# define gettext(Msgid) ((const char *) (Msgid))
+# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
+# define dcgettext(Domainname, Msgid, Category) \
+ ((void) (Category), dgettext (Domainname, Msgid))
+# define ngettext(Msgid1, Msgid2, N) \
+ ((N) == 1 \
+ ? ((void) (Msgid2), (const char *) (Msgid1)) \
+ : ((void) (Msgid1), (const char *) (Msgid2)))
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+ ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+ ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N))
+# define textdomain(Domainname) ((const char *) (Domainname))
+# define bindtextdomain(Domainname, Dirname) \
+ ((void) (Domainname), (const char *) (Dirname))
+# define bind_textdomain_codeset(Domainname, Codeset) \
+ ((void) (Domainname), (const char *) (Codeset))
+
+#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>
+
+#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \
+ (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \
+ /* || __STDC_VERSION__ >= 199901L */ )
+
+#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
+ {
+ 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);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ if (msg_ctxt_id != buf)
+ free (msg_ctxt_id);
+#endif
+ if (translation != msg_ctxt_id)
+ 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
+ {
+ 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);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ if (msg_ctxt_id != buf)
+ free (msg_ctxt_id);
+#endif
+ if (!(translation == msg_ctxt_id || translation == msgid_plural))
+ 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..86bd325
--- /dev/null
+++ b/lib/gettime.c
@@ -0,0 +1,49 @@
+/* gettime -- get the system clock
+
+ Copyright (C) 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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 HAVE_NANOTIME
+ nanotime (ts);
+#else
+
+# if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME
+ if (clock_gettime (CLOCK_REALTIME, ts) == 0)
+ return;
+# endif
+
+ {
+ struct timeval tv;
+ gettimeofday (&tv, NULL);
+ ts->tv_sec = tv.tv_sec;
+ ts->tv_nsec = tv.tv_usec * 1000;
+ }
+
+#endif
+}
diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c
new file mode 100644
index 0000000..bd5576c
--- /dev/null
+++ b/lib/gettimeofday.c
@@ -0,0 +1,142 @@
+/* Provide gettimeofday for systems that don't have it or for which it's broken.
+
+ Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/time.h>
+
+#include <time.h>
+
+#if HAVE_SYS_TIMEB_H
+# include <sys/timeb.h>
+#endif
+
+#if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME
+
+/* 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. The tzset replacement is necessary for at least
+ Solaris 2.5, 2.5.1, and 2.6. */
+
+static struct tm tm_zero_buffer;
+static struct tm *localtime_buffer_addr = &tm_zero_buffer;
+
+/* This is a wrapper for localtime. It is used only on systems for which
+ gettimeofday clobbers the static buffer used for localtime's result.
+
+ On the first call, record the address of the static buffer that
+ localtime uses for its result. */
+
+struct tm *
+localtime (time_t const *timep)
+{
+#undef localtime
+ extern struct tm *localtime (time_t const *);
+ struct tm *tm = localtime (timep);
+
+ if (localtime_buffer_addr == &tm_zero_buffer)
+ localtime_buffer_addr = tm;
+
+ return tm;
+}
+
+/* Same as above, since gmtime and localtime use the same buffer. */
+struct tm *
+gmtime (time_t const *timep)
+{
+#undef gmtime
+ extern struct tm *gmtime (time_t const *);
+ struct tm *tm = gmtime (timep);
+
+ if (localtime_buffer_addr == &tm_zero_buffer)
+ localtime_buffer_addr = tm;
+
+ return tm;
+}
+
+#endif /* GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME */
+
+#if TZSET_CLOBBERS_LOCALTIME
+/* This is a wrapper for tzset, for systems on which tzset may clobber
+ the static buffer used for localtime's result. */
+void
+tzset (void)
+{
+#undef tzset
+ extern void tzset (void);
+
+ /* Save and restore the contents of the buffer used for localtime's
+ result around the call to tzset. */
+ struct tm save = *localtime_buffer_addr;
+ tzset ();
+ *localtime_buffer_addr = save;
+}
+#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. */
+
+int
+rpl_gettimeofday (struct timeval *restrict tv, void *restrict tz)
+{
+#undef gettimeofday
+#if HAVE_GETTIMEOFDAY
+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+ /* Save and restore the contents of the buffer used for localtime's
+ result around the call to gettimeofday. */
+ struct tm save = *localtime_buffer_addr;
+# endif
+
+ int result = gettimeofday (tv, tz);
+
+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+ *localtime_buffer_addr = save;
+# endif
+
+ return result;
+
+#else
+
+# if HAVE__FTIME
+
+ struct _timeb timebuf;
+ _ftime (&timebuf);
+ tv->tv_sec = timebuf.time;
+ tv->tv_usec = timebuf.millitm * 1000;
+
+# 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;
+
+# endif
+
+ return 0;
+
+#endif
+}
diff --git a/lib/gnulib.mk b/lib/gnulib.mk
new file mode 100644
index 0000000..77691d6
--- /dev/null
+++ b/lib/gnulib.mk
@@ -0,0 +1,1553 @@
+## DO NOT EDIT! GENERATED AUTOMATICALLY!
+## Process this file with automake to produce Makefile.in.
+# Copyright (C) 2004-2007 Free Software Foundation, Inc.
+#
+# This file is free software, distributed under the terms of the GNU
+# General Public License. As a special exception to the GNU General
+# Public License, this file may be distributed as part of a program
+# that contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+# Reproduce by: gnulib-tool --import --dir=. --local-dir=gl --lib=libtar --source-base=.#bootmp/lib --m4-base=.#bootmp/m4 --doc-base=.#bootmp/doc --aux-dir=.#bootmp/build-aux --avoid=lock --avoid=size_max --avoid=xsize --no-libtool --macro-prefix=gl alloca argmatch argp backupfile closeout configmake dirname error exclude exitfail fileblocks fnmatch-gnu ftruncate full-write getdate getline getopt getpagesize gettext gettime hash human inttostr inttypes lchown localcharset memset mkdtemp modechange obstack quote quotearg rmdir rpmatch safe-read save-cwd savedir setenv stat-time stdbool stdint stpcpy strdup strerror strtol strtoul timespec unlinkdir unlocked-io utime utimens version-etc-fsf xalloc xalloc-die xgetcwd xstrtoumax
+
+AUTOMAKE_OPTIONS = 1.5 gnits
+
+noinst_HEADERS =
+noinst_LIBRARIES =
+noinst_LTLIBRARIES =
+EXTRA_DIST =
+BUILT_SOURCES =
+SUFFIXES =
+MOSTLYCLEANFILES = core *.stackdump
+MOSTLYCLEANDIRS =
+CLEANFILES =
+DISTCLEANFILES =
+MAINTAINERCLEANFILES =
+
+AM_CPPFLAGS =
+
+noinst_LIBRARIES += libtar.a
+
+libtar_a_SOURCES =
+libtar_a_LIBADD = $(gl_LIBOBJS)
+libtar_a_DEPENDENCIES = $(gl_LIBOBJS)
+EXTRA_libtar_a_SOURCES =
+
+## 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__ || 60000000 <= __DECC_VER)
+
+## end gnulib module absolute-header
+
+## begin gnulib module alloca
+
+
+EXTRA_DIST += alloca.c
+
+EXTRA_libtar_a_SOURCES += alloca.c
+
+libtar_a_LIBADD += @ALLOCA@
+libtar_a_DEPENDENCIES += @ALLOCA@
+## 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.
+alloca.h: alloca_.h
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/alloca_.h; \
+ } > $@-t
+ mv -f $@-t $@
+MOSTLYCLEANFILES += alloca.h alloca.h-t
+
+EXTRA_DIST += alloca_.h
+
+## end gnulib module alloca-opt
+
+## begin gnulib module allocsa
+
+libtar_a_SOURCES += allocsa.h allocsa.c
+
+EXTRA_DIST += allocsa.valgrind
+
+## end gnulib module allocsa
+
+## begin gnulib module argmatch
+
+
+EXTRA_DIST += argmatch.c argmatch.h
+
+EXTRA_libtar_a_SOURCES += argmatch.c
+
+## end gnulib module argmatch
+
+## begin gnulib module argp
+
+libtar_a_SOURCES += argp.h argp-ba.c argp-eexst.c \
+ argp-fmtstream.c argp-fmtstream.h argp-fs-xinl.c argp-help.c \
+ argp-namefrob.h argp-parse.c argp-pin.c argp-pv.c argp-pvh.c \
+ argp-xinl.c
+
+## end gnulib module argp
+
+## begin gnulib module backupfile
+
+
+EXTRA_DIST += backupfile.c backupfile.h
+
+EXTRA_libtar_a_SOURCES += backupfile.c
+
+## end gnulib module backupfile
+
+## begin gnulib module canonicalize-lgpl
+
+
+EXTRA_DIST += canonicalize-lgpl.c canonicalize.h
+
+EXTRA_libtar_a_SOURCES += canonicalize-lgpl.c
+
+## end gnulib module canonicalize-lgpl
+
+## begin gnulib module chdir-long
+
+
+EXTRA_DIST += chdir-long.c chdir-long.h
+
+EXTRA_libtar_a_SOURCES += chdir-long.c
+
+## end gnulib module chdir-long
+
+## begin gnulib module chown
+
+
+EXTRA_DIST += chown.c fchown-stub.c
+
+EXTRA_libtar_a_SOURCES += chown.c fchown-stub.c
+
+## end gnulib module chown
+
+## begin gnulib module close-stream
+
+
+EXTRA_DIST += close-stream.c close-stream.h
+
+EXTRA_libtar_a_SOURCES += close-stream.c
+
+## end gnulib module close-stream
+
+## begin gnulib module closeout
+
+
+EXTRA_DIST += closeout.c closeout.h
+
+EXTRA_libtar_a_SOURCES += closeout.c
+
+## end gnulib module closeout
+
+## begin gnulib module configmake
+
+# Retrieve values of the variables through 'configure' followed by
+# 'make', not directly through 'configure', so that a user who
+# sets some of these variables consistently on the 'make' command
+# line gets correct results.
+#
+# One advantage of this approach, compared to the classical
+# approach of adding -DLIBDIR=\"$(libdir)\" etc. to AM_CPPFLAGS,
+# is that it protects against the use of undefined variables.
+# If, say, $(libdir) is not set in the Makefile, LIBDIR is not
+# defined by this module, and code using LIBDIR gives a
+# compilation error.
+#
+# Another advantage is that 'make' output is shorter.
+#
+# Listed in the same order as the GNU makefile conventions.
+# The Automake-defined pkg* macros are appended, in the order
+# listed in the Automake 1.10a+ documentation.
+configmake.h: Makefile
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ echo '#define PREFIX "$(prefix)"'; \
+ echo '#define EXEC_PREFIX "$(exec_prefix)"'; \
+ echo '#define BINDIR "$(bindir)"'; \
+ echo '#define SBINDIR "$(sbindir)"'; \
+ echo '#define LIBEXECDIR "$(libexecdir)"'; \
+ echo '#define DATAROOTDIR "$(datarootdir)"'; \
+ echo '#define DATADIR "$(datadir)"'; \
+ echo '#define SYSCONFDIR "$(sysconfdir)"'; \
+ echo '#define SHAREDSTATEDIR "$(sharedstatedir)"'; \
+ echo '#define LOCALSTATEDIR "$(localstatedir)"'; \
+ echo '#define INCLUDEDIR "$(includedir)"'; \
+ echo '#define OLDINCLUDEDIR "$(oldincludedir)"'; \
+ echo '#define DOCDIR "$(docdir)"'; \
+ echo '#define INFODIR "$(infodir)"'; \
+ echo '#define HTMLDIR "$(htmldir)"'; \
+ echo '#define DVIDIR "$(dvidir)"'; \
+ echo '#define PDFDIR "$(pdfdir)"'; \
+ echo '#define PSDIR "$(psdir)"'; \
+ echo '#define LIBDIR "$(libdir)"'; \
+ echo '#define LISPDIR "$(lispdir)"'; \
+ echo '#define LOCALEDIR "$(localedir)"'; \
+ echo '#define MANDIR "$(mandir)"'; \
+ echo '#define MANEXT "$(manext)"'; \
+ echo '#define PKGDATADIR "$(pkgdatadir)"'; \
+ echo '#define PKGINCLUDEDIR "$(pkgincludedir)"'; \
+ echo '#define PKGLIBDIR "$(pkglibdir)"'; \
+ echo '#define PKGLIBEXECDIR "$(pkglibexecdir)"'; \
+ } | sed '/""/d' > $@-t
+ mv $@-t $@
+BUILT_SOURCES += configmake.h
+CLEANFILES += configmake.h configmake.h-t
+
+## end gnulib module configmake
+
+## begin gnulib module dirfd
+
+
+EXTRA_DIST += dirfd.c dirfd.h
+
+EXTRA_libtar_a_SOURCES += dirfd.c
+
+## end gnulib module dirfd
+
+## begin gnulib module dirname
+
+
+EXTRA_DIST += basename.c dirname.c dirname.h stripslash.c
+
+EXTRA_libtar_a_SOURCES += basename.c dirname.c stripslash.c
+
+## end gnulib module dirname
+
+## begin gnulib module dup2
+
+
+EXTRA_DIST += dup2.c
+
+EXTRA_libtar_a_SOURCES += dup2.c
+
+## end gnulib module dup2
+
+## begin gnulib module error
+
+
+EXTRA_DIST += error.c error.h
+
+EXTRA_libtar_a_SOURCES += error.c
+
+## end gnulib module error
+
+## begin gnulib module exclude
+
+
+EXTRA_DIST += exclude.c exclude.h
+
+EXTRA_libtar_a_SOURCES += exclude.c
+
+## end gnulib module exclude
+
+## begin gnulib module exitfail
+
+
+EXTRA_DIST += exitfail.c exitfail.h
+
+EXTRA_libtar_a_SOURCES += exitfail.c
+
+## end gnulib module exitfail
+
+## begin gnulib module fchdir
+
+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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''ABSOLUTE_DIRENT_H''@|$(ABSOLUTE_DIRENT_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \
+ < $(srcdir)/dirent_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += dirent.h dirent.h-t
+
+EXTRA_DIST += dirent_.h fchdir.c
+
+EXTRA_libtar_a_SOURCES += fchdir.c
+
+## end gnulib module fchdir
+
+## begin gnulib module fcntl
+
+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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''ABSOLUTE_FCNTL_H''@|$(ABSOLUTE_FCNTL_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ < $(srcdir)/fcntl_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += fcntl.h fcntl.h-t
+
+EXTRA_DIST += fcntl_.h
+
+## end gnulib module fcntl
+
+## begin gnulib module fcntl-safer
+
+
+EXTRA_DIST += creat-safer.c fcntl--.h fcntl-safer.h open-safer.c
+
+EXTRA_libtar_a_SOURCES += creat-safer.c open-safer.c
+
+## end gnulib module fcntl-safer
+
+## begin gnulib module fileblocks
+
+
+EXTRA_DIST += fileblocks.c
+
+EXTRA_libtar_a_SOURCES += fileblocks.c
+
+## end gnulib module fileblocks
+
+## 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.
+float.h: float_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''ABSOLUTE_FLOAT_H''@|$(ABSOLUTE_FLOAT_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ < $(srcdir)/float_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += float.h float.h-t
+
+EXTRA_DIST += float_.h
+
+## end gnulib module float
+
+## begin gnulib module fnmatch
+
+BUILT_SOURCES += $(FNMATCH_H)
+
+# We need the following in order to create <fnmatch.h> when the system
+# doesn't have one that supports the required API.
+fnmatch.h: fnmatch_.h
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/fnmatch_.h; \
+ } > $@-t
+ mv -f $@-t $@
+MOSTLYCLEANFILES += fnmatch.h fnmatch.h-t
+
+EXTRA_DIST += fnmatch.c fnmatch_.h fnmatch_loop.c
+
+EXTRA_libtar_a_SOURCES += fnmatch.c fnmatch_loop.c
+
+## end gnulib module fnmatch
+
+## begin gnulib module fpending
+
+
+EXTRA_DIST += __fpending.c __fpending.h
+
+EXTRA_libtar_a_SOURCES += __fpending.c
+
+## end gnulib module fpending
+
+## begin gnulib module ftruncate
+
+
+EXTRA_DIST += ftruncate.c
+
+EXTRA_libtar_a_SOURCES += ftruncate.c
+
+## end gnulib module ftruncate
+
+## begin gnulib module full-write
+
+libtar_a_SOURCES += full-write.h full-write.c
+
+## end gnulib module full-write
+
+## begin gnulib module getcwd
+
+
+EXTRA_DIST += getcwd.c
+
+EXTRA_libtar_a_SOURCES += getcwd.c
+
+## end gnulib module getcwd
+
+## begin gnulib module getdate
+
+libtar_a_SOURCES += getdate.y
+BUILT_SOURCES += getdate.c
+MAINTAINERCLEANFILES += getdate.c
+EXTRA_DIST += getdate.c
+
+EXTRA_DIST += getdate.h
+
+## end gnulib module getdate
+
+## begin gnulib module getdelim
+
+
+EXTRA_DIST += getdelim.c getdelim.h
+
+EXTRA_libtar_a_SOURCES += getdelim.c
+
+## end gnulib module getdelim
+
+## begin gnulib module getline
+
+
+EXTRA_DIST += getline.c getline.h
+
+EXTRA_libtar_a_SOURCES += getline.c
+
+## end gnulib module getline
+
+## begin gnulib module getopt
+
+BUILT_SOURCES += $(GETOPT_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_.h
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/getopt_.h; \
+ } > $@-t
+ mv -f $@-t $@
+MOSTLYCLEANFILES += getopt.h getopt.h-t
+
+EXTRA_DIST += getopt.c getopt1.c getopt_.h getopt_int.h
+
+EXTRA_libtar_a_SOURCES += getopt.c getopt1.c
+
+## end gnulib module getopt
+
+## begin gnulib module getpagesize
+
+
+EXTRA_DIST += getpagesize.h
+
+## end gnulib module getpagesize
+
+## begin gnulib module gettext
+
+# This is for those projects which use "gettextize --intl" to put a source-code
+# copy of libintl into their package. In such projects, every Makefile.am needs
+# -I$(top_builddir)/intl, so that <libintl.h> can be found in this directory.
+# For the Makefile.ams in other directories it is the maintainer's
+# responsibility; for the one from gnulib we do it here.
+# This option has no effect when the user disables NLS (because then the intl
+# directory contains no libintl.h file) or when the project does not use
+# "gettextize --intl".
+#AM_CPPFLAGS += -I$(top_builddir)/intl
+
+## end gnulib module gettext
+
+## begin gnulib module gettext-h
+
+libtar_a_SOURCES += gettext.h
+
+## end gnulib module gettext-h
+
+## begin gnulib module gettime
+
+
+EXTRA_DIST += gettime.c
+
+EXTRA_libtar_a_SOURCES += gettime.c
+
+## end gnulib module gettime
+
+## begin gnulib module gettimeofday
+
+
+EXTRA_DIST += gettimeofday.c
+
+EXTRA_libtar_a_SOURCES += gettimeofday.c
+
+## end gnulib module gettimeofday
+
+## begin gnulib module hash
+
+
+EXTRA_DIST += hash.c hash.h
+
+EXTRA_libtar_a_SOURCES += hash.c
+
+## end gnulib module hash
+
+## begin gnulib module human
+
+
+EXTRA_DIST += human.c human.h
+
+EXTRA_libtar_a_SOURCES += human.c
+
+## end gnulib module human
+
+## begin gnulib module intprops
+
+
+EXTRA_DIST += intprops.h
+
+## end gnulib module intprops
+
+## begin gnulib module inttostr
+
+
+EXTRA_DIST += imaxtostr.c inttostr.c inttostr.h offtostr.c uinttostr.c umaxtostr.c
+
+EXTRA_libtar_a_SOURCES += imaxtostr.c inttostr.c offtostr.c uinttostr.c umaxtostr.c
+
+## end gnulib module inttostr
+
+## begin gnulib module inttypes
+
+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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's|@''ABSOLUTE_INTTYPES_H''@|$(ABSOLUTE_INTTYPES_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's/@''PRI_MACROS_BROKEN''@/$(PRI_MACROS_BROKEN)/g' \
+ -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
+ -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/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 '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+ < $(srcdir)/inttypes_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += inttypes.h inttypes.h-t
+
+EXTRA_DIST += inttypes_.h
+
+## end gnulib module inttypes
+
+## begin gnulib module lchown
+
+
+EXTRA_DIST += lchown.c lchown.h
+
+EXTRA_libtar_a_SOURCES += lchown.c
+
+## end gnulib module lchown
+
+## begin gnulib module link-warning
+
+LINK_WARNING_H=$(top_srcdir)/build-aux/link-warning.h
+
+## end gnulib module link-warning
+
+## begin gnulib module localcharset
+
+libtar_a_SOURCES += localcharset.h localcharset.c
+
+# We need the following in order to install a simple file in $(libdir)
+# which is shared with other installed packages. We use a list of referencing
+# packages so that "make uninstall" will remove the file if and only if it
+# is not used by another installed package.
+# On systems with glibc-2.1 or newer, the file is redundant, therefore we
+# avoid installing it.
+
+all-local: charset.alias ref-add.sed ref-del.sed
+
+charset_alias = $(DESTDIR)$(libdir)/charset.alias
+charset_tmp = $(DESTDIR)$(libdir)/charset.tmp
+install-exec-local: all-local
+ test $(GLIBC21) != no || $(mkinstalldirs) $(DESTDIR)$(libdir)
+ if test -f $(charset_alias); then \
+ sed -f ref-add.sed $(charset_alias) > $(charset_tmp) ; \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \
+ rm -f $(charset_tmp) ; \
+ else \
+ if test $(GLIBC21) = no; then \
+ sed -f ref-add.sed charset.alias > $(charset_tmp) ; \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \
+ rm -f $(charset_tmp) ; \
+ fi ; \
+ fi
+
+uninstall-local: all-local
+ if test -f $(charset_alias); then \
+ sed -f ref-del.sed $(charset_alias) > $(charset_tmp); \
+ if grep '^# Packages using this file: $$' $(charset_tmp) \
+ > /dev/null; then \
+ rm -f $(charset_alias); \
+ else \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias); \
+ fi; \
+ rm -f $(charset_tmp); \
+ fi
+
+charset.alias: config.charset
+ rm -f t-$@ $@
+ $(SHELL) $(srcdir)/config.charset '$(host)' > t-$@
+ mv t-$@ $@
+
+SUFFIXES += .sed .sin
+.sin.sed:
+ rm -f t-$@ $@
+ sed -e '/^#/d' -e 's/@''PACKAGE''@/$(PACKAGE)/g' $< > t-$@
+ mv t-$@ $@
+
+CLEANFILES += charset.alias ref-add.sed ref-del.sed
+
+EXTRA_DIST += config.charset ref-add.sin ref-del.sin
+
+## end gnulib module localcharset
+
+## begin gnulib module lstat
+
+
+EXTRA_DIST += lstat.c lstat.h
+
+EXTRA_libtar_a_SOURCES += lstat.c
+
+## end gnulib module lstat
+
+## begin gnulib module malloc
+
+
+EXTRA_DIST += malloc.c
+
+EXTRA_libtar_a_SOURCES += malloc.c
+
+## end gnulib module malloc
+
+## begin gnulib module mbchar
+
+libtar_a_SOURCES += mbchar.c
+
+EXTRA_DIST += mbchar.h
+
+## end gnulib module mbchar
+
+## begin gnulib module mbscasecmp
+
+libtar_a_SOURCES += mbscasecmp.c
+
+## end gnulib module mbscasecmp
+
+## begin gnulib module mbuiter
+
+libtar_a_SOURCES += mbuiter.h
+
+## end gnulib module mbuiter
+
+## begin gnulib module memchr
+
+
+EXTRA_DIST += memchr.c
+
+EXTRA_libtar_a_SOURCES += memchr.c
+
+## end gnulib module memchr
+
+## begin gnulib module mempcpy
+
+
+EXTRA_DIST += mempcpy.c
+
+EXTRA_libtar_a_SOURCES += mempcpy.c
+
+## end gnulib module mempcpy
+
+## begin gnulib module memrchr
+
+
+EXTRA_DIST += memrchr.c
+
+EXTRA_libtar_a_SOURCES += memrchr.c
+
+## end gnulib module memrchr
+
+## begin gnulib module memset
+
+
+EXTRA_DIST += memset.c
+
+EXTRA_libtar_a_SOURCES += memset.c
+
+## end gnulib module memset
+
+## begin gnulib module mkdtemp
+
+
+EXTRA_DIST += mkdtemp.c
+
+EXTRA_libtar_a_SOURCES += mkdtemp.c
+
+## end gnulib module mkdtemp
+
+## begin gnulib module mktime
+
+
+EXTRA_DIST += mktime.c
+
+EXTRA_libtar_a_SOURCES += mktime.c
+
+## end gnulib module mktime
+
+## begin gnulib module modechange
+
+
+EXTRA_DIST += modechange.c modechange.h
+
+EXTRA_libtar_a_SOURCES += modechange.c
+
+## end gnulib module modechange
+
+## begin gnulib module obstack
+
+
+EXTRA_DIST += obstack.c obstack.h
+
+EXTRA_libtar_a_SOURCES += obstack.c
+
+## end gnulib module obstack
+
+## begin gnulib module openat
+
+
+EXTRA_DIST += at-func.c fchmodat.c fchownat.c fstatat.c mkdirat.c openat-priv.h openat-proc.c openat.c openat.h
+
+EXTRA_libtar_a_SOURCES += at-func.c fchmodat.c fchownat.c fstatat.c mkdirat.c openat-proc.c openat.c
+
+## end gnulib module openat
+
+## begin gnulib module openat-die
+
+libtar_a_SOURCES += openat-die.c
+
+## end gnulib module openat-die
+
+## begin gnulib module pathmax
+
+
+EXTRA_DIST += pathmax.h
+
+## end gnulib module pathmax
+
+## begin gnulib module quote
+
+
+EXTRA_DIST += quote.c quote.h
+
+EXTRA_libtar_a_SOURCES += quote.c
+
+## end gnulib module quote
+
+## begin gnulib module quotearg
+
+
+EXTRA_DIST += quotearg.c quotearg.h
+
+EXTRA_libtar_a_SOURCES += quotearg.c
+
+## end gnulib module quotearg
+
+## begin gnulib module readlink
+
+
+EXTRA_DIST += readlink.c
+
+EXTRA_libtar_a_SOURCES += readlink.c
+
+## end gnulib module readlink
+
+## begin gnulib module regex
+
+
+EXTRA_DIST += regcomp.c regex.c regex.h regex_internal.c regex_internal.h regexec.c
+
+EXTRA_libtar_a_SOURCES += regcomp.c regex.c regex_internal.c regexec.c
+
+## end gnulib module regex
+
+## begin gnulib module rmdir
+
+
+EXTRA_DIST += rmdir.c
+
+EXTRA_libtar_a_SOURCES += rmdir.c
+
+## end gnulib module rmdir
+
+## begin gnulib module rpmatch
+
+
+EXTRA_DIST += rpmatch.c
+
+EXTRA_libtar_a_SOURCES += rpmatch.c
+
+## end gnulib module rpmatch
+
+## begin gnulib module safe-read
+
+
+EXTRA_DIST += safe-read.c safe-read.h
+
+EXTRA_libtar_a_SOURCES += safe-read.c
+
+## end gnulib module safe-read
+
+## begin gnulib module safe-write
+
+
+EXTRA_DIST += safe-write.c safe-write.h
+
+EXTRA_libtar_a_SOURCES += safe-write.c
+
+## end gnulib module safe-write
+
+## begin gnulib module same-inode
+
+
+EXTRA_DIST += same-inode.h
+
+## end gnulib module same-inode
+
+## begin gnulib module save-cwd
+
+
+EXTRA_DIST += save-cwd.c save-cwd.h
+
+EXTRA_libtar_a_SOURCES += save-cwd.c
+
+## end gnulib module save-cwd
+
+## begin gnulib module savedir
+
+
+EXTRA_DIST += savedir.c savedir.h
+
+EXTRA_libtar_a_SOURCES += savedir.c
+
+## end gnulib module savedir
+
+## begin gnulib module setenv
+
+
+EXTRA_DIST += setenv.c setenv.h unsetenv.c
+
+EXTRA_libtar_a_SOURCES += setenv.c unsetenv.c
+
+## end gnulib module setenv
+
+## begin gnulib module sleep
+
+
+EXTRA_DIST += sleep.c
+
+EXTRA_libtar_a_SOURCES += sleep.c
+
+## end gnulib module sleep
+
+## begin gnulib module stat-macros
+
+
+EXTRA_DIST += stat-macros.h
+
+## end gnulib module stat-macros
+
+## begin gnulib module stat-time
+
+
+EXTRA_DIST += stat-time.h
+
+## end gnulib module stat-time
+
+## 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.
+stdbool.h: stdbool_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += stdbool.h stdbool.h-t
+
+EXTRA_DIST += stdbool_.h
+
+## end gnulib module stdbool
+
+## 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.
+stdint.h: stdint_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+ -e 's|@''ABSOLUTE_STDINT_H''@|$(ABSOLUTE_STDINT_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/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_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
+ -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/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' \
+ < $(srcdir)/stdint_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += stdint.h stdint.h-t
+
+EXTRA_DIST += stdint_.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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''ABSOLUTE_STDIO_H''@|$(ABSOLUTE_STDIO_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''GNULIB_FPRINTF_POSIX''@|$(GNULIB_FPRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_PRINTF_POSIX''@|$(GNULIB_PRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_SNPRINTF''@|$(GNULIB_SNPRINTF)|g' \
+ -e 's|@''GNULIB_SPRINTF_POSIX''@|$(GNULIB_SPRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_VFPRINTF_POSIX''@|$(GNULIB_VFPRINTF_POSIX)|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_VASPRINTF''@|$(GNULIB_VASPRINTF)|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_FFLUSH''@|$(GNULIB_FFLUSH)|g' \
+ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \
+ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \
+ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \
+ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \
+ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
+ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
+ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
+ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \
+ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \
+ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
+ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
+ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
+ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
+ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \
+ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
+ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \
+ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
+ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+ < $(srcdir)/stdio_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += stdio.h stdio.h-t
+
+EXTRA_DIST += stdio_.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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''ABSOLUTE_STDLIB_H''@|$(ABSOLUTE_STDLIB_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''GNULIB_GETSUBOPT''@|$(GNULIB_GETSUBOPT)|g' \
+ -e 's|@''GNULIB_MKDTEMP''@|$(GNULIB_MKDTEMP)|g' \
+ -e 's|@''GNULIB_MKSTEMP''@|$(GNULIB_MKSTEMP)|g' \
+ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+ < $(srcdir)/stdlib_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += stdlib.h stdlib.h-t
+
+EXTRA_DIST += stdlib_.h
+
+## end gnulib module stdlib
+
+## begin gnulib module stpcpy
+
+
+EXTRA_DIST += stpcpy.c
+
+EXTRA_libtar_a_SOURCES += stpcpy.c
+
+## end gnulib module stpcpy
+
+## begin gnulib module strcase
+
+
+EXTRA_DIST += strcasecmp.c strncasecmp.c
+
+EXTRA_libtar_a_SOURCES += strcasecmp.c strncasecmp.c
+
+## end gnulib module strcase
+
+## begin gnulib module strchrnul
+
+
+EXTRA_DIST += strchrnul.c
+
+EXTRA_libtar_a_SOURCES += strchrnul.c
+
+## end gnulib module strchrnul
+
+## begin gnulib module strdup
+
+
+EXTRA_DIST += strdup.c
+
+EXTRA_libtar_a_SOURCES += strdup.c
+
+## end gnulib module strdup
+
+## begin gnulib module strerror
+
+
+EXTRA_DIST += strerror.c
+
+EXTRA_libtar_a_SOURCES += strerror.c
+
+## end gnulib module strerror
+
+## 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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''ABSOLUTE_STRING_H''@|$(ABSOLUTE_STRING_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''GNULIB_MBSLEN''@|$(GNULIB_MBSLEN)|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_MEMMEM''@|$(GNULIB_MEMMEM)|g' \
+ -e 's|@''GNULIB_MEMPCPY''@|$(GNULIB_MEMPCPY)|g' \
+ -e 's|@''GNULIB_MEMRCHR''@|$(GNULIB_MEMRCHR)|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_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_STRCASESTR''@|$(GNULIB_STRCASESTR)|g' \
+ -e 's|@''GNULIB_STRTOK_R''@|$(GNULIB_STRTOK_R)|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_STPCPY''@|$(HAVE_STPCPY)|g' \
+ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+ -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
+ -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
+ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+ -e 's|@''HAVE_STRNDUP''@|$(HAVE_STRNDUP)|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 '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+ < $(srcdir)/string_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += string.h string.h-t
+
+EXTRA_DIST += string_.h
+
+## end gnulib module string
+
+## begin gnulib module strndup
+
+
+EXTRA_DIST += strndup.c
+
+EXTRA_libtar_a_SOURCES += strndup.c
+
+## end gnulib module strndup
+
+## begin gnulib module strnlen
+
+
+EXTRA_DIST += strnlen.c
+
+EXTRA_libtar_a_SOURCES += strnlen.c
+
+## end gnulib module strnlen
+
+## begin gnulib module strnlen1
+
+libtar_a_SOURCES += strnlen1.h strnlen1.c
+
+## end gnulib module strnlen1
+
+## begin gnulib module strtoimax
+
+
+EXTRA_DIST += strtoimax.c
+
+EXTRA_libtar_a_SOURCES += strtoimax.c
+
+## end gnulib module strtoimax
+
+## begin gnulib module strtol
+
+
+EXTRA_DIST += strtol.c
+
+EXTRA_libtar_a_SOURCES += strtol.c
+
+## end gnulib module strtol
+
+## begin gnulib module strtoll
+
+
+EXTRA_DIST += strtoll.c
+
+EXTRA_libtar_a_SOURCES += strtoll.c
+
+## end gnulib module strtoll
+
+## begin gnulib module strtoul
+
+
+EXTRA_DIST += strtoul.c
+
+EXTRA_libtar_a_SOURCES += strtoul.c
+
+## end gnulib module strtoul
+
+## begin gnulib module strtoull
+
+
+EXTRA_DIST += strtoull.c
+
+EXTRA_libtar_a_SOURCES += strtoull.c
+
+## end gnulib module strtoull
+
+## begin gnulib module strtoumax
+
+
+EXTRA_DIST += strtoumax.c
+
+EXTRA_libtar_a_SOURCES += strtoumax.c
+
+## end gnulib module strtoumax
+
+## 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_.h
+ @MKDIR_P@ sys
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''ABSOLUTE_SYS_STAT_H''@|$(ABSOLUTE_SYS_STAT_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''HAVE_IO_H''@|$(HAVE_IO_H)|g' \
+ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \
+ -e 's|@''HAVE_DECL_MKDIR''@|$(HAVE_DECL_MKDIR)|g' \
+ < $(srcdir)/sys_stat_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/stat.h sys/stat.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_stat_.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_.h
+ @MKDIR_P@ sys
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \
+ -e 's|@''ABSOLUTE_SYS_TIME_H''@|$(ABSOLUTE_SYS_TIME_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \
+ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \
+ < $(srcdir)/sys_time_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/time.h sys/time.h-t
+
+EXTRA_DIST += sys_time_.h
+
+## end gnulib module sys_time
+
+## begin gnulib module sysexits
+
+BUILT_SOURCES += $(SYSEXITS_H)
+
+# We need the following in order to create <sysexits.h> when the system
+# doesn't have one that works with the given compiler.
+sysexits.h: sysexits_.h
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SYSEXITS_H''@|$(HAVE_SYSEXITS_H)|g' \
+ -e 's|@''ABSOLUTE_SYSEXITS_H''@|$(ABSOLUTE_SYSEXITS_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ < $(srcdir)/sysexits_.h; \
+ } > $@-t
+ mv -f $@-t $@
+MOSTLYCLEANFILES += sysexits.h sysexits.h-t
+
+EXTRA_DIST += sysexits_.h
+
+## end gnulib module sysexits
+
+## begin gnulib module tempname
+
+
+EXTRA_DIST += tempname.c tempname.h
+
+EXTRA_libtar_a_SOURCES += tempname.c
+
+## end gnulib module tempname
+
+## 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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@ABSOLUTE_TIME_H''@|$(ABSOLUTE_TIME_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \
+ -e 's|@REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \
+ -e 's|@REPLACE_STRPTIME''@|$(REPLACE_STRPTIME)|g' \
+ -e 's|@REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|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' \
+ < $(srcdir)/time_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += time.h time.h-t
+
+EXTRA_DIST += time_.h
+
+## end gnulib module time
+
+## begin gnulib module time_r
+
+
+EXTRA_DIST += time_r.c
+
+EXTRA_libtar_a_SOURCES += time_r.c
+
+## end gnulib module time_r
+
+## begin gnulib module timespec
+
+
+EXTRA_DIST += timespec.h
+
+## end gnulib module timespec
+
+## begin gnulib module unistd
+
+BUILT_SOURCES += unistd.h
+
+# We need the following in order to create an empty placeholder for
+# <unistd.h> when the system doesn't have one.
+unistd.h: unistd_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+ -e 's|@''ABSOLUTE_UNISTD_H''@|$(ABSOLUTE_UNISTD_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \
+ -e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \
+ -e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \
+ -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \
+ -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \
+ -e 's|@''GNULIB_GETLOGIN_R''@|$(GNULIB_GETLOGIN_R)|g' \
+ -e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \
+ -e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \
+ -e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \
+ -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
+ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+ -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \
+ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+ < $(srcdir)/unistd_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += unistd.h unistd.h-t
+
+EXTRA_DIST += unistd_.h
+
+## end gnulib module unistd
+
+## begin gnulib module unistd-safer
+
+
+EXTRA_DIST += dup-safer.c fd-safer.c pipe-safer.c unistd--.h unistd-safer.h
+
+EXTRA_libtar_a_SOURCES += dup-safer.c fd-safer.c pipe-safer.c
+
+## end gnulib module unistd-safer
+
+## begin gnulib module unlinkdir
+
+
+EXTRA_DIST += unlinkdir.c unlinkdir.h
+
+EXTRA_libtar_a_SOURCES += unlinkdir.c
+
+## end gnulib module unlinkdir
+
+## begin gnulib module unlocked-io
+
+
+EXTRA_DIST += unlocked-io.h
+
+## end gnulib module unlocked-io
+
+## begin gnulib module utime
+
+
+EXTRA_DIST += utime.c
+
+EXTRA_libtar_a_SOURCES += utime.c
+
+## end gnulib module utime
+
+## begin gnulib module utimens
+
+
+EXTRA_DIST += utimens.c utimens.h
+
+EXTRA_libtar_a_SOURCES += utimens.c
+
+## 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_libtar_a_SOURCES += asnprintf.c printf-args.c printf-parse.c vasnprintf.c
+
+## end gnulib module vasnprintf
+
+## begin gnulib module verify
+
+libtar_a_SOURCES += verify.h
+
+## end gnulib module verify
+
+## begin gnulib module version-etc
+
+libtar_a_SOURCES += version-etc.h version-etc.c
+
+## end gnulib module version-etc
+
+## begin gnulib module version-etc-fsf
+
+libtar_a_SOURCES += version-etc-fsf.c
+
+## end gnulib module version-etc-fsf
+
+## begin gnulib module vsnprintf
+
+
+EXTRA_DIST += vsnprintf.c
+
+EXTRA_libtar_a_SOURCES += vsnprintf.c
+
+## end gnulib module vsnprintf
+
+## 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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''ABSOLUTE_WCHAR_H''@|$(ABSOLUTE_WCHAR_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ < $(srcdir)/wchar_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += wchar.h wchar.h-t
+
+EXTRA_DIST += wchar_.h
+
+## end gnulib module wchar
+
+## begin gnulib module wctype
+
+BUILT_SOURCES += $(WCTYPE_H)
+
+# 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_.h
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \
+ -e 's|@''ABSOLUTE_WCTYPE_H''@|$(ABSOLUTE_WCTYPE_H)|g' \
+ -e 's/@''HAVE_INCLUDE_NEXT''@/$(HAVE_INCLUDE_NEXT)/g' \
+ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
+ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
+ < $(srcdir)/wctype_.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += wctype.h wctype.h-t
+
+EXTRA_DIST += wctype_.h
+
+## end gnulib module wctype
+
+## begin gnulib module wcwidth
+
+libtar_a_SOURCES += wcwidth.h
+
+## end gnulib module wcwidth
+
+## begin gnulib module xalloc
+
+
+EXTRA_DIST += xalloc.h xmalloc.c
+
+EXTRA_libtar_a_SOURCES += xmalloc.c
+
+## end gnulib module xalloc
+
+## begin gnulib module xalloc-die
+
+libtar_a_SOURCES += xalloc-die.c
+
+## end gnulib module xalloc-die
+
+## begin gnulib module xgetcwd
+
+
+EXTRA_DIST += xgetcwd.c xgetcwd.h
+
+EXTRA_libtar_a_SOURCES += xgetcwd.c
+
+## end gnulib module xgetcwd
+
+## begin gnulib module xstrndup
+
+libtar_a_SOURCES += xstrndup.h xstrndup.c
+
+## end gnulib module xstrndup
+
+## begin gnulib module xstrtol
+
+
+EXTRA_DIST += xstrtol.c xstrtol.h xstrtoul.c
+
+EXTRA_libtar_a_SOURCES += xstrtol.c xstrtoul.c
+
+## end gnulib module xstrtol
+
+## begin gnulib module xstrtoumax
+
+libtar_a_SOURCES += xstrtoumax.c
+
+## end gnulib module xstrtoumax
+
+
+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/hash.c b/lib/hash.c
new file mode 100644
index 0000000..f4ab12f
--- /dev/null
+++ b/lib/hash.c
@@ -0,0 +1,1048 @@
+/* hash - hashing table processing.
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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 "xalloc.h"
+
+#include <limits.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
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+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 physicaly 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.8
+#define DEFAULT_GROWTH_FACTOR 1.414
+
+/* 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.0
+#define DEFAULT_SHRINK_FACTOR 1.0
+
+/* 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. */
+
+/* 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. */
+
+size_t
+hash_get_n_buckets (const Hash_table *table)
+{
+ return table->n_buckets;
+}
+
+/* Return the number of slots in use (non-empty buckets). */
+
+size_t
+hash_get_n_buckets_used (const Hash_table *table)
+{
+ return table->n_buckets_used;
+}
+
+/* Return the number of active entries. */
+
+size_t
+hash_get_n_entries (const Hash_table *table)
+{
+ return table->n_entries;
+}
+
+/* Return the length of the longest chain (bucket). */
+
+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;
+}
+
+/* Do a mild validation of a hash table, by traversing it and checking two
+ statistics. */
+
+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);
+}
+
+/* If ENTRY matches an entry already in the hash table, return the
+ entry from the table. Otherwise, return NULL. */
+
+void *
+hash_lookup (const Hash_table *table, const void *entry)
+{
+ struct hash_entry const *bucket
+ = table->bucket + table->hasher (entry, table->n_buckets);
+ struct hash_entry const *cursor;
+
+ if (! (bucket < table->bucket_limit))
+ abort ();
+
+ if (bucket->data == NULL)
+ return NULL;
+
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ if (table->comparator (entry, cursor->data))
+ return cursor->data;
+
+ return NULL;
+}
+
+/* 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 or removed. */
+
+/* Return the first data in the table, or NULL if the table is empty. */
+
+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;
+}
+
+/* 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. */
+
+void *
+hash_get_next (const Hash_table *table, const void *entry)
+{
+ struct hash_entry const *bucket
+ = table->bucket + table->hasher (entry, table->n_buckets);
+ struct hash_entry const *cursor;
+
+ if (! (bucket < table->bucket_limit))
+ abort ();
+
+ /* Find next entry in the same bucket. */
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ if (cursor->data == entry && cursor->next)
+ return cursor->next->data;
+
+ /* Find first entry in any subsequent bucket. */
+ while (++bucket < table->bucket_limit)
+ if (bucket->data)
+ return bucket->data;
+
+ /* None found. */
+ return NULL;
+}
+
+/* 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. */
+
+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;
+}
+
+/* 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. */
+
+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. */
+
+/* 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. */
+
+#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 ROTATE_LEFT(Value, Shift) \
+ ((Value) << (Shift) | (Value) >> ((sizeof (size_t) * CHAR_BIT) - (Shift)))
+# define HASH_ONE_CHAR(Value, Byte) \
+ ((Byte) + ROTATE_LEFT (Value, 7))
+
+ size_t value = 0;
+ unsigned char ch;
+
+ for (; (ch = *string); string++)
+ value = HASH_ONE_CHAR (value, ch);
+ return value % n_buckets;
+
+# undef ROTATE_LEFT
+# 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
+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
+next_prime (size_t candidate)
+{
+ /* Skip small primes. */
+ if (candidate < 10)
+ candidate = 10;
+
+ /* Make it definitely odd. */
+ candidate |= 1;
+
+ while (!is_prime (candidate))
+ candidate += 2;
+
+ return candidate;
+}
+
+void
+hash_reset_tuning (Hash_tuning *tuning)
+{
+ *tuning = default_tuning;
+}
+
+/* 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;
+
+ /* 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. */
+ float 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;
+}
+
+/* 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.
+
+ The user-supplied HASHER function should be provided. It 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 should be provided. It 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.
+
+ 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. */
+
+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 || comparator == NULL)
+ return NULL;
+
+ 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;
+ }
+
+ if (!tuning->is_n_buckets)
+ {
+ float new_candidate = candidate / tuning->growth_threshold;
+ if (SIZE_MAX <= new_candidate)
+ goto fail;
+ candidate = new_candidate;
+ }
+
+ if (xalloc_oversized (candidate, sizeof *table->bucket))
+ goto fail;
+ table->n_buckets = next_prime (candidate);
+ if (xalloc_oversized (table->n_buckets, sizeof *table->bucket))
+ goto fail;
+
+ table->bucket = calloc (table->n_buckets, sizeof *table->bucket);
+ 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;
+}
+
+/* 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. */
+
+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;
+}
+
+/* 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. */
+
+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 reclying 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
+ = table->bucket + table->hasher (entry, table->n_buckets);
+ struct hash_entry *cursor;
+
+ if (! (bucket < table->bucket_limit))
+ abort ();
+
+ *bucket_head = bucket;
+
+ /* Test for empty bucket. */
+ if (bucket->data == NULL)
+ return NULL;
+
+ /* See if the entry is the first in the bucket. */
+ if ((*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 ((*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;
+}
+
+/* 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. */
+
+bool
+hash_rehash (Hash_table *table, size_t candidate)
+{
+ Hash_table *new_table;
+ struct hash_entry *bucket;
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+
+ new_table = hash_initialize (candidate, table->tuning, table->hasher,
+ table->comparator, table->data_freer);
+ if (new_table == NULL)
+ return false;
+
+ /* Merely reuse the extra old space into the new table. */
+#if USE_OBSTACK
+ obstack_free (&new_table->entry_stack, NULL);
+ new_table->entry_stack = table->entry_stack;
+#endif
+ new_table->free_entry_list = table->free_entry_list;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ if (bucket->data)
+ for (cursor = bucket; cursor; cursor = next)
+ {
+ void *data = cursor->data;
+ struct hash_entry *new_bucket
+ = (new_table->bucket
+ + new_table->hasher (data, new_table->n_buckets));
+
+ if (! (new_bucket < new_table->bucket_limit))
+ abort ();
+
+ next = cursor->next;
+
+ if (new_bucket->data)
+ {
+ if (cursor == bucket)
+ {
+ /* Allocate or recycle an entry, when moving from a bucket
+ header into a bucket overflow. */
+ struct hash_entry *new_entry = allocate_entry (new_table);
+
+ if (new_entry == NULL)
+ return false;
+
+ new_entry->data = data;
+ new_entry->next = new_bucket->next;
+ new_bucket->next = new_entry;
+ }
+ else
+ {
+ /* 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. Also take care of the
+ simple case of moving from a bucket header into a bucket
+ header. */
+ new_bucket->data = data;
+ new_table->n_buckets_used++;
+ if (cursor != bucket)
+ free_entry (new_table, cursor);
+ }
+ }
+
+ 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 already holds its value. */
+#if USE_OBSTACK
+ table->entry_stack = new_table->entry_stack;
+#endif
+ free (new_table);
+
+ return true;
+}
+
+/* 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. */
+
+void *
+hash_insert (Hash_table *table, const void *entry)
+{
+ void *data;
+ struct hash_entry *bucket;
+
+ /* The caller cannot insert a NULL entry. */
+ 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)
+ return data;
+
+ /* ENTRY is not matched, it should be inserted. */
+
+ if (bucket->data)
+ {
+ struct hash_entry *new_entry = allocate_entry (table);
+
+ if (new_entry == NULL)
+ return NULL;
+
+ /* 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 (void *) entry;
+ }
+
+ /* Add ENTRY right in the bucket head. */
+
+ bucket->data = (void *) entry;
+ table->n_entries++;
+ table->n_buckets_used++;
+
+ /* 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 (SIZE_MAX <= candidate)
+ return NULL;
+
+ /* If the rehash fails, arrange to return NULL. */
+ if (!hash_rehash (table, candidate))
+ entry = NULL;
+ }
+ }
+
+ return (void *) entry;
+}
+
+/* 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. */
+
+void *
+hash_delete (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));
+
+ hash_rehash (table, candidate);
+ }
+ }
+ }
+
+ return data;
+}
+
+/* Testing. */
+
+#if TESTING
+
+void
+hash_print (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+
+ for (bucket = table->bucket; 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..ab63a86
--- /dev/null
+++ b/lib/hash.h
@@ -0,0 +1,88 @@
+/* hash - hashing table processing.
+ Copyright (C) 1998, 1999, 2001, 2003 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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>
+
+typedef size_t (*Hash_hasher) (const void *, size_t);
+typedef bool (*Hash_comparator) (const void *, const void *);
+typedef void (*Hash_data_freer) (void *);
+typedef bool (*Hash_processor) (void *, void *);
+
+struct hash_entry
+ {
+ void *data;
+ struct hash_entry *next;
+ };
+
+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. */
+size_t hash_get_n_buckets (const Hash_table *);
+size_t hash_get_n_buckets_used (const Hash_table *);
+size_t hash_get_n_entries (const Hash_table *);
+size_t hash_get_max_bucket_length (const Hash_table *);
+bool hash_table_ok (const Hash_table *);
+void hash_print_statistics (const Hash_table *, FILE *);
+void *hash_lookup (const Hash_table *, const void *);
+
+/* Walking. */
+void *hash_get_first (const Hash_table *);
+void *hash_get_next (const Hash_table *, const void *);
+size_t hash_get_entries (const Hash_table *, void **, size_t);
+size_t hash_do_for_each (const Hash_table *, Hash_processor, void *);
+
+/* Allocation and clean-up. */
+size_t hash_string (const char *, size_t);
+void hash_reset_tuning (Hash_tuning *);
+Hash_table *hash_initialize (size_t, const Hash_tuning *,
+ Hash_hasher, Hash_comparator,
+ Hash_data_freer);
+void hash_clear (Hash_table *);
+void hash_free (Hash_table *);
+
+/* Insertion and deletion. */
+bool hash_rehash (Hash_table *, size_t);
+void *hash_insert (Hash_table *, const void *);
+void *hash_delete (Hash_table *, const void *);
+
+#endif
diff --git a/lib/human.c b/lib/human.c
new file mode 100644
index 0000000..ecf4c97
--- /dev/null
+++ b/lib/human.c
@@ -0,0 +1,479 @@
+/* human.c -- print human readable file size
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert and Larry McVoy. */
+
+#include <config.h>
+
+#include "human.h"
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include <argmatch.h>
+#include <error.h>
+#include <intprops.h>
+#include <xstrtol.h>
+
+/* The maximum length of a suffix like "KiB". */
+#define HUMAN_READABLE_SUFFIX_LENGTH_MAX 3
+
+static const char power_letter[] =
+{
+ 0, /* not used */
+ 'K', /* kibi ('k' for kilo is a special case) */
+ 'M', /* mega or mebi */
+ 'G', /* giga or gibi */
+ 'T', /* tera or tebi */
+ 'P', /* peta or pebi */
+ 'E', /* exa or exbi */
+ 'Z', /* zetta or 2**70 */
+ 'Y' /* yotta or 2**80 */
+};
+
+
+/* If INEXACT_STYLE is not human_round_to_nearest, and if easily
+ possible, adjust VALUE according to the style. */
+
+static long double
+adjust_value (int inexact_style, long double value)
+{
+ /* Do not use the floorl or ceill functions, as that would mean
+ checking for their presence and possibly linking with the
+ standard math library, which is a porting pain. So leave the
+ value alone if it is too large to easily round. */
+ if (inexact_style != human_round_to_nearest && value < UINTMAX_MAX)
+ {
+ uintmax_t u = value;
+ value = u + (inexact_style == human_ceiling && u != value);
+ }
+
+ return value;
+}
+
+/* Group the digits of NUMBER according to the grouping rules of the
+ current locale. NUMBER contains NUMBERLEN digits. Modify the
+ bytes pointed to by NUMBER in place, subtracting 1 from NUMBER for
+ each byte inserted. Return the starting address of the modified
+ number.
+
+ To group the digits, use GROUPING and THOUSANDS_SEP as in `struct
+ lconv' from <locale.h>. */
+
+static char *
+group_number (char *number, size_t numberlen,
+ char const *grouping, char const *thousands_sep)
+{
+ register char *d;
+ size_t grouplen = SIZE_MAX;
+ size_t thousands_seplen = strlen (thousands_sep);
+ size_t i = numberlen;
+
+ /* The maximum possible value for NUMBERLEN is the number of digits
+ in the square of the largest uintmax_t, so double the size needed. */
+ char buf[2 * INT_STRLEN_BOUND (uintmax_t) + 1];
+
+ memcpy (buf, number, numberlen);
+ d = number + numberlen;
+
+ for (;;)
+ {
+ unsigned char g = *grouping;
+
+ if (g)
+ {
+ grouplen = g < CHAR_MAX ? g : i;
+ grouping++;
+ }
+
+ if (i < grouplen)
+ grouplen = i;
+
+ d -= grouplen;
+ i -= grouplen;
+ memcpy (d, buf + i, grouplen);
+ if (i == 0)
+ return d;
+
+ d -= thousands_seplen;
+ memcpy (d, thousands_sep, thousands_seplen);
+ }
+}
+
+/* Convert N to a human readable format in BUF, using the options OPTS.
+
+ N is expressed in units of FROM_BLOCK_SIZE. FROM_BLOCK_SIZE must
+ be nonnegative.
+
+ Use units of TO_BLOCK_SIZE in the output number. TO_BLOCK_SIZE
+ must be positive.
+
+ Use (OPTS & (human_round_to_nearest | human_floor | human_ceiling))
+ to determine whether to take the ceiling or floor of any result
+ that cannot be expressed exactly.
+
+ If (OPTS & human_group_digits), group the thousands digits
+ according to the locale, e.g., `1,000,000' in an American English
+ locale.
+
+ If (OPTS & human_autoscale), deduce the output block size
+ automatically; TO_BLOCK_SIZE must be 1 but it has no effect on the
+ output. Use powers of 1024 if (OPTS & human_base_1024), and powers
+ of 1000 otherwise. For example, assuming powers of 1024, 8500
+ would be converted to 8.3, 133456345 to 127, 56990456345 to 53, and
+ so on. Numbers smaller than the power aren't modified.
+ human_autoscale is normally used together with human_SI.
+
+ If (OPTS & human_space_before_unit), use a space to separate the
+ number from any suffix that is appended as described below.
+
+ If (OPTS & human_SI), append an SI prefix indicating which power is
+ being used. If in addition (OPTS & human_B), append "B" (if base
+ 1000) or "iB" (if base 1024) to the SI prefix. When ((OPTS &
+ human_SI) && ! (OPTS & human_autoscale)), TO_BLOCK_SIZE must be a
+ power of 1024 or of 1000, depending on (OPTS &
+ human_base_1024). */
+
+char *
+human_readable (uintmax_t n, char *buf, int opts,
+ uintmax_t from_block_size, uintmax_t to_block_size)
+{
+ int inexact_style =
+ opts & (human_round_to_nearest | human_floor | human_ceiling);
+ unsigned int base = opts & human_base_1024 ? 1024 : 1000;
+ uintmax_t amt;
+ int tenths;
+ int exponent = -1;
+ int exponent_max = sizeof power_letter - 1;
+ char *p;
+ char *psuffix;
+ char const *integerlim;
+
+ /* 0 means adjusted N == AMT.TENTHS;
+ 1 means AMT.TENTHS < adjusted N < AMT.TENTHS + 0.05;
+ 2 means adjusted N == AMT.TENTHS + 0.05;
+ 3 means AMT.TENTHS + 0.05 < adjusted N < AMT.TENTHS + 0.1. */
+ int rounding;
+
+ char const *decimal_point = ".";
+ size_t decimal_pointlen = 1;
+ char const *grouping = "";
+ char const *thousands_sep = "";
+ struct lconv const *l = localeconv ();
+ size_t pointlen = strlen (l->decimal_point);
+ if (0 < pointlen && pointlen <= MB_LEN_MAX)
+ {
+ decimal_point = l->decimal_point;
+ decimal_pointlen = pointlen;
+ }
+ grouping = l->grouping;
+ if (strlen (l->thousands_sep) <= MB_LEN_MAX)
+ thousands_sep = l->thousands_sep;
+
+ psuffix = buf + LONGEST_HUMAN_READABLE - HUMAN_READABLE_SUFFIX_LENGTH_MAX;
+ p = psuffix;
+
+ /* Adjust AMT out of FROM_BLOCK_SIZE units and into TO_BLOCK_SIZE
+ units. If this can be done exactly with integer arithmetic, do
+ not use floating point operations. */
+ if (to_block_size <= from_block_size)
+ {
+ if (from_block_size % to_block_size == 0)
+ {
+ uintmax_t multiplier = from_block_size / to_block_size;
+ amt = n * multiplier;
+ if (amt / multiplier == n)
+ {
+ tenths = 0;
+ rounding = 0;
+ goto use_integer_arithmetic;
+ }
+ }
+ }
+ else if (from_block_size != 0 && to_block_size % from_block_size == 0)
+ {
+ uintmax_t divisor = to_block_size / from_block_size;
+ uintmax_t r10 = (n % divisor) * 10;
+ uintmax_t r2 = (r10 % divisor) * 2;
+ amt = n / divisor;
+ tenths = r10 / divisor;
+ rounding = r2 < divisor ? 0 < r2 : 2 + (divisor < r2);
+ goto use_integer_arithmetic;
+ }
+
+ {
+ /* Either the result cannot be computed easily using uintmax_t,
+ or from_block_size is zero. Fall back on floating point.
+ FIXME: This can yield answers that are slightly off. */
+
+ long double dto_block_size = to_block_size;
+ long double damt = n * (from_block_size / dto_block_size);
+ size_t buflen;
+ size_t nonintegerlen;
+
+ if (! (opts & human_autoscale))
+ {
+ sprintf (buf, "%.0Lf", adjust_value (inexact_style, damt));
+ buflen = strlen (buf);
+ nonintegerlen = 0;
+ }
+ else
+ {
+ long double e = 1;
+ exponent = 0;
+
+ do
+ {
+ e *= base;
+ exponent++;
+ }
+ while (e * base <= damt && exponent < exponent_max);
+
+ damt /= e;
+
+ sprintf (buf, "%.1Lf", adjust_value (inexact_style, damt));
+ buflen = strlen (buf);
+ nonintegerlen = decimal_pointlen + 1;
+
+ if (1 + nonintegerlen + ! (opts & human_base_1024) < buflen
+ || ((opts & human_suppress_point_zero)
+ && buf[buflen - 1] == '0'))
+ {
+ sprintf (buf, "%.0Lf",
+ adjust_value (inexact_style, damt * 10) / 10);
+ buflen = strlen (buf);
+ nonintegerlen = 0;
+ }
+ }
+
+ p = psuffix - buflen;
+ memmove (p, buf, buflen);
+ integerlim = p + buflen - nonintegerlen;
+ }
+ goto do_grouping;
+
+ use_integer_arithmetic:
+ {
+ /* The computation can be done exactly, with integer arithmetic.
+
+ Use power of BASE notation if requested and if adjusted AMT is
+ large enough. */
+
+ if (opts & human_autoscale)
+ {
+ exponent = 0;
+
+ if (base <= amt)
+ {
+ do
+ {
+ unsigned int r10 = (amt % base) * 10 + tenths;
+ unsigned int r2 = (r10 % base) * 2 + (rounding >> 1);
+ amt /= base;
+ tenths = r10 / base;
+ rounding = (r2 < base
+ ? (r2 + rounding) != 0
+ : 2 + (base < r2 + rounding));
+ exponent++;
+ }
+ while (base <= amt && exponent < exponent_max);
+
+ if (amt < 10)
+ {
+ if (inexact_style == human_round_to_nearest
+ ? 2 < rounding + (tenths & 1)
+ : inexact_style == human_ceiling && 0 < rounding)
+ {
+ tenths++;
+ rounding = 0;
+
+ if (tenths == 10)
+ {
+ amt++;
+ tenths = 0;
+ }
+ }
+
+ if (amt < 10
+ && (tenths || ! (opts & human_suppress_point_zero)))
+ {
+ *--p = '0' + tenths;
+ p -= decimal_pointlen;
+ memcpy (p, decimal_point, decimal_pointlen);
+ tenths = rounding = 0;
+ }
+ }
+ }
+ }
+
+ if (inexact_style == human_round_to_nearest
+ ? 5 < tenths + (0 < rounding + (amt & 1))
+ : inexact_style == human_ceiling && 0 < tenths + rounding)
+ {
+ amt++;
+
+ if ((opts & human_autoscale)
+ && amt == base && exponent < exponent_max)
+ {
+ exponent++;
+ if (! (opts & human_suppress_point_zero))
+ {
+ *--p = '0';
+ p -= decimal_pointlen;
+ memcpy (p, decimal_point, decimal_pointlen);
+ }
+ amt = 1;
+ }
+ }
+
+ integerlim = p;
+
+ do
+ {
+ int digit = amt % 10;
+ *--p = digit + '0';
+ }
+ while ((amt /= 10) != 0);
+ }
+
+ do_grouping:
+ if (opts & human_group_digits)
+ p = group_number (p, integerlim - p, grouping, thousands_sep);
+
+ if (opts & human_SI)
+ {
+ if (exponent < 0)
+ {
+ uintmax_t power;
+ exponent = 0;
+ for (power = 1; power < to_block_size; power *= base)
+ if (++exponent == exponent_max)
+ break;
+ }
+
+ if ((exponent | (opts & human_B)) && (opts & human_space_before_unit))
+ *psuffix++ = ' ';
+
+ if (exponent)
+ *psuffix++ = (! (opts & human_base_1024) && exponent == 1
+ ? 'k'
+ : power_letter[exponent]);
+
+ if (opts & human_B)
+ {
+ if ((opts & human_base_1024) && exponent)
+ *psuffix++ = 'i';
+ *psuffix++ = 'B';
+ }
+ }
+
+ *psuffix = '\0';
+
+ return p;
+}
+
+
+/* The default block size used for output. This number may change in
+ the future as disks get larger. */
+#ifndef DEFAULT_BLOCK_SIZE
+# define DEFAULT_BLOCK_SIZE 1024
+#endif
+
+static char const *const block_size_args[] = { "human-readable", "si", 0 };
+static int const block_size_opts[] =
+ {
+ human_autoscale + human_SI + human_base_1024,
+ human_autoscale + human_SI
+ };
+
+static uintmax_t
+default_block_size (void)
+{
+ return getenv ("POSIXLY_CORRECT") ? 512 : DEFAULT_BLOCK_SIZE;
+}
+
+static strtol_error
+humblock (char const *spec, uintmax_t *block_size, int *options)
+{
+ int i;
+ int opts = 0;
+
+ if (! spec
+ && ! (spec = getenv ("BLOCK_SIZE"))
+ && ! (spec = getenv ("BLOCKSIZE")))
+ *block_size = default_block_size ();
+ else
+ {
+ if (*spec == '\'')
+ {
+ opts |= human_group_digits;
+ spec++;
+ }
+
+ if (0 <= (i = ARGMATCH (spec, block_size_args, block_size_opts)))
+ {
+ opts |= block_size_opts[i];
+ *block_size = 1;
+ }
+ else
+ {
+ char *ptr;
+ strtol_error e = xstrtoumax (spec, &ptr, 0, block_size,
+ "eEgGkKmMpPtTyYzZ0");
+ if (e != LONGINT_OK)
+ {
+ *options = 0;
+ return e;
+ }
+ for (; ! ('0' <= *spec && *spec <= '9'); spec++)
+ if (spec == ptr)
+ {
+ opts |= human_SI;
+ if (ptr[-1] == 'B')
+ opts |= human_B;
+ if (ptr[-1] != 'B' || ptr[-2] == 'i')
+ opts |= human_base_1024;
+ break;
+ }
+ }
+ }
+
+ *options = opts;
+ return LONGINT_OK;
+}
+
+int
+human_options (char const *spec, bool report_errors, uintmax_t *block_size)
+{
+ int opts;
+ strtol_error e = humblock (spec, block_size, &opts);
+ if (*block_size == 0)
+ {
+ *block_size = default_block_size ();
+ e = LONGINT_INVALID;
+ }
+ if (e != LONGINT_OK && report_errors)
+ STRTOL_FATAL_ERROR (spec, _("block size"), e);
+ return opts;
+}
diff --git a/lib/human.h b/lib/human.h
new file mode 100644
index 0000000..44b8b36
--- /dev/null
+++ b/lib/human.h
@@ -0,0 +1,83 @@
+/* human.h -- print human readable file size
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert and Larry McVoy. */
+
+#ifndef HUMAN_H_
+# define HUMAN_H_ 1
+
+# include <limits.h>
+# include <stdbool.h>
+# include <stdint.h>
+# include <unistd.h>
+
+/* A conservative bound on the maximum length of a human-readable string.
+ The output can be the square of the largest uintmax_t, so double
+ its size before converting to a bound.
+ log10 (2.0) < 146/485. Add 1 for integer division truncation.
+ Also, the output can have a thousands separator between every digit,
+ so multiply by MB_LEN_MAX + 1 and then subtract MB_LEN_MAX.
+ Append 1 for a space before the suffix.
+ Finally, append 3, the maximum length of a suffix. */
+# define LONGEST_HUMAN_READABLE \
+ ((2 * sizeof (uintmax_t) * CHAR_BIT * 146 / 485 + 1) * (MB_LEN_MAX + 1) \
+ - MB_LEN_MAX + 1 + 3)
+
+/* Options for human_readable. */
+enum
+{
+ /* Unless otherwise specified these options may be ORed together. */
+
+ /* The following three options are mutually exclusive. */
+ /* Round to plus infinity (default). */
+ human_ceiling = 0,
+ /* Round to nearest, ties to even. */
+ human_round_to_nearest = 1,
+ /* Round to minus infinity. */
+ human_floor = 2,
+
+ /* Group digits together, e.g. `1,000,000'. This uses the
+ locale-defined grouping; the traditional C locale does not group,
+ so this has effect only if some other locale is in use. */
+ human_group_digits = 4,
+
+ /* When autoscaling, suppress ".0" at end. */
+ human_suppress_point_zero = 8,
+
+ /* Scale output and use SI-style units, ignoring the output block size. */
+ human_autoscale = 16,
+
+ /* Prefer base 1024 to base 1000. */
+ human_base_1024 = 32,
+
+ /* Prepend " " before unit symbol. */
+ human_space_before_unit = 64,
+
+ /* Append SI prefix, e.g. "k" or "M". */
+ human_SI = 128,
+
+ /* Append "B" (if base 1000) or "iB" (if base 1024) to SI prefix. */
+ human_B = 256
+};
+
+char *human_readable (uintmax_t, char *, int, uintmax_t, uintmax_t);
+
+int human_options (char const *, bool, uintmax_t *);
+
+#endif /* HUMAN_H_ */
diff --git a/lib/imaxtostr.c b/lib/imaxtostr.c
new file mode 100644
index 0000000..5e87ad5
--- /dev/null
+++ b/lib/imaxtostr.c
@@ -0,0 +1,3 @@
+#define inttostr imaxtostr
+#define inttype intmax_t
+#include "inttostr.c"
diff --git a/lib/intprops.h b/lib/intprops.h
new file mode 100644
index 0000000..34f971c
--- /dev/null
+++ b/lib/intprops.h
@@ -0,0 +1,78 @@
+/* intprops.h -- properties of integer types
+
+ Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <limits.h>
+
+/* 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 negative values of the signed integer type T use two's
+ complement, ones' complement, or signed magnitude representation,
+ respectively. Much GNU code assumes two's complement, but some
+ people like to be portable to all possible C hosts. */
+#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
+#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
+#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
+
+/* True if the arithmetic type T is signed. */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* The maximum and minimum values for the integer type T. These
+ macros have undefined behavior if T is signed and has padding bits.
+ If this is a problem for you, please let us know how to fix it for
+ your host. */
+#define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : TYPE_SIGNED_MAGNITUDE (t) \
+ ? ~ (t) 0 \
+ : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+#define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+
+/* Return zero if T can be determined to be an unsigned type.
+ Otherwise, return 1.
+ When compiling with GCC, INT_STRLEN_BOUND uses this macro to obtain a
+ tighter bound. Otherwise, it overestimates the true bound by one byte
+ when applied to unsigned types of size 2, 4, 16, ... bytes.
+ The symbol signed_type_or_expr__ is private to this header file. */
+#if __GNUC__ >= 2
+# define signed_type_or_expr__(t) TYPE_SIGNED (__typeof__ (t))
+#else
+# define signed_type_or_expr__(t) 1
+#endif
+
+/* Bound on length of the string representing an integer type or expression T.
+ Subtract 1 for the sign bit if T is signed; log10 (2.0) < 146/485;
+ add 1 for integer division truncation; add 1 more for a minus sign
+ if needed. */
+#define INT_STRLEN_BOUND(t) \
+ ((sizeof (t) * CHAR_BIT - signed_type_or_expr__ (t)) * 146 / 485 \
+ + signed_type_or_expr__ (t) + 1)
+
+/* Bound on buffer size needed to represent an integer type or expression T,
+ including the terminating null. */
+#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
diff --git a/lib/inttostr.c b/lib/inttostr.c
new file mode 100644
index 0000000..246d658
--- /dev/null
+++ b/lib/inttostr.c
@@ -0,0 +1,51 @@
+/* inttostr.c -- convert integers to printable strings
+
+ Copyright (C) 2001, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert */
+
+#include <config.h>
+
+#include "inttostr.h"
+
+/* Convert I to a printable string in BUF, which must be at least
+ INT_BUFSIZE_BOUND (INTTYPE) bytes long. Return the address of the
+ printable string, which need not start at BUF. */
+
+char *
+inttostr (inttype i, char *buf)
+{
+ char *p = buf + INT_STRLEN_BOUND (inttype);
+ *p = 0;
+
+ if (i < 0)
+ {
+ do
+ *--p = '0' - i % 10;
+ while ((i /= 10) != 0);
+
+ *--p = '-';
+ }
+ else
+ {
+ do
+ *--p = '0' + i % 10;
+ while ((i /= 10) != 0);
+ }
+
+ return p;
+}
diff --git a/lib/inttostr.h b/lib/inttostr.h
new file mode 100644
index 0000000..31258ca
--- /dev/null
+++ b/lib/inttostr.h
@@ -0,0 +1,30 @@
+/* inttostr.h -- convert integers to printable strings
+
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert */
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include "intprops.h"
+
+char *offtostr (off_t, char *);
+char *imaxtostr (intmax_t, char *);
+char *umaxtostr (uintmax_t, char *);
+char *uinttostr (unsigned int, char *);
diff --git a/lib/inttypes_.h b/lib/inttypes_.h
new file mode 100644
index 0000000..6d78325
--- /dev/null
+++ b/lib/inttypes_.h
@@ -0,0 +1,1100 @@
+/* Copyright (C) 2006-2007 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 Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/*
+ * ISO C 99 <inttypes.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/inttypes.h.html>
+ */
+
+/* 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_ABSOLUTE_INTTYPES_H
+# if @HAVE_INTTYPES_H@
+# if @HAVE_INCLUDE_NEXT@
+# include_next <inttypes.h>
+# else
+# include @ABSOLUTE_INTTYPES_H@
+# endif
+# endif
+#endif
+
+#if ! defined INTTYPES_H && ! defined _GL_JUST_INCLUDE_ABSOLUTE_INTTYPES_H
+#define INTTYPES_H
+
+/* Include <stdint.h> or the gnulib replacement. */
+#include <stdint.h>
+/* Get CHAR_BIT. */
+#include <limits.h>
+
+#if !(INT_MIN == INT32_MIN && INT_MAX == INT32_MAX)
+# error "This file assumes that 'int' has exactly 32 bits. Please report your platform and compiler to <bug-gnulib@gnu.org>."
+#endif
+
+/* The definition of GL_LINK_WARNING is copied here. */
+
+/* 7.8.1 Macros for format specifiers */
+
+#if ! defined __cplusplus || defined __STDC_FORMAT_MACROS
+
+# 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 || @PRI_MACROS_BROKEN@
+# undef PRId8
+# ifdef INT8_MAX
+# define PRId8 "d"
+# endif
+# endif
+# if !defined PRIi8 || @PRI_MACROS_BROKEN@
+# undef PRIi8
+# ifdef INT8_MAX
+# define PRIi8 "i"
+# endif
+# endif
+# if !defined PRIo8 || @PRI_MACROS_BROKEN@
+# undef PRIo8
+# ifdef UINT8_MAX
+# define PRIo8 "o"
+# endif
+# endif
+# if !defined PRIu8 || @PRI_MACROS_BROKEN@
+# undef PRIu8
+# ifdef UINT8_MAX
+# define PRIu8 "u"
+# endif
+# endif
+# if !defined PRIx8 || @PRI_MACROS_BROKEN@
+# undef PRIx8
+# ifdef UINT8_MAX
+# define PRIx8 "x"
+# endif
+# endif
+# if !defined PRIX8 || @PRI_MACROS_BROKEN@
+# undef PRIX8
+# ifdef UINT8_MAX
+# define PRIX8 "X"
+# endif
+# endif
+# if !defined PRId16 || @PRI_MACROS_BROKEN@
+# undef PRId16
+# ifdef INT16_MAX
+# define PRId16 "d"
+# endif
+# endif
+# if !defined PRIi16 || @PRI_MACROS_BROKEN@
+# undef PRIi16
+# ifdef INT16_MAX
+# define PRIi16 "i"
+# endif
+# endif
+# if !defined PRIo16 || @PRI_MACROS_BROKEN@
+# undef PRIo16
+# ifdef UINT16_MAX
+# define PRIo16 "o"
+# endif
+# endif
+# if !defined PRIu16 || @PRI_MACROS_BROKEN@
+# undef PRIu16
+# ifdef UINT16_MAX
+# define PRIu16 "u"
+# endif
+# endif
+# if !defined PRIx16 || @PRI_MACROS_BROKEN@
+# undef PRIx16
+# ifdef UINT16_MAX
+# define PRIx16 "x"
+# endif
+# endif
+# if !defined PRIX16 || @PRI_MACROS_BROKEN@
+# undef PRIX16
+# ifdef UINT16_MAX
+# define PRIX16 "X"
+# endif
+# endif
+# if !defined PRId32 || @PRI_MACROS_BROKEN@
+# undef PRId32
+# ifdef INT32_MAX
+# define PRId32 "d"
+# endif
+# endif
+# if !defined PRIi32 || @PRI_MACROS_BROKEN@
+# undef PRIi32
+# ifdef INT32_MAX
+# define PRIi32 "i"
+# endif
+# endif
+# if !defined PRIo32 || @PRI_MACROS_BROKEN@
+# undef PRIo32
+# ifdef UINT32_MAX
+# define PRIo32 "o"
+# endif
+# endif
+# if !defined PRIu32 || @PRI_MACROS_BROKEN@
+# undef PRIu32
+# ifdef UINT32_MAX
+# define PRIu32 "u"
+# endif
+# endif
+# if !defined PRIx32 || @PRI_MACROS_BROKEN@
+# undef PRIx32
+# ifdef UINT32_MAX
+# define PRIx32 "x"
+# endif
+# endif
+# if !defined PRIX32 || @PRI_MACROS_BROKEN@
+# undef PRIX32
+# ifdef UINT32_MAX
+# define PRIX32 "X"
+# endif
+# endif
+# ifdef INT64_MAX
+# if INT64_MAX == LONG_MAX
+# define _PRI64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRI64_PREFIX "I64"
+# elif @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRId64 || @PRI_MACROS_BROKEN@
+# undef PRId64
+# define PRId64 _PRI64_PREFIX "d"
+# endif
+# if !defined PRIi64 || @PRI_MACROS_BROKEN@
+# undef PRIi64
+# define PRIi64 _PRI64_PREFIX "i"
+# endif
+# endif
+# ifdef UINT64_MAX
+# if UINT64_MAX == ULONG_MAX
+# define _PRIu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRIu64_PREFIX "I64"
+# elif @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRIo64 || @PRI_MACROS_BROKEN@
+# undef PRIo64
+# define PRIo64 _PRIu64_PREFIX "o"
+# endif
+# if !defined PRIu64 || @PRI_MACROS_BROKEN@
+# undef PRIu64
+# define PRIu64 _PRIu64_PREFIX "u"
+# endif
+# if !defined PRIx64 || @PRI_MACROS_BROKEN@
+# undef PRIx64
+# define PRIx64 _PRIu64_PREFIX "x"
+# endif
+# if !defined PRIX64 || @PRI_MACROS_BROKEN@
+# undef PRIX64
+# define PRIX64 _PRIu64_PREFIX "X"
+# endif
+# endif
+
+# if !defined PRIdLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST8
+# define PRIdLEAST8 "d"
+# endif
+# if !defined PRIiLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST8
+# define PRIiLEAST8 "i"
+# endif
+# if !defined PRIoLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST8
+# define PRIoLEAST8 "o"
+# endif
+# if !defined PRIuLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST8
+# define PRIuLEAST8 "u"
+# endif
+# if !defined PRIxLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST8
+# define PRIxLEAST8 "x"
+# endif
+# if !defined PRIXLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST8
+# define PRIXLEAST8 "X"
+# endif
+# if !defined PRIdLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST16
+# define PRIdLEAST16 "d"
+# endif
+# if !defined PRIiLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST16
+# define PRIiLEAST16 "i"
+# endif
+# if !defined PRIoLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST16
+# define PRIoLEAST16 "o"
+# endif
+# if !defined PRIuLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST16
+# define PRIuLEAST16 "u"
+# endif
+# if !defined PRIxLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST16
+# define PRIxLEAST16 "x"
+# endif
+# if !defined PRIXLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST16
+# define PRIXLEAST16 "X"
+# endif
+# if !defined PRIdLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST32
+# define PRIdLEAST32 "d"
+# endif
+# if !defined PRIiLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST32
+# define PRIiLEAST32 "i"
+# endif
+# if !defined PRIoLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST32
+# define PRIoLEAST32 "o"
+# endif
+# if !defined PRIuLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST32
+# define PRIuLEAST32 "u"
+# endif
+# if !defined PRIxLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST32
+# define PRIxLEAST32 "x"
+# endif
+# if !defined PRIXLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST32
+# define PRIXLEAST32 "X"
+# endif
+# ifdef INT64_MAX
+# if !defined PRIdLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST64
+# define PRIdLEAST64 PRId64
+# endif
+# if !defined PRIiLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST64
+# define PRIiLEAST64 PRIi64
+# endif
+# endif
+# ifdef UINT64_MAX
+# if !defined PRIoLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST64
+# define PRIoLEAST64 PRIo64
+# endif
+# if !defined PRIuLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST64
+# define PRIuLEAST64 PRIu64
+# endif
+# if !defined PRIxLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST64
+# define PRIxLEAST64 PRIx64
+# endif
+# if !defined PRIXLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST64
+# define PRIXLEAST64 PRIX64
+# endif
+# endif
+
+# if !defined PRIdFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIdFAST8 PRId64
+# else
+# define PRIdFAST8 "d"
+# endif
+# endif
+# if !defined PRIiFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIiFAST8 PRIi64
+# else
+# define PRIiFAST8 "i"
+# endif
+# endif
+# if !defined PRIoFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIoFAST8 PRIo64
+# else
+# define PRIoFAST8 "o"
+# endif
+# endif
+# if !defined PRIuFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIuFAST8 PRIu64
+# else
+# define PRIuFAST8 "u"
+# endif
+# endif
+# if !defined PRIxFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIxFAST8 PRIx64
+# else
+# define PRIxFAST8 "x"
+# endif
+# endif
+# if !defined PRIXFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIXFAST8 PRIX64
+# else
+# define PRIXFAST8 "X"
+# endif
+# endif
+# if !defined PRIdFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIdFAST16 PRId64
+# else
+# define PRIdFAST16 "d"
+# endif
+# endif
+# if !defined PRIiFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIiFAST16 PRIi64
+# else
+# define PRIiFAST16 "i"
+# endif
+# endif
+# if !defined PRIoFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIoFAST16 PRIo64
+# else
+# define PRIoFAST16 "o"
+# endif
+# endif
+# if !defined PRIuFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIuFAST16 PRIu64
+# else
+# define PRIuFAST16 "u"
+# endif
+# endif
+# if !defined PRIxFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIxFAST16 PRIx64
+# else
+# define PRIxFAST16 "x"
+# endif
+# endif
+# if !defined PRIXFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIXFAST16 PRIX64
+# else
+# define PRIXFAST16 "X"
+# endif
+# endif
+# if !defined PRIdFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIdFAST32 PRId64
+# else
+# define PRIdFAST32 "d"
+# endif
+# endif
+# if !defined PRIiFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIiFAST32 PRIi64
+# else
+# define PRIiFAST32 "i"
+# endif
+# endif
+# if !defined PRIoFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIoFAST32 PRIo64
+# else
+# define PRIoFAST32 "o"
+# endif
+# endif
+# if !defined PRIuFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIuFAST32 PRIu64
+# else
+# define PRIuFAST32 "u"
+# endif
+# endif
+# if !defined PRIxFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIxFAST32 PRIx64
+# else
+# define PRIxFAST32 "x"
+# endif
+# endif
+# if !defined PRIXFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIXFAST32 PRIX64
+# else
+# define PRIXFAST32 "X"
+# endif
+# endif
+# ifdef INT64_MAX
+# if !defined PRIdFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST64
+# define PRIdFAST64 PRId64
+# endif
+# if !defined PRIiFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST64
+# define PRIiFAST64 PRIi64
+# endif
+# endif
+# ifdef UINT64_MAX
+# if !defined PRIoFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST64
+# define PRIoFAST64 PRIo64
+# endif
+# if !defined PRIuFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST64
+# define PRIuFAST64 PRIu64
+# endif
+# if !defined PRIxFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST64
+# define PRIxFAST64 PRIx64
+# endif
+# if !defined PRIXFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST64
+# define PRIXFAST64 PRIX64
+# endif
+# endif
+
+# if !defined PRIdMAX || @PRI_MACROS_BROKEN@
+# undef PRIdMAX
+# if INTMAX_MAX > INT32_MAX
+# define PRIdMAX PRId64
+# else
+# define PRIdMAX "ld"
+# endif
+# endif
+# if !defined PRIiMAX || @PRI_MACROS_BROKEN@
+# undef PRIiMAX
+# if INTMAX_MAX > INT32_MAX
+# define PRIiMAX PRIi64
+# else
+# define PRIiMAX "li"
+# endif
+# endif
+# if !defined PRIoMAX || @PRI_MACROS_BROKEN@
+# undef PRIoMAX
+# if UINTMAX_MAX > UINT32_MAX
+# define PRIoMAX PRIo64
+# else
+# define PRIoMAX "lo"
+# endif
+# endif
+# if !defined PRIuMAX || @PRI_MACROS_BROKEN@
+# undef PRIuMAX
+# if UINTMAX_MAX > UINT32_MAX
+# define PRIuMAX PRIu64
+# else
+# define PRIuMAX "lu"
+# endif
+# endif
+# if !defined PRIxMAX || @PRI_MACROS_BROKEN@
+# undef PRIxMAX
+# if UINTMAX_MAX > UINT32_MAX
+# define PRIxMAX PRIx64
+# else
+# define PRIxMAX "lx"
+# endif
+# endif
+# if !defined PRIXMAX || @PRI_MACROS_BROKEN@
+# undef PRIXMAX
+# if UINTMAX_MAX > UINT32_MAX
+# define PRIXMAX PRIX64
+# else
+# define PRIXMAX "lX"
+# endif
+# endif
+
+# if !defined PRIdPTR || @PRI_MACROS_BROKEN@
+# undef PRIdPTR
+# ifdef INTPTR_MAX
+# define PRIdPTR @PRIPTR_PREFIX@ "d"
+# endif
+# endif
+# if !defined PRIiPTR || @PRI_MACROS_BROKEN@
+# undef PRIiPTR
+# ifdef INTPTR_MAX
+# define PRIiPTR @PRIPTR_PREFIX@ "i"
+# endif
+# endif
+# if !defined PRIoPTR || @PRI_MACROS_BROKEN@
+# undef PRIoPTR
+# ifdef UINTPTR_MAX
+# define PRIoPTR @PRIPTR_PREFIX@ "o"
+# endif
+# endif
+# if !defined PRIuPTR || @PRI_MACROS_BROKEN@
+# undef PRIuPTR
+# ifdef UINTPTR_MAX
+# define PRIuPTR @PRIPTR_PREFIX@ "u"
+# endif
+# endif
+# if !defined PRIxPTR || @PRI_MACROS_BROKEN@
+# undef PRIxPTR
+# ifdef UINTPTR_MAX
+# define PRIxPTR @PRIPTR_PREFIX@ "x"
+# endif
+# endif
+# if !defined PRIXPTR || @PRI_MACROS_BROKEN@
+# undef PRIXPTR
+# ifdef UINTPTR_MAX
+# define PRIXPTR @PRIPTR_PREFIX@ "X"
+# endif
+# endif
+
+# if !defined SCNd8 || @PRI_MACROS_BROKEN@
+# undef SCNd8
+# ifdef INT8_MAX
+# define SCNd8 "hhd"
+# endif
+# endif
+# if !defined SCNi8 || @PRI_MACROS_BROKEN@
+# undef SCNi8
+# ifdef INT8_MAX
+# define SCNi8 "hhi"
+# endif
+# endif
+# if !defined SCNo8 || @PRI_MACROS_BROKEN@
+# undef SCNo8
+# ifdef UINT8_MAX
+# define SCNo8 "hho"
+# endif
+# endif
+# if !defined SCNu8 || @PRI_MACROS_BROKEN@
+# undef SCNu8
+# ifdef UINT8_MAX
+# define SCNu8 "hhu"
+# endif
+# endif
+# if !defined SCNx8 || @PRI_MACROS_BROKEN@
+# undef SCNx8
+# ifdef UINT8_MAX
+# define SCNx8 "hhx"
+# endif
+# endif
+# if !defined SCNd16 || @PRI_MACROS_BROKEN@
+# undef SCNd16
+# ifdef INT16_MAX
+# define SCNd16 "hd"
+# endif
+# endif
+# if !defined SCNi16 || @PRI_MACROS_BROKEN@
+# undef SCNi16
+# ifdef INT16_MAX
+# define SCNi16 "hi"
+# endif
+# endif
+# if !defined SCNo16 || @PRI_MACROS_BROKEN@
+# undef SCNo16
+# ifdef UINT16_MAX
+# define SCNo16 "ho"
+# endif
+# endif
+# if !defined SCNu16 || @PRI_MACROS_BROKEN@
+# undef SCNu16
+# ifdef UINT16_MAX
+# define SCNu16 "hu"
+# endif
+# endif
+# if !defined SCNx16 || @PRI_MACROS_BROKEN@
+# undef SCNx16
+# ifdef UINT16_MAX
+# define SCNx16 "hx"
+# endif
+# endif
+# if !defined SCNd32 || @PRI_MACROS_BROKEN@
+# undef SCNd32
+# ifdef INT32_MAX
+# define SCNd32 "d"
+# endif
+# endif
+# if !defined SCNi32 || @PRI_MACROS_BROKEN@
+# undef SCNi32
+# ifdef INT32_MAX
+# define SCNi32 "i"
+# endif
+# endif
+# if !defined SCNo32 || @PRI_MACROS_BROKEN@
+# undef SCNo32
+# ifdef UINT32_MAX
+# define SCNo32 "o"
+# endif
+# endif
+# if !defined SCNu32 || @PRI_MACROS_BROKEN@
+# undef SCNu32
+# ifdef UINT32_MAX
+# define SCNu32 "u"
+# endif
+# endif
+# if !defined SCNx32 || @PRI_MACROS_BROKEN@
+# undef SCNx32
+# ifdef UINT32_MAX
+# define SCNx32 "x"
+# endif
+# endif
+# ifdef INT64_MAX
+# if INT64_MAX == LONG_MAX
+# define _SCN64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCN64_PREFIX "I64"
+# elif @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNd64 || @PRI_MACROS_BROKEN@
+# undef SCNd64
+# define SCNd64 _SCN64_PREFIX "d"
+# endif
+# if !defined SCNi64 || @PRI_MACROS_BROKEN@
+# undef SCNi64
+# define SCNi64 _SCN64_PREFIX "i"
+# endif
+# endif
+# ifdef UINT64_MAX
+# if UINT64_MAX == ULONG_MAX
+# define _SCNu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCNu64_PREFIX "I64"
+# elif @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNo64 || @PRI_MACROS_BROKEN@
+# undef SCNo64
+# define SCNo64 _SCNu64_PREFIX "o"
+# endif
+# if !defined SCNu64 || @PRI_MACROS_BROKEN@
+# undef SCNu64
+# define SCNu64 _SCNu64_PREFIX "u"
+# endif
+# if !defined SCNx64 || @PRI_MACROS_BROKEN@
+# undef SCNx64
+# define SCNx64 _SCNu64_PREFIX "x"
+# endif
+# endif
+
+# if !defined SCNdLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST8
+# define SCNdLEAST8 "hhd"
+# endif
+# if !defined SCNiLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST8
+# define SCNiLEAST8 "hhi"
+# endif
+# if !defined SCNoLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST8
+# define SCNoLEAST8 "hho"
+# endif
+# if !defined SCNuLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST8
+# define SCNuLEAST8 "hhu"
+# endif
+# if !defined SCNxLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST8
+# define SCNxLEAST8 "hhx"
+# endif
+# if !defined SCNdLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST16
+# define SCNdLEAST16 "hd"
+# endif
+# if !defined SCNiLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST16
+# define SCNiLEAST16 "hi"
+# endif
+# if !defined SCNoLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST16
+# define SCNoLEAST16 "ho"
+# endif
+# if !defined SCNuLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST16
+# define SCNuLEAST16 "hu"
+# endif
+# if !defined SCNxLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST16
+# define SCNxLEAST16 "hx"
+# endif
+# if !defined SCNdLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST32
+# define SCNdLEAST32 "d"
+# endif
+# if !defined SCNiLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST32
+# define SCNiLEAST32 "i"
+# endif
+# if !defined SCNoLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST32
+# define SCNoLEAST32 "o"
+# endif
+# if !defined SCNuLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST32
+# define SCNuLEAST32 "u"
+# endif
+# if !defined SCNxLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST32
+# define SCNxLEAST32 "x"
+# endif
+# ifdef INT64_MAX
+# if !defined SCNdLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST64
+# define SCNdLEAST64 SCNd64
+# endif
+# if !defined SCNiLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST64
+# define SCNiLEAST64 SCNi64
+# endif
+# endif
+# ifdef UINT64_MAX
+# if !defined SCNoLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST64
+# define SCNoLEAST64 SCNo64
+# endif
+# if !defined SCNuLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST64
+# define SCNuLEAST64 SCNu64
+# endif
+# if !defined SCNxLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST64
+# define SCNxLEAST64 SCNx64
+# endif
+# endif
+
+# if !defined SCNdFAST8 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef 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 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNdFAST32 SCNd64
+# else
+# define SCNdFAST32 "d"
+# endif
+# endif
+# if !defined SCNiFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNiFAST32 SCNi64
+# else
+# define SCNiFAST32 "i"
+# endif
+# endif
+# if !defined SCNoFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNoFAST32 SCNo64
+# else
+# define SCNoFAST32 "o"
+# endif
+# endif
+# if !defined SCNuFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNuFAST32 SCNu64
+# else
+# define SCNuFAST32 "u"
+# endif
+# endif
+# if !defined SCNxFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNxFAST32 SCNx64
+# else
+# define SCNxFAST32 "x"
+# endif
+# endif
+# ifdef INT64_MAX
+# if !defined SCNdFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST64
+# define SCNdFAST64 SCNd64
+# endif
+# if !defined SCNiFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST64
+# define SCNiFAST64 SCNi64
+# endif
+# endif
+# ifdef UINT64_MAX
+# if !defined SCNoFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST64
+# define SCNoFAST64 SCNo64
+# endif
+# if !defined SCNuFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST64
+# define SCNuFAST64 SCNu64
+# endif
+# if !defined SCNxFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST64
+# define SCNxFAST64 SCNx64
+# endif
+# endif
+
+# if !defined SCNdMAX || @PRI_MACROS_BROKEN@
+# undef SCNdMAX
+# if INTMAX_MAX > INT32_MAX
+# define SCNdMAX SCNd64
+# else
+# define SCNdMAX "ld"
+# endif
+# endif
+# if !defined SCNiMAX || @PRI_MACROS_BROKEN@
+# undef SCNiMAX
+# if INTMAX_MAX > INT32_MAX
+# define SCNiMAX SCNi64
+# else
+# define SCNiMAX "li"
+# endif
+# endif
+# if !defined SCNoMAX || @PRI_MACROS_BROKEN@
+# undef SCNoMAX
+# if UINTMAX_MAX > UINT32_MAX
+# define SCNoMAX SCNo64
+# else
+# define SCNoMAX "lo"
+# endif
+# endif
+# if !defined SCNuMAX || @PRI_MACROS_BROKEN@
+# undef SCNuMAX
+# if UINTMAX_MAX > UINT32_MAX
+# define SCNuMAX SCNu64
+# else
+# define SCNuMAX "lu"
+# endif
+# endif
+# if !defined SCNxMAX || @PRI_MACROS_BROKEN@
+# undef SCNxMAX
+# if UINTMAX_MAX > UINT32_MAX
+# define SCNxMAX SCNx64
+# else
+# define SCNxMAX "lx"
+# endif
+# endif
+
+# if !defined SCNdPTR || @PRI_MACROS_BROKEN@
+# undef SCNdPTR
+# ifdef INTPTR_MAX
+# define SCNdPTR @PRIPTR_PREFIX@ "d"
+# endif
+# endif
+# if !defined SCNiPTR || @PRI_MACROS_BROKEN@
+# undef SCNiPTR
+# ifdef INTPTR_MAX
+# define SCNiPTR @PRIPTR_PREFIX@ "i"
+# endif
+# endif
+# if !defined SCNoPTR || @PRI_MACROS_BROKEN@
+# undef SCNoPTR
+# ifdef UINTPTR_MAX
+# define SCNoPTR @PRIPTR_PREFIX@ "o"
+# endif
+# endif
+# if !defined SCNuPTR || @PRI_MACROS_BROKEN@
+# undef SCNuPTR
+# ifdef UINTPTR_MAX
+# define SCNuPTR @PRIPTR_PREFIX@ "u"
+# endif
+# endif
+# if !defined SCNxPTR || @PRI_MACROS_BROKEN@
+# undef SCNxPTR
+# ifdef UINTPTR_MAX
+# define SCNxPTR @PRIPTR_PREFIX@ "x"
+# endif
+# 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
+# define imaxabs(a) \
+ (GL_LINK_WARNING ("imaxabs is unportable - " \
+ "use gnulib module imaxabs for portability"), \
+ imaxabs (a))
+#endif
+
+#if @GNULIB_IMAXDIV@
+# if !@HAVE_DECL_IMAXDIV@
+typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t;
+extern imaxdiv_t imaxdiv (intmax_t, intmax_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxdiv
+# define imaxdiv(a,b) \
+ (GL_LINK_WARNING ("imaxdiv is unportable - " \
+ "use gnulib module imaxdiv for portability"), \
+ imaxdiv (a, b))
+#endif
+
+#if @GNULIB_STRTOIMAX@
+# if !@HAVE_DECL_STRTOIMAX@
+extern intmax_t strtoimax (const char *, char **, int);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtoimax
+# define strtoimax(p,e,b) \
+ (GL_LINK_WARNING ("strtoimax is unportable - " \
+ "use gnulib module strtoimax for portability"), \
+ strtoimax (p, e, b))
+#endif
+
+#if @GNULIB_STRTOUMAX@
+# if !@HAVE_DECL_STRTOUMAX@
+extern uintmax_t strtoumax (const char *, char **, int);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtoumax
+# define strtoumax(p,e,b) \
+ (GL_LINK_WARNING ("strtoumax is unportable - " \
+ "use gnulib module strtoumax for portability"), \
+ strtoumax (p, e, b))
+#endif
+
+/* Don't bother defining or declaring wcstoimax and wcstoumax, since
+ wide-character functions like this are hardly ever useful. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* INTTYPES_H */
diff --git a/lib/lchown.c b/lib/lchown.c
new file mode 100644
index 0000000..fa0826e
--- /dev/null
+++ b/lib/lchown.c
@@ -0,0 +1,47 @@
+/* Provide a stub lchown function for systems that lack it.
+
+ Copyright (C) 1998, 1999, 2002, 2004, 2006 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "lchown.h"
+
+#include <sys/stat.h>
+
+/* Work just like chown, except when FILE is a symbolic link.
+ In that case, set errno to EOPNOTSUPP and return -1.
+ But if autoconf tests determined that chown modifies
+ symlinks, then just call chown. */
+
+int
+lchown (const char *file, uid_t uid, gid_t gid)
+{
+#if ! CHOWN_MODIFIES_SYMLINK
+ struct stat stats;
+
+ if (lstat (file, &stats) == 0 && S_ISLNK (stats.st_mode))
+ {
+ errno = EOPNOTSUPP;
+ return -1;
+ }
+#endif
+
+ return chown (file, uid, gid);
+}
diff --git a/lib/lchown.h b/lib/lchown.h
new file mode 100644
index 0000000..6816d1f
--- /dev/null
+++ b/lib/lchown.h
@@ -0,0 +1,42 @@
+/* Declare a replacement for lchown on hosts that lack it.
+
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#include <errno.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#if HAVE_DECL_LCHOWN
+# if ! HAVE_LCHOWN
+# undef lchown
+# define lchown rpl_chown
+# endif
+#else
+int lchown (char const *, uid_t, gid_t);
+#endif
+
+/* Some systems don't have EOPNOTSUPP. */
+#ifndef EOPNOTSUPP
+# ifdef ENOTSUP
+# define EOPNOTSUPP ENOTSUP
+# else
+/* Some systems don't have ENOTSUP either. */
+# define EOPNOTSUPP EINVAL
+# endif
+#endif
diff --git a/lib/localcharset.c b/lib/localcharset.c
new file mode 100644
index 0000000..a0f7cca
--- /dev/null
+++ b/lib/localcharset.c
@@ -0,0 +1,460 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 2000-2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "localcharset.h"
+
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS. */
+# define OS2
+#endif
+
+#if !defined WIN32_NATIVE
+# if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+# else
+# if 0 /* see comment below */
+# include <locale.h>
+# endif
+# endif
+# ifdef __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# endif
+#elif defined WIN32_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+/* Get LIBDIR. */
+#ifndef LIBDIR
+# include "configmake.h"
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+#if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc getc_unlocked
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+ possible multithread problem in the function get_charset_aliases. If we
+ are running in a threaded environment, and if two threads initialize
+ 'charset_aliases' simultaneously, both will produce the same value,
+ and everything will be ok if the two assignments to 'charset_aliases'
+ are atomic. But I don't know what will happen if the two assignments mix. */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+ read, else NULL. Its format is:
+ ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file. */
+static const char *
+get_charset_aliases (void)
+{
+ const char *cp;
+
+ cp = charset_aliases;
+ if (cp == NULL)
+ {
+#if !(defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
+ FILE *fp;
+ const char *dir;
+ const char *base = "charset.alias";
+ char *file_name;
+
+ /* Make it possible to override the charset.alias location. This is
+ necessary for running the testsuite before "make install". */
+ dir = getenv ("CHARSETALIASDIR");
+ if (dir == NULL || dir[0] == '\0')
+ dir = relocate (LIBDIR);
+
+ /* Concatenate dir and base into freshly allocated file_name. */
+ {
+ size_t dir_len = strlen (dir);
+ size_t base_len = strlen (base);
+ int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+ file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+ if (file_name != NULL)
+ {
+ memcpy (file_name, dir, dir_len);
+ if (add_slash)
+ file_name[dir_len] = DIRECTORY_SEPARATOR;
+ memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+ }
+ }
+
+ if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
+ /* Out of memory or file not found, treat it as empty. */
+ cp = "";
+ else
+ {
+ /* Parse the file's contents. */
+ char *res_ptr = NULL;
+ size_t res_size = 0;
+
+ for (;;)
+ {
+ int c;
+ char buf1[50+1];
+ char buf2[50+1];
+ size_t l1, l2;
+ char *old_res_ptr;
+
+ c = getc (fp);
+ if (c == EOF)
+ break;
+ if (c == '\n' || c == ' ' || c == '\t')
+ continue;
+ if (c == '#')
+ {
+ /* Skip comment, to end of line. */
+ do
+ c = getc (fp);
+ while (!(c == EOF || c == '\n'));
+ if (c == EOF)
+ break;
+ continue;
+ }
+ ungetc (c, fp);
+ if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
+ break;
+ l1 = strlen (buf1);
+ l2 = strlen (buf2);
+ old_res_ptr = res_ptr;
+ if (res_size == 0)
+ {
+ res_size = l1 + 1 + l2 + 1;
+ res_ptr = (char *) malloc (res_size + 1);
+ }
+ else
+ {
+ res_size += l1 + 1 + l2 + 1;
+ res_ptr = (char *) realloc (res_ptr, res_size + 1);
+ }
+ if (res_ptr == NULL)
+ {
+ /* Out of memory. */
+ res_size = 0;
+ if (old_res_ptr != NULL)
+ free (old_res_ptr);
+ break;
+ }
+ strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+ strcpy (res_ptr + res_size - (l2 + 1), buf2);
+ }
+ fclose (fp);
+ if (res_size == 0)
+ cp = "";
+ else
+ {
+ *(res_ptr + res_size) = '\0';
+ cp = res_ptr;
+ }
+ }
+
+ if (file_name != NULL)
+ free (file_name);
+
+#else
+
+# if defined VMS
+ /* To avoid the troubles of an extra file charset.alias_vms in the
+ sources of many GNU packages, simply inline the aliases here. */
+ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+ "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+ section 10.7 "Handling Different Character Sets". */
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+ "ISO8859-2" "\0" "ISO-8859-2" "\0"
+ "ISO8859-5" "\0" "ISO-8859-5" "\0"
+ "ISO8859-7" "\0" "ISO-8859-7" "\0"
+ "ISO8859-8" "\0" "ISO-8859-8" "\0"
+ "ISO8859-9" "\0" "ISO-8859-9" "\0"
+ /* Japanese */
+ "eucJP" "\0" "EUC-JP" "\0"
+ "SJIS" "\0" "SHIFT_JIS" "\0"
+ "DECKANJI" "\0" "DEC-KANJI" "\0"
+ "SDECKANJI" "\0" "EUC-JP" "\0"
+ /* Chinese */
+ "eucTW" "\0" "EUC-TW" "\0"
+ "DECHANYU" "\0" "DEC-HANYU" "\0"
+ "DECHANZI" "\0" "GB2312" "\0"
+ /* Korean */
+ "DECKOREAN" "\0" "EUC-KR" "\0";
+# endif
+
+# if defined WIN32_NATIVE || defined __CYGWIN__
+ /* To avoid the troubles of installing a separate file in the same
+ directory as the DLL and of retrieving the DLL's directory at
+ runtime, simply inline the aliases here. */
+
+ cp = "CP936" "\0" "GBK" "\0"
+ "CP1361" "\0" "JOHAB" "\0"
+ "CP20127" "\0" "ASCII" "\0"
+ "CP20866" "\0" "KOI8-R" "\0"
+ "CP20936" "\0" "GB2312" "\0"
+ "CP21866" "\0" "KOI8-RU" "\0"
+ "CP28591" "\0" "ISO-8859-1" "\0"
+ "CP28592" "\0" "ISO-8859-2" "\0"
+ "CP28593" "\0" "ISO-8859-3" "\0"
+ "CP28594" "\0" "ISO-8859-4" "\0"
+ "CP28595" "\0" "ISO-8859-5" "\0"
+ "CP28596" "\0" "ISO-8859-6" "\0"
+ "CP28597" "\0" "ISO-8859-7" "\0"
+ "CP28598" "\0" "ISO-8859-8" "\0"
+ "CP28599" "\0" "ISO-8859-9" "\0"
+ "CP28605" "\0" "ISO-8859-15" "\0"
+ "CP38598" "\0" "ISO-8859-8" "\0"
+ "CP51932" "\0" "EUC-JP" "\0"
+ "CP51936" "\0" "GB2312" "\0"
+ "CP51949" "\0" "EUC-KR" "\0"
+ "CP51950" "\0" "EUC-TW" "\0"
+ "CP54936" "\0" "GB18030" "\0"
+ "CP65001" "\0" "UTF-8" "\0";
+# endif
+#endif
+
+ charset_aliases = cp;
+ }
+
+ return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset (void)
+{
+ const char *codeset;
+ const char *aliases;
+
+#if !(defined WIN32_NATIVE || defined OS2)
+
+# if HAVE_LANGINFO_CODESET
+
+ /* Most systems support nl_langinfo (CODESET) nowadays. */
+ codeset = nl_langinfo (CODESET);
+
+# ifdef __CYGWIN__
+ /* Cygwin 2006 does not have locales. nl_langinfo (CODESET) always
+ returns "US-ASCII". As long as this is not fixed, return the suffix
+ of the locale name from the environment variables (if present) or
+ the codepage as a number. */
+ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
+ {
+ const char *locale;
+ static char buf[2 + 10 + 1];
+
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return
+ it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+ }
+
+ /* Woe32 has a function returning the locale's codepage as a number. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+ }
+# endif
+
+# else
+
+ /* On old systems which lack it, use setlocale or getenv. */
+ const char *locale = NULL;
+
+ /* But most old systems don't have a complete set of locales. Some
+ (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't
+ use setlocale here; it would return "C" when it doesn't support the
+ locale name the user has set. */
+# if 0
+ locale = setlocale (LC_CTYPE, NULL);
+# endif
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ }
+
+ /* On some old systems, one used to set locale = "iso8859_1". On others,
+ you set it to "language_COUNTRY.charset". In any case, we resolve it
+ through the charset.alias file. */
+ codeset = locale;
+
+# endif
+
+#elif defined WIN32_NATIVE
+
+ static char buf[2 + 10 + 1];
+
+ /* Woe32 has a function returning the locale's codepage as a number. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+
+#elif defined OS2
+
+ const char *locale;
+ static char buf[2 + 10 + 1];
+ ULONG cp[3];
+ ULONG cplen;
+
+ /* Allow user to override the codeset, as set in the operating system,
+ with standard language environment variables. */
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+
+ /* Resolve through the charset.alias file. */
+ codeset = locale;
+ }
+ else
+ {
+ /* OS/2 has a function returning the locale's codepage as a number. */
+ if (DosQueryCp (sizeof (cp), cp, &cplen))
+ codeset = "";
+ else
+ {
+ sprintf (buf, "CP%u", cp[0]);
+ codeset = buf;
+ }
+ }
+
+#endif
+
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+ /* Resolve alias. */
+ for (aliases = get_charset_aliases ();
+ *aliases != '\0';
+ aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+ if (strcmp (codeset, aliases) == 0
+ || (aliases[0] == '*' && aliases[1] == '\0'))
+ {
+ codeset = aliases + strlen (aliases) + 1;
+ break;
+ }
+
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ if (codeset[0] == '\0')
+ codeset = "ASCII";
+
+ return codeset;
+}
diff --git a/lib/localcharset.h b/lib/localcharset.h
new file mode 100644
index 0000000..5030210
--- /dev/null
+++ b/lib/localcharset.h
@@ -0,0 +1,41 @@
+/* Determine a canonical name for the current locale's character encoding.
+ Copyright (C) 2000-2003 Free Software Foundation, Inc.
+ This file is part of the GNU CHARSET Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+extern const char * locale_charset (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */
diff --git a/lib/lstat.c b/lib/lstat.c
new file mode 100644
index 0000000..77dd228
--- /dev/null
+++ b/lib/lstat.c
@@ -0,0 +1,76 @@
+/* Work around a bug of lstat on some systems
+
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* The specification of these functions is in sys_stat.h. But we cannot
+ include this include file here, because on some systems, a
+ "#define lstat lstat64" is being used, and sys_stat.h deletes this
+ definition. */
+
+#include <sys/types.h>
+#include <sys/stat.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)
+{
+ size_t len;
+ int lstat_result = lstat (file, sbuf);
+
+ if (lstat_result != 0 || !S_ISLNK (sbuf->st_mode))
+ return lstat_result;
+
+ len = strlen (file);
+ if (len == 0 || file[len - 1] != '/')
+ return 0;
+
+ /* FILE refers to a symbolic link and the name ends with a slash.
+ Call stat() to get info about the link's referent. */
+
+ /* If stat fails, then we do the same. */
+ if (stat (file, sbuf) != 0)
+ return -1;
+
+ /* If FILE references a directory, return 0. */
+ if (S_ISDIR (sbuf->st_mode))
+ return 0;
+
+ /* Here, we know stat succeeded and FILE references a non-directory.
+ But it was specified via a name including a trailing slash.
+ Fail with errno set to ENOTDIR to indicate the contradiction. */
+ errno = ENOTDIR;
+ return -1;
+}
diff --git a/lib/lstat.h b/lib/lstat.h
new file mode 100644
index 0000000..6a83fbf
--- /dev/null
+++ b/lib/lstat.h
@@ -0,0 +1,24 @@
+/* Retrieving information about files.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <sys/stat.h>
+
+#if !LSTAT_FOLLOWS_SLASHED_SYMLINK
+extern int rpl_lstat (const char *name, struct stat *buf);
+# undef lstat
+# define lstat rpl_lstat
+#endif
diff --git a/lib/malloc.c b/lib/malloc.c
new file mode 100644
index 0000000..d4dae3e
--- /dev/null
+++ b/lib/malloc.c
@@ -0,0 +1,35 @@
+/* malloc() function that is glibc compatible.
+
+ Copyright (C) 1997, 1998, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+#undef malloc
+
+#include <stdlib.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)
+{
+ if (n == 0)
+ n = 1;
+ return malloc (n);
+}
diff --git a/lib/mbchar.c b/lib/mbchar.c
new file mode 100644
index 0000000..95373f5
--- /dev/null
+++ b/lib/mbchar.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 2001, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+
+#include <config.h>
+
+#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..f3e28ef
--- /dev/null
+++ b/lib/mbchar.h
@@ -0,0 +1,353 @@
+/* Multibyte character data type.
+ Copyright (C) 2001, 2005-2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* 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>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "wcwidth.h"
+
+#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
+
+static 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. */
+static 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[];
+
+static inline bool
+is_basic (char c)
+{
+ return (is_basic_table [(unsigned char) c >> 5] >> ((unsigned char) c & 31))
+ & 1;
+}
+
+#else
+
+static 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
+
+#endif /* _MBCHAR_H */
diff --git a/lib/mbscasecmp.c b/lib/mbscasecmp.c
new file mode 100644
index 0000000..8a2f434
--- /dev/null
+++ b/lib/mbscasecmp.c
@@ -0,0 +1,103 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2007 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005,
+ based on earlier glibc code.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#if HAVE_MBRTOWC
+# include "mbuiter.h"
+#endif
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* 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! */
+int
+mbscasecmp (const char *s1, const char *s2)
+{
+ if (s1 == s2)
+ return 0;
+
+ /* Be careful not to look at the entire extent of s1 or s2 until needed.
+ This is useful because when two strings differ, the difference is
+ most often already in the very few first characters. */
+#if HAVE_MBRTOWC
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter1;
+ mbui_iterator_t iter2;
+
+ mbui_init (iter1, s1);
+ mbui_init (iter2, s2);
+
+ while (mbui_avail (iter1) && mbui_avail (iter2))
+ {
+ int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
+
+ if (cmp != 0)
+ return cmp;
+
+ mbui_advance (iter1);
+ mbui_advance (iter2);
+ }
+ if (mbui_avail (iter1))
+ /* s2 terminated before s1. */
+ return 1;
+ if (mbui_avail (iter2))
+ /* s1 terminated before s2. */
+ return -1;
+ return 0;
+ }
+ else
+#endif
+ {
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ 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 (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+ }
+}
diff --git a/lib/mbuiter.h b/lib/mbuiter.h
new file mode 100644
index 0000000..e6ad488
--- /dev/null
+++ b/lib/mbuiter.h
@@ -0,0 +1,222 @@
+/* Iterating through multibyte strings: macros for multi-byte encodings.
+ Copyright (C) 2001, 2005, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+/* The macros in this file implement forward iteration through a
+ multi-byte string, without knowing its length a-priori.
+
+ With these macros, an iteration loop that looks like
+
+ char *iter;
+ for (iter = buf; *iter != '\0'; iter++)
+ {
+ do_something (*iter);
+ }
+
+ becomes
+
+ mbui_iterator_t iter;
+ for (mbui_init (iter, buf); mbui_avail (iter); mbui_advance (iter))
+ {
+ do_something (mbui_cur_ptr (iter), mb_len (mbui_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.
+
+ Compared to mbiter.h, the macros here don't need to know the string's
+ length a-priori. The downside is that at each step, the look-ahead
+ that guards against overrunning the terminating '\0' is more expensive.
+ The mbui_* macros are therefore suitable when there is a high probability
+ that only the first few multibyte characters need to be inspected.
+ Whereas the mbi_* macros are better if usually the iteration runs
+ through the entire string.
+
+ mbui_iterator_t
+ is a type usable for variable declarations.
+
+ mbui_init (iter, startptr)
+ initializes the iterator, starting at startptr.
+
+ mbui_avail (iter)
+ returns true if there are more multibyte chracters available before
+ the end of string is reached. In this case, mbui_cur (iter) is
+ initialized to the next multibyte chracter.
+
+ mbui_advance (iter)
+ advances the iterator by one multibyte character.
+
+ mbui_cur (iter)
+ returns the current multibyte character, of type mbchar_t. All the
+ macros defined in mbchar.h can be used on it.
+
+ mbui_cur_ptr (iter)
+ return a pointer to the beginning of the current multibyte character.
+
+ mbui_reloc (iter, ptrdiff)
+ relocates iterator when the string is moved by ptrdiff bytes.
+
+ mbui_copy (&destiter, &srciter)
+ copies srciter to destiter.
+
+ Here are the function prototypes of the macros.
+
+ extern void mbui_init (mbui_iterator_t iter, const char *startptr);
+ extern bool mbui_avail (mbui_iterator_t iter);
+ extern void mbui_advance (mbui_iterator_t iter);
+ extern mbchar_t mbui_cur (mbui_iterator_t iter);
+ extern const char * mbui_cur_ptr (mbui_iterator_t iter);
+ extern void mbui_reloc (mbui_iterator_t iter, ptrdiff_t ptrdiff);
+ extern void mbui_copy (mbui_iterator_t *new, const mbui_iterator_t *old);
+ */
+
+#ifndef _MBUITER_H
+#define _MBUITER_H 1
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+
+#include "mbchar.h"
+#include "strnlen1.h"
+
+struct mbuiter_multi
+{
+ 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 mbui_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 mbui_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
+ */
+};
+
+static inline void
+mbuiter_multi_next (struct mbuiter_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,
+ strnlen1 (iter->cur.ptr, MB_CUR_MAX),
+ &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 = strlen (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;
+}
+
+static inline void
+mbuiter_multi_reloc (struct mbuiter_multi *iter, ptrdiff_t ptrdiff)
+{
+ iter->cur.ptr += ptrdiff;
+}
+
+static inline void
+mbuiter_multi_copy (struct mbuiter_multi *new_iter, const struct mbuiter_multi *old_iter)
+{
+ 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 mbuiter_multi mbui_iterator_t;
+#define mbui_init(iter, startptr) \
+ ((iter).cur.ptr = (startptr), \
+ (iter).in_shift = false, memset (&(iter).state, '\0', sizeof (mbstate_t)), \
+ (iter).next_done = false)
+#define mbui_avail(iter) \
+ (mbuiter_multi_next (&(iter)), !mb_isnul ((iter).cur))
+#define mbui_advance(iter) \
+ ((iter).cur.ptr += (iter).cur.bytes, (iter).next_done = false)
+
+/* Access to the current character. */
+#define mbui_cur(iter) (iter).cur
+#define mbui_cur_ptr(iter) (iter).cur.ptr
+
+/* Relocation. */
+#define mbui_reloc(iter, ptrdiff) mbuiter_multi_reloc (&iter, ptrdiff)
+
+/* Copying an iterator. */
+#define mbui_copy mbuiter_multi_copy
+
+#endif /* _MBUITER_H */
diff --git a/lib/memchr.c b/lib/memchr.c
new file mode 100644
index 0000000..d44ad6d
--- /dev/null
+++ b/lib/memchr.c
@@ -0,0 +1,201 @@
+/* Copyright (C) 1991, 1993, 1996, 1997, 1999, 2000, 2003, 2004, 2006 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 2, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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
+#undef __memchr
+
+/* Search no more than N bytes of S for C. */
+void *
+__memchr (void const *s, int c_in, size_t n)
+{
+ const unsigned char *char_ptr;
+ const unsigned long int *longword_ptr;
+ unsigned long int longword, magic_bits, charmask;
+ unsigned reg_char c;
+ int i;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the first few characters by reading one character 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;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ longword_ptr = (const unsigned long int *) char_ptr;
+
+ /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits
+ the "holes." Note that there is a hole just to the left of
+ each byte, with an extra at the end:
+
+ bits: 01111110 11111110 11111110 11111111
+ bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
+
+ The 1-bits make sure that carries propagate to the next 0-bit.
+ The 0-bits provide holes for carries to fall into. */
+
+ /* Set MAGIC_BITS to be this pattern of 1 and 0 bits.
+ Set CHARMASK to be a longword, each of whose bytes is C. */
+
+ magic_bits = 0xfefefefe;
+ charmask = c | (c << 8);
+ charmask |= charmask << 16;
+#if 0xffffffffU < ULONG_MAX
+ magic_bits |= magic_bits << 32;
+ charmask |= charmask << 32;
+ if (8 < sizeof longword)
+ for (i = 64; i < sizeof longword * 8; i *= 2)
+ {
+ magic_bits |= magic_bits << i;
+ charmask |= charmask << i;
+ }
+#endif
+ magic_bits = (ULONG_MAX >> 1) & (magic_bits | 1);
+
+ /* Instead of the traditional loop which tests each character,
+ 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 zero. */
+ while (n >= sizeof longword)
+ {
+ /* We tentatively exit the loop if adding MAGIC_BITS to
+ LONGWORD fails to change any of the hole bits of LONGWORD.
+
+ 1) Is this safe? Will it catch all the zero bytes?
+ Suppose there is a byte with all zeros. Any carry bits
+ propagating from its left will fall into the hole at its
+ least significant bit and stop. Since there will be no
+ carry from its most significant bit, the LSB of the
+ byte to the left will be unchanged, and the zero will be
+ detected.
+
+ 2) Is this worthwhile? Will it ignore everything except
+ zero bytes? Suppose every byte of LONGWORD has a bit set
+ somewhere. There will be a carry into bit 8. If bit 8
+ is set, this will carry into bit 16. If bit 8 is clear,
+ one of bits 9-15 must be set, so there will be a carry
+ into bit 16. Similarly, there will be a carry into bit
+ 24. If one of bits 24-30 is set, there will be a carry
+ into bit 31, so all of the hole bits will be changed.
+
+ The one misfire occurs when bits 24-30 are clear and bit
+ 31 is set; in this case, the hole at bit 31 is not
+ changed. If we had access to the processor carry flag,
+ we could close this loophole by putting the fourth hole
+ at bit 32!
+
+ So it ignores everything except 128's, when they're aligned
+ properly.
+
+ 3) But wait! Aren't we looking for C, not zero?
+ Good point. So what we do is XOR LONGWORD with a longword,
+ each of whose bytes is C. This turns each byte that is C
+ into a zero. */
+
+ longword = *longword_ptr++ ^ charmask;
+
+ /* Add MAGIC_BITS to LONGWORD. */
+ if ((((longword + magic_bits)
+
+ /* Set those bits that were unchanged by the addition. */
+ ^ ~longword)
+
+ /* Look at only the hole bits. If any of the hole bits
+ are unchanged, most likely one of the bytes was a
+ zero. */
+ & ~magic_bits) != 0)
+ {
+ /* Which of the bytes was C? If none of them were, it was
+ a misfire; continue the search. */
+
+ const unsigned char *cp = (const unsigned char *) (longword_ptr - 1);
+
+ if (cp[0] == c)
+ return (void *) cp;
+ if (cp[1] == c)
+ return (void *) &cp[1];
+ if (cp[2] == c)
+ return (void *) &cp[2];
+ if (cp[3] == c)
+ return (void *) &cp[3];
+ if (4 < sizeof longword && cp[4] == c)
+ return (void *) &cp[4];
+ if (5 < sizeof longword && cp[5] == c)
+ return (void *) &cp[5];
+ if (6 < sizeof longword && cp[6] == c)
+ return (void *) &cp[6];
+ if (7 < sizeof longword && cp[7] == c)
+ return (void *) &cp[7];
+ if (8 < sizeof longword)
+ for (i = 8; i < sizeof longword; i++)
+ if (cp[i] == c)
+ return (void *) &cp[i];
+ }
+
+ n -= sizeof longword;
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ while (n-- > 0)
+ {
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+ else
+ ++char_ptr;
+ }
+
+ return 0;
+}
+#ifdef weak_alias
+weak_alias (__memchr, BP_SYM (memchr))
+#endif
diff --git a/lib/mempcpy.c b/lib/mempcpy.c
new file mode 100644
index 0000000..1c702c7
--- /dev/null
+++ b/lib/mempcpy.c
@@ -0,0 +1,29 @@
+/* Copy memory area and return pointer after last written byte.
+ Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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..29fd531
--- /dev/null
+++ b/lib/memrchr.c
@@ -0,0 +1,190 @@
+/* memrchr -- find the last occurrence of a byte in a memory block
+
+ Copyright (C) 1991, 1993, 1996, 1997, 1999, 2000, 2003, 2004, 2005,
+ 2006, 2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if defined _LIBC
+# include <memcopy.h>
+#else
+# include <config.h>
+# define reg_char char
+#endif
+
+#include <string.h>
+#include <limits.h>
+
+#undef __memrchr
+#undef memrchr
+
+#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)
+{
+ const unsigned char *char_ptr;
+ const unsigned long int *longword_ptr;
+ unsigned long int longword, magic_bits, charmask;
+ unsigned reg_char c;
+ int i;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the last few characters by reading one character 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;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ longword_ptr = (const unsigned long int *) char_ptr;
+
+ /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits
+ the "holes." Note that there is a hole just to the left of
+ each byte, with an extra at the end:
+
+ bits: 01111110 11111110 11111110 11111111
+ bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
+
+ The 1-bits make sure that carries propagate to the next 0-bit.
+ The 0-bits provide holes for carries to fall into. */
+
+ /* Set MAGIC_BITS to be this pattern of 1 and 0 bits.
+ Set CHARMASK to be a longword, each of whose bytes is C. */
+
+ magic_bits = 0xfefefefe;
+ charmask = c | (c << 8);
+ charmask |= charmask << 16;
+#if 0xffffffffU < ULONG_MAX
+ magic_bits |= magic_bits << 32;
+ charmask |= charmask << 32;
+ if (8 < sizeof longword)
+ for (i = 64; i < sizeof longword * 8; i *= 2)
+ {
+ magic_bits |= magic_bits << i;
+ charmask |= charmask << i;
+ }
+#endif
+ magic_bits = (ULONG_MAX >> 1) & (magic_bits | 1);
+
+ /* Instead of the traditional loop which tests each character,
+ 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 zero. */
+ while (n >= sizeof longword)
+ {
+ /* We tentatively exit the loop if adding MAGIC_BITS to
+ LONGWORD fails to change any of the hole bits of LONGWORD.
+
+ 1) Is this safe? Will it catch all the zero bytes?
+ Suppose there is a byte with all zeros. Any carry bits
+ propagating from its left will fall into the hole at its
+ least significant bit and stop. Since there will be no
+ carry from its most significant bit, the LSB of the
+ byte to the left will be unchanged, and the zero will be
+ detected.
+
+ 2) Is this worthwhile? Will it ignore everything except
+ zero bytes? Suppose every byte of LONGWORD has a bit set
+ somewhere. There will be a carry into bit 8. If bit 8
+ is set, this will carry into bit 16. If bit 8 is clear,
+ one of bits 9-15 must be set, so there will be a carry
+ into bit 16. Similarly, there will be a carry into bit
+ 24. If one of bits 24-30 is set, there will be a carry
+ into bit 31, so all of the hole bits will be changed.
+
+ The one misfire occurs when bits 24-30 are clear and bit
+ 31 is set; in this case, the hole at bit 31 is not
+ changed. If we had access to the processor carry flag,
+ we could close this loophole by putting the fourth hole
+ at bit 32!
+
+ So it ignores everything except 128's, when they're aligned
+ properly.
+
+ 3) But wait! Aren't we looking for C, not zero?
+ Good point. So what we do is XOR LONGWORD with a longword,
+ each of whose bytes is C. This turns each byte that is C
+ into a zero. */
+
+ longword = *--longword_ptr ^ charmask;
+
+ /* Add MAGIC_BITS to LONGWORD. */
+ if ((((longword + magic_bits)
+
+ /* Set those bits that were unchanged by the addition. */
+ ^ ~longword)
+
+ /* Look at only the hole bits. If any of the hole bits
+ are unchanged, most likely one of the bytes was a
+ zero. */
+ & ~magic_bits) != 0)
+ {
+ /* Which of the bytes was C? If none of them were, it was
+ a misfire; continue the search. */
+
+ const unsigned char *cp = (const unsigned char *) longword_ptr;
+
+ if (8 < sizeof longword)
+ for (i = sizeof longword - 1; 8 <= i; i--)
+ if (cp[i] == c)
+ return (void *) &cp[i];
+ if (7 < sizeof longword && cp[7] == c)
+ return (void *) &cp[7];
+ if (6 < sizeof longword && cp[6] == c)
+ return (void *) &cp[6];
+ if (5 < sizeof longword && cp[5] == c)
+ return (void *) &cp[5];
+ if (4 < sizeof longword && cp[4] == c)
+ return (void *) &cp[4];
+ if (cp[3] == c)
+ return (void *) &cp[3];
+ if (cp[2] == c)
+ return (void *) &cp[2];
+ if (cp[1] == c)
+ return (void *) &cp[1];
+ if (cp[0] == c)
+ return (void *) cp;
+ }
+
+ n -= sizeof longword;
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ while (n-- > 0)
+ {
+ if (*--char_ptr == c)
+ return (void *) char_ptr;
+ }
+
+ return 0;
+}
+#ifdef weak_alias
+weak_alias (__memrchr, memrchr)
+#endif
diff --git a/lib/memset.c b/lib/memset.c
new file mode 100644
index 0000000..890cbf1
--- /dev/null
+++ b/lib/memset.c
@@ -0,0 +1,28 @@
+/* memset.c -- set an area of memory to a given value
+ Copyright (C) 1991, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <stddef.h>
+
+void *
+memset (void *str, int c, size_t len)
+{
+ register char *st = str;
+
+ while (len-- > 0)
+ *st++ = c;
+ return str;
+}
diff --git a/lib/mkdirat.c b/lib/mkdirat.c
new file mode 100644
index 0000000..da0b262
--- /dev/null
+++ b/lib/mkdirat.c
@@ -0,0 +1,43 @@
+/* fd-relative mkdir
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "openat.h"
+
+#include <unistd.h>
+
+#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "save-cwd.h"
+#include "openat-priv.h"
+
+/* Solaris 10 has no function like this.
+ Create a subdirectory, FILE, with mode MODE, in the directory
+ open on descriptor FD. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then mkdir/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+#define AT_FUNC_NAME mkdirat
+#define AT_FUNC_F1 mkdir
+#define AT_FUNC_F2 mkdir
+#define AT_FUNC_USE_F1_COND 1
+#define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode
+#define AT_FUNC_POST_FILE_ARGS , mode
+#include "at-func.c"
diff --git a/lib/mkdtemp.c b/lib/mkdtemp.c
new file mode 100644
index 0000000..36b6c75
--- /dev/null
+++ b/lib/mkdtemp.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 1999, 2001-2003, 2006-2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Extracted from misc/mkdtemp.c. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include "tempname.h"
+
+/* Generate a unique temporary directory from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the filename unique.
+ The directory is created, mode 700, and its name is returned.
+ (This function comes from OpenBSD.) */
+char *
+mkdtemp (char *template)
+{
+ if (gen_tempname (template, GT_DIR))
+ return NULL;
+ else
+ return template;
+}
diff --git a/lib/mktime.c b/lib/mktime.c
new file mode 100644
index 0000000..a91fb20
--- /dev/null
+++ b/lib/mktime.c
@@ -0,0 +1,663 @@
+/* Convert a `struct tm' to a time_t value.
+ Copyright (C) 1993-1999, 2002-2005, 2006, 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Paul Eggert <eggert@twinsun.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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Define this to have a standalone program to test this implementation of
+ mktime. */
+/* #define DEBUG 1 */
+
+#ifndef _LIBC
+# include <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 <limits.h>
+
+#include <string.h> /* For the real memcpy prototype. */
+
+#if DEBUG
+# include <stdio.h>
+# include <stdlib.h>
+/* Make it work even if the system's libc has its own mktime routine. */
+# define mktime my_mktime
+#endif /* DEBUG */
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. A and B should be free of side
+ effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
+ INT_BITS is the number of useful bits in an int. GNU code can
+ assume that 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. */
+#define SHR(a, b) \
+ (-1 >> 1 == -1 \
+ ? (a) >> (b) \
+ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
+
+/* 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 negative values of the signed integer type T use two's
+ complement, ones' complement, or signed magnitude representation,
+ respectively. Much GNU code assumes two's complement, but some
+ people like to be portable to all possible C hosts. */
+#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
+#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
+#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
+
+/* True if the arithmetic type T is signed. */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* The maximum and minimum values for the integer type T. These
+ macros have undefined behavior if T is signed and has padding bits.
+ If this is a problem for you, please let us know how to fix it for
+ your host. */
+#define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : TYPE_SIGNED_MAGNITUDE (t) \
+ ? ~ (t) 0 \
+ : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+#define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+
+#ifndef TIME_T_MIN
+# define TIME_T_MIN TYPE_MINIMUM (time_t)
+#endif
+#ifndef TIME_T_MAX
+# define TIME_T_MAX TYPE_MAXIMUM (time_t)
+#endif
+#define TIME_T_MIDPOINT (SHR (TIME_T_MIN + TIME_T_MAX, 1) + 1)
+
+/* Verify a requirement at compile-time (unlike assert, which is runtime). */
+#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
+
+verify (time_t_is_integer, TYPE_IS_INTEGER (time_t));
+verify (twos_complement_arithmetic, TYPE_TWOS_COMPLEMENT (int));
+/* The code also assumes that signed integer overflow silently wraps
+ around, but this assumption can't be stated without causing a
+ diagnostic on some hosts. */
+
+#define EPOCH_YEAR 1970
+#define TM_YEAR_BASE 1900
+verify (base_year_is_a_multiple_of_100, TM_YEAR_BASE % 100 == 0);
+
+/* Return 1 if YEAR + TM_YEAR_BASE is a leap year. */
+static inline int
+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 }
+ };
+
+
+#ifndef _LIBC
+/* 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.
+ See the gnulib time_r module for one way to implement this. */
+# undef __localtime_r
+# define __localtime_r localtime_r
+# define __mktime_internal mktime_internal
+#endif
+
+/* 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 time stamps.
+
+ The YEAR values uses the same numbering as TP->tm_year. Values
+ need not be in the usual range. However, YEAR1 must not be less
+ than 2 * INT_MIN or greater than 2 * INT_MAX.
+
+ The result may overflow. It is the caller's responsibility to
+ detect overflow. */
+
+static inline time_t
+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 (C99_integer_division, -1 / 2 == 0);
+ verify (long_int_year_and_yday_are_wide_enough,
+ INT_MAX <= LONG_MAX / 2 || TIME_T_MAX <= UINT_MAX);
+
+ /* 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 / 25 - (a4 % 25 < 0);
+ int b100 = b4 / 25 - (b4 % 25 < 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 in time_t precision. Overflow might
+ occur here. */
+ time_t tyear1 = year1;
+ time_t years = tyear1 - year0;
+ time_t days = 365 * years + yday1 - yday0 + intervening_leap_days;
+ time_t hours = 24 * days + hour1 - hour0;
+ time_t minutes = 60 * hours + min1 - min0;
+ time_t seconds = 60 * minutes + sec1 - sec0;
+ return seconds;
+}
+
+
+/* Return a time_t value corresponding to (YEAR-YDAY HOUR:MIN:SEC),
+ assuming that *T corresponds to *TP and that no clock adjustments
+ occurred between *TP and the desired time.
+ If TP is null, return a value not equal to *T; this avoids false matches.
+ If overflow occurs, yield the minimal or maximal value, except do not
+ yield a value equal to *T. */
+static time_t
+guess_time_tm (long int year, long int yday, int hour, int min, int sec,
+ const time_t *t, const struct tm *tp)
+{
+ if (tp)
+ {
+ time_t d = ydhms_diff (year, yday, hour, min, sec,
+ tp->tm_year, tp->tm_yday,
+ tp->tm_hour, tp->tm_min, tp->tm_sec);
+ time_t t1 = *t + d;
+ if ((t1 < *t) == (TYPE_SIGNED (time_t) ? d < 0 : TIME_T_MAX / 2 < d))
+ return t1;
+ }
+
+ /* Overflow occurred one way or another. Return the nearest result
+ that is actually in range, except don't report a zero difference
+ if the actual difference is nonzero, as that would cause a false
+ match; and don't oscillate between two values, as that would
+ confuse the spring-forward gap detector. */
+ return (*t < TIME_T_MIDPOINT
+ ? (*t <= TIME_T_MIN + 1 ? *t + 1 : TIME_T_MIN)
+ : (TIME_T_MAX - 1 <= *t ? *t - 1 : TIME_T_MAX));
+}
+
+/* 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. */
+static struct tm *
+ranged_convert (struct tm *(*convert) (const time_t *, struct tm *),
+ time_t *t, struct tm *tp)
+{
+ struct tm *r = convert (t, tp);
+
+ if (!r && *t)
+ {
+ time_t bad = *t;
+ time_t ok = 0;
+
+ /* BAD is a known unconvertible time_t, and OK is a known good one.
+ Use binary search to narrow the range between BAD and OK until
+ they differ by 1. */
+ while (bad != ok + (bad < 0 ? -1 : 1))
+ {
+ time_t mid = *t = (bad < 0
+ ? bad + ((ok - bad) >> 1)
+ : ok + ((bad - ok) >> 1));
+ r = convert (t, tp);
+ if (r)
+ ok = mid;
+ else
+ bad = mid;
+ }
+
+ if (!r && ok)
+ {
+ /* The last conversion attempt failed;
+ revert to the most recent successful attempt. */
+ *t = ok;
+ r = convert (t, tp);
+ }
+ }
+
+ return r;
+}
+
+
+/* Convert *TP to a time_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.
+ This function is external because it is used also by timegm.c. */
+time_t
+__mktime_internal (struct tm *tp,
+ struct tm *(*convert) (const time_t *, struct tm *),
+ time_t *offset)
+{
+ time_t t, gt, t0, t1, t2;
+ 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;
+
+ /* 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 minor overflows correctly,
+ assuming int and time_t arithmetic wraps around.
+ Major overflows are caught at the end. */
+
+ /* 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;
+
+ time_t guessed_offset = *offset;
+
+ int sec_requested = sec;
+
+ if (LEAP_SECONDS_POSSIBLE)
+ {
+ /* Handle out-of-range seconds specially,
+ since ydhms_tm_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. */
+
+ t0 = ydhms_diff (year, yday, hour, min, sec,
+ EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0, - guessed_offset);
+
+ if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3)
+ {
+ /* time_t isn't large enough to rule out overflows, so check
+ for major overflows. A gross check suffices, since if t0
+ has overflowed, it is off by a multiple of TIME_T_MAX -
+ TIME_T_MIN + 1. So ignore any component of the difference
+ that is bounded by a small value. */
+
+ /* Approximate log base 2 of the number of time units per
+ biennium. A biennium is 2 years; use this unit instead of
+ years to avoid integer overflow. For example, 2 average
+ Gregorian years are 2 * 365.2425 * 24 * 60 * 60 seconds,
+ which is 63113904 seconds, and rint (log2 (63113904)) is
+ 26. */
+ int ALOG2_SECONDS_PER_BIENNIUM = 26;
+ int ALOG2_MINUTES_PER_BIENNIUM = 20;
+ int ALOG2_HOURS_PER_BIENNIUM = 14;
+ int ALOG2_DAYS_PER_BIENNIUM = 10;
+ int LOG2_YEARS_PER_BIENNIUM = 1;
+
+ int approx_requested_biennia =
+ (SHR (year_requested, LOG2_YEARS_PER_BIENNIUM)
+ - SHR (EPOCH_YEAR - TM_YEAR_BASE, LOG2_YEARS_PER_BIENNIUM)
+ + SHR (mday, ALOG2_DAYS_PER_BIENNIUM)
+ + SHR (hour, ALOG2_HOURS_PER_BIENNIUM)
+ + SHR (min, ALOG2_MINUTES_PER_BIENNIUM)
+ + (LEAP_SECONDS_POSSIBLE
+ ? 0
+ : SHR (sec, ALOG2_SECONDS_PER_BIENNIUM)));
+
+ int approx_biennia = SHR (t0, ALOG2_SECONDS_PER_BIENNIUM);
+ int diff = approx_biennia - approx_requested_biennia;
+ int abs_diff = diff < 0 ? - diff : diff;
+
+ /* IRIX 4.0.5 cc miscaculates TIME_T_MIN / 3: it erroneously
+ gives a positive value of 715827882. Setting a variable
+ first then doing math on it seems to work.
+ (ghazi@caip.rutgers.edu) */
+ time_t time_t_max = TIME_T_MAX;
+ time_t time_t_min = TIME_T_MIN;
+ time_t overflow_threshold =
+ (time_t_max / 3 - time_t_min / 3) >> ALOG2_SECONDS_PER_BIENNIUM;
+
+ if (overflow_threshold < abs_diff)
+ {
+ /* Overflow occurred. Try repairing it; this might work if
+ the time zone offset is enough to undo the overflow. */
+ time_t repaired_t0 = -1 - t0;
+ approx_biennia = SHR (repaired_t0, ALOG2_SECONDS_PER_BIENNIUM);
+ diff = approx_biennia - approx_requested_biennia;
+ abs_diff = diff < 0 ? - diff : diff;
+ if (overflow_threshold < abs_diff)
+ return -1;
+ guessed_offset += repaired_t0 - t0;
+ t0 = repaired_t0;
+ }
+ }
+
+ /* Repeatedly use the error to improve the guess. */
+
+ for (t = t1 = t2 = t0, dst2 = 0;
+ (gt = guess_time_tm (year, yday, hour, min, sec, &t,
+ ranged_convert (convert, &t, &tm)),
+ t != gt);
+ t1 = t2, t2 = t, t = gt, dst2 = tm.tm_isdst != 0)
+ 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 GT - T. Follow the common
+ practice in this case, which is to return a time that is GT - T
+ 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;
+ else if (--remaining_probes == 0)
+ return -1;
+
+ /* We have a match. Check whether tm.tm_isdst has the requested
+ value, if any. */
+ if (isdst != tm.tm_isdst && 0 <= isdst && 0 <= 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)
+ {
+ time_t ot = t + delta * direction;
+ if ((ot < t) == (direction < 0))
+ {
+ struct tm otm;
+ ranged_convert (convert, &ot, &otm);
+ if (otm.tm_isdst == isdst)
+ {
+ /* We found the desired tm_isdst.
+ Extrapolate back to the desired time. */
+ t = guess_time_tm (year, yday, hour, min, sec, &ot, &otm);
+ ranged_convert (convert, &t, &tm);
+ goto offset_found;
+ }
+ }
+ }
+ }
+
+ offset_found:
+ *offset = guessed_offset + t - t0;
+
+ 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. */
+ int sec_adjustment = (sec == 0 && tm.tm_sec == 60) - sec;
+ t1 = t + sec_requested;
+ t2 = t1 + sec_adjustment;
+ if (((t1 < t) != (sec_requested < 0))
+ | ((t2 < t1) != (sec_adjustment < 0))
+ | ! convert (&t2, &tm))
+ return -1;
+ t = t2;
+ }
+
+ *tp = tm;
+ return t;
+}
+
+
+/* FIXME: This should use a signed type wide enough to hold any UTC
+ offset in seconds. 'int' should be good enough for GNU code. We
+ can't fix this unilaterally though, as other modules invoke
+ __mktime_internal. */
+static time_t localtime_offset;
+
+/* Convert *TP to a time_t value. */
+time_t
+mktime (struct tm *tp)
+{
+#ifdef _LIBC
+ /* 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 ();
+#endif
+
+ return __mktime_internal (tp, __localtime_r, &localtime_offset);
+}
+
+#ifdef weak_alias
+weak_alias (mktime, timelocal)
+#endif
+
+#ifdef _LIBC
+libc_hidden_def (mktime)
+libc_hidden_weak (timelocal)
+#endif
+
+#if DEBUG
+
+static int
+not_equal_tm (const struct tm *a, const struct tm *b)
+{
+ return ((a->tm_sec ^ b->tm_sec)
+ | (a->tm_min ^ b->tm_min)
+ | (a->tm_hour ^ b->tm_hour)
+ | (a->tm_mday ^ b->tm_mday)
+ | (a->tm_mon ^ b->tm_mon)
+ | (a->tm_year ^ b->tm_year)
+ | (a->tm_yday ^ b->tm_yday)
+ | (a->tm_isdst ^ b->tm_isdst));
+}
+
+static void
+print_tm (const struct tm *tp)
+{
+ if (tp)
+ printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d",
+ tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday,
+ tp->tm_hour, tp->tm_min, tp->tm_sec,
+ tp->tm_yday, tp->tm_wday, tp->tm_isdst);
+ else
+ printf ("0");
+}
+
+static int
+check_result (time_t tk, struct tm tmk, time_t tl, const struct tm *lt)
+{
+ if (tk != tl || !lt || not_equal_tm (&tmk, lt))
+ {
+ printf ("mktime (");
+ print_tm (lt);
+ printf (")\nyields (");
+ print_tm (&tmk);
+ printf (") == %ld, should be %ld\n", (long int) tk, (long int) tl);
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+ int status = 0;
+ struct tm tm, tmk, tml;
+ struct tm *lt;
+ time_t tk, tl, tl1;
+ char trailer;
+
+ if ((argc == 3 || argc == 4)
+ && (sscanf (argv[1], "%d-%d-%d%c",
+ &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer)
+ == 3)
+ && (sscanf (argv[2], "%d:%d:%d%c",
+ &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer)
+ == 3))
+ {
+ tm.tm_year -= TM_YEAR_BASE;
+ tm.tm_mon--;
+ tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
+ tmk = tm;
+ tl = mktime (&tmk);
+ lt = localtime (&tl);
+ if (lt)
+ {
+ tml = *lt;
+ lt = &tml;
+ }
+ printf ("mktime returns %ld == ", (long int) tl);
+ print_tm (&tmk);
+ printf ("\n");
+ status = check_result (tl, tmk, tl, lt);
+ }
+ else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
+ {
+ time_t from = atol (argv[1]);
+ time_t by = atol (argv[2]);
+ time_t to = atol (argv[3]);
+
+ if (argc == 4)
+ for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
+ {
+ lt = localtime (&tl);
+ if (lt)
+ {
+ tmk = tml = *lt;
+ tk = mktime (&tmk);
+ status |= check_result (tk, tmk, tl, &tml);
+ }
+ else
+ {
+ printf ("localtime (%ld) yields 0\n", (long int) tl);
+ status = 1;
+ }
+ tl1 = tl + by;
+ if ((tl1 < tl) != (by < 0))
+ break;
+ }
+ else
+ for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
+ {
+ /* Null benchmark. */
+ lt = localtime (&tl);
+ if (lt)
+ {
+ tmk = tml = *lt;
+ tk = tl;
+ status |= check_result (tk, tmk, tl, &tml);
+ }
+ else
+ {
+ printf ("localtime (%ld) yields 0\n", (long int) tl);
+ status = 1;
+ }
+ tl1 = tl + by;
+ if ((tl1 < tl) != (by < 0))
+ break;
+ }
+ }
+ else
+ printf ("Usage:\
+\t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\
+\t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\
+\t%s FROM BY TO - # Do not test those values (for benchmark).\n",
+ argv[0], argv[0], argv[0]);
+
+ return status;
+}
+
+#endif /* DEBUG */
+
+/*
+Local Variables:
+compile-command: "gcc -DDEBUG -Wall -W -O -g mktime.c -o mktime"
+End:
+*/
diff --git a/lib/modechange.c b/lib/modechange.c
new file mode 100644
index 0000000..e1f7ceb
--- /dev/null
+++ b/lib/modechange.c
@@ -0,0 +1,386 @@
+/* modechange.c -- file mode manipulation
+
+ Copyright (C) 1989, 1990, 1997, 1998, 1999, 2001, 2003, 2004, 2005,
+ 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by David MacKenzie <djm@ai.mit.edu> */
+
+/* The ASCII mode string is compiled into an array of `struct
+ modechange', which can then be applied to each file to be changed.
+ We do this instead of re-parsing the ASCII string for each file
+ because the compiled form requires less computation to use; when
+ changing the mode of many files, this probably results in a
+ performance gain. */
+
+#include <config.h>
+
+#include "modechange.h"
+#include <sys/stat.h>
+#include "stat-macros.h"
+#include "xalloc.h"
+#include <stdlib.h>
+
+/* The traditional octal values corresponding to each mode bit. */
+#define SUID 04000
+#define SGID 02000
+#define SVTX 01000
+#define RUSR 00400
+#define WUSR 00200
+#define XUSR 00100
+#define RGRP 00040
+#define WGRP 00020
+#define XGRP 00010
+#define ROTH 00004
+#define WOTH 00002
+#define XOTH 00001
+#define ALLM 07777 /* all octal mode bits */
+
+/* Convert OCTAL, which uses one of the traditional octal values, to
+ an internal mode_t value. */
+static mode_t
+octal_to_mode (unsigned int octal)
+{
+ /* Help the compiler optimize the usual case where mode_t uses
+ the traditional octal representation. */
+ return ((S_ISUID == SUID && S_ISGID == SGID && S_ISVTX == SVTX
+ && S_IRUSR == RUSR && S_IWUSR == WUSR && S_IXUSR == XUSR
+ && S_IRGRP == RGRP && S_IWGRP == WGRP && S_IXGRP == XGRP
+ && S_IROTH == ROTH && S_IWOTH == WOTH && S_IXOTH == XOTH)
+ ? octal
+ : (mode_t) ((octal & SUID ? S_ISUID : 0)
+ | (octal & SGID ? S_ISGID : 0)
+ | (octal & SVTX ? S_ISVTX : 0)
+ | (octal & RUSR ? S_IRUSR : 0)
+ | (octal & WUSR ? S_IWUSR : 0)
+ | (octal & XUSR ? S_IXUSR : 0)
+ | (octal & RGRP ? S_IRGRP : 0)
+ | (octal & WGRP ? S_IWGRP : 0)
+ | (octal & XGRP ? S_IXGRP : 0)
+ | (octal & ROTH ? S_IROTH : 0)
+ | (octal & WOTH ? S_IWOTH : 0)
+ | (octal & XOTH ? S_IXOTH : 0)));
+}
+
+/* Special operations flags. */
+enum
+ {
+ /* For the sentinel at the end of the mode changes array. */
+ MODE_DONE,
+
+ /* The typical case. */
+ MODE_ORDINARY_CHANGE,
+
+ /* In addition to the typical case, affect the execute bits if at
+ least one execute bit is set already, or if the file is a
+ directory. */
+ MODE_X_IF_ANY_X,
+
+ /* Instead of the typical case, copy some existing permissions for
+ u, g, or o onto the other two. Which of u, g, or o is copied
+ is determined by which bits are set in the `value' field. */
+ MODE_COPY_EXISTING
+ };
+
+/* Description of a mode change. */
+struct mode_change
+{
+ char op; /* One of "=+-". */
+ char flag; /* Special operations flag. */
+ mode_t affected; /* Set for u, g, o, or a. */
+ mode_t value; /* Bits to add/remove. */
+ mode_t mentioned; /* Bits explicitly mentioned. */
+};
+
+/* Return a mode_change array with the specified `=ddd'-style
+ mode change operation, where NEW_MODE is `ddd' and MENTIONED
+ contains the bits explicitly mentioned in the mode are MENTIONED. */
+
+static struct mode_change *
+make_node_op_equals (mode_t new_mode, mode_t mentioned)
+{
+ struct mode_change *p = xmalloc (2 * sizeof *p);
+ p->op = '=';
+ p->flag = MODE_ORDINARY_CHANGE;
+ p->affected = CHMOD_MODE_BITS;
+ p->value = new_mode;
+ p->mentioned = mentioned;
+ p[1].flag = MODE_DONE;
+ return p;
+}
+
+/* Return a pointer to an array of file mode change operations created from
+ MODE_STRING, an ASCII string that contains either an octal number
+ specifying an absolute mode, or symbolic mode change operations with
+ the form:
+ [ugoa...][[+-=][rwxXstugo...]...][,...]
+
+ Return NULL if `mode_string' does not contain a valid
+ representation of file mode change operations. */
+
+struct mode_change *
+mode_compile (char const *mode_string)
+{
+ /* The array of mode-change directives to be returned. */
+ struct mode_change *mc;
+ size_t used = 0;
+
+ if ('0' <= *mode_string && *mode_string < '8')
+ {
+ unsigned int octal_mode = 0;
+ mode_t mode;
+ mode_t mentioned;
+
+ do
+ {
+ octal_mode = 8 * octal_mode + *mode_string++ - '0';
+ if (ALLM < octal_mode)
+ return NULL;
+ }
+ while ('0' <= *mode_string && *mode_string < '8');
+
+ if (*mode_string)
+ return NULL;
+
+ mode = octal_to_mode (octal_mode);
+ mentioned = (mode & (S_ISUID | S_ISGID)) | S_ISVTX | S_IRWXUGO;
+ return make_node_op_equals (mode, mentioned);
+ }
+
+ /* Allocate enough space to hold the result. */
+ {
+ size_t needed = 1;
+ char const *p;
+ for (p = mode_string; *p; p++)
+ needed += (*p == '=' || *p == '+' || *p == '-');
+ mc = xnmalloc (needed, sizeof *mc);
+ }
+
+ /* One loop iteration for each `[ugoa]*([-+=]([rwxXst]*|[ugo]))+'. */
+ for (;; mode_string++)
+ {
+ /* Which bits in the mode are operated on. */
+ mode_t affected = 0;
+
+ /* Turn on all the bits in `affected' for each group given. */
+ for (;; mode_string++)
+ switch (*mode_string)
+ {
+ default:
+ goto invalid;
+ case 'u':
+ affected |= S_ISUID | S_IRWXU;
+ break;
+ case 'g':
+ affected |= S_ISGID | S_IRWXG;
+ break;
+ case 'o':
+ affected |= S_ISVTX | S_IRWXO;
+ break;
+ case 'a':
+ affected |= CHMOD_MODE_BITS;
+ break;
+ case '=': case '+': case '-':
+ goto no_more_affected;
+ }
+ no_more_affected:;
+
+ do
+ {
+ char op = *mode_string++;
+ mode_t value;
+ char flag = MODE_COPY_EXISTING;
+ struct mode_change *change;
+
+ switch (*mode_string++)
+ {
+ case 'u':
+ /* Set the affected bits to the value of the `u' bits
+ on the same file. */
+ value = S_IRWXU;
+ break;
+ case 'g':
+ /* Set the affected bits to the value of the `g' bits
+ on the same file. */
+ value = S_IRWXG;
+ break;
+ case 'o':
+ /* Set the affected bits to the value of the `o' bits
+ on the same file. */
+ value = S_IRWXO;
+ break;
+
+ default:
+ value = 0;
+ flag = MODE_ORDINARY_CHANGE;
+
+ for (mode_string--;; mode_string++)
+ switch (*mode_string)
+ {
+ case 'r':
+ value |= S_IRUSR | S_IRGRP | S_IROTH;
+ break;
+ case 'w':
+ value |= S_IWUSR | S_IWGRP | S_IWOTH;
+ break;
+ case 'x':
+ value |= S_IXUSR | S_IXGRP | S_IXOTH;
+ break;
+ case 'X':
+ flag = MODE_X_IF_ANY_X;
+ break;
+ case 's':
+ /* Set the setuid/gid bits if `u' or `g' is selected. */
+ value |= S_ISUID | S_ISGID;
+ break;
+ case 't':
+ /* Set the "save text image" bit if `o' is selected. */
+ value |= S_ISVTX;
+ break;
+ default:
+ goto no_more_values;
+ }
+ no_more_values:;
+ }
+
+ change = &mc[used++];
+ change->op = op;
+ change->flag = flag;
+ change->affected = affected;
+ change->value = value;
+ change->mentioned = (affected ? affected & value : value);
+ }
+ while (*mode_string == '=' || *mode_string == '+'
+ || *mode_string == '-');
+
+ if (*mode_string != ',')
+ break;
+ }
+
+ if (*mode_string == 0)
+ {
+ mc[used].flag = MODE_DONE;
+ return mc;
+ }
+
+invalid:
+ free (mc);
+ return NULL;
+}
+
+/* Return a file mode change operation that sets permissions to match those
+ of REF_FILE. Return NULL (setting errno) if REF_FILE can't be accessed. */
+
+struct mode_change *
+mode_create_from_ref (const char *ref_file)
+{
+ struct stat ref_stats;
+
+ if (stat (ref_file, &ref_stats) != 0)
+ return NULL;
+ return make_node_op_equals (ref_stats.st_mode, CHMOD_MODE_BITS);
+}
+
+/* Return the file mode bits of OLDMODE (which is the mode of a
+ directory if DIR), assuming the umask is UMASK_VALUE, adjusted as
+ indicated by the list of change operations CHANGES. If DIR, the
+ type 'X' change affects the returned value even if no execute bits
+ were set in OLDMODE, and set user and group ID bits are preserved
+ unless CHANGES mentioned them. If PMODE_BITS is not null, store into
+ *PMODE_BITS a mask denoting file mode bits that are affected by
+ CHANGES.
+
+ The returned value and *PMODE_BITS contain only file mode bits.
+ For example, they have the S_IFMT bits cleared on a standard
+ Unix-like host. */
+
+mode_t
+mode_adjust (mode_t oldmode, bool dir, mode_t umask_value,
+ struct mode_change const *changes, mode_t *pmode_bits)
+{
+ /* The adjusted mode. */
+ mode_t newmode = oldmode & CHMOD_MODE_BITS;
+
+ /* File mode bits that CHANGES cares about. */
+ mode_t mode_bits = 0;
+
+ for (; changes->flag != MODE_DONE; changes++)
+ {
+ mode_t affected = changes->affected;
+ mode_t omit_change =
+ (dir ? S_ISUID | S_ISGID : 0) & ~ changes->mentioned;
+ mode_t value = changes->value;
+
+ switch (changes->flag)
+ {
+ case MODE_ORDINARY_CHANGE:
+ break;
+
+ case MODE_COPY_EXISTING:
+ /* Isolate in `value' the bits in `newmode' to copy. */
+ value &= newmode;
+
+ /* Copy the isolated bits to the other two parts. */
+ value |= ((value & (S_IRUSR | S_IRGRP | S_IROTH)
+ ? S_IRUSR | S_IRGRP | S_IROTH : 0)
+ | (value & (S_IWUSR | S_IWGRP | S_IWOTH)
+ ? S_IWUSR | S_IWGRP | S_IWOTH : 0)
+ | (value & (S_IXUSR | S_IXGRP | S_IXOTH)
+ ? S_IXUSR | S_IXGRP | S_IXOTH : 0));
+ break;
+
+ case MODE_X_IF_ANY_X:
+ /* Affect the execute bits if execute bits are already set
+ or if the file is a directory. */
+ if ((newmode & (S_IXUSR | S_IXGRP | S_IXOTH)) | dir)
+ value |= S_IXUSR | S_IXGRP | S_IXOTH;
+ break;
+ }
+
+ /* If WHO was specified, limit the change to the affected bits.
+ Otherwise, apply the umask. Either way, omit changes as
+ requested. */
+ value &= (affected ? affected : ~umask_value) & ~ omit_change;
+
+ switch (changes->op)
+ {
+ case '=':
+ /* If WHO was specified, preserve the previous values of
+ bits that are not affected by this change operation.
+ Otherwise, clear all the bits. */
+ {
+ mode_t preserved = (affected ? ~affected : 0) | omit_change;
+ mode_bits |= CHMOD_MODE_BITS & ~preserved;
+ newmode = (newmode & preserved) | value;
+ break;
+ }
+
+ case '+':
+ mode_bits |= value;
+ newmode |= value;
+ break;
+
+ case '-':
+ mode_bits |= value;
+ newmode &= ~value;
+ break;
+ }
+ }
+
+ if (pmode_bits)
+ *pmode_bits = mode_bits;
+ return newmode;
+}
diff --git a/lib/modechange.h b/lib/modechange.h
new file mode 100644
index 0000000..76e0178
--- /dev/null
+++ b/lib/modechange.h
@@ -0,0 +1,31 @@
+/* modechange.h -- definitions for file mode manipulation
+
+ Copyright (C) 1989, 1990, 1997, 2003, 2004, 2005, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if ! defined MODECHANGE_H_
+# define MODECHANGE_H_
+
+# include <stdbool.h>
+# include <sys/types.h>
+
+struct mode_change *mode_compile (const char *);
+struct mode_change *mode_create_from_ref (const char *);
+mode_t mode_adjust (mode_t, bool, mode_t, struct mode_change const *,
+ mode_t *);
+
+#endif
diff --git a/lib/obstack.c b/lib/obstack.c
new file mode 100644
index 0000000..5cd0b7a
--- /dev/null
+++ b/lib/obstack.c
@@ -0,0 +1,431 @@
+/* obstack.c - subroutines used implicitly by object stack macros
+
+ Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997,
+ 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef _LIBC
+# include <obstack.h>
+# include <shlib-compat.h>
+#else
+# include <config.h>
+# include "obstack.h"
+#endif
+
+/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
+ incremented whenever callers compiled using an old obstack.h can no
+ longer properly call the functions in this obstack.c. */
+#define OBSTACK_INTERFACE_VERSION 1
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself, and the installed library
+ supports the same library interface we do. This code is part of the GNU
+ C Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object
+ files, it is simpler to just do this in the source for each such file. */
+
+#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */
+#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
+# include <gnu-versions.h>
+# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
+# define ELIDE_CODE
+# endif
+#endif
+
+#include <stddef.h>
+
+#ifndef ELIDE_CODE
+
+# include <stdint.h>
+
+/* Determine default alignment. */
+union fooround
+{
+ uintmax_t i;
+ long double d;
+ void *p;
+};
+struct fooalign
+{
+ char c;
+ union fooround u;
+};
+/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
+ But in fact it might be less smart and round addresses to as much as
+ DEFAULT_ROUNDING. So we prepare for it to do that. */
+enum
+ {
+ DEFAULT_ALIGNMENT = offsetof (struct fooalign, u),
+ DEFAULT_ROUNDING = sizeof (union fooround)
+ };
+
+/* When we copy a long block of data, this is the unit to do it with.
+ On some machines, copying successive ints does not work;
+ in such a case, redefine COPYING_UNIT to `long' (if that works)
+ or `char' as a last resort. */
+# ifndef COPYING_UNIT
+# define COPYING_UNIT int
+# endif
+
+
+/* The functions allocating more room by calling `obstack_chunk_alloc'
+ jump to the handler pointed to by `obstack_alloc_failed_handler'.
+ This can be set to a user defined function which should either
+ abort gracefully or use longjump - but shouldn't return. This
+ variable by default points to the internal function
+ `print_and_abort'. */
+static void print_and_abort (void);
+void (*obstack_alloc_failed_handler) (void) = print_and_abort;
+
+/* Exit value used when `print_and_abort' is used. */
+# include <stdlib.h>
+# ifdef _LIBC
+int obstack_exit_failure = EXIT_FAILURE;
+# else
+# include "exitfail.h"
+# define obstack_exit_failure exit_failure
+# endif
+
+# ifdef _LIBC
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+/* A looong time ago (before 1994, anyway; we're not sure) this global variable
+ was used by non-GNU-C macros to avoid multiple evaluation. The GNU C
+ library still exports it because somebody might use it. */
+struct obstack *_obstack_compat;
+compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0);
+# endif
+# endif
+
+/* Define a macro that either calls functions with the traditional malloc/free
+ calling interface, or calls functions with the mmalloc/mfree interface
+ (that adds an extra first argument), based on the state of use_extra_arg.
+ For free, do not use ?:, since some compilers, like the MIPS compilers,
+ do not allow (expr) ? void : void. */
+
+# define CALL_CHUNKFUN(h, size) \
+ (((h) -> use_extra_arg) \
+ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
+ : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
+
+# define CALL_FREEFUN(h, old_chunk) \
+ do { \
+ if ((h) -> use_extra_arg) \
+ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
+ else \
+ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
+ } while (0)
+
+
+/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
+ Objects start on multiples of ALIGNMENT (0 means use default).
+ CHUNKFUN is the function to use to allocate chunks,
+ and FREEFUN the function to free them.
+
+ Return nonzero if successful, calls obstack_alloc_failed_handler if
+ allocation fails. */
+
+int
+_obstack_begin (struct obstack *h,
+ int size, int alignment,
+ void *(*chunkfun) (long),
+ void (*freefun) (void *))
+{
+ register struct _obstack_chunk *chunk; /* points to new chunk */
+
+ if (alignment == 0)
+ alignment = DEFAULT_ALIGNMENT;
+ if (size == 0)
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ {
+ /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
+
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
+ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
+ size = 4096 - extra;
+ }
+
+ h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
+ h->chunk_size = size;
+ h->alignment_mask = alignment - 1;
+ h->use_extra_arg = 0;
+
+ chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
+ if (!chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+ alignment - 1);
+ h->chunk_limit = chunk->limit
+ = (char *) chunk + h->chunk_size;
+ chunk->prev = 0;
+ /* The initial chunk now contains no empty object. */
+ h->maybe_empty_object = 0;
+ h->alloc_failed = 0;
+ return 1;
+}
+
+int
+_obstack_begin_1 (struct obstack *h, int size, int alignment,
+ void *(*chunkfun) (void *, long),
+ void (*freefun) (void *, void *),
+ void *arg)
+{
+ register struct _obstack_chunk *chunk; /* points to new chunk */
+
+ if (alignment == 0)
+ alignment = DEFAULT_ALIGNMENT;
+ if (size == 0)
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ {
+ /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
+
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
+ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
+ size = 4096 - extra;
+ }
+
+ h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
+ h->chunk_size = size;
+ h->alignment_mask = alignment - 1;
+ h->extra_arg = arg;
+ h->use_extra_arg = 1;
+
+ chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
+ if (!chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+ alignment - 1);
+ h->chunk_limit = chunk->limit
+ = (char *) chunk + h->chunk_size;
+ chunk->prev = 0;
+ /* The initial chunk now contains no empty object. */
+ h->maybe_empty_object = 0;
+ h->alloc_failed = 0;
+ return 1;
+}
+
+/* Allocate a new current chunk for the obstack *H
+ on the assumption that LENGTH bytes need to be added
+ to the current object, or a new object of length LENGTH allocated.
+ Copies any partial object from the end of the old chunk
+ to the beginning of the new one. */
+
+void
+_obstack_newchunk (struct obstack *h, int length)
+{
+ register struct _obstack_chunk *old_chunk = h->chunk;
+ register struct _obstack_chunk *new_chunk;
+ register long new_size;
+ register long obj_size = h->next_free - h->object_base;
+ register long i;
+ long already;
+ char *object_base;
+
+ /* Compute size for new chunk. */
+ new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100;
+ if (new_size < h->chunk_size)
+ new_size = h->chunk_size;
+
+ /* Allocate and initialize the new chunk. */
+ new_chunk = CALL_CHUNKFUN (h, new_size);
+ if (!new_chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->chunk = new_chunk;
+ new_chunk->prev = old_chunk;
+ new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
+
+ /* Compute an aligned object_base in the new chunk */
+ object_base =
+ __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask);
+
+ /* Move the existing object to the new chunk.
+ Word at a time is fast and is safe if the object
+ is sufficiently aligned. */
+ if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
+ {
+ for (i = obj_size / sizeof (COPYING_UNIT) - 1;
+ i >= 0; i--)
+ ((COPYING_UNIT *)object_base)[i]
+ = ((COPYING_UNIT *)h->object_base)[i];
+ /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT,
+ but that can cross a page boundary on a machine
+ which does not do strict alignment for COPYING_UNITS. */
+ already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
+ }
+ else
+ already = 0;
+ /* Copy remaining bytes one by one. */
+ for (i = already; i < obj_size; i++)
+ object_base[i] = h->object_base[i];
+
+ /* If the object just copied was the only data in OLD_CHUNK,
+ free that chunk and remove it from the chain.
+ But not if that chunk might contain an empty object. */
+ if (! h->maybe_empty_object
+ && (h->object_base
+ == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents,
+ h->alignment_mask)))
+ {
+ new_chunk->prev = old_chunk->prev;
+ CALL_FREEFUN (h, old_chunk);
+ }
+
+ h->object_base = object_base;
+ h->next_free = h->object_base + obj_size;
+ /* The new chunk certainly contains no empty object yet. */
+ h->maybe_empty_object = 0;
+}
+# ifdef _LIBC
+libc_hidden_def (_obstack_newchunk)
+# endif
+
+/* Return nonzero if object OBJ has been allocated from obstack H.
+ This is here for debugging.
+ If you use it in a program, you are probably losing. */
+
+/* Suppress -Wmissing-prototypes warning. We don't want to declare this in
+ obstack.h because it is just for debugging. */
+int _obstack_allocated_p (struct obstack *h, void *obj);
+
+int
+_obstack_allocated_p (struct obstack *h, void *obj)
+{
+ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
+ register struct _obstack_chunk *plp; /* point to previous chunk if any */
+
+ lp = (h)->chunk;
+ /* We use >= rather than > since the object cannot be exactly at
+ the beginning of the chunk but might be an empty object exactly
+ at the end of an adjacent chunk. */
+ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
+ {
+ plp = lp->prev;
+ lp = plp;
+ }
+ return lp != 0;
+}
+
+/* Free objects in obstack H, including OBJ and everything allocate
+ more recently than OBJ. If OBJ is zero, free everything in H. */
+
+# undef obstack_free
+
+void
+__obstack_free (struct obstack *h, void *obj)
+{
+ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
+ register struct _obstack_chunk *plp; /* point to previous chunk if any */
+
+ lp = h->chunk;
+ /* We use >= because there cannot be an object at the beginning of a chunk.
+ But there can be an empty object at that address
+ at the end of another chunk. */
+ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
+ {
+ plp = lp->prev;
+ CALL_FREEFUN (h, lp);
+ lp = plp;
+ /* If we switch chunks, we can't tell whether the new current
+ chunk contains an empty object, so assume that it may. */
+ h->maybe_empty_object = 1;
+ }
+ if (lp)
+ {
+ h->object_base = h->next_free = (char *) (obj);
+ h->chunk_limit = lp->limit;
+ h->chunk = lp;
+ }
+ else if (obj != 0)
+ /* obj is not in any of the chunks! */
+ abort ();
+}
+
+# ifdef _LIBC
+/* Older versions of libc used a function _obstack_free intended to be
+ called by non-GCC compilers. */
+strong_alias (obstack_free, _obstack_free)
+# endif
+
+int
+_obstack_memory_used (struct obstack *h)
+{
+ register struct _obstack_chunk* lp;
+ register int nbytes = 0;
+
+ for (lp = h->chunk; lp != 0; lp = lp->prev)
+ {
+ nbytes += lp->limit - (char *) lp;
+ }
+ return nbytes;
+}
+
+/* Define the error handler. */
+# ifdef _LIBC
+# include <libintl.h>
+# else
+# include "gettext.h"
+# endif
+# ifndef _
+# define _(msgid) gettext (msgid)
+# endif
+
+# ifdef _LIBC
+# include <libio/iolibio.h>
+# endif
+
+# ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
+# define __attribute__(Spec) /* empty */
+# endif
+# endif
+
+static void
+__attribute__ ((noreturn))
+print_and_abort (void)
+{
+ /* Don't change any of these strings. Yes, it would be possible to add
+ the newline to the string and use fputs or so. But this must not
+ happen because the "memory exhausted" message appears in other places
+ like this and the translation should be reused instead of creating
+ a very similar string which requires a separate translation. */
+# ifdef _LIBC
+ (void) __fxprintf (NULL, "%s\n", _("memory exhausted"));
+# else
+ fprintf (stderr, "%s\n", _("memory exhausted"));
+# endif
+ exit (obstack_exit_failure);
+}
+
+#endif /* !ELIDE_CODE */
diff --git a/lib/obstack.h b/lib/obstack.h
new file mode 100644
index 0000000..3315dfe
--- /dev/null
+++ b/lib/obstack.h
@@ -0,0 +1,513 @@
+/* obstack.h - object stack macros
+ Copyright (C) 1988-1994,1996-1999,2003,2004,2005,2006
+ 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Summary:
+
+All the apparent functions defined here are macros. The idea
+is that you would use these pre-tested macros to solve a
+very specific set of problems, and they would run fast.
+Caution: no side-effects in arguments please!! They may be
+evaluated MANY times!!
+
+These macros operate a stack of objects. Each object starts life
+small, and may grow to maturity. (Consider building a word syllable
+by syllable.) An object can move while it is growing. Once it has
+been "finished" it never changes address again. So the "top of the
+stack" is typically an immature growing object, while the rest of the
+stack is of mature, fixed size and fixed address objects.
+
+These routines grab large chunks of memory, using a function you
+supply, called `obstack_chunk_alloc'. On occasion, they free chunks,
+by calling `obstack_chunk_free'. You must define them and declare
+them before using any obstack macros.
+
+Each independent stack is represented by a `struct obstack'.
+Each of the obstack macros expects a pointer to such a structure
+as the first argument.
+
+One motivation for this package is the problem of growing char strings
+in symbol tables. Unless you are "fascist pig with a read-only mind"
+--Gosper's immortal quote from HAKMEM item 154, out of context--you
+would not like to put any arbitrary upper limit on the length of your
+symbols.
+
+In practice this often means you will build many short symbols and a
+few long symbols. At the time you are reading a symbol you don't know
+how long it is. One traditional method is to read a symbol into a
+buffer, realloc()ating the buffer every time you try to read a symbol
+that is longer than the buffer. This is beaut, but you still will
+want to copy the symbol from the buffer to a more permanent
+symbol-table entry say about half the time.
+
+With obstacks, you can work differently. Use one obstack for all symbol
+names. As you read a symbol, grow the name in the obstack gradually.
+When the name is complete, finalize it. Then, if the symbol exists already,
+free the newly read name.
+
+The way we do this is to take a large chunk, allocating memory from
+low addresses. When you want to build a symbol in the chunk you just
+add chars above the current "high water mark" in the chunk. When you
+have finished adding chars, because you got to the end of the symbol,
+you know how long the chars are, and you can create a new object.
+Mostly the chars will not burst over the highest address of the chunk,
+because you would typically expect a chunk to be (say) 100 times as
+long as an average object.
+
+In case that isn't clear, when we have enough chars to make up
+the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
+so we just point to it where it lies. No moving of chars is
+needed and this is the second win: potentially long strings need
+never be explicitly shuffled. Once an object is formed, it does not
+change its address during its lifetime.
+
+When the chars burst over a chunk boundary, we allocate a larger
+chunk, and then copy the partly formed object from the end of the old
+chunk to the beginning of the new larger chunk. We then carry on
+accreting characters to the end of the object as we normally would.
+
+A special macro is provided to add a single char at a time to a
+growing object. This allows the use of register variables, which
+break the ordinary 'growth' macro.
+
+Summary:
+ We allocate large chunks.
+ We carve out one object at a time from the current chunk.
+ Once carved, an object never moves.
+ We are free to append data of any size to the currently
+ growing object.
+ Exactly one object is growing in an obstack at any one time.
+ You can run one obstack per control block.
+ You may have as many control blocks as you dare.
+ Because of the way we do it, you can `unwind' an obstack
+ back to a previous state. (You may remove objects much
+ as you would with a stack.)
+*/
+
+
+/* Don't do the contents of this file more than once. */
+
+#ifndef _OBSTACK_H
+#define _OBSTACK_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* We need the type of a pointer subtraction. If __PTRDIFF_TYPE__ is
+ defined, as with GNU C, use that; that way we don't pollute the
+ namespace with <stddef.h>'s symbols. Otherwise, include <stddef.h>
+ and use ptrdiff_t. */
+
+#ifdef __PTRDIFF_TYPE__
+# define PTR_INT_TYPE __PTRDIFF_TYPE__
+#else
+# include <stddef.h>
+# define PTR_INT_TYPE ptrdiff_t
+#endif
+
+/* If B is the base of an object addressed by P, return the result of
+ aligning P to the next multiple of A + 1. B and P must be of type
+ char *. A + 1 must be a power of 2. */
+
+#define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A)))
+
+/* Similiar to _BPTR_ALIGN (B, P, A), except optimize the common case
+ where pointers can be converted to integers, aligned as integers,
+ and converted back again. If PTR_INT_TYPE is narrower than a
+ pointer (e.g., the AS/400), play it safe and compute the alignment
+ relative to B. Otherwise, use the faster strategy of computing the
+ alignment relative to 0. */
+
+#define __PTR_ALIGN(B, P, A) \
+ __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \
+ P, A)
+
+#include <string.h>
+
+struct _obstack_chunk /* Lives at front of each chunk. */
+{
+ char *limit; /* 1 past end of this chunk */
+ struct _obstack_chunk *prev; /* address of prior chunk or NULL */
+ char contents[4]; /* objects begin here */
+};
+
+struct obstack /* control current object in current chunk */
+{
+ long chunk_size; /* preferred size to allocate chunks in */
+ struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
+ char *object_base; /* address of object we are building */
+ char *next_free; /* where to add next char to current object */
+ char *chunk_limit; /* address of char after current chunk */
+ union
+ {
+ PTR_INT_TYPE tempint;
+ void *tempptr;
+ } temp; /* Temporary for some macros. */
+ int alignment_mask; /* Mask of alignment for each object. */
+ /* These prototypes vary based on `use_extra_arg', and we use
+ casts to the prototypeless function type in all assignments,
+ but having prototypes here quiets -Wstrict-prototypes. */
+ struct _obstack_chunk *(*chunkfun) (void *, long);
+ void (*freefun) (void *, struct _obstack_chunk *);
+ void *extra_arg; /* first arg for chunk alloc/dealloc funcs */
+ unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */
+ unsigned maybe_empty_object:1;/* There is a possibility that the current
+ chunk contains a zero-length object. This
+ prevents freeing the chunk if we allocate
+ a bigger chunk to replace it. */
+ unsigned alloc_failed:1; /* No longer used, as we now call the failed
+ handler on error, but retained for binary
+ compatibility. */
+};
+
+/* Declare the external functions we use; they are in obstack.c. */
+
+extern void _obstack_newchunk (struct obstack *, int);
+extern int _obstack_begin (struct obstack *, int, int,
+ void *(*) (long), void (*) (void *));
+extern int _obstack_begin_1 (struct obstack *, int, int,
+ void *(*) (void *, long),
+ void (*) (void *, void *), void *);
+extern int _obstack_memory_used (struct obstack *);
+
+/* The default name of the function for freeing a chunk is 'obstack_free',
+ but gnulib users can override this by defining '__obstack_free'. */
+#ifndef __obstack_free
+# define __obstack_free obstack_free
+#endif
+extern void __obstack_free (struct obstack *obstack, void *block);
+
+
+/* Error handler called when `obstack_chunk_alloc' failed to allocate
+ more memory. This can be set to a user defined function which
+ should either abort gracefully or use longjump - but shouldn't
+ return. The default action is to print a message and abort. */
+extern void (*obstack_alloc_failed_handler) (void);
+
+/* Exit value used when `print_and_abort' is used. */
+extern int obstack_exit_failure;
+
+/* Pointer to beginning of object being allocated or to be allocated next.
+ Note that this might not be the final address of the object
+ because a new chunk might be needed to hold the final size. */
+
+#define obstack_base(h) ((void *) (h)->object_base)
+
+/* Size for allocating ordinary chunks. */
+
+#define obstack_chunk_size(h) ((h)->chunk_size)
+
+/* Pointer to next byte not yet allocated in current chunk. */
+
+#define obstack_next_free(h) ((h)->next_free)
+
+/* Mask specifying low bits that should be clear in address of an object. */
+
+#define obstack_alignment_mask(h) ((h)->alignment_mask)
+
+/* To prevent prototype warnings provide complete argument list. */
+#define obstack_init(h) \
+ _obstack_begin ((h), 0, 0, \
+ (void *(*) (long)) obstack_chunk_alloc, \
+ (void (*) (void *)) obstack_chunk_free)
+
+#define obstack_begin(h, size) \
+ _obstack_begin ((h), (size), 0, \
+ (void *(*) (long)) obstack_chunk_alloc, \
+ (void (*) (void *)) obstack_chunk_free)
+
+#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
+ _obstack_begin ((h), (size), (alignment), \
+ (void *(*) (long)) (chunkfun), \
+ (void (*) (void *)) (freefun))
+
+#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
+ _obstack_begin_1 ((h), (size), (alignment), \
+ (void *(*) (void *, long)) (chunkfun), \
+ (void (*) (void *, void *)) (freefun), (arg))
+
+#define obstack_chunkfun(h, newchunkfun) \
+ ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
+
+#define obstack_freefun(h, newfreefun) \
+ ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
+
+#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar))
+
+#define obstack_blank_fast(h,n) ((h)->next_free += (n))
+
+#define obstack_memory_used(h) _obstack_memory_used (h)
+
+#if defined __GNUC__ && defined __STDC__ && __STDC__
+/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
+ does not implement __extension__. But that compiler doesn't define
+ __GNUC_MINOR__. */
+# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
+# define __extension__
+# endif
+
+/* For GNU C, if not -traditional,
+ we can define these macros to compute all args only once
+ without using a global variable.
+ Also, we can avoid using the `temp' slot, to make faster code. */
+
+# define obstack_object_size(OBSTACK) \
+ __extension__ \
+ ({ struct obstack const *__o = (OBSTACK); \
+ (unsigned) (__o->next_free - __o->object_base); })
+
+# define obstack_room(OBSTACK) \
+ __extension__ \
+ ({ struct obstack const *__o = (OBSTACK); \
+ (unsigned) (__o->chunk_limit - __o->next_free); })
+
+# define obstack_make_room(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->chunk_limit - __o->next_free < __len) \
+ _obstack_newchunk (__o, __len); \
+ (void) 0; })
+
+# define obstack_empty_p(OBSTACK) \
+ __extension__ \
+ ({ struct obstack const *__o = (OBSTACK); \
+ (__o->chunk->prev == 0 \
+ && __o->next_free == __PTR_ALIGN ((char *) __o->chunk, \
+ __o->chunk->contents, \
+ __o->alignment_mask)); })
+
+# define obstack_grow(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->next_free + __len > __o->chunk_limit) \
+ _obstack_newchunk (__o, __len); \
+ memcpy (__o->next_free, where, __len); \
+ __o->next_free += __len; \
+ (void) 0; })
+
+# define obstack_grow0(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->next_free + __len + 1 > __o->chunk_limit) \
+ _obstack_newchunk (__o, __len + 1); \
+ memcpy (__o->next_free, where, __len); \
+ __o->next_free += __len; \
+ *(__o->next_free)++ = 0; \
+ (void) 0; })
+
+# define obstack_1grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + 1 > __o->chunk_limit) \
+ _obstack_newchunk (__o, 1); \
+ obstack_1grow_fast (__o, datum); \
+ (void) 0; })
+
+/* These assume that the obstack alignment is good enough for pointers
+ or ints, and that the data added so far to the current object
+ shares that much alignment. */
+
+# define obstack_ptr_grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + sizeof (void *) > __o->chunk_limit) \
+ _obstack_newchunk (__o, sizeof (void *)); \
+ obstack_ptr_grow_fast (__o, datum); }) \
+
+# define obstack_int_grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + sizeof (int) > __o->chunk_limit) \
+ _obstack_newchunk (__o, sizeof (int)); \
+ obstack_int_grow_fast (__o, datum); })
+
+# define obstack_ptr_grow_fast(OBSTACK,aptr) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ *(const void **) __o1->next_free = (aptr); \
+ __o1->next_free += sizeof (const void *); \
+ (void) 0; })
+
+# define obstack_int_grow_fast(OBSTACK,aint) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ *(int *) __o1->next_free = (aint); \
+ __o1->next_free += sizeof (int); \
+ (void) 0; })
+
+# define obstack_blank(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->chunk_limit - __o->next_free < __len) \
+ _obstack_newchunk (__o, __len); \
+ obstack_blank_fast (__o, __len); \
+ (void) 0; })
+
+# define obstack_alloc(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_blank (__h, (length)); \
+ obstack_finish (__h); })
+
+# define obstack_copy(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+# define obstack_copy0(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow0 (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+/* The local variable is named __o1 to avoid a name conflict
+ when obstack_blank is called. */
+# define obstack_finish(OBSTACK) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ void *__value = (void *) __o1->object_base; \
+ if (__o1->next_free == __value) \
+ __o1->maybe_empty_object = 1; \
+ __o1->next_free \
+ = __PTR_ALIGN (__o1->object_base, __o1->next_free, \
+ __o1->alignment_mask); \
+ if (__o1->next_free - (char *)__o1->chunk \
+ > __o1->chunk_limit - (char *)__o1->chunk) \
+ __o1->next_free = __o1->chunk_limit; \
+ __o1->object_base = __o1->next_free; \
+ __value; })
+
+# define obstack_free(OBSTACK, OBJ) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ void *__obj = (OBJ); \
+ if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \
+ __o->next_free = __o->object_base = (char *)__obj; \
+ else (__obstack_free) (__o, __obj); })
+
+#else /* not __GNUC__ or not __STDC__ */
+
+# define obstack_object_size(h) \
+ (unsigned) ((h)->next_free - (h)->object_base)
+
+# define obstack_room(h) \
+ (unsigned) ((h)->chunk_limit - (h)->next_free)
+
+# define obstack_empty_p(h) \
+ ((h)->chunk->prev == 0 \
+ && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk, \
+ (h)->chunk->contents, \
+ (h)->alignment_mask))
+
+/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
+ so that we can avoid having void expressions
+ in the arms of the conditional expression.
+ Casting the third operand to void was tried before,
+ but some compilers won't accept it. */
+
+# define obstack_make_room(h,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0))
+
+# define obstack_grow(h,where,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \
+ memcpy ((h)->next_free, where, (h)->temp.tempint), \
+ (h)->next_free += (h)->temp.tempint)
+
+# define obstack_grow0(h,where,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0), \
+ memcpy ((h)->next_free, where, (h)->temp.tempint), \
+ (h)->next_free += (h)->temp.tempint, \
+ *((h)->next_free)++ = 0)
+
+# define obstack_1grow(h,datum) \
+( (((h)->next_free + 1 > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), 1), 0) : 0), \
+ obstack_1grow_fast (h, datum))
+
+# define obstack_ptr_grow(h,datum) \
+( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \
+ obstack_ptr_grow_fast (h, datum))
+
+# define obstack_int_grow(h,datum) \
+( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
+ obstack_int_grow_fast (h, datum))
+
+# define obstack_ptr_grow_fast(h,aptr) \
+ (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr))
+
+# define obstack_int_grow_fast(h,aint) \
+ (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint))
+
+# define obstack_blank(h,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \
+ obstack_blank_fast (h, (h)->temp.tempint))
+
+# define obstack_alloc(h,length) \
+ (obstack_blank ((h), (length)), obstack_finish ((h)))
+
+# define obstack_copy(h,where,length) \
+ (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
+
+# define obstack_copy0(h,where,length) \
+ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
+
+# define obstack_finish(h) \
+( ((h)->next_free == (h)->object_base \
+ ? (((h)->maybe_empty_object = 1), 0) \
+ : 0), \
+ (h)->temp.tempptr = (h)->object_base, \
+ (h)->next_free \
+ = __PTR_ALIGN ((h)->object_base, (h)->next_free, \
+ (h)->alignment_mask), \
+ (((h)->next_free - (char *) (h)->chunk \
+ > (h)->chunk_limit - (char *) (h)->chunk) \
+ ? ((h)->next_free = (h)->chunk_limit) : 0), \
+ (h)->object_base = (h)->next_free, \
+ (h)->temp.tempptr)
+
+# define obstack_free(h,obj) \
+( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk, \
+ ((((h)->temp.tempint > 0 \
+ && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk)) \
+ ? (int) ((h)->next_free = (h)->object_base \
+ = (h)->temp.tempint + (char *) (h)->chunk) \
+ : (((__obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0)))
+
+#endif /* not __GNUC__ or not __STDC__ */
+
+#ifdef __cplusplus
+} /* C++ */
+#endif
+
+#endif /* obstack.h */
diff --git a/lib/offtostr.c b/lib/offtostr.c
new file mode 100644
index 0000000..45196e2
--- /dev/null
+++ b/lib/offtostr.c
@@ -0,0 +1,3 @@
+#define inttostr offtostr
+#define inttype off_t
+#include "inttostr.c"
diff --git a/lib/open-safer.c b/lib/open-safer.c
new file mode 100644
index 0000000..04a72eb
--- /dev/null
+++ b/lib/open-safer.c
@@ -0,0 +1,50 @@
+/* Invoke open, but avoid some glitches.
+
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "fcntl-safer.h"
+
+#include <fcntl.h>
+#include <stdarg.h>
+#include "unistd-safer.h"
+
+int
+open_safer (char const *file, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if (flags & O_CREAT)
+ {
+ va_list ap;
+ va_start (ap, flags);
+
+ /* Assume mode_t promotes to int if and only if it is smaller.
+ This assumption isn't guaranteed by the C standard, but we
+ don't know of any real-world counterexamples. */
+ mode = (sizeof (mode_t) < sizeof (int)
+ ? va_arg (ap, int)
+ : va_arg (ap, mode_t));
+
+ va_end (ap);
+ }
+
+ return fd_safer (open (file, flags, mode));
+}
diff --git a/lib/openat-die.c b/lib/openat-die.c
new file mode 100644
index 0000000..7a28570
--- /dev/null
+++ b/lib/openat-die.c
@@ -0,0 +1,51 @@
+/* Report a save- or restore-cwd failure in our openat replacement and then exit.
+
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+void
+openat_save_fail (int errno)
+{
+ error (exit_failure, errno,
+ _("unable to record current working directory"));
+
+ /* The `noreturn' attribute 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 ();
+}
+
+void
+openat_restore_fail (int errno)
+{
+ error (exit_failure, errno,
+ _("failed to return to initial working directory"));
+
+ /* As above. */
+ abort ();
+}
diff --git a/lib/openat-priv.h b/lib/openat-priv.h
new file mode 100644
index 0000000..2d98821
--- /dev/null
+++ b/lib/openat-priv.h
@@ -0,0 +1,55 @@
+/* Internals for openat-like functions.
+
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <errno.h>
+#include <stdlib.h>
+
+#define OPENAT_BUFFER_SIZE 512
+char *openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file);
+
+/* Some systems don't have ENOSYS. */
+#ifndef ENOSYS
+# ifdef ENOTSUP
+# define ENOSYS ENOTSUP
+# else
+/* Some systems don't have ENOTSUP either. */
+# define ENOSYS EINVAL
+# endif
+#endif
+
+/* Some systems don't have EOPNOTSUPP. */
+#ifndef EOPNOTSUPP
+# ifdef ENOTSUP
+# define EOPNOTSUPP ENOTSUP
+# else
+/* Some systems don't have ENOTSUP either. */
+# define EOPNOTSUPP EINVAL
+# endif
+#endif
+
+/* 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 */)
diff --git a/lib/openat-proc.c b/lib/openat-proc.c
new file mode 100644
index 0000000..ff2fff0
--- /dev/null
+++ b/lib/openat-proc.c
@@ -0,0 +1,95 @@
+/* Create /proc/self/fd-related names for subfiles of open directories.
+
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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 <string.h>
+
+#include "dirname.h"
+#include "intprops.h"
+#include "same-inode.h"
+#include "xalloc.h"
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+#define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/%s"
+
+#define PROC_SELF_FD_NAME_SIZE_BOUND(len) \
+ (sizeof PROC_SELF_FD_FORMAT - sizeof "%d%s" \
+ + INT_STRLEN_BOUND (int) + (len) + 1)
+
+
+/* Set BUF to the expansion of PROC_SELF_FD_FORMAT, using FD and FILE
+ respectively for %d and %s. If successful, return BUF if the
+ result fits in BUF, dynamically allocated memory otherwise. But
+ return NULL if /proc is not reliable. */
+char *
+openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)
+{
+ 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_RDONLY);
+ if (proc_self_fd < 0)
+ proc_status = -1;
+ else
+ {
+ struct stat proc_self_fd_dotdot_st;
+ struct stat proc_self_st;
+ char dotdot_buf[PROC_SELF_FD_NAME_SIZE_BOUND (sizeof ".." - 1)];
+ sprintf (dotdot_buf, PROC_SELF_FD_FORMAT, proc_self_fd, "..");
+ proc_status =
+ ((stat (dotdot_buf, &proc_self_fd_dotdot_st) == 0
+ && stat ("/proc/self", &proc_self_st) == 0
+ && SAME_INODE (proc_self_fd_dotdot_st, proc_self_st))
+ ? 1 : -1);
+ close (proc_self_fd);
+ }
+ }
+
+ if (proc_status < 0)
+ return NULL;
+ else
+ {
+ size_t bufsize = PROC_SELF_FD_NAME_SIZE_BOUND (strlen (file));
+ char *result = (bufsize < OPENAT_BUFFER_SIZE ? buf : xmalloc (bufsize));
+ sprintf (result, PROC_SELF_FD_FORMAT, fd, file);
+ return result;
+ }
+}
diff --git a/lib/openat.c b/lib/openat.c
new file mode 100644
index 0000000..cd49654
--- /dev/null
+++ b/lib/openat.c
@@ -0,0 +1,270 @@
+/* provide a replacement openat function
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "openat.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+
+#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "fcntl--.h"
+#include "lchown.h"
+#include "lstat.h"
+#include "openat-priv.h"
+#include "save-cwd.h"
+
+/* Replacement for Solaris' openat function.
+ <http://www.google.com/search?q=openat+site:docs.sun.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);
+
+ /* If mode_t is narrower than int, use the promoted type (int),
+ not mode_t. Use sizeof to guess whether mode_t is narrower;
+ we don't know of any practical counterexamples. */
+ mode = (sizeof (mode_t) < sizeof (int)
+ ? va_arg (arg, int)
+ : va_arg (arg, 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;
+ }
+
+ 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)
+ openat_restore_fail (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_RDONLY);
+
+ 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;
+}
+
+#if !HAVE_FDOPENDIR
+
+/* Replacement for Solaris' function by the same name.
+ <http://www.google.com/search?q=fdopendir+site:docs.sun.com>
+ First, try to simulate it via opendir ("/proc/self/fd/FD"). Failing
+ that, simulate it 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.
+ Otherwise, this function works just like Solaris' fdopendir.
+
+ W A R N I N G:
+ Unlike the other fd-related functions here, this one
+ effectively consumes its FD parameter. The caller should not
+ close or otherwise manipulate FD if this function returns successfully. */
+DIR *
+fdopendir (int fd)
+{
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ DIR *dir;
+
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, ".");
+ if (proc_file)
+ {
+ dir = opendir (proc_file);
+ saved_errno = errno;
+ }
+ else
+ {
+ dir = NULL;
+ saved_errno = EOPNOTSUPP;
+ }
+
+ /* If the syscall fails with an expected errno value, resort to
+ save_cwd/restore_cwd. */
+ if (! dir && EXPECTED_ERRNO (saved_errno))
+ {
+ if (save_cwd (&saved_cwd) != 0)
+ openat_save_fail (errno);
+
+ if (fchdir (fd) != 0)
+ {
+ dir = NULL;
+ saved_errno = errno;
+ }
+ else
+ {
+ dir = opendir (".");
+ saved_errno = errno;
+
+ if (restore_cwd (&saved_cwd) != 0)
+ openat_restore_fail (errno);
+ }
+
+ free_cwd (&saved_cwd);
+ }
+
+ if (dir)
+ close (fd);
+ if (proc_file != buf)
+ free (proc_file);
+ errno = saved_errno;
+ return dir;
+}
+
+#endif
+
+/* Replacement for Solaris' function by the same name.
+ <http://www.google.com/search?q=fstatat+site:docs.sun.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
+#define AT_FUNC_USE_F1_COND flag == 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
+
+/* Replacement for Solaris' function by the same name.
+ <http://www.google.com/search?q=unlinkat+site:docs.sun.com>
+ First, try to simulate it via (unlink|rmdir) ("/proc/self/fd/FD/FILE").
+ Failing that, simulate it via save_cwd/fchdir/(unlink|rmdir)/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' unlinkat. */
+
+#define AT_FUNC_NAME unlinkat
+#define AT_FUNC_F1 rmdir
+#define AT_FUNC_F2 unlink
+#define AT_FUNC_USE_F1_COND flag == AT_REMOVEDIR
+#define AT_FUNC_POST_FILE_PARAM_DECLS , int flag
+#define AT_FUNC_POST_FILE_ARGS /* empty */
+#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
diff --git a/lib/openat.h b/lib/openat.h
new file mode 100644
index 0000000..f8333f0
--- /dev/null
+++ b/lib/openat.h
@@ -0,0 +1,127 @@
+/* provide a replacement openat function
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
+# define __attribute__(x) /* empty */
+# endif
+#endif
+
+#ifndef ATTRIBUTE_NORETURN
+# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+#endif
+
+/* 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
+# define AT_REMOVEDIR 1
+#endif
+
+#ifdef __OPENAT_PREFIX
+
+# undef openat
+# define __OPENAT_CONCAT(x, y) x ## y
+# define __OPENAT_XCONCAT(x, y) __OPENAT_CONCAT (x, y)
+# define __OPENAT_ID(y) __OPENAT_XCONCAT (__OPENAT_PREFIX, y)
+# define openat __OPENAT_ID (openat)
+int openat (int fd, char const *file, int flags, /* mode_t mode */ ...);
+int openat_permissive (int fd, char const *file, int flags, mode_t mode,
+ int *cwd_errno);
+# if ! HAVE_FDOPENDIR
+# define fdopendir __OPENAT_ID (fdopendir)
+# endif
+DIR *fdopendir (int fd);
+# define fstatat __OPENAT_ID (fstatat)
+int fstatat (int fd, char const *file, struct stat *st, int flag);
+# define unlinkat __OPENAT_ID (unlinkat)
+int unlinkat (int fd, char const *file, int flag);
+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
+
+#if HAVE_OPENAT && ! LSTAT_FOLLOWS_SLASHED_SYMLINK
+int rpl_fstatat (int fd, char const *file, struct stat *st, int flag);
+# if !COMPILING_FSTATAT
+# undef fstatat
+# define fstatat rpl_fstatat
+# endif
+#endif
+
+int mkdirat (int fd, char const *file, mode_t mode);
+void openat_restore_fail (int) ATTRIBUTE_NORETURN;
+void openat_save_fail (int) ATTRIBUTE_NORETURN;
+int fchmodat (int fd, char const *file, mode_t mode, int flag);
+int fchownat (int fd, char const *file, uid_t owner, gid_t group, int flag);
+
+/* Using these function names makes application code
+ slightly more readable than it would be with
+ fchownat (..., 0) or fchownat (..., AT_SYMLINK_NOFOLLOW). */
+static inline int
+chownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+ return fchownat (fd, file, owner, group, 0);
+}
+
+static inline int
+lchownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+ return fchownat (fd, file, owner, group, AT_SYMLINK_NOFOLLOW);
+}
+
+static inline int
+chmodat (int fd, char const *file, mode_t mode)
+{
+ return fchmodat (fd, file, mode, 0);
+}
+
+static inline int
+lchmodat (int fd, char const *file, mode_t mode)
+{
+ return fchmodat (fd, file, mode, AT_SYMLINK_NOFOLLOW);
+}
diff --git a/lib/pathmax.h b/lib/pathmax.h
new file mode 100644
index 0000000..6941e45
--- /dev/null
+++ b/lib/pathmax.h
@@ -0,0 +1,47 @@
+/* Define PATH_MAX somehow. Requires sys/types.h.
+ Copyright (C) 1992, 1999, 2001, 2003, 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _PATHMAX_H
+# define _PATHMAX_H
+
+# include <unistd.h>
+
+# include <limits.h>
+
+# ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 256
+# endif
+
+# if !defined PATH_MAX && defined _PC_PATH_MAX
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \
+ : pathconf ("/", _PC_PATH_MAX))
+# endif
+
+/* Don't include sys/param.h if it already has been. */
+# if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+# endif
+
+# if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# endif
+
+# ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+# endif
+
+#endif /* _PATHMAX_H */
diff --git a/lib/paxerror.c b/lib/paxerror.c
new file mode 100644
index 0000000..000d9e4
--- /dev/null
+++ b/lib/paxerror.c
@@ -0,0 +1,365 @@
+/* Miscellaneous error functions
+
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <paxlib.h>
+#include <quote.h>
+#include <quotearg.h>
+
+/* Decode MODE from its binary form in a stat structure, and encode it
+ into a 9-byte string STRING, terminated with a NUL. */
+
+void
+pax_decode_mode (mode_t mode, char *string)
+{
+ *string++ = mode & S_IRUSR ? 'r' : '-';
+ *string++ = mode & S_IWUSR ? 'w' : '-';
+ *string++ = (mode & S_ISUID
+ ? (mode & S_IXUSR ? 's' : 'S')
+ : (mode & S_IXUSR ? 'x' : '-'));
+ *string++ = mode & S_IRGRP ? 'r' : '-';
+ *string++ = mode & S_IWGRP ? 'w' : '-';
+ *string++ = (mode & S_ISGID
+ ? (mode & S_IXGRP ? 's' : 'S')
+ : (mode & S_IXGRP ? 'x' : '-'));
+ *string++ = mode & S_IROTH ? 'r' : '-';
+ *string++ = mode & S_IWOTH ? 'w' : '-';
+ *string++ = (mode & S_ISVTX
+ ? (mode & S_IXOTH ? 't' : 'T')
+ : (mode & S_IXOTH ? 'x' : '-'));
+ *string = '\0';
+}
+
+/* Report an error associated with the system call CALL and the
+ optional name NAME. */
+void
+call_arg_error (char const *call, char const *name)
+{
+ int e = errno;
+ /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+ Directly translating this to another language will not work, first because
+ %s itself is not translated.
+ Translate it as `%s: Function %s failed'. */
+ ERROR ((0, e, _("%s: Cannot %s"), quotearg_colon (name), call));
+}
+
+/* Report a fatal error associated with the system call CALL and
+ the optional file name NAME. */
+void
+call_arg_fatal (char const *call, char const *name)
+{
+ int e = errno;
+ /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+ Directly translating this to another language will not work, first because
+ %s itself is not translated.
+ Translate it as `%s: Function %s failed'. */
+ FATAL_ERROR ((0, e, _("%s: Cannot %s"), quotearg_colon (name), call));
+}
+
+/* Report a warning associated with the system call CALL and
+ the optional file name NAME. */
+void
+call_arg_warn (char const *call, char const *name)
+{
+ int e = errno;
+ /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+ Directly translating this to another language will not work, first because
+ %s itself is not translated.
+ Translate it as `%s: Function %s failed'. */
+ WARN ((0, e, _("%s: Warning: Cannot %s"), quotearg_colon (name), call));
+}
+
+void
+chmod_error_details (char const *name, mode_t mode)
+{
+ int e = errno;
+ char buf[10];
+ pax_decode_mode (mode, buf);
+ ERROR ((0, e, _("%s: Cannot change mode to %s"),
+ quotearg_colon (name), buf));
+}
+
+void
+chown_error_details (char const *name, uid_t uid, gid_t gid)
+{
+ int e = errno;
+ ERROR ((0, e, _("%s: Cannot change ownership to uid %lu, gid %lu"),
+ quotearg_colon (name), (unsigned long) uid, (unsigned long) gid));
+}
+
+void
+close_error (char const *name)
+{
+ call_arg_error ("close", name);
+}
+
+void
+close_warn (char const *name)
+{
+ call_arg_warn ("close", name);
+}
+
+void
+exec_fatal (char const *name)
+{
+ call_arg_fatal ("exec", name);
+}
+
+void
+link_error (char const *target, char const *source)
+{
+ int e = errno;
+ ERROR ((0, e, _("%s: Cannot hard link to %s"),
+ quotearg_colon (source), quote_n (1, target)));
+}
+
+void
+mkdir_error (char const *name)
+{
+ call_arg_error ("mkdir", name);
+}
+
+void
+mkfifo_error (char const *name)
+{
+ call_arg_error ("mkfifo", name);
+}
+
+void
+mknod_error (char const *name)
+{
+ call_arg_error ("mknod", name);
+}
+
+void
+open_error (char const *name)
+{
+ call_arg_error ("open", name);
+}
+
+void
+open_fatal (char const *name)
+{
+ call_arg_fatal ("open", name);
+}
+
+void
+open_warn (char const *name)
+{
+ call_arg_warn ("open", name);
+}
+
+void
+read_error (char const *name)
+{
+ call_arg_error ("read", name);
+}
+
+void
+read_error_details (char const *name, off_t offset, size_t size)
+{
+ char buf[UINTMAX_STRSIZE_BOUND];
+ int e = errno;
+ ERROR ((0, e,
+ ngettext ("%s: Read error at byte %s, while reading %lu byte",
+ "%s: Read error at byte %s, while reading %lu bytes",
+ size),
+ quotearg_colon (name), STRINGIFY_BIGINT (offset, buf),
+ (unsigned long) size));
+}
+
+void
+read_warn_details (char const *name, off_t offset, size_t size)
+{
+ char buf[UINTMAX_STRSIZE_BOUND];
+ int e = errno;
+ WARN ((0, e,
+ ngettext ("%s: Warning: Read error at byte %s, while reading %lu byte",
+ "%s: Warning: Read error at byte %s, while reading %lu bytes",
+ size),
+ quotearg_colon (name), STRINGIFY_BIGINT (offset, buf),
+ (unsigned long) size));
+}
+
+void
+read_fatal (char const *name)
+{
+ call_arg_fatal ("read", name);
+}
+
+void
+read_fatal_details (char const *name, off_t offset, size_t size)
+{
+ char buf[UINTMAX_STRSIZE_BOUND];
+ int e = errno;
+ FATAL_ERROR ((0, e,
+ ngettext ("%s: Read error at byte %s, while reading %lu byte",
+ "%s: Read error at byte %s, while reading %lu bytes",
+ size),
+ quotearg_colon (name), STRINGIFY_BIGINT (offset, buf),
+ (unsigned long) size));
+}
+
+void
+readlink_error (char const *name)
+{
+ call_arg_error ("readlink", name);
+}
+
+void
+readlink_warn (char const *name)
+{
+ call_arg_warn ("readlink", name);
+}
+
+void
+rmdir_error (char const *name)
+{
+ call_arg_error ("rmdir", name);
+}
+
+void
+savedir_error (char const *name)
+{
+ call_arg_error ("savedir", name);
+}
+
+void
+savedir_warn (char const *name)
+{
+ call_arg_warn ("savedir", name);
+}
+
+void
+seek_error (char const *name)
+{
+ call_arg_error ("seek", name);
+}
+
+void
+seek_error_details (char const *name, off_t offset)
+{
+ char buf[UINTMAX_STRSIZE_BOUND];
+ int e = errno;
+ ERROR ((0, e, _("%s: Cannot seek to %s"),
+ quotearg_colon (name),
+ STRINGIFY_BIGINT (offset, buf)));
+}
+
+void
+seek_warn (char const *name)
+{
+ call_arg_warn ("seek", name);
+}
+
+void
+seek_warn_details (char const *name, off_t offset)
+{
+ char buf[UINTMAX_STRSIZE_BOUND];
+ int e = errno;
+ WARN ((0, e, _("%s: Warning: Cannot seek to %s"),
+ quotearg_colon (name),
+ STRINGIFY_BIGINT (offset, buf)));
+}
+
+void
+symlink_error (char const *contents, char const *name)
+{
+ int e = errno;
+ ERROR ((0, e, _("%s: Cannot create symlink to %s"),
+ quotearg_colon (name), quote_n (1, contents)));
+}
+
+void
+stat_fatal (char const *name)
+{
+ call_arg_fatal ("stat", name);
+}
+
+void
+stat_error (char const *name)
+{
+ call_arg_error ("stat", name);
+}
+
+void
+stat_warn (char const *name)
+{
+ call_arg_warn ("stat", name);
+}
+
+void
+truncate_error (char const *name)
+{
+ call_arg_error ("truncate", name);
+}
+
+void
+truncate_warn (char const *name)
+{
+ call_arg_warn ("truncate", name);
+}
+
+void
+unlink_error (char const *name)
+{
+ call_arg_error ("unlink", name);
+}
+
+void
+utime_error (char const *name)
+{
+ call_arg_error ("utime", name);
+}
+
+void
+waitpid_error (char const *name)
+{
+ call_arg_error ("waitpid", name);
+}
+
+void
+write_error (char const *name)
+{
+ call_arg_error ("write", name);
+}
+
+void
+write_error_details (char const *name, size_t status, size_t size)
+{
+ if (status == 0)
+ write_error (name);
+ else
+ ERROR ((0, 0,
+ ngettext ("%s: Wrote only %lu of %lu byte",
+ "%s: Wrote only %lu of %lu bytes",
+ size),
+ name, (unsigned long int) status, (unsigned long int) size));
+}
+
+void
+write_fatal (char const *name)
+{
+ call_arg_fatal ("write", name);
+}
+
+void
+chdir_fatal (char const *name)
+{
+ call_arg_fatal ("chdir", name);
+}
diff --git a/lib/paxexit.c b/lib/paxexit.c
new file mode 100644
index 0000000..a511f79
--- /dev/null
+++ b/lib/paxexit.c
@@ -0,0 +1,28 @@
+/* Miscellaneous error functions
+
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <paxlib.h>
+
+int exit_status = PAXEXIT_SUCCESS;
+
+void
+pax_exit ()
+{
+ exit (exit_status);
+}
diff --git a/lib/paxlib.h b/lib/paxlib.h
new file mode 100644
index 0000000..381c4c7
--- /dev/null
+++ b/lib/paxlib.h
@@ -0,0 +1,115 @@
+/* This file is part of GNU paxutils
+
+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003,
+ 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _paxlib_h_
+#define _paxlib_h_
+
+#include <hash.h>
+#include <inttostr.h>
+
+/* Error reporting functions and definitions */
+
+/* Exit status for paxutils app. Let's try to keep this list as simple as
+ possible. tar -d option strongly invites a status different for unequal
+ comparison and other errors. */
+#define PAXEXIT_SUCCESS 0
+#define PAXEXIT_DIFFERS 1
+#define PAXEXIT_FAILURE 2
+
+/* Both WARN and ERROR write a message on stderr and continue processing,
+ however ERROR manages so tar will exit unsuccessfully. FATAL_ERROR
+ writes a message on stderr and aborts immediately, with another message
+ line telling so. USAGE_ERROR works like FATAL_ERROR except that the
+ other message line suggests trying --help. All four macros accept a
+ single argument of the form ((0, errno, _("FORMAT"), Args...)). errno
+ is zero when the error is not being detected by the system. */
+
+#define WARN(Args) \
+ error Args
+#define ERROR(Args) \
+ (error Args, exit_status = PAXEXIT_FAILURE)
+#define FATAL_ERROR(Args) \
+ (error Args, fatal_exit ())
+#define USAGE_ERROR(Args) \
+ (error Args, usage (PAXEXIT_FAILURE))
+
+extern int exit_status;
+
+void pax_decode_mode (mode_t mode, char *string);
+void call_arg_error (char const *call, char const *name);
+void call_arg_fatal (char const *call, char const *name) __attribute__ ((noreturn));
+void call_arg_warn (char const *call, char const *name);
+void chmod_error_details (char const *name, mode_t mode);
+void chown_error_details (char const *name, uid_t uid, gid_t gid);
+
+void decode_mode (mode_t, char *);
+
+void chdir_fatal (char const *) __attribute__ ((noreturn));
+void chmod_error_details (char const *, mode_t);
+void chown_error_details (char const *, uid_t, gid_t);
+void close_error (char const *);
+void close_warn (char const *);
+void exec_fatal (char const *) __attribute__ ((noreturn));
+void link_error (char const *, char const *);
+void mkdir_error (char const *);
+void mkfifo_error (char const *);
+void mknod_error (char const *);
+void open_error (char const *);
+void open_fatal (char const *) __attribute__ ((noreturn));
+void open_warn (char const *);
+void read_error (char const *);
+void read_error_details (char const *, off_t, size_t);
+void read_fatal (char const *) __attribute__ ((noreturn));
+void read_fatal_details (char const *, off_t, size_t) __attribute__ ((noreturn));
+void read_warn_details (char const *, off_t, size_t);
+void readlink_error (char const *);
+void readlink_warn (char const *);
+void rmdir_error (char const *);
+void savedir_error (char const *);
+void savedir_warn (char const *);
+void seek_error (char const *);
+void seek_error_details (char const *, off_t);
+void seek_warn (char const *);
+void seek_warn_details (char const *, off_t);
+void stat_fatal (char const *);
+void stat_error (char const *);
+void stat_warn (char const *);
+void symlink_error (char const *, char const *);
+void truncate_error (char const *);
+void truncate_warn (char const *);
+void unlink_error (char const *);
+void utime_error (char const *);
+void waitpid_error (char const *);
+void write_error (char const *);
+
+void pax_exit (void);
+void fatal_exit (void) __attribute__ ((noreturn));
+
+#define STRINGIFY_BIGINT(i, b) umaxtostr (i, b)
+
+
+/* Name-related functions */
+bool hash_string_insert (Hash_table **table, char const *string);
+bool hash_string_lookup (Hash_table const *table, char const *string);
+
+bool removed_prefixes_p (void);
+char *safer_name_suffix (char const *file_name, bool link_target, bool absolute_names);
+
+#endif
diff --git a/lib/paxnames.c b/lib/paxnames.c
new file mode 100644
index 0000000..3ca8bfa
--- /dev/null
+++ b/lib/paxnames.c
@@ -0,0 +1,156 @@
+/* This file is part of GNU paxutils
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <hash.h>
+#include <paxlib.h>
+
+
+/* Hash tables of strings. */
+
+/* Calculate the hash of a string. */
+static size_t
+hash_string_hasher (void const *name, size_t n_buckets)
+{
+ return hash_string (name, n_buckets);
+}
+
+/* Compare two strings for equality. */
+static bool
+hash_string_compare (void const *name1, void const *name2)
+{
+ return strcmp (name1, name2) == 0;
+}
+
+/* Return zero if TABLE contains a copy of STRING; otherwise, insert a
+ copy of STRING to TABLE and return 1. */
+bool
+hash_string_insert (Hash_table **table, char const *string)
+{
+ Hash_table *t = *table;
+ char *s = xstrdup (string);
+ char *e;
+
+ if (! ((t
+ || (*table = t = hash_initialize (0, 0, hash_string_hasher,
+ hash_string_compare, 0)))
+ && (e = hash_insert (t, s))))
+ xalloc_die ();
+
+ if (e == s)
+ return 1;
+ else
+ {
+ free (s);
+ return 0;
+ }
+}
+
+/* Return 1 if TABLE contains STRING. */
+bool
+hash_string_lookup (Hash_table const *table, char const *string)
+{
+ return table && hash_lookup (table, string);
+}
+
+
+static Hash_table *prefix_table[2];
+
+/* Return true if file names of some members in the archive were stripped off
+ their leading components. We could have used
+ return prefix_table[0] || prefix_table[1]
+ but the following seems to be safer: */
+bool
+removed_prefixes_p (void)
+{
+ return (prefix_table[0] && hash_get_n_entries (prefix_table[0]) != 0)
+ || (prefix_table[1] && hash_get_n_entries (prefix_table[1]) != 0);
+}
+
+/* Return a safer suffix of FILE_NAME, or "." if it has no safer
+ suffix. Check for fully specified file names and other atrocities.
+ Warn the user if we do not return NAME. If LINK_TARGET is 1,
+ FILE_NAME is the target of a hard link, not a member name.
+ If ABSOLUTE_NAMES is 0, strip filesystem prefix from the file name. */
+
+char *
+safer_name_suffix (char const *file_name, bool link_target, bool absolute_names)
+{
+ char const *p;
+
+ if (absolute_names)
+ p = file_name;
+ else
+ {
+ /* Skip file system prefixes, leading file name components that contain
+ "..", and leading slashes. */
+
+ size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (file_name);
+
+ for (p = file_name + prefix_len; *p; )
+ {
+ if (p[0] == '.' && p[1] == '.' && (ISSLASH (p[2]) || !p[2]))
+ prefix_len = p + 2 - file_name;
+
+ do
+ {
+ char c = *p++;
+ if (ISSLASH (c))
+ break;
+ }
+ while (*p);
+ }
+
+ for (p = file_name + prefix_len; ISSLASH (*p); p++)
+ continue;
+ prefix_len = p - file_name;
+
+ if (prefix_len)
+ {
+ char *prefix = alloca (prefix_len + 1);
+ memcpy (prefix, file_name, prefix_len);
+ prefix[prefix_len] = '\0';
+
+ if (hash_string_insert (&prefix_table[link_target], prefix))
+ {
+ static char const *const diagnostic[] =
+ {
+ N_("Removing leading `%s' from member names"),
+ N_("Removing leading `%s' from hard link targets")
+ };
+ WARN ((0, 0, _(diagnostic[link_target]), prefix));
+ }
+ }
+ }
+
+ if (! *p)
+ {
+ if (p == file_name)
+ {
+ static char const *const diagnostic[] =
+ {
+ N_("Substituting `.' for empty member name"),
+ N_("Substituting `.' for empty hard link target")
+ };
+ WARN ((0, 0, "%s", _(diagnostic[link_target])));
+ }
+
+ p = ".";
+ }
+
+ return (char *) p;
+}
diff --git a/lib/pipe-safer.c b/lib/pipe-safer.c
new file mode 100644
index 0000000..e4431b3
--- /dev/null
+++ b/lib/pipe-safer.c
@@ -0,0 +1,57 @@
+/* Invoke pipe, but avoid some glitches.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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 HAVE_PIPE
+ if (pipe (fd) == 0)
+ {
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ fd[i] = fd_safer (fd[i]);
+ if (fd[i] < 0)
+ {
+ int e = errno;
+ close (fd[1 - i]);
+ errno = e;
+ return -1;
+ }
+ }
+
+ return 0;
+ }
+#else
+ errno = ENOSYS;
+#endif
+
+ return -1;
+}
diff --git a/lib/prepargs.c b/lib/prepargs.c
new file mode 100644
index 0000000..1b0d9f5
--- /dev/null
+++ b/lib/prepargs.c
@@ -0,0 +1,95 @@
+/* Parse arguments from a string and prepend them to an argv.
+ Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+/* Written by Paul Eggert <eggert@twinsun.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "prepargs.h"
+#include <sys/types.h>
+#include <xalloc.h>
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#include <ctype.h>
+
+/* IN_CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given
+ as an argument to <ctype.h> macros like "isspace". */
+#ifdef STDC_HEADERS
+# define IN_CTYPE_DOMAIN(c) 1
+#else
+# define IN_CTYPE_DOMAIN(c) ((c) <= 0177)
+#endif
+
+#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
+
+/* Find the white-space-separated options specified by OPTIONS, and
+ using BUF to store copies of these options, set ARGV[0], ARGV[1],
+ etc. to the option copies. Return the number N of options found.
+ Do not set ARGV[N]. If ARGV is null, do not store ARGV[0]
+ etc. Backslash can be used to escape whitespace (and backslashes). */
+static int
+prepend_args (char const *options, char *buf, char **argv)
+{
+ char const *o = options;
+ char *b = buf;
+ int n = 0;
+
+ for (;;)
+ {
+ while (ISSPACE ((unsigned char) *o))
+ o++;
+ if (!*o)
+ return n;
+ if (argv)
+ argv[n] = b;
+ n++;
+
+ do
+ if ((*b++ = *o++) == '\\' && *o)
+ b[-1] = *o++;
+ while (*o && ! ISSPACE ((unsigned char) *o));
+
+ *b++ = '\0';
+ }
+}
+
+/* Prepend the whitespace-separated options in OPTIONS to the argument
+ vector of a main program with argument count *PARGC and argument
+ vector *PARGV. */
+void
+prepend_default_options (char const *options, int *pargc, char ***pargv)
+{
+ if (options)
+ {
+ char *buf = xmalloc (strlen (options) + 1);
+ int prepended = prepend_args (options, buf, (char **) 0);
+ int argc = *pargc;
+ char * const *argv = *pargv;
+ char **pp = (char **) xmalloc ((prepended + argc + 1) * sizeof *pp);
+ *pargc = prepended + argc;
+ *pargv = pp;
+ *pp++ = *argv++;
+ pp += prepend_args (options, buf, pp);
+ while ((*pp++ = *argv++))
+ continue;
+ }
+}
diff --git a/lib/prepargs.h b/lib/prepargs.h
new file mode 100644
index 0000000..ce93ea8
--- /dev/null
+++ b/lib/prepargs.h
@@ -0,0 +1,3 @@
+/* Parse arguments from a string and prepend them to an argv. */
+
+void prepend_default_options (char const *, int *, char ***);
diff --git a/lib/printf-args.c b/lib/printf-args.c
new file mode 100644
index 0000000..f039b2d
--- /dev/null
+++ b/lib/printf-args.c
@@ -0,0 +1,139 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2005-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "printf-args.h"
+
+#ifdef STATIC
+STATIC
+#endif
+int
+printf_fetchargs (va_list args, arguments *a)
+{
+ size_t i;
+ argument *ap;
+
+ for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
+ switch (ap->type)
+ {
+ case TYPE_SCHAR:
+ ap->a.a_schar = va_arg (args, /*signed char*/ int);
+ break;
+ case TYPE_UCHAR:
+ ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
+ break;
+ case TYPE_SHORT:
+ ap->a.a_short = va_arg (args, /*short*/ int);
+ break;
+ case TYPE_USHORT:
+ ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
+ break;
+ case TYPE_INT:
+ ap->a.a_int = va_arg (args, int);
+ break;
+ case TYPE_UINT:
+ ap->a.a_uint = va_arg (args, unsigned int);
+ break;
+ case TYPE_LONGINT:
+ ap->a.a_longint = va_arg (args, long int);
+ break;
+ case TYPE_ULONGINT:
+ ap->a.a_ulongint = va_arg (args, unsigned long int);
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_LONGLONGINT:
+ ap->a.a_longlongint = va_arg (args, long long int);
+ break;
+ case TYPE_ULONGLONGINT:
+ ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
+ break;
+#endif
+ case TYPE_DOUBLE:
+ ap->a.a_double = va_arg (args, double);
+ break;
+ case TYPE_LONGDOUBLE:
+ ap->a.a_longdouble = va_arg (args, long double);
+ break;
+ case TYPE_CHAR:
+ ap->a.a_char = va_arg (args, int);
+ break;
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
+ default argument promotions", this is not the case in mingw32,
+ where wint_t is 'unsigned short'. */
+ ap->a.a_wide_char =
+ (sizeof (wint_t) < sizeof (int)
+ ? va_arg (args, int)
+ : va_arg (args, wint_t));
+ break;
+#endif
+ case TYPE_STRING:
+ ap->a.a_string = va_arg (args, const char *);
+ /* A null pointer is an invalid argument for "%s", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_string == NULL)
+ ap->a.a_string = "(NULL)";
+ break;
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ ap->a.a_wide_string = va_arg (args, const wchar_t *);
+ /* A null pointer is an invalid argument for "%ls", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_wide_string == NULL)
+ {
+ static const wchar_t wide_null_string[] =
+ {
+ (wchar_t)'(',
+ (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
+ (wchar_t)')',
+ (wchar_t)0
+ };
+ ap->a.a_wide_string = wide_null_string;
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ ap->a.a_pointer = va_arg (args, void *);
+ break;
+ case TYPE_COUNT_SCHAR_POINTER:
+ ap->a.a_count_schar_pointer = va_arg (args, signed char *);
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ ap->a.a_count_short_pointer = va_arg (args, short *);
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ ap->a.a_count_int_pointer = va_arg (args, int *);
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ ap->a.a_count_longint_pointer = va_arg (args, long int *);
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+ break;
+#endif
+ 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..bcf4470
--- /dev/null
+++ b/lib/printf-args.h
@@ -0,0 +1,132 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2006-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _PRINTF_ARGS_H
+#define _PRINTF_ARGS_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get wchar_t. */
+#if HAVE_WCHAR_T
+# include <stddef.h>
+#endif
+
+/* Get wint_t. */
+#if HAVE_WINT_T
+# include <wchar.h>
+#endif
+
+/* Get va_list. */
+#include <stdarg.h>
+
+
+/* Argument types */
+typedef enum
+{
+ TYPE_NONE,
+ TYPE_SCHAR,
+ TYPE_UCHAR,
+ TYPE_SHORT,
+ TYPE_USHORT,
+ TYPE_INT,
+ TYPE_UINT,
+ TYPE_LONGINT,
+ TYPE_ULONGINT,
+#if HAVE_LONG_LONG_INT
+ TYPE_LONGLONGINT,
+ TYPE_ULONGLONGINT,
+#endif
+ TYPE_DOUBLE,
+ TYPE_LONGDOUBLE,
+ TYPE_CHAR,
+#if HAVE_WINT_T
+ TYPE_WIDE_CHAR,
+#endif
+ TYPE_STRING,
+#if HAVE_WCHAR_T
+ TYPE_WIDE_STRING,
+#endif
+ TYPE_POINTER,
+ TYPE_COUNT_SCHAR_POINTER,
+ TYPE_COUNT_SHORT_POINTER,
+ TYPE_COUNT_INT_POINTER,
+ TYPE_COUNT_LONGINT_POINTER
+#if HAVE_LONG_LONG_INT
+, TYPE_COUNT_LONGLONGINT_POINTER
+#endif
+} arg_type;
+
+/* Polymorphic argument */
+typedef struct
+{
+ arg_type type;
+ union
+ {
+ signed char a_schar;
+ unsigned char a_uchar;
+ short a_short;
+ unsigned short a_ushort;
+ int a_int;
+ unsigned int a_uint;
+ long int a_longint;
+ unsigned long int a_ulongint;
+#if HAVE_LONG_LONG_INT
+ long long int a_longlongint;
+ unsigned long long int a_ulonglongint;
+#endif
+ float a_float;
+ double a_double;
+ long double a_longdouble;
+ int a_char;
+#if HAVE_WINT_T
+ wint_t a_wide_char;
+#endif
+ const char* a_string;
+#if HAVE_WCHAR_T
+ const wchar_t* a_wide_string;
+#endif
+ void* a_pointer;
+ signed char * a_count_schar_pointer;
+ short * a_count_short_pointer;
+ int * a_count_int_pointer;
+ long int * a_count_longint_pointer;
+#if HAVE_LONG_LONG_INT
+ long long int * a_count_longlongint_pointer;
+#endif
+ }
+ a;
+}
+argument;
+
+typedef struct
+{
+ size_t count;
+ argument *arg;
+}
+arguments;
+
+
+/* Fetch the arguments, putting them into a. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int printf_fetchargs (va_list args, arguments *a);
+
+#endif /* _PRINTF_ARGS_H */
diff --git a/lib/printf-parse.c b/lib/printf-parse.c
new file mode 100644
index 0000000..f8e0ced
--- /dev/null
+++ b/lib/printf-parse.c
@@ -0,0 +1,535 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002-2004, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+#else
+# include "printf-parse.h"
+#endif
+
+/* Get size_t, NULL. */
+#include <stddef.h>
+
+/* Get intmax_t. */
+#if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+#endif
+
+/* malloc(), realloc(), free(). */
+#include <stdlib.h>
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#if WIDE_CHAR_VERSION
+# define PRINTF_PARSE wprintf_parse
+# define CHAR_T wchar_t
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+#else
+# define PRINTF_PARSE printf_parse
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
+{
+ const CHAR_T *cp = format; /* pointer into format */
+ size_t arg_posn = 0; /* number of regular arguments consumed */
+ size_t d_allocated; /* allocated elements of d->dir */
+ size_t a_allocated; /* allocated elements of a->arg */
+ size_t max_width_length = 0;
+ size_t max_precision_length = 0;
+
+ d->count = 0;
+ d_allocated = 1;
+ d->dir = malloc (d_allocated * sizeof (DIRECTIVE));
+ if (d->dir == NULL)
+ /* Out of memory. */
+ return -1;
+
+ a->count = 0;
+ a_allocated = 0;
+ a->arg = NULL;
+
+#define REGISTER_ARG(_index_,_type_) \
+ { \
+ size_t n = (_index_); \
+ if (n >= a_allocated) \
+ { \
+ size_t memory_size; \
+ argument *memory; \
+ \
+ a_allocated *= 2; \
+ if (a_allocated <= n) \
+ a_allocated = n + 1; \
+ if (SIZE_MAX / sizeof (argument) < a_allocated) \
+ /* Overflow, would lead to out of memory. */ \
+ goto error; \
+ memory_size = a_allocated * sizeof (argument); \
+ memory = (a->arg \
+ ? realloc (a->arg, memory_size) \
+ : malloc (memory_size)); \
+ if (memory == NULL) \
+ /* Out of memory. */ \
+ goto error; \
+ a->arg = memory; \
+ } \
+ while (a->count <= n) \
+ a->arg[a->count++].type = TYPE_NONE; \
+ if (a->arg[n].type == TYPE_NONE) \
+ a->arg[n].type = (_type_); \
+ else if (a->arg[n].type != (_type_)) \
+ /* Ambiguous type for positional argument. */ \
+ goto error; \
+ }
+
+ while (*cp != '\0')
+ {
+ CHAR_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++)
+ if (n < SIZE_MAX / 10)
+ n = 10 * n + (*np - '0');
+ else
+ /* n too large for memory. */
+ goto error;
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+
+ /* Read the flags. */
+ for (;;)
+ {
+ if (*cp == '\'')
+ {
+ dp->flags |= FLAG_GROUP;
+ cp++;
+ }
+ else if (*cp == '-')
+ {
+ dp->flags |= FLAG_LEFT;
+ cp++;
+ }
+ else if (*cp == '+')
+ {
+ dp->flags |= FLAG_SHOWSIGN;
+ cp++;
+ }
+ else if (*cp == ' ')
+ {
+ dp->flags |= FLAG_SPACE;
+ cp++;
+ }
+ else if (*cp == '#')
+ {
+ dp->flags |= FLAG_ALT;
+ cp++;
+ }
+ else if (*cp == '0')
+ {
+ dp->flags |= FLAG_ZERO;
+ cp++;
+ }
+ else
+ break;
+ }
+
+ /* Parse the field width. */
+ if (*cp == '*')
+ {
+ dp->width_start = cp;
+ cp++;
+ dp->width_end = cp;
+ if (max_width_length < 1)
+ max_width_length = 1;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ if (n < SIZE_MAX / 10)
+ n = 10 * n + (*np - '0');
+ else
+ /* n too large for memory. */
+ goto error;
+ if (n == 0)
+ /* Positional argument 0. */
+ 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++)
+ if (n < SIZE_MAX / 10)
+ n = 10 * n + (*np - '0');
+ else
+ /* n too large for memory. */
+ goto error;
+ if (n == 0)
+ /* Positional argument 0. */
+ 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++;
+ }
+#ifdef HAVE_INTMAX_T
+ else if (*cp == 'j')
+ {
+ if (sizeof (intmax_t) > sizeof (long))
+ {
+ /* intmax_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (intmax_t) > sizeof (int))
+ {
+ /* intmax_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#endif
+ else if (*cp == 'z' || *cp == 'Z')
+ {
+ /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
+ because the warning facility in gcc-2.95.2 understands
+ only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
+ if (sizeof (size_t) > sizeof (long))
+ {
+ /* size_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (size_t) > sizeof (int))
+ {
+ /* size_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 't')
+ {
+ if (sizeof (ptrdiff_t) > sizeof (long))
+ {
+ /* ptrdiff_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (ptrdiff_t) > sizeof (int))
+ {
+ /* ptrdiff_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else
+ break;
+ }
+
+ /* Read the conversion character. */
+ c = *cp++;
+ switch (c)
+ {
+ case 'd': case 'i':
+#ifdef HAVE_LONG_LONG
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGLONGINT;
+ else
+#endif
+ if (flags >= 8)
+ type = TYPE_LONGINT;
+ else if (flags & 2)
+ type = TYPE_SCHAR;
+ else if (flags & 1)
+ type = TYPE_SHORT;
+ else
+ type = TYPE_INT;
+ break;
+ case 'o': case 'u': case 'x': case 'X':
+#ifdef HAVE_LONG_LONG
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_ULONGLONGINT;
+ else
+#endif
+ if (flags >= 8)
+ type = TYPE_ULONGINT;
+ else if (flags & 2)
+ type = TYPE_UCHAR;
+ else if (flags & 1)
+ type = TYPE_USHORT;
+ else
+ type = TYPE_UINT;
+ break;
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+#ifdef HAVE_LONG_DOUBLE
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGDOUBLE;
+ else
+#endif
+ type = TYPE_DOUBLE;
+ break;
+ case 'c':
+ if (flags >= 8)
+#ifdef HAVE_WINT_T
+ type = TYPE_WIDE_CHAR;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_CHAR;
+ break;
+#ifdef HAVE_WINT_T
+ case 'C':
+ type = TYPE_WIDE_CHAR;
+ c = 'c';
+ break;
+#endif
+ case 's':
+ if (flags >= 8)
+#ifdef HAVE_WCHAR_T
+ type = TYPE_WIDE_STRING;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_STRING;
+ break;
+#ifdef HAVE_WCHAR_T
+ case 'S':
+ type = TYPE_WIDE_STRING;
+ c = 's';
+ break;
+#endif
+ case 'p':
+ type = TYPE_POINTER;
+ break;
+ case 'n':
+#ifdef HAVE_LONG_LONG
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_COUNT_LONGLONGINT_POINTER;
+ else
+#endif
+ if (flags >= 8)
+ type = TYPE_COUNT_LONGINT_POINTER;
+ else if (flags & 2)
+ type = TYPE_COUNT_SCHAR_POINTER;
+ else if (flags & 1)
+ type = TYPE_COUNT_SHORT_POINTER;
+ else
+ type = TYPE_COUNT_INT_POINTER;
+ break;
+ case '%':
+ type = TYPE_NONE;
+ break;
+ default:
+ /* Unknown conversion character. */
+ goto error;
+ }
+ }
+
+ if (type != TYPE_NONE)
+ {
+ dp->arg_index = arg_index;
+ if (dp->arg_index == 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)
+ {
+ DIRECTIVE *memory;
+
+ if (SIZE_MAX / (2 * sizeof (DIRECTIVE)) < d_allocated)
+ /* Overflow, would lead to out of memory. */
+ goto error;
+ d_allocated *= 2;
+ memory = realloc (d->dir, d_allocated * sizeof (DIRECTIVE));
+ if (memory == NULL)
+ /* Out of memory. */
+ goto error;
+ d->dir = memory;
+ }
+ }
+ }
+ d->dir[d->count].dir_start = cp;
+
+ d->max_width_length = max_width_length;
+ d->max_precision_length = max_precision_length;
+ return 0;
+
+error:
+ if (a->arg)
+ free (a->arg);
+ if (d->dir)
+ free (d->dir);
+ return -1;
+}
+
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T
+#undef PRINTF_PARSE
diff --git a/lib/printf-parse.h b/lib/printf-parse.h
new file mode 100644
index 0000000..82a0d37
--- /dev/null
+++ b/lib/printf-parse.h
@@ -0,0 +1,74 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _PRINTF_PARSE_H
+#define _PRINTF_PARSE_H
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP 1 /* ' flag */
+#define FLAG_LEFT 2 /* - flag */
+#define FLAG_SHOWSIGN 4 /* + flag */
+#define FLAG_SPACE 8 /* space flag */
+#define FLAG_ALT 16 /* # flag */
+#define FLAG_ZERO 32
+
+/* arg_index value indicating that no argument is consumed. */
+#define ARG_NONE (~(size_t)0)
+
+/* A parsed directive. */
+typedef struct
+{
+ const char* dir_start;
+ const char* dir_end;
+ int flags;
+ const char* width_start;
+ const char* width_end;
+ size_t width_arg_index;
+ const char* precision_start;
+ const char* precision_end;
+ size_t precision_arg_index;
+ char conversion; /* d i o u x X f e E g G c s p n U % but not C S */
+ size_t arg_index;
+}
+char_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ char_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+}
+char_directives;
+
+
+/* Parses the format string. Fills in the number N of directives, and fills
+ in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+ to the end of the format string. Also fills in the arg_type fields of the
+ arguments and the needed count of arguments. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int printf_parse (const char *format, char_directives *d, arguments *a);
+
+#endif /* _PRINTF_PARSE_H */
diff --git a/lib/quote.c b/lib/quote.c
new file mode 100644
index 0000000..119be72
--- /dev/null
+++ b/lib/quote.c
@@ -0,0 +1,41 @@
+/* quote.c - quote arguments for output
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2003, 2005, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#include <config.h>
+
+#include "quotearg.h"
+#include "quote.h"
+
+/* Return an unambiguous printable representation of NAME,
+ allocated in slot N, suitable for diagnostics. */
+char const *
+quote_n (int n, char const *name)
+{
+ return quotearg_n_style (n, locale_quoting_style, name);
+}
+
+/* Return an unambiguous printable representation of NAME,
+ suitable for diagnostics. */
+char const *
+quote (char const *name)
+{
+ return quote_n (0, name);
+}
diff --git a/lib/quote.h b/lib/quote.h
new file mode 100644
index 0000000..5400ead
--- /dev/null
+++ b/lib/quote.h
@@ -0,0 +1,22 @@
+/* quote.h - prototypes for quote.c
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+
+char const *quote_n (int n, char const *name);
+char const *quote (char const *name);
diff --git a/lib/quotearg.c b/lib/quotearg.c
new file mode 100644
index 0000000..f7f326a
--- /dev/null
+++ b/lib/quotearg.c
@@ -0,0 +1,697 @@
+/* quotearg.c - quote arguments for output
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#include <config.h>
+
+#include "quotearg.h"
+
+#include "xalloc.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#if !HAVE_MBRTOWC
+/* Disable multibyte processing entirely. Since MB_CUR_MAX is 1, the
+ other macros are defined only for documentation and to satisfy C
+ syntax. */
+# undef MB_CUR_MAX
+# define MB_CUR_MAX 1
+# undef mbstate_t
+# define mbstate_t int
+# define mbrtowc(pwc, s, n, ps) ((*(pwc) = *(s)) != 0)
+# define iswprint(wc) isprint ((unsigned char) (wc))
+# undef HAVE_MBSINIT
+#endif
+
+#if !defined mbsinit && !HAVE_MBSINIT
+# define mbsinit(ps) 1
+#endif
+
+#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;
+
+ /* 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];
+};
+
+/* Names of quoting styles. */
+char const *const quoting_style_args[] =
+{
+ "literal",
+ "shell",
+ "shell-always",
+ "c",
+ "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,
+ c_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 *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;
+}
+
+/* MSGID approximates a quotation mark. Return its translation if it
+ has one; otherwise, return either it or "\"", depending on S. */
+static char const *
+gettext_quote (char const *msgid, enum quoting_style s)
+{
+ char const *translation = _(msgid);
+ if (translation == msgid && s == clocale_quoting_style)
+ translation = "\"";
+ return translation;
+}
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using QUOTING_STYLE and the
+ non-quoting-style part of O 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 uses QUOTING_STYLE instead of the quoting
+ style specified by O, and O may not be null. */
+
+static size_t
+quotearg_buffer_restyled (char *buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ enum quoting_style quoting_style,
+ struct quoting_options const *o)
+{
+ size_t i;
+ size_t len = 0;
+ char const *quote_string = 0;
+ size_t quote_string_len = 0;
+ bool backslash_escapes = false;
+ bool unibyte_locale = MB_CUR_MAX == 1;
+
+#define STORE(c) \
+ do \
+ { \
+ if (len < buffersize) \
+ buffer[len] = (c); \
+ len++; \
+ } \
+ while (0)
+
+ switch (quoting_style)
+ {
+ case c_quoting_style:
+ STORE ('"');
+ backslash_escapes = true;
+ quote_string = "\"";
+ quote_string_len = 1;
+ break;
+
+ case escape_quoting_style:
+ backslash_escapes = true;
+ break;
+
+ case locale_quoting_style:
+ case clocale_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
+ "'". If the catalog has no translation,
+ locale_quoting_style quotes `like this', and
+ clocale_quoting_style quotes "like this".
+
+ For example, an American English Unicode locale should
+ translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+ should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+ MARK). A British English Unicode locale should instead
+ translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+ U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+
+ If you don't know what to put here, please see
+ <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+ and use glyphs suitable for your language. */
+
+ char const *left = gettext_quote (N_("`"), quoting_style);
+ char const *right = gettext_quote (N_("'"), quoting_style);
+ for (quote_string = left; *quote_string; quote_string++)
+ STORE (*quote_string);
+ backslash_escapes = true;
+ quote_string = right;
+ quote_string_len = strlen (quote_string);
+ }
+ break;
+
+ case shell_always_quoting_style:
+ STORE ('\'');
+ quote_string = "'";
+ quote_string_len = 1;
+ break;
+
+ default:
+ break;
+ }
+
+ for (i = 0; ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize); i++)
+ {
+ unsigned char c;
+ unsigned char esc;
+
+ if (backslash_escapes
+ && quote_string_len
+ && i + quote_string_len <= argsize
+ && memcmp (arg + i, quote_string, quote_string_len) == 0)
+ STORE ('\\');
+
+ c = arg[i];
+ switch (c)
+ {
+ case '\0':
+ if (backslash_escapes)
+ {
+ STORE ('\\');
+ STORE ('0');
+ STORE ('0');
+ c = '0';
+ }
+ break;
+
+ case '?':
+ switch (quoting_style)
+ {
+ case shell_quoting_style:
+ goto use_shell_always_quoting_style;
+
+ case c_quoting_style:
+ if (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. */
+ c = arg[i + 2];
+ i += 2;
+ 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; goto c_and_shell_escape;
+
+ c_and_shell_escape:
+ if (quoting_style == shell_quoting_style)
+ goto use_shell_always_quoting_style;
+ 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;
+ /* Fall through. */
+ case '#': case '~':
+ if (i != 0)
+ break;
+ /* Fall through. */
+ case ' ':
+ 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_quoting_style)
+ goto use_shell_always_quoting_style;
+ break;
+
+ case '\'':
+ switch (quoting_style)
+ {
+ case shell_quoting_style:
+ goto use_shell_always_quoting_style;
+
+ case shell_always_quoting_style:
+ STORE ('\'');
+ STORE ('\\');
+ STORE ('\'');
+ break;
+
+ default:
+ break;
+ }
+ 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. */
+ 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 && quoting_style == shell_quoting_style)
+ {
+ size_t j;
+ for (j = 1; j < bytes; j++)
+ switch (arg[i + m + j])
+ {
+ case '[': case '\\': case '^':
+ case '`': case '|':
+ goto use_shell_always_quoting_style;
+
+ default:
+ break;
+ }
+ }
+
+ if (! iswprint (w))
+ printable = false;
+ m += bytes;
+ }
+ }
+ while (! mbsinit (&mbstate));
+ }
+
+ 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)
+ {
+ STORE ('\\');
+ STORE ('0' + (c >> 6));
+ STORE ('0' + ((c >> 3) & 7));
+ c = '0' + (c & 7);
+ }
+ if (ilim <= i + 1)
+ break;
+ STORE (c);
+ c = arg[++i];
+ }
+
+ goto store_c;
+ }
+ }
+ }
+
+ if (! (backslash_escapes
+ && o->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
+ goto store_c;
+
+ store_escape:
+ STORE ('\\');
+
+ store_c:
+ STORE (c);
+ }
+
+ if (i == 0 && quoting_style == shell_quoting_style)
+ goto use_shell_always_quoting_style;
+
+ if (quote_string)
+ for (; *quote_string; quote_string++)
+ STORE (*quote_string);
+
+ if (len < buffersize)
+ buffer[len] = '\0';
+ return len;
+
+ use_shell_always_quoting_style:
+ return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
+ shell_always_quoting_style, o);
+}
+
+/* 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);
+ errno = e;
+ return r;
+}
+
+/* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly
+ allocated storage containing the quoted string. */
+char *
+quotearg_alloc (char const *arg, size_t argsize,
+ struct quoting_options const *o)
+{
+ int e = errno;
+ size_t bufsize = quotearg_buffer (0, 0, arg, argsize, o) + 1;
+ char *buf = xcharalloc (bufsize);
+ quotearg_buffer (buf, bufsize, arg, argsize, o);
+ errno = e;
+ 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 unsigned int nslots = 1;
+static struct slotvec slotvec0 = {sizeof slot0, slot0};
+static struct slotvec *slotvec = &slotvec0;
+
+void
+quotearg_free (void)
+{
+ struct slotvec *sv = slotvec;
+ unsigned 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;
+
+ unsigned int n0 = n;
+ struct slotvec *sv = slotvec;
+
+ if (n < 0)
+ abort ();
+
+ if (nslots <= n0)
+ {
+ /* FIXME: technically, the type of n1 should be `unsigned int',
+ but that evokes an unsuppressible warning from gcc-4.0.1 and
+ older. If gcc ever provides an option to suppress that warning,
+ revert to the original type, so that the test in xalloc_oversized
+ is once again performed only at compile time. */
+ size_t n1 = n0 + 1;
+ bool preallocated = (sv == &slotvec0);
+
+ if (xalloc_oversized (n1, sizeof *sv))
+ xalloc_die ();
+
+ slotvec = sv = xrealloc (preallocated ? NULL : sv, n1 * sizeof *sv);
+ if (preallocated)
+ *sv = slotvec0;
+ memset (sv + nslots, 0, (n1 - nslots) * sizeof *sv);
+ nslots = n1;
+ }
+
+ {
+ size_t size = sv[n].size;
+ char *val = sv[n].val;
+ size_t qsize = quotearg_buffer (val, size, arg, argsize, options);
+
+ if (size <= qsize)
+ {
+ sv[n].size = size = qsize + 1;
+ if (val != slot0)
+ free (val);
+ sv[n].val = val = xcharalloc (size);
+ quotearg_buffer (val, size, arg, argsize, options);
+ }
+
+ 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 (char const *arg)
+{
+ return quotearg_n (0, arg);
+}
+
+/* Return quoting options for STYLE, with no extra quoting. */
+static struct quoting_options
+quoting_options_from_style (enum quoting_style style)
+{
+ struct quoting_options o;
+ o.style = style;
+ memset (o.quote_these_too, 0, sizeof o.quote_these_too);
+ return o;
+}
+
+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_char (char const *arg, char ch)
+{
+ struct quoting_options options;
+ options = default_quoting_options;
+ set_char_quoting (&options, ch, 1);
+ return quotearg_n_options (0, arg, SIZE_MAX, &options);
+}
+
+char *
+quotearg_colon (char const *arg)
+{
+ return quotearg_char (arg, ':');
+}
diff --git a/lib/quotearg.h b/lib/quotearg.h
new file mode 100644
index 0000000..4887df3
--- /dev/null
+++ b/lib/quotearg.h
@@ -0,0 +1,140 @@
+/* quotearg.h - quote arguments for output
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#ifndef QUOTEARG_H_
+# define QUOTEARG_H_ 1
+
+# include <stddef.h>
+
+/* Basic quoting styles. */
+enum quoting_style
+ {
+ /* Output names as-is (ls --quoting-style=literal). */
+ literal_quoting_style,
+
+ /* Quote names for the shell if they contain shell metacharacters
+ or would cause ambiguous output (ls --quoting-style=shell). */
+ shell_quoting_style,
+
+ /* Quote names for the shell, even if they would normally not
+ require quoting (ls --quoting-style=shell-always). */
+ shell_always_quoting_style,
+
+ /* Quote names as for a C language string (ls --quoting-style=c). */
+ c_quoting_style,
+
+ /* Like c_quoting_style except omit the surrounding double-quote
+ characters (ls --quoting-style=escape). */
+ escape_quoting_style,
+
+ /* Like clocale_quoting_style, but quote `like this' instead of
+ "like this" in the default C locale (ls --quoting-style=locale). */
+ locale_quoting_style,
+
+ /* Like c_quoting_style except use quotation marks appropriate for
+ the locale (ls --quoting-style=clocale). */
+ clocale_quoting_style
+ };
+
+/* 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 *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). */
+int set_char_quoting (struct quoting_options *o, char c, int i);
+
+/* 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. */
+size_t quotearg_buffer (char *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. */
+char *quotearg_alloc (char const *arg, size_t argsize,
+ 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. */
+char *quotearg_n (int n, char const *arg);
+
+/* Equivalent to quotearg_n (0, ARG). */
+char *quotearg (char const *arg);
+
+/* 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);
+
+/* Like quotearg (ARG), except also quote any instances of CH. */
+char *quotearg_char (char const *arg, char ch);
+
+/* Equivalent to quotearg_char (ARG, ':'). */
+char *quotearg_colon (char const *arg);
+
+/* Free any dynamically allocated memory. */
+void quotearg_free (void);
+
+#endif /* !QUOTEARG_H_ */
diff --git a/lib/readlink.c b/lib/readlink.c
new file mode 100644
index 0000000..3cbdc1c
--- /dev/null
+++ b/lib/readlink.c
@@ -0,0 +1,50 @@
+/* Stub for readlink().
+ Copyright (C) 2003-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stddef.h>
+
+#if !HAVE_READLINK
+
+/* readlink() substitute for systems that don't have a readlink() function,
+ such as DJGPP 2.03 and mingw32. */
+
+/* The official POSIX return type of readlink() is ssize_t, but since here
+ we have no declaration in a public header file, we use 'int' as return
+ type. */
+
+int
+readlink (const char *path, char *buf, size_t bufsize)
+{
+ 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 (path, &statbuf) >= 0)
+ errno = EINVAL;
+ return -1;
+}
+
+#endif
diff --git a/lib/ref-add.sin b/lib/ref-add.sin
new file mode 100644
index 0000000..bc5cc79
--- /dev/null
+++ b/lib/ref-add.sin
@@ -0,0 +1,30 @@
+# Add this package to a list of references stored in a text file.
+#
+# Copyright (C) 2000 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ ta
+ :a
+ s/ @PACKAGE@ / @PACKAGE@ /
+ tb
+ s/ $/ @PACKAGE@ /
+ :b
+ s/^/# Packages using this file:/
+}
diff --git a/lib/ref-del.sin b/lib/ref-del.sin
new file mode 100644
index 0000000..e9301bf
--- /dev/null
+++ b/lib/ref-del.sin
@@ -0,0 +1,25 @@
+# Remove this package from a list of references stored in a text file.
+#
+# Copyright (C) 2000 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ s/ @PACKAGE@ / /
+ s/^/# Packages using this file:/
+}
diff --git a/lib/regcomp.c b/lib/regcomp.c
new file mode 100644
index 0000000..fe4d243
--- /dev/null
+++ b/lib/regcomp.c
@@ -0,0 +1,3832 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+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) internal_function;
+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 unsigned 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 unsigned 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 unsigned char *class_name,
+ const unsigned 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. */
+
+#ifdef _LIBC
+const char *
+re_compile_pattern (pattern, length, bufp)
+ const char *pattern;
+ size_t length;
+ struct re_pattern_buffer *bufp;
+#else /* size_t might promote */
+const char *
+re_compile_pattern (const char *pattern, size_t length,
+ struct re_pattern_buffer *bufp)
+#endif
+{
+ 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]);
+}
+#ifdef _LIBC
+weak_alias (__re_compile_pattern, re_compile_pattern)
+#endif
+
+/* 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 (syntax)
+ reg_syntax_t syntax;
+{
+ reg_syntax_t ret = re_syntax_options;
+
+ re_syntax_options = syntax;
+ return ret;
+}
+#ifdef _LIBC
+weak_alias (__re_set_syntax, re_set_syntax)
+#endif
+
+int
+re_compile_fastmap (bufp)
+ struct re_pattern_buffer *bufp;
+{
+ re_dfa_t *dfa = (re_dfa_t *) 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;
+}
+#ifdef _LIBC
+weak_alias (__re_compile_fastmap, re_compile_fastmap)
+#endif
+
+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 = (re_dfa_t *) 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)
+ {
+ Idx i;
+ re_charset_t *cset = dfa->nodes[node].opr.mbcset;
+ if (cset->non_match || cset->ncoll_syms || cset->nequiv_classes
+ || cset->nranges || cset->nchar_classes)
+ {
+# ifdef _LIBC
+ if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0)
+ {
+ /* In this case we want to catch the bytes which are
+ the first byte of any 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'. */
+ 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);
+ }
+# else
+ if (dfa->mb_cur_max > 1)
+ for (i = 0; i < SBC_MAX; ++i)
+ if (__btowc (i) == WEOF)
+ re_set_fastmap (fastmap, icase, i);
+# endif /* not _LIBC */
+ }
+ 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 (preg, pattern, cflags)
+ 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 (BE (preg->fastmap == NULL, 0))
+ 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 (BE (ret == REG_NOERROR, 1))
+ /* 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;
+}
+#ifdef _LIBC
+weak_alias (__regcomp, regcomp)
+#endif
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+ from either regcomp or regexec. We don't use PREG here. */
+
+#ifdef _LIBC
+size_t
+regerror (errcode, preg, errbuf, errbuf_size)
+ int errcode;
+ const regex_t *_Restrict_ preg;
+ char *_Restrict_ errbuf;
+ size_t errbuf_size;
+#else /* size_t might promote */
+size_t
+regerror (int errcode, const regex_t *_Restrict_ preg,
+ char *_Restrict_ errbuf, size_t errbuf_size)
+#endif
+{
+ const char *msg;
+ size_t msg_size;
+
+ if (BE (errcode < 0
+ || errcode >= (int) (sizeof (__re_error_msgid_idx)
+ / sizeof (__re_error_msgid_idx[0])), 0))
+ /* 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 (BE (errbuf_size != 0, 1))
+ {
+ size_t cpy_size = msg_size;
+ if (BE (msg_size > errbuf_size, 0))
+ {
+ cpy_size = errbuf_size - 1;
+ errbuf[cpy_size] = '\0';
+ }
+ memcpy (errbuf, msg, cpy_size);
+ }
+
+ return msg_size;
+}
+#ifdef _LIBC
+weak_alias (__regerror, regerror)
+#endif
+
+
+#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 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
+
+
+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 (preg)
+ regex_t *preg;
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ if (BE (dfa != NULL, 1))
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+
+ re_free (preg->fastmap);
+ preg->fastmap = NULL;
+
+ re_free (preg->translate);
+ preg->translate = NULL;
+}
+#ifdef _LIBC
+weak_alias (__regfree, regfree)
+#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
+
+/* 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 (s)
+ 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 = (char *) malloc (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 = (re_dfa_t *) preg->buffer;
+ if (BE (preg->allocated < sizeof (re_dfa_t), 0))
+ {
+ /* 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 = (unsigned char *) dfa;
+ }
+ preg->used = sizeof (re_dfa_t);
+
+ err = init_dfa (dfa, length);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ 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
+
+ __libc_lock_init (dfa->lock);
+
+ err = re_string_construct (&regexp, pattern, length, preg->translate,
+ syntax & RE_ICASE, dfa);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_compile_internal_free_return:
+ free_workarea_compile (preg);
+ re_string_destruct (&regexp);
+ 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 (BE (dfa->str_tree == NULL, 0))
+ goto re_compile_internal_free_return;
+
+ /* Analyze the tree and create the nfa. */
+ err = analyze (preg);
+ if (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ {
+ 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;
+#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 (BE (SIZE_MAX / max_object_size / 2 <= pat_len, 0))
+ 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
+ if (strcmp (locale_charset (), "UTF-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 (BE (dfa->sb_char == NULL, 0))
+ 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 (BE (dfa->nodes == NULL || dfa->state_table == NULL, 0))
+ 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
+internal_function
+init_word_char (re_dfa_t *dfa)
+{
+ int i, j, ch;
+ dfa->word_ops_used = 1;
+ for (i = 0, ch = 0; 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 = (re_dfa_t *) 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 (BE (err != REG_NOERROR, 0))
+ 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))
+ {
+ re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx);
+ 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 (BE (dfa->init_state == NULL, 0))
+ 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 (BE (dfa->init_state_word == NULL || dfa->init_state_nl == NULL
+ || dfa->init_state_begbuf == NULL, 0))
+ 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.idx)
+ {
+ case LINE_FIRST:
+ case LINE_LAST:
+ case BUF_FIRST:
+ case BUF_LAST:
+ break;
+ default:
+ /* Word anchors etc. cannot be handled. */
+ 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 = (re_dfa_t *) 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 (BE (dfa->nexts == NULL || dfa->org_indices == NULL || dfa->edests == NULL
+ || dfa->eclosures == NULL, 0))
+ 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)
+ {
+ free (dfa->subexp_map);
+ dfa->subexp_map = NULL;
+ }
+ }
+
+ ret = postorder (dfa->str_tree, lower_subexps, preg);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ ret = postorder (dfa->str_tree, calc_first, dfa);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ preorder (dfa->str_tree, calc_next, dfa);
+ ret = preorder (dfa->str_tree, link_nfa_nodes, dfa);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ ret = calc_eclosure (dfa);
+ if (BE (ret != REG_NOERROR, 0))
+ 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 (BE (dfa->inveclosures == NULL, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 = (re_dfa_t *) 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 (BE (tree == NULL || tree1 == NULL || op == NULL || cls == NULL, 0))
+ {
+ *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 (BE (node->node_idx == REG_MISSING, 0))
+ return REG_ESPACE;
+ }
+ 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:
+ 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;
+ assert (REG_VALID_INDEX (left));
+ assert (REG_VALID_INDEX (right));
+ 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)
+ re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]);
+ break;
+
+ default:
+ 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
+internal_function
+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 (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ dfa->nexts[clone_node] = dfa->nexts[org_node];
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ 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 (dfa->nodes[org_node].type == ANCHOR)
+ {
+ /* In case of the node has another constraint, append it. */
+ if (org_node == root_node && clone_node != org_node)
+ {
+ /* ...but if the node is root_node itself, it means the
+ epsilon closure have a loop, then tie it to the
+ destination of the root_node. */
+ ok = re_node_set_insert (dfa->edests + clone_node, org_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ break;
+ }
+ constraint |= dfa->nodes[org_node].opr.ctx_type;
+ }
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ 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 == REG_MISSING)
+ {
+ /* There are no such a duplicated node, create a new one. */
+ reg_errcode_t err;
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ err = duplicate_node_closure (dfa, org_dest, clone_dest,
+ root_node, constraint);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ else
+ {
+ /* There are a duplicated node which satisfy the constraint,
+ use it to avoid infinite loop. */
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+
+ org_dest = dfa->edests[org_node].elems[1];
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ 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 REG_MISSING; /* Not found. */
+}
+
+/* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT.
+ Return the index of the new node, or REG_MISSING 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 (BE (dup_idx != REG_MISSING, 1))
+ {
+ dfa->nodes[dup_idx].constraint = constraint;
+ if (dfa->nodes[org_idx].type == ANCHOR)
+ dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].opr.ctx_type;
+ 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 (BE (! ok, 0))
+ 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;
+#ifdef DEBUG
+ assert (dfa->nodes_len > 0);
+#endif
+ 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;
+ }
+
+#ifdef DEBUG
+ assert (dfa->eclosures[node_idx].nelem != REG_MISSING);
+#endif
+
+ /* 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 (BE (err != REG_NOERROR, 0))
+ 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;
+ unsigned int constraint;
+ Idx i;
+ bool incomplete;
+ bool ok;
+ re_node_set eclosure;
+ incomplete = false;
+ err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ /* This indicates that we are calculating this node now.
+ We reference this value to avoid infinite loop. */
+ dfa->eclosures[node].nelem = REG_MISSING;
+
+ constraint = ((dfa->nodes[node].type == ANCHOR)
+ ? dfa->nodes[node].opr.ctx_type : 0);
+ /* If the current node has constraints, duplicate all nodes.
+ Since they must inherit the constraints. */
+ if (constraint
+ && dfa->edests[node].nelem
+ && !dfa->nodes[dfa->edests[node].elems[0]].duplicated)
+ {
+ err = duplicate_node_closure (dfa, node, node, node, constraint);
+ if (BE (err != REG_NOERROR, 0))
+ 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 == REG_MISSING)
+ {
+ 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 (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ else
+ eclosure_elem = dfa->eclosures[edest];
+ /* Merge the epsilon closure of `edest'. */
+ re_node_set_merge (&eclosure, &eclosure_elem);
+ /* 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);
+ }
+ }
+
+ /* Epsilon closures include itself. */
+ ok = re_node_set_insert (&eclosure, node);
+ if (BE (! ok, 0))
+ 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
+internal_function
+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
+internal_function
+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
+internal_function
+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;
+ }
+ /* else fall through. */
+ 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 is occured, 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 = (re_dfa_t *) 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 (BE (*err != REG_NOERROR && tree == NULL, 0))
+ 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 (BE (eor == NULL || root == NULL, 0))
+ {
+ *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 = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree, *branch = NULL;
+ tree = parse_branch (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ 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))
+ {
+ branch = parse_branch (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && branch == NULL, 0))
+ return NULL;
+ }
+ else
+ branch = NULL;
+ tree = create_tree (dfa, tree, branch, OP_ALT);
+ if (BE (tree == NULL, 0))
+ {
+ *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 = (re_dfa_t *) preg->buffer;
+ tree = parse_expression (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ 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 (BE (*err != REG_NOERROR && expr == NULL, 0))
+ {
+ return NULL;
+ }
+ if (tree != NULL && expr != NULL)
+ {
+ tree = create_tree (dfa, tree, expr, CONCAT);
+ if (tree == NULL)
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ 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 = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree;
+ switch (token->type)
+ {
+ case CHARACTER:
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *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 (BE (mbc_remain == NULL || tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ }
+#endif
+ break;
+ case OP_OPEN_SUBEXP:
+ tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_OPEN_BRACKET:
+ tree = parse_bracket_exp (regexp, dfa, token, syntax, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_BACK_REF:
+ if (!BE (dfa->completed_bkref_map & (1 << token->opr.idx), 1))
+ {
+ *err = REG_ESUBREG;
+ return NULL;
+ }
+ dfa->used_bkref_map |= 1 << token->opr.idx;
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *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);
+ }
+ /* else fall through */
+ case OP_CLOSE_SUBEXP:
+ if ((token->type == OP_CLOSE_SUBEXP) &&
+ !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD))
+ {
+ *err = REG_ERPAREN;
+ return NULL;
+ }
+ /* else fall through */
+ 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 (BE (tree == NULL, 0))
+ {
+ *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 (BE (tree_first == NULL || tree_last == NULL || tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ else
+ {
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *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 (BE (tree == NULL, 0))
+ {
+ *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,
+ (const unsigned char *) "alnum",
+ (const unsigned char *) "_",
+ token->type == OP_NOTWORD, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_SPACE:
+ case OP_NOTSPACE:
+ tree = build_charclass_op (dfa, regexp->trans,
+ (const unsigned char *) "space",
+ (const unsigned char *) "",
+ token->type == OP_NOTSPACE, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_ALT:
+ case END_OF_RE:
+ return NULL;
+ case BACK_SLASH:
+ *err = REG_EESCAPE;
+ return NULL;
+ default:
+ /* Must not happen? */
+#ifdef DEBUG
+ assert (0);
+#endif
+ 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)
+ {
+ tree = parse_dup_op (tree, regexp, dfa, token, syntax, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ /* In BRE consecutive duplications are not allowed. */
+ if ((syntax & RE_CONTEXT_INVALID_DUP)
+ && (token->type == OP_DUP_ASTERISK
+ || token->type == OP_OPEN_DUP_NUM))
+ {
+ *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 = (re_dfa_t *) 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 (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0))
+ *err = REG_EPAREN;
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ }
+
+ if (cur_nsub <= '9' - '1')
+ dfa->completed_bkref_map |= 1 << cur_nsub;
+
+ tree = create_tree (dfa, tree, NULL, SUBEXP);
+ if (BE (tree == NULL, 0))
+ {
+ *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 == REG_MISSING)
+ {
+ 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 (BE (start != REG_ERROR, 1))
+ {
+ /* 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) : REG_ERROR));
+ }
+ if (BE (start == REG_ERROR || end == REG_ERROR, 0))
+ {
+ /* Invalid sequence. */
+ if (BE (!(syntax & RE_INVALID_INTERVAL_ORD), 0))
+ {
+ 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 (BE (end != REG_MISSING && start > end, 0))
+ {
+ /* First number greater than second. */
+ *err = REG_BADBR;
+ return NULL;
+ }
+ }
+ else
+ {
+ start = (token->type == OP_DUP_PLUS) ? 1 : 0;
+ end = (token->type == OP_DUP_QUESTION) ? 1 : REG_MISSING;
+ }
+
+ fetch_token (token, regexp, syntax);
+
+ if (BE (elem == NULL, 0))
+ return NULL;
+ if (BE (start == 0 && end == 0, 0))
+ {
+ postorder (elem, free_tree, NULL);
+ return NULL;
+ }
+
+ /* Extract "<re>{n,m}" to "<re><re>...<re><re>{0,<m-n>}". */
+ if (BE (start > 0, 0))
+ {
+ tree = elem;
+ for (i = 2; i <= start; ++i)
+ {
+ elem = duplicate_tree (elem, dfa);
+ tree = create_tree (dfa, tree, elem, CONCAT);
+ if (BE (elem == NULL || tree == NULL, 0))
+ goto parse_dup_op_espace;
+ }
+
+ if (start == end)
+ return tree;
+
+ /* Duplicate ELEM before it is marked optional. */
+ elem = duplicate_tree (elem, dfa);
+ old_tree = tree;
+ }
+ else
+ old_tree = NULL;
+
+ if (elem->token.type == SUBEXP)
+ postorder (elem, mark_opt_subexp, (void *) (long) elem->token.opr.idx);
+
+ tree = create_tree (dfa, elem, NULL,
+ (end == REG_MISSING ? OP_DUP_ASTERISK : OP_ALT));
+ if (BE (tree == NULL, 0))
+ goto parse_dup_op_espace;
+
+ /* This loop is actually executed only when end != REG_MISSING,
+ to rewrite <re>{0,n} as (<re>(<re>...<re>?)?)?... We have
+ already created the start+1-th copy. */
+ if ((Idx) -1 < 0 || end != REG_MISSING)
+ for (i = start + 2; i <= end; ++i)
+ {
+ elem = duplicate_tree (elem, dfa);
+ tree = create_tree (dfa, tree, elem, CONCAT);
+ if (BE (elem == NULL || tree == NULL, 0))
+ goto parse_dup_op_espace;
+
+ tree = create_tree (dfa, tree, NULL, OP_ALT);
+ if (BE (tree == NULL, 0))
+ 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
+ /* 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 sinse we may
+ update it. */
+
+static reg_errcode_t
+internal_function
+# ifdef RE_ENABLE_I18N
+build_range_exp (bitset_t sbcset, re_charset_t *mbcset, Idx *range_alloc,
+ bracket_elem_t *start_elem, bracket_elem_t *end_elem)
+# else /* not RE_ENABLE_I18N */
+build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem,
+ 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 (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
+ || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
+ 0))
+ return REG_ERANGE;
+
+ /* We can handle no multi character collating elements without libc
+ support. */
+ if (BE ((start_elem->type == COLL_SYM
+ && strlen ((char *) start_elem->opr.name) > 1)
+ || (end_elem->type == COLL_SYM
+ && strlen ((char *) end_elem->opr.name) > 1), 0))
+ return REG_ECOLLATE;
+
+# ifdef RE_ENABLE_I18N
+ {
+ wchar_t wc;
+ wint_t start_wc;
+ wint_t end_wc;
+ wchar_t cmp_buf[6] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
+
+ 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)
+ ? __btowc (start_ch) : start_elem->opr.wch);
+ end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM)
+ ? __btowc (end_ch) : end_elem->opr.wch);
+ if (start_wc == WEOF || end_wc == WEOF)
+ return REG_ECOLLATE;
+ cmp_buf[0] = start_wc;
+ cmp_buf[4] = end_wc;
+ if (wcscoll (cmp_buf, cmp_buf + 4) > 0)
+ 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 (BE (*range_alloc == mbcset->nranges, 0))
+ {
+ /* 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 (BE (new_array_start == NULL || new_array_end == NULL, 0))
+ 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)
+ {
+ cmp_buf[2] = wc;
+ if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
+ && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+ 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
+internal_function
+build_collating_symbol (bitset_t sbcset,
+# ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset, Idx *coll_sym_alloc,
+# endif
+ const unsigned char *name)
+{
+ size_t name_len = strlen ((const char *) name);
+ if (BE (name_len != 1, 0))
+ 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 environement.
+ Seek the collating symbol entry correspondings to NAME.
+ Return the index of the symbol in the SYMB_TABLE. */
+
+ auto inline int32_t
+ __attribute ((always_inline))
+ seek_collating_symbol_entry (name, name_len)
+ const unsigned char *name;
+ size_t name_len;
+ {
+ int32_t hash = elem_hash ((const char *) name, name_len);
+ int32_t elem = hash % table_size;
+ if (symb_table[2 * elem] != 0)
+ {
+ int32_t second = hash % (table_size - 2) + 1;
+
+ do
+ {
+ /* First compare the hashing value. */
+ if (symb_table[2 * elem] == hash
+ /* Compare the length of the name. */
+ && name_len == extra[symb_table[2 * elem + 1]]
+ /* Compare the name. */
+ && memcmp (name, &extra[symb_table[2 * elem + 1] + 1],
+ name_len) == 0)
+ {
+ /* Yep, this is the entry. */
+ break;
+ }
+
+ /* Next entry. */
+ elem += second;
+ }
+ while (symb_table[2 * elem] != 0);
+ }
+ return elem;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environement.
+ 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 (br_elem)
+ 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)
+ {
+ 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 (symb_table[2 * elem] != 0)
+ {
+ /* 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 (symb_table[2 * elem] == 0 && 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 environement.
+ 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 sinse we may
+ update it. */
+
+ auto inline reg_errcode_t
+ __attribute ((always_inline))
+ build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
+ re_charset_t *mbcset;
+ Idx *range_alloc;
+ bitset_t sbcset;
+ bracket_elem_t *start_elem, *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 (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
+ || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
+ 0))
+ return REG_ERANGE;
+
+ start_collseq = lookup_collation_sequence_value (start_elem);
+ end_collseq = lookup_collation_sequence_value (end_elem);
+ /* Check start/end collation sequence values. */
+ if (BE (start_collseq == UINT_MAX || end_collseq == UINT_MAX, 0))
+ return REG_ECOLLATE;
+ if (BE ((syntax & RE_NO_EMPTY_RANGES) && start_collseq > end_collseq, 0))
+ 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 (BE (*range_alloc == mbcset->nranges, 0))
+ {
+ /* 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 (BE (new_array_start == NULL || new_array_end == NULL, 0))
+ 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 environement.
+ 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 sinse we may update it. */
+
+ auto inline reg_errcode_t
+ __attribute ((always_inline))
+ build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name)
+ re_charset_t *mbcset;
+ Idx *coll_sym_alloc;
+ bitset_t sbcset;
+ 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 (symb_table[2 * elem] != 0)
+ {
+ /* We found the entry. */
+ idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating element name. */
+ idx += 1 + extra[idx];
+ }
+ else if (symb_table[2 * elem] == 0 && 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 (BE (*coll_sym_alloc == mbcset->ncoll_syms, 0))
+ {
+ /* 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 (BE (new_coll_syms == NULL, 0))
+ 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 (BE (name_len != 1, 0))
+ 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 (BE (sbcset == NULL || mbcset == NULL, 0))
+#else
+ if (BE (sbcset == NULL, 0))
+#endif /* RE_ENABLE_I18N */
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ token_len = peek_token_bracket (token, regexp, syntax);
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *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 (BE (token->type == END_OF_RE, 0))
+ {
+ *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;
+ ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa,
+ syntax, first_round);
+ if (BE (ret != REG_NOERROR, 0))
+ {
+ *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 (BE (token->type == END_OF_RE, 0))
+ {
+ *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 (BE (token2.type == END_OF_RE, 0))
+ {
+ *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;
+ ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2,
+ dfa, syntax, true);
+ if (BE (ret != REG_NOERROR, 0))
+ {
+ *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 (sbcset,
+ dfa->mb_cur_max > 1 ? mbcset : NULL,
+ &range_alloc, &start_elem, &end_elem);
+# else
+ *err = build_range_exp (sbcset, &start_elem, &end_elem);
+# endif
+#endif /* RE_ENABLE_I18N */
+ if (BE (*err != REG_NOERROR, 0))
+ 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 (BE (mbchar_alloc == mbcset->nmbchars, 0))
+ {
+ 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 (BE (new_mbchars == NULL, 0))
+ 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 (BE (*err != REG_NOERROR, 0))
+ 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 (BE (*err != REG_NOERROR, 0))
+ 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 */
+ start_elem.opr.name, syntax);
+ if (BE (*err != REG_NOERROR, 0))
+ goto parse_bracket_exp_free_return;
+ break;
+ default:
+ assert (0);
+ break;
+ }
+ }
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *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 (BE (mbc_tree == NULL, 0))
+ 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 (BE (work_tree == NULL, 0))
+ goto parse_bracket_exp_espace;
+
+ /* Then join them by ALT node. */
+ work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT);
+ if (BE (work_tree == NULL, 0))
+ 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 (BE (work_tree == NULL, 0))
+ 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 (BE (token->type == OP_CHARSET_RANGE, 0) && !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 sinse 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;
+ /* This #include defines a local function! */
+# include <locale/weight.h>
+ /* 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 (&cp);
+ if (BE (idx1 == 0 || cp < name + strlen ((const char *) name), 0))
+ /* This isn't a valid character. */
+ return REG_ECOLLATE;
+
+ /* Build single byte matcing table for this equivalence class. */
+ char_buf[1] = (unsigned char) '\0';
+ len = weights[idx1];
+ for (ch = 0; ch < SBC_MAX; ++ch)
+ {
+ char_buf[0] = ch;
+ cp = char_buf;
+ idx2 = findidx (&cp);
+/*
+ idx2 = table[ch];
+*/
+ if (idx2 == 0)
+ /* This isn't a valid character. */
+ continue;
+ if (len == weights[idx2])
+ {
+ int cnt = 0;
+ while (cnt <= len &&
+ weights[idx1 + 1 + cnt] == weights[idx2 + 1 + cnt])
+ ++cnt;
+
+ if (cnt > len)
+ bitset_set (sbcset, ch);
+ }
+ }
+ /* Check whether the array has enough space. */
+ if (BE (*equiv_class_alloc == mbcset->nequiv_classes, 0))
+ {
+ /* 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 (BE (new_equiv_classes == NULL, 0))
+ 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 (BE (strlen ((const char *) name) != 1, 0))
+ 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 sinse 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 unsigned char *class_name, reg_syntax_t syntax)
+#else /* not RE_ENABLE_I18N */
+build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
+ const unsigned char *class_name, reg_syntax_t syntax)
+#endif /* not RE_ENABLE_I18N */
+{
+ int i;
+ const char *name = (const char *) 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 (BE (*char_class_alloc == mbcset->nchar_classes, 0))
+ {
+ /* 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 (BE (new_char_classes == NULL, 0))
+ 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 (BE (trans != NULL, 0)) \
+ { \
+ 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 unsigned char *class_name,
+ const unsigned 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;
+ re_token_t br_token;
+ bin_tree_t *tree;
+
+ 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 (BE (sbcset == NULL || mbcset == NULL, 0))
+#else /* not RE_ENABLE_I18N */
+ if (BE (sbcset == NULL, 0))
+#endif /* not RE_ENABLE_I18N */
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ if (non_match)
+ {
+#ifdef RE_ENABLE_I18N
+ mbcset->non_match = 1;
+#endif /* not 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 (BE (ret != REG_NOERROR, 0))
+ {
+ 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. */
+ br_token.type = SIMPLE_BRACKET;
+ br_token.opr.sbcset = sbcset;
+ tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (tree == NULL, 0))
+ 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 (BE (mbc_tree == NULL, 0))
+ goto build_word_op_espace;
+ /* Then join them by ALT node. */
+ tree = create_tree (dfa, tree, mbc_tree, OP_ALT);
+ if (BE (mbc_tree != NULL, 1))
+ 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 REG_MISSING if the number field is empty like "{,1}".
+ Return REG_ERROR if an error occurred. */
+
+static Idx
+fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax)
+{
+ Idx num = REG_MISSING;
+ unsigned char c;
+ while (1)
+ {
+ fetch_token (token, input, syntax);
+ c = token->opr.c;
+ if (BE (token->type == END_OF_RE, 0))
+ return REG_ERROR;
+ if (token->type == OP_CLOSE_DUP_NUM || c == ',')
+ break;
+ num = ((token->type != CHARACTER || c < '0' || '9' < c
+ || num == REG_ERROR)
+ ? REG_ERROR
+ : ((num == REG_MISSING) ? c - '0' : num * 10 + c - '0'));
+ num = (num > RE_DUP_MAX) ? REG_ERROR : num;
+ }
+ 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);
+ re_free (cset->range_starts);
+ re_free (cset->range_ends);
+# endif
+ 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;
+ 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 (BE (dfa->str_tree_storage_idx == BIN_TREE_STORAGE_SIZE, 0))
+ {
+ 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 = REG_MISSING;
+
+ 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 = (Idx) (long) 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..d4eb726
--- /dev/null
+++ b/lib/regex.c
@@ -0,0 +1,71 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Make sure noone 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..7a79ca3
--- /dev/null
+++ b/lib/regex.h
@@ -0,0 +1,675 @@
+/* Definitions for data structures and routines for the regular
+ expression library.
+ Copyright (C) 1985,1989-93,1995-98,2000,2001,2002,2003,2005,2006
+ 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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_REGEX to declare GNU extensions that violate the
+ POSIX name space rules. */
+#undef __USE_GNU_REGEX
+#if (defined _GNU_SOURCE \
+ || (!defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE \
+ && !defined _XOPEN_SOURCE))
+# define __USE_GNU_REGEX 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 the offset of a byte within a string.
+ For historical reasons POSIX 1003.1-2004 requires that regoff_t be
+ at least as wide as off_t. However, many common POSIX platforms set
+ regoff_t to the more-sensible ssize_t and the Open Group has
+ signalled its intention to change the requirement to be that
+ regoff_t be at least as wide as ptrdiff_t and ssize_t; see XBD ERN
+ 60 (2005-08-25). We don't know of any hosts where ssize_t or
+ ptrdiff_t is wider than ssize_t, so ssize_t is safe. */
+typedef ssize_t regoff_t;
+
+/* The type of nonnegative object indexes. Traditionally, GNU regex
+ uses 'int' for these. Code that uses __re_idx_t should work
+ regardless of whether the type is signed. */
+typedef size_t __re_idx_t;
+
+/* 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
+
+/* Use types that are binary-compatible with the traditional GNU regex
+ implementation, which mishandles strings longer than INT_MAX. */
+
+typedef int regoff_t;
+typedef int __re_idx_t;
+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_REGEX
+
+/* 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 an bre or
+ immediately after an alternation or begin-group 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 /* defined __USE_GNU_REGEX */
+
+/* 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_REGEX
+/* 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_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
+
+# define RE_SYNTAX_GNU_AWK \
+ ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \
+ & ~(RE_DOT_NOT_NULL | RE_INTERVALS | 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)
+
+# define RE_SYNTAX_GREP \
+ (RE_BK_PLUS_QM | RE_CHAR_CLASSES \
+ | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \
+ | RE_NEWLINE_ALT)
+
+# define RE_SYNTAX_EGREP \
+ (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \
+ | RE_NEWLINE_ALT | RE_NO_BK_PARENS \
+ | RE_NO_BK_VBAR)
+
+# define RE_SYNTAX_POSIX_EGREP \
+ (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \
+ | RE_INVALID_INTERVAL_ORD)
+
+/* 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]]] */
+
+#endif /* defined __USE_GNU_REGEX */
+
+#ifdef __USE_GNU_REGEX
+
+/* 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 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 - 2) / 10 - 1) 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 /* defined __USE_GNU_REGEX */
+
+
+/* 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, /* Compiled pattern bigger than 2^16 bytes. */
+ _REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */
+} reg_errcode_t;
+
+#ifdef _XOPEN_SOURCE
+# 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
+
+/* struct re_pattern_buffer normally uses member names like `buffer'
+ that POSIX does not allow. In POSIX mode these members have names
+ with leading `re_' (e.g., `re_buffer'). */
+#ifdef __USE_GNU_REGEX
+# define _REG_RE_NAME(id) id
+# define _REG_RM_NAME(id) id
+#else
+# define _REG_RE_NAME(id) re_##id
+# define _REG_RM_NAME(id) rm_##id
+#endif
+
+/* The user can specify the type of the re_translate member by
+ defining the macro RE_TRANSLATE_TYPE, which defaults to unsigned
+ char *. This pollutes the POSIX name space, so in POSIX mode just
+ use unsigned char *. */
+#ifdef __USE_GNU_REGEX
+# ifndef RE_TRANSLATE_TYPE
+# define RE_TRANSLATE_TYPE unsigned char *
+# endif
+# define REG_TRANSLATE_TYPE RE_TRANSLATE_TYPE
+#else
+# define REG_TRANSLATE_TYPE unsigned char *
+#endif
+
+/* This data structure represents a compiled pattern. Before calling
+ the pattern compiler, the fields `buffer', `allocated', `fastmap',
+ `translate', and `no_sub' can be set. After the pattern has been
+ compiled, the `re_nsub' field is available. All other fields are
+ private to the regex routines. */
+
+struct re_pattern_buffer
+{
+ /* Space that holds the compiled pattern. It is declared as
+ `unsigned char *' because its elements are sometimes used as
+ array indexes. */
+ unsigned char *_REG_RE_NAME (buffer);
+
+ /* Number of bytes to which `buffer' points. */
+ __re_long_size_t _REG_RE_NAME (allocated);
+
+ /* Number of bytes actually used in `buffer'. */
+ __re_long_size_t _REG_RE_NAME (used);
+
+ /* Syntax setting with which the pattern was compiled. */
+ reg_syntax_t _REG_RE_NAME (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 *_REG_RE_NAME (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. */
+ REG_TRANSLATE_TYPE _REG_RE_NAME (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 int _REG_RE_NAME (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_REGEX
+# define REGS_UNALLOCATED 0
+# define REGS_REALLOCATE 1
+# define REGS_FIXED 2
+#endif
+ unsigned int _REG_RE_NAME (regs_allocated) : 2;
+
+ /* Set to zero when `regex_compile' compiles a pattern; set to one
+ by `re_compile_fastmap' if it updates the fastmap. */
+ unsigned int _REG_RE_NAME (fastmap_accurate) : 1;
+
+ /* If set, `re_match_2' does not return information about
+ subexpressions. */
+ unsigned int _REG_RE_NAME (no_sub) : 1;
+
+ /* If set, a beginning-of-line anchor doesn't match at the beginning
+ of the string. */
+ unsigned int _REG_RE_NAME (not_bol) : 1;
+
+ /* Similarly for an end-of-line anchor. */
+ unsigned int _REG_RE_NAME (not_eol) : 1;
+
+ /* If true, an anchor at a newline matches. */
+ unsigned int _REG_RE_NAME (newline_anchor) : 1;
+
+/* [[[end pattern_buffer]]] */
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+/* 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 _REG_RM_NAME (num_regs);
+ regoff_t *_REG_RM_NAME (start);
+ regoff_t *_REG_RM_NAME (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. */
+#if !defined RE_NREGS && defined __USE_GNU_REGEX
+# define RE_NREGS 30
+#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. */
+
+/* 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. */
+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, __re_idx_t __length,
+ __re_idx_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, __re_idx_t __length1,
+ const char *__string2, __re_idx_t __length2,
+ __re_idx_t __start, regoff_t __range,
+ struct re_registers *__regs,
+ __re_idx_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, __re_idx_t __length,
+ __re_idx_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, __re_idx_t __length1,
+ const char *__string2, __re_idx_t __length2,
+ __re_idx_t __start, struct re_registers *__regs,
+ __re_idx_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
+ PATTERN_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);
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+# ifndef _CRAY
+/* 4.2 bsd compatibility. */
+extern char *re_comp (const char *);
+extern int re_exec (const char *);
+# endif
+#endif
+
+/* 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 199901L <= __STDC_VERSION__
+# define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# define _Restrict_ __restrict
+# else
+# define _Restrict_
+# endif
+#endif
+/* gcc 3.1 and up support the [restrict] syntax. Don't trust
+ sys/cdefs.h's definition of __restrict_arr, though, as it
+ mishandles gcc -ansi -pedantic. */
+#ifndef _Restrict_arr_
+# if ((199901L <= __STDC_VERSION__ \
+ || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
+ && !__STRICT_ANSI__)) \
+ && !defined __GNUG__)
+# 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..2129888
--- /dev/null
+++ b/lib/regex_internal.c
@@ -0,0 +1,1741 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+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) internal_function;
+static re_dfastate_t *create_ci_newstate (const re_dfa_t *dfa,
+ const re_node_set *nodes,
+ re_hashval_t hash) internal_function;
+static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa,
+ const re_node_set *nodes,
+ unsigned int context,
+ re_hashval_t hash) internal_function;
+
+/* 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
+internal_function
+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 (BE (ret != REG_NOERROR, 0))
+ 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
+internal_function
+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 (BE (ret != REG_NOERROR, 0))
+ 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 (BE (ret != REG_NOERROR, 0))
+ 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 (BE (ret != REG_NOERROR, 0))
+ 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
+internal_function
+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. */
+ size_t max_object_size = MAX (sizeof (wint_t), sizeof (Idx));
+ if (BE (SIZE_MAX / max_object_size < new_buf_len, 0))
+ return REG_ESPACE;
+
+ new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len);
+ if (BE (new_wcs == NULL, 0))
+ return REG_ESPACE;
+ pstr->wcs = new_wcs;
+ if (pstr->offsets != NULL)
+ {
+ Idx *new_offsets = re_realloc (pstr->offsets, Idx, new_buf_len);
+ if (BE (new_offsets == NULL, 0))
+ 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 (BE (new_mbs == NULL, 0))
+ return REG_ESPACE;
+ pstr->mbs = new_mbs;
+ }
+ pstr->bufs_len = new_buf_len;
+ return REG_NOERROR;
+}
+
+
+static void
+internal_function
+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
+internal_function
+build_wcs_buffer (re_string_t *pstr)
+{
+#ifdef _LIBC
+ unsigned char buf[MB_LEN_MAX];
+ 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 (BE (pstr->trans != NULL, 0))
+ {
+ 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 (BE (mbclen == (size_t) -2, 0))
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+ else if (BE (mbclen == (size_t) -1 || mbclen == 0, 0))
+ {
+ /* We treat these cases as a singlebyte character. */
+ mbclen = 1;
+ wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+ if (BE (pstr->trans != NULL, 0))
+ wc = pstr->trans[wc];
+ pstr->cur_state = prev_st;
+ }
+
+ /* 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
+internal_function
+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];
+ assert (MB_LEN_MAX >= pstr->mb_cur_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;
+
+ if (isascii (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx])
+ && mbsinit (&pstr->cur_state))
+ {
+ /* In case of a singlebyte character. */
+ pstr->mbs[byte_idx]
+ = toupper (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]);
+ /* The next step uses the assumption that wchar_t is encoded
+ ASCII-safe: all ASCII values can be converted like this. */
+ pstr->wcs[byte_idx] = (wchar_t) pstr->mbs[byte_idx];
+ ++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 (BE (mbclen < (size_t) -2, 1))
+ {
+ wchar_t wcu = wc;
+ if (iswlower (wc))
+ {
+ size_t mbcdlen;
+
+ wcu = towupper (wc);
+ mbcdlen = wcrtomb (buf, wcu, &prev_st);
+ if (BE (mbclen == mbcdlen, 1))
+ 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)
+ {
+ /* It is an invalid character or '\0'. Just use the byte. */
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+ pstr->mbs[byte_idx] = ch;
+ /* And also cast it to wide char. */
+ pstr->wcs[byte_idx++] = (wchar_t) ch;
+ if (BE (mbclen == (size_t) -1, 0))
+ 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 (BE (pstr->trans != NULL, 0))
+ {
+ 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 (BE (mbclen < (size_t) -2, 1))
+ {
+ wchar_t wcu = wc;
+ if (iswlower (wc))
+ {
+ size_t mbcdlen;
+
+ wcu = towupper (wc);
+ mbcdlen = wcrtomb ((char *) buf, wcu, &prev_st);
+ if (BE (mbclen == mbcdlen, 1))
+ 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 (BE (pstr->offsets_needed != 0, 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)
+ {
+ /* It is an invalid character or '\0'. Just use the byte. */
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx];
+
+ if (BE (pstr->trans != NULL, 0))
+ ch = pstr->trans [ch];
+ pstr->mbs[byte_idx] = ch;
+
+ if (BE (pstr->offsets_needed != 0, 0))
+ pstr->offsets[byte_idx] = src_idx;
+ ++src_idx;
+
+ /* And also cast it to wide char. */
+ pstr->wcs[byte_idx++] = (wchar_t) ch;
+ if (BE (mbclen == (size_t) -1, 0))
+ 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
+internal_function
+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;
+ remain_len = pstr->len - rawbuf_idx;
+ prev_st = pstr->cur_state;
+ mbclen = mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx,
+ remain_len, &pstr->cur_state);
+ if (BE (mbclen == (size_t) -2 || mbclen == (size_t) -1 || mbclen == 0, 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
+internal_function
+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 (BE (pstr->trans != NULL, 0))
+ ch = pstr->trans[ch];
+ if (islower (ch))
+ pstr->mbs[char_idx] = toupper (ch);
+ else
+ pstr->mbs[char_idx] = ch;
+ }
+ pstr->valid_len = char_idx;
+ pstr->valid_raw_len = char_idx;
+}
+
+/* Apply TRANS to the buffer in PSTR. */
+
+static void
+internal_function
+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
+internal_function
+re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags)
+{
+ Idx offset;
+
+ if (BE (pstr->raw_mbs_idx <= idx, 0))
+ 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 (BE (offset != 0, 1))
+ {
+ /* Should the already checked characters be kept? */
+ if (BE (offset < pstr->valid_raw_len, 1))
+ {
+ /* Yes, move them to the front of the buffer. */
+#ifdef RE_ENABLE_I18N
+ if (BE (pstr->offsets_needed, 0))
+ {
+ 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 (BE (pstr->mbs_allocated, 0))
+ memmove (pstr->mbs, pstr->mbs + offset,
+ pstr->valid_len - offset);
+ pstr->valid_len -= offset;
+ pstr->valid_raw_len -= offset;
+#if DEBUG
+ assert (pstr->valid_len > 0);
+#endif
+ }
+ }
+ else
+ {
+ /* No, skip all characters until IDX. */
+ Idx prev_valid_len = pstr->valid_len;
+
+#ifdef RE_ENABLE_I18N
+ if (BE (pstr->offsets_needed, 0))
+ {
+ 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) && BE (pstr->trans == NULL, 1))
+ {
+ 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;
+
+ if (BE (pstr->trans != NULL, 0))
+ {
+ int i = mlen < 6 ? mlen : 6;
+ while (--i >= 0)
+ buf[i] = pstr->trans[p[i]];
+ }
+ /* 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 *) p, 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 = ((BE (pstr->word_ops_used != 0, 0)
+ && IS_WIDE_WORD_CHAR (wc))
+ ? CONTEXT_WORD
+ : ((IS_WIDE_NEWLINE (wc)
+ && pstr->newline_anchor)
+ ? CONTEXT_NEWLINE : 0));
+ if (BE (pstr->valid_len, 0))
+ {
+ 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 (!BE (pstr->mbs_allocated, 0))
+ 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 (BE (ret != REG_NOERROR, 0))
+ return ret;
+ }
+ else
+ build_wcs_buffer (pstr);
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ if (BE (pstr->mbs_allocated, 0))
+ {
+ 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
+internal_function __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 (BE (!pstr->mbs_allocated, 1))
+ 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
+internal_function __attribute ((pure))
+re_string_fetch_byte_case (re_string_t *pstr)
+{
+ if (BE (!pstr->mbs_allocated, 1))
+ 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
+internal_function
+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
+internal_function
+re_string_context_at (const re_string_t *input, Idx idx, int eflags)
+{
+ int c;
+ if (BE (! REG_VALID_INDEX (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 (BE (idx == input->len, 0))
+ 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)
+ {
+#ifdef DEBUG
+ /* It must not happen. */
+ assert (REG_VALID_INDEX (wc_idx));
+#endif
+ --wc_idx;
+ if (! REG_VALID_INDEX (wc_idx))
+ return input->tip_context;
+ }
+ wc = input->wcs[wc_idx];
+ if (BE (input->word_ops_used != 0, 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
+internal_function
+re_node_set_alloc (re_node_set *set, Idx size)
+{
+ set->alloc = size;
+ set->nelem = 0;
+ set->elems = re_malloc (Idx, size);
+ if (BE (set->elems == NULL, 0))
+ return REG_ESPACE;
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function
+re_node_set_init_1 (re_node_set *set, Idx elem)
+{
+ set->alloc = 1;
+ set->nelem = 1;
+ set->elems = re_malloc (Idx, 1);
+ if (BE (set->elems == NULL, 0))
+ {
+ set->alloc = set->nelem = 0;
+ return REG_ESPACE;
+ }
+ set->elems[0] = elem;
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function
+re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2)
+{
+ set->alloc = 2;
+ set->elems = re_malloc (Idx, 2);
+ if (BE (set->elems == NULL, 0))
+ 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
+internal_function
+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 (BE (dest->elems == NULL, 0))
+ {
+ 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
+internal_function
+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 (BE (new_elems == NULL, 0))
+ 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 (REG_VALID_INDEX (id) && dest->elems[id] > src1->elems[i1])
+ --id;
+
+ if (! REG_VALID_INDEX (id) || dest->elems[id] != src1->elems[i1])
+ dest->elems[--sbase] = src1->elems[i1];
+
+ if (! REG_VALID_INDEX (--i1) || ! REG_VALID_INDEX (--i2))
+ break;
+ }
+
+ /* Lower the highest of the two items. */
+ else if (src1->elems[i1] < src2->elems[i2])
+ {
+ if (! REG_VALID_INDEX (--i2))
+ break;
+ }
+ else
+ {
+ if (! REG_VALID_INDEX (--i1))
+ 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 && REG_VALID_INDEX (id))
+ 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 (! REG_VALID_INDEX (--id))
+ 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
+internal_function
+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 (BE (dest->elems == NULL, 0))
+ 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
+internal_function
+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 (BE (new_buffer == NULL, 0))
+ return REG_ESPACE;
+ dest->elems = new_buffer;
+ dest->alloc = new_alloc;
+ }
+
+ if (BE (dest->nelem == 0, 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;
+ REG_VALID_INDEX (is) && REG_VALID_INDEX (id); )
+ {
+ 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 (REG_VALID_INDEX (is))
+ {
+ /* 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 (! REG_VALID_INDEX (--id))
+ {
+ /* 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
+internal_function
+re_node_set_insert (re_node_set *set, Idx elem)
+{
+ Idx idx;
+ /* In case the set is empty. */
+ if (set->alloc == 0)
+ return BE (re_node_set_init_1 (set, elem) == REG_NOERROR, 1);
+
+ if (BE (set->nelem, 0) == 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 (BE (new_elems == NULL, 0))
+ 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])
+ {
+ idx = 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
+internal_function
+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 (BE (new_elems == NULL, 0))
+ 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
+internal_function __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 ; REG_VALID_INDEX (--i) ; )
+ 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
+internal_function __attribute ((pure))
+re_node_set_contains (const re_node_set *set, Idx elem)
+{
+ __re_size_t idx, right, mid;
+ if (! REG_VALID_NONZERO_INDEX (set->nelem))
+ 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
+internal_function
+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 REG_MISSING if an error occurred. */
+
+static Idx
+internal_function
+re_dfa_add_node (re_dfa_t *dfa, re_token_t token)
+{
+ if (BE (dfa->nodes_len >= dfa->nodes_alloc, 0))
+ {
+ 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;
+ size_t max_object_size =
+ MAX (sizeof (re_token_t),
+ MAX (sizeof (re_node_set),
+ sizeof (Idx)));
+
+ /* Avoid overflows. */
+ if (BE (SIZE_MAX / 2 / max_object_size < dfa->nodes_alloc, 0))
+ return REG_MISSING;
+
+ new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc);
+ if (BE (new_nodes == NULL, 0))
+ return REG_MISSING;
+ 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 (BE (new_nexts == NULL || new_indices == NULL
+ || new_edests == NULL || new_eclosures == NULL, 0))
+ return REG_MISSING;
+ 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
+ {
+ int type = token.type;
+ dfa->nodes[dfa->nodes_len].accept_mb =
+ (type == OP_PERIOD && dfa->mb_cur_max > 1) || type == COMPLEX_BRACKET;
+ }
+#endif
+ dfa->nexts[dfa->nodes_len] = REG_MISSING;
+ 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 inline re_hashval_t
+internal_function
+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 *
+internal_function
+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;
+#ifdef lint
+ /* Suppress bogus uninitialized-variable warnings. */
+ *err = REG_NOERROR;
+#endif
+ if (BE (nodes->nelem == 0, 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 (BE (new_state == NULL, 0))
+ *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 *
+internal_function
+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;
+#ifdef 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 (BE (new_state == NULL, 0))
+ *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
+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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (! re_node_set_insert_last (&newstate->non_eps_nodes, elem), 0))
+ return REG_ESPACE;
+ }
+
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+ if (BE (spot->alloc <= spot->num, 0))
+ {
+ Idx new_alloc = 2 * spot->num + 2;
+ re_dfastate_t **new_array = re_realloc (spot->array, re_dfastate_t *,
+ new_alloc);
+ if (BE (new_array == NULL, 0))
+ 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 independ of contexts.
+ Return the new state if succeeded, otherwise return NULL. */
+
+static re_dfastate_t *
+internal_function
+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 (BE (newstate == NULL, 0))
+ return NULL;
+ err = re_node_set_init_copy (&newstate->nodes, nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ 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 (BE (err != REG_NOERROR, 0))
+ {
+ 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 *
+internal_function
+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 (BE (newstate == NULL, 0))
+ return NULL;
+ err = re_node_set_init_copy (&newstate->nodes, nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_free (newstate);
+ return NULL;
+ }
+
+ newstate->context = context;
+ newstate->entrance_nodes = &newstate->nodes;
+
+ for (i = 0 ; i < nodes->nelem ; i++)
+ {
+ unsigned int constraint = 0;
+ re_token_t *node = dfa->nodes + nodes->elems[i];
+ re_token_type_t type = node->type;
+ if (node->constraint)
+ 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;
+ else if (type == ANCHOR)
+ constraint = node->opr.ctx_type;
+
+ if (constraint)
+ {
+ if (newstate->entrance_nodes == &newstate->nodes)
+ {
+ newstate->entrance_nodes = re_malloc (re_node_set, 1);
+ if (BE (newstate->entrance_nodes == NULL, 0))
+ {
+ free_state (newstate);
+ return NULL;
+ }
+ re_node_set_init_copy (newstate->entrance_nodes, nodes);
+ 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 (BE (err != REG_NOERROR, 0))
+ {
+ 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..9bbc6ac
--- /dev/null
+++ b/lib/regex_internal.h
@@ -0,0 +1,857 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _REGEX_INTERNAL_H
+#define _REGEX_INTERNAL_H 1
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <langinfo.h>
+#else
+# include "localcharset.h"
+#endif
+#if defined HAVE_LOCALE_H || defined _LIBC
+# include <locale.h>
+#endif
+
+#include <wchar.h>
+#include <wctype.h>
+#include <stdint.h>
+#if defined _LIBC
+# include <bits/libc-lock.h>
+#else
+# define __libc_lock_init(NAME) do { } while (0)
+# define __libc_lock_lock(NAME) do { } while (0)
+# define __libc_lock_unlock(NAME) do { } while (0)
+#endif
+
+/* In case that the system doesn't have isblank(). */
+#if !defined _LIBC && !HAVE_DECL_ISBLANK && !defined isblank
+# define isblank(ch) ((ch) == ' ' || (ch) == '\t')
+#endif
+
+#ifdef _LIBC
+# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
+# define _RE_DEFINE_LOCALE_FUNCTIONS 1
+# include <locale/localeinfo.h>
+# include <locale/elem-hash.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) \
+ INTUSE(__dcgettext) (_libc_intl_domainname, msgid, LC_MESSAGES)
+# endif
+#else
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef gettext_noop
+/* This define is so xgettext can find the internationalizable
+ strings. */
+# define gettext_noop(String) String
+#endif
+
+/* For loser systems without the definition. */
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#if (defined MB_CUR_MAX && HAVE_LOCALE_H && HAVE_WCTYPE_H && HAVE_ISWCTYPE && HAVE_WCRTOMB && HAVE_MBRTOWC && HAVE_WCSCOLL) || _LIBC
+# define RE_ENABLE_I18N
+#endif
+
+#if __GNUC__ >= 3
+# define BE(expr, val) __builtin_expect (expr, val)
+#else
+# define BE(expr, val) (expr)
+# ifdef _LIBC
+# define inline
+# endif
+#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
+# define __wctype wctype
+# define __iswctype iswctype
+# define __btowc btowc
+# define __wcrtomb wcrtomb
+# define __regfree regfree
+# define attribute_hidden
+#endif /* not _LIBC */
+
+#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
+# define __attribute(arg) __attribute__ (arg)
+#else
+# define __attribute(arg)
+#endif
+
+typedef __re_idx_t Idx;
+
+/* Special return value for failure to match. */
+#define REG_MISSING ((Idx) -1)
+
+/* Special return value for internal error. */
+#define REG_ERROR ((Idx) -2)
+
+/* Test whether N is a valid index, and is not one of the above. */
+#ifdef _REGEX_LARGE_OFFSETS
+# define REG_VALID_INDEX(n) ((Idx) (n) < REG_ERROR)
+#else
+# define REG_VALID_INDEX(n) (0 <= (n))
+#endif
+
+/* Test whether N is a valid nonzero index. */
+#ifdef _REGEX_LARGE_OFFSETS
+# define REG_VALID_NONZERO_INDEX(n) ((Idx) ((n) - 1) < (Idx) (REG_ERROR - 1))
+#else
+# define REG_VALID_NONZERO_INDEX(n) (0 < (n))
+#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. For portability to hosts with
+ padding bits, do not use '(sizeof (bitset_word_t) * CHAR_BIT)';
+ instead, deduce it directly from BITSET_WORD_MAX. Avoid
+ greater-than-32-bit integers and unconditional shifts by more than
+ 31 bits, as they're not portable. */
+#if BITSET_WORD_MAX == 0xffffffff
+# define BITSET_WORD_BITS 32
+#elif BITSET_WORD_MAX >> 31 >> 5 == 1
+# define BITSET_WORD_BITS 36
+#elif BITSET_WORD_MAX >> 31 >> 16 == 1
+# define BITSET_WORD_BITS 48
+#elif BITSET_WORD_MAX >> 31 >> 28 == 1
+# define BITSET_WORD_BITS 60
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 1 == 1
+# define BITSET_WORD_BITS 64
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 9 == 1
+# define BITSET_WORD_BITS 72
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 3 == 1
+# define BITSET_WORD_BITS 128
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 == 1
+# define BITSET_WORD_BITS 256
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 > 1
+# define BITSET_WORD_BITS 257 /* any value > SBC_MAX will do here */
+# if BITSET_WORD_BITS <= SBC_MAX
+# error "Invalid SBC_MAX"
+# endif
+#elif BITSET_WORD_MAX == (0xffffffff + 2) * 0xffffffff
+/* Work around a bug in 64-bit PGC (before version 6.1-2), where the
+ preprocessor mishandles large unsigned values as if they were signed. */
+# define BITSET_WORD_BITS 64
+#else
+# error "Add case for new bitset_word_t size"
+#endif
+
+/* 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 && !__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
+# ifdef __i386__
+# define internal_function __attribute ((regparm (3), stdcall))
+# else
+# define internal_function
+# endif
+#endif
+
+static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
+ Idx new_buf_len)
+ internal_function;
+#ifdef RE_ENABLE_I18N
+static void build_wcs_buffer (re_string_t *pstr) internal_function;
+static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr)
+ internal_function;
+#endif /* RE_ENABLE_I18N */
+static void build_upper_buffer (re_string_t *pstr) internal_function;
+static void re_string_translate_buffer (re_string_t *pstr) internal_function;
+static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
+ int eflags)
+ internal_function __attribute ((pure));
+#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))
+
+#include <alloca.h>
+
+#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
+# endif
+#endif
+
+#ifndef MAX
+# define MAX(a,b) ((a) < (b) ? (b) : (a))
+#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;
+ char more;
+ char unused;
+ unsigned short int eps_reachable_subexps_map;
+};
+
+typedef struct
+{
+ /* The string object corresponding to the input string. */
+ re_string_t input;
+#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+ const re_dfa_t *const dfa;
+#else
+ const re_dfa_t *dfa;
+#endif
+ /* 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
+#ifdef _LIBC
+ __libc_lock_define (, lock)
+#endif
+};
+
+#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;
+
+
+/* Inline 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
+/* Inline functions for re_string. */
+static inline int
+internal_function __attribute ((pure))
+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 inline wint_t
+internal_function __attribute ((pure))
+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];
+}
+
+static int
+internal_function __attribute ((pure))
+re_string_elem_size_at (const re_string_t *pstr, Idx idx)
+{
+# ifdef _LIBC
+ const unsigned char *p, *extra;
+ const int32_t *table, *indirect;
+ int32_t tmp;
+# include <locale/weight.h>
+ 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;
+ tmp = findidx (&p);
+ return p - pstr->mbs - idx;
+ }
+ else
+# endif /* _LIBC */
+ return 1;
+}
+#endif /* RE_ENABLE_I18N */
+
+#endif /* _REGEX_INTERNAL_H */
diff --git a/lib/regexec.c b/lib/regexec.c
new file mode 100644
index 0000000..b136570
--- /dev/null
+++ b/lib/regexec.c
@@ -0,0 +1,4399 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
+ Idx n) internal_function;
+static void match_ctx_clean (re_match_context_t *mctx) internal_function;
+static void match_ctx_free (re_match_context_t *cache) internal_function;
+static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, Idx node,
+ Idx str_idx, Idx from, Idx to)
+ internal_function;
+static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx)
+ internal_function;
+static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, Idx node,
+ Idx str_idx) internal_function;
+static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop,
+ Idx node, Idx str_idx)
+ internal_function;
+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)
+ internal_function;
+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) internal_function;
+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) internal_function;
+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) internal_function;
+static unsigned int re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
+ Idx nregs, int regs_allocated)
+ internal_function;
+static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx)
+ internal_function;
+static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,
+ Idx *p_match_first) internal_function;
+static Idx check_halt_state_context (const re_match_context_t *mctx,
+ const re_dfastate_t *state, Idx idx)
+ internal_function;
+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) internal_function;
+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)
+ internal_function;
+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) internal_function;
+static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs)
+ internal_function;
+
+#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)
+ internal_function;
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t sift_states_backward (const re_match_context_t *mctx,
+ re_sift_context_t *sctx)
+ internal_function;
+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)
+ internal_function;
+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)
+ internal_function;
+static reg_errcode_t add_epsilon_src_nodes (const re_dfa_t *dfa,
+ re_node_set *dest_nodes,
+ const re_node_set *candidates)
+ internal_function;
+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) internal_function;
+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)
+ internal_function;
+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) internal_function;
+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) internal_function;
+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)
+ internal_function;
+static reg_errcode_t merge_state_array (const re_dfa_t *dfa,
+ re_dfastate_t **dst,
+ re_dfastate_t **src, Idx num)
+ internal_function;
+static re_dfastate_t *find_recover_state (reg_errcode_t *err,
+ re_match_context_t *mctx) internal_function;
+static re_dfastate_t *transit_state (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *state) internal_function;
+static re_dfastate_t *merge_state_with_log (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *next_state)
+ internal_function;
+static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx,
+ re_node_set *cur_nodes,
+ Idx str_idx) internal_function;
+#if 0
+static re_dfastate_t *transit_state_sb (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *pstate)
+ internal_function;
+#endif
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t transit_state_mb (re_match_context_t *mctx,
+ re_dfastate_t *pstate)
+ internal_function;
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t transit_state_bkref (re_match_context_t *mctx,
+ const re_node_set *nodes)
+ internal_function;
+static reg_errcode_t get_subexp (re_match_context_t *mctx,
+ Idx bkref_node, Idx bkref_str_idx)
+ internal_function;
+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)
+ internal_function;
+static Idx find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
+ Idx subexp_idx, int type) internal_function;
+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) internal_function;
+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)
+ internal_function;
+static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa,
+ re_node_set *cur_nodes,
+ Idx ex_subexp, int type)
+ internal_function;
+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) internal_function;
+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)
+ internal_function;
+static bool build_trtable (const re_dfa_t *dfa,
+ re_dfastate_t *state) internal_function;
+#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)
+ internal_function;
+# ifdef _LIBC
+static unsigned int find_collation_sequence_value (const unsigned char *mbs,
+ size_t name_len)
+ internal_function;
+# 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) internal_function;
+static bool check_node_accept (const re_match_context_t *mctx,
+ const re_token_t *node, Idx idx)
+ internal_function;
+static reg_errcode_t extend_buffers (re_match_context_t *mctx)
+ internal_function;
+
+/* 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 (preg, string, nmatch, pmatch, eflags)
+ const regex_t *_Restrict_ preg;
+ const char *_Restrict_ string;
+ size_t nmatch;
+ regmatch_t pmatch[_Restrict_arr_];
+ int eflags;
+{
+ reg_errcode_t err;
+ Idx start, length;
+#ifdef _LIBC
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+#endif
+
+ 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);
+ }
+
+ __libc_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);
+ __libc_lock_unlock (dfa->lock);
+ return err != REG_NOERROR;
+}
+
+#ifdef _LIBC
+# 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 (bufp, string, length, start, regs)
+ struct re_pattern_buffer *bufp;
+ const char *string;
+ Idx length, 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 (bufp, string, length, start, range, regs)
+ struct re_pattern_buffer *bufp;
+ const char *string;
+ Idx length, 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 (bufp, string1, length1, string2, length2, start, regs, stop)
+ struct re_pattern_buffer *bufp;
+ const char *string1, *string2;
+ Idx length1, length2, start, stop;
+ struct re_registers *regs;
+{
+ 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 (bufp, string1, length1, string2, length2, start, range, regs, stop)
+ struct re_pattern_buffer *bufp;
+ const char *string1, *string2;
+ Idx length1, length2, start, stop;
+ regoff_t range;
+ struct re_registers *regs;
+{
+ 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
+internal_function
+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 = length1 + length2;
+ char *s = NULL;
+
+ if (BE (length1 < 0 || length2 < 0 || stop < 0 || len < length1, 0))
+ return -2;
+
+ /* Concatenate the strings. */
+ if (length2 > 0)
+ if (length1 > 0)
+ {
+ s = re_malloc (char, len);
+
+ if (BE (s == NULL, 0))
+ 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
+internal_function
+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;
+#ifdef _LIBC
+ re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
+#endif
+ Idx last_start = start + range;
+
+ /* Check for out-of-range. */
+ if (BE (start < 0 || start > length, 0))
+ return -1;
+ if (BE (length < last_start || (0 <= range && last_start < start), 0))
+ last_start = length;
+ else if (BE (last_start < 0 || (range < 0 && start <= last_start), 0))
+ last_start = 0;
+
+ __libc_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 (BE (bufp->no_sub, 0))
+ regs = NULL;
+
+ /* We need at least 1 register. */
+ if (regs == NULL)
+ nregs = 1;
+ else if (BE (bufp->regs_allocated == REGS_FIXED
+ && regs->num_regs <= bufp->re_nsub, 0))
+ {
+ nregs = regs->num_regs;
+ if (BE (nregs < 1, 0))
+ {
+ /* Nothing can be copied to regs. */
+ regs = NULL;
+ nregs = 1;
+ }
+ }
+ else
+ nregs = bufp->re_nsub + 1;
+ pmatch = re_malloc (regmatch_t, nregs);
+ if (BE (pmatch == NULL, 0))
+ {
+ 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 ther regs with -1's when no match was found. */
+ if (result != REG_NOERROR)
+ rval = -1;
+ 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 (BE (bufp->regs_allocated == REGS_UNALLOCATED, 0))
+ rval = -2;
+ }
+
+ if (BE (rval == 0, 1))
+ {
+ if (ret_len)
+ {
+ assert (pmatch[0].rm_so == start);
+ rval = pmatch[0].rm_eo - start;
+ }
+ else
+ rval = pmatch[0].rm_so;
+ }
+ re_free (pmatch);
+ out:
+ __libc_lock_unlock (dfa->lock);
+ return rval;
+}
+
+static unsigned int
+internal_function
+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 (BE (regs->start == NULL, 0))
+ return REGS_UNALLOCATED;
+ regs->end = re_malloc (regoff_t, need_regs);
+ if (BE (regs->end == NULL, 0))
+ {
+ 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 (BE (need_regs > regs->num_regs, 0))
+ {
+ regoff_t *new_start = re_realloc (regs->start, regoff_t, need_regs);
+ regoff_t *new_end;
+ if (BE (new_start == NULL, 0))
+ return REGS_UNALLOCATED;
+ new_end = re_realloc (regs->end, regoff_t, need_regs);
+ if (BE (new_end == NULL, 0))
+ {
+ re_free (new_start);
+ return REGS_UNALLOCATED;
+ }
+ regs->start = new_start;
+ regs->end = new_end;
+ regs->num_regs = need_regs;
+ }
+ }
+ else
+ {
+ assert (regs_allocated == REGS_FIXED);
+ /* This function may not be called with REGS_FIXED and nregs too big. */
+ assert (regs->num_regs >= nregs);
+ 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 (bufp, regs, num_regs, starts, ends)
+ struct re_pattern_buffer *bufp;
+ struct re_registers *regs;
+ __re_size_t num_regs;
+ regoff_t *starts, *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 (s)
+ 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
+internal_function
+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 = (const re_dfa_t *) preg->buffer;
+ Idx left_lim, right_lim;
+ int incr;
+ bool fl_longest_match;
+ int match_kind;
+ Idx match_first;
+ Idx match_last = REG_MISSING;
+ Idx extra_nmatch;
+ bool sb;
+ int ch;
+#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+ re_match_context_t mctx = { .dfa = dfa };
+#else
+ re_match_context_t mctx;
+#endif
+ char *fastmap = ((preg->fastmap != NULL && preg->fastmap_accurate
+ && start != last_start && !preg->can_be_null)
+ ? preg->fastmap : NULL);
+ RE_TRANSLATE_TYPE t = preg->translate;
+
+#if !(defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
+ memset (&mctx, '\0', sizeof (re_match_context_t));
+ mctx.dfa = dfa;
+#endif
+
+ extra_nmatch = (nmatch > preg->re_nsub) ? nmatch - (preg->re_nsub + 1) : 0;
+ nmatch -= extra_nmatch;
+
+ /* Check if the DFA haven't been compiled. */
+ if (BE (preg->used == 0 || dfa->init_state == NULL
+ || dfa->init_state_word == NULL || dfa->init_state_nl == NULL
+ || dfa->init_state_begbuf == NULL, 0))
+ return REG_NOMATCH;
+
+#ifdef DEBUG
+ /* We assume front-end functions already check them. */
+ assert (0 <= last_start && last_start <= length);
+#endif
+
+ /* 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, dfa);
+ if (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= mctx.input.bufs_len, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+
+ mctx.state_log = re_malloc (re_dfastate_t *, mctx.input.bufs_len + 1);
+ if (BE (mctx.state_log == NULL, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ }
+ else
+ mctx.state_log = NULL;
+
+ match_first = start;
+ mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+ : CONTEXT_NEWLINE | CONTEXT_BEGBUF;
+
+ /* Check incrementally whether of not the input string match. */
+ 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 (BE (match_first < right_lim, 1)
+ && !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 (BE (match_first < right_lim, 1)
+ && !fastmap[(unsigned char) string[match_first]])
+ ++match_first;
+
+ forward_match_found_start_or_reached_end:
+ if (BE (match_first == right_lim, 0))
+ {
+ 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 (BE (offset >= (__re_size_t) mctx.input.valid_raw_len, 0))
+ {
+ err = re_string_reconstruct (&mctx.input, match_first,
+ eflags);
+ if (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 != REG_MISSING)
+ {
+ if (BE (match_last == REG_ERROR, 0))
+ {
+ 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 (BE (err != REG_NOMATCH, 0))
+ goto free_return;
+ match_last = REG_MISSING;
+ }
+ else
+ break; /* We found a match. */
+ }
+ }
+
+ match_ctx_clean (&mctx);
+ }
+
+#ifdef DEBUG
+ assert (match_last != REG_MISSING);
+ assert (err == REG_NOERROR);
+#endif
+
+ /* 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 (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+
+ /* At last, add the offset to the each registers, since we slided
+ 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 (BE (mctx.input.offsets_needed != 0, 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
+ 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
+internal_function
+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;
+#ifdef DEBUG
+ assert (mctx->state_log != NULL);
+#endif
+ match_last = mctx->match_last;
+ halt_node = mctx->last_node;
+
+ /* Avoid overflow. */
+ if (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= match_last, 0))
+ return REG_ESPACE;
+
+ sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
+ if (BE (sifted_states == NULL, 0))
+ {
+ ret = REG_ESPACE;
+ goto free_return;
+ }
+ if (dfa->nbackref)
+ {
+ lim_states = re_malloc (re_dfastate_t *, match_last + 1);
+ if (BE (lim_states == NULL, 0))
+ {
+ 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 (BE (ret != REG_NOERROR, 0))
+ goto free_return;
+ if (sifted_states[0] != NULL || lim_states[0] != NULL)
+ break;
+ do
+ {
+ --match_last;
+ if (! REG_VALID_INDEX (match_last))
+ {
+ 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 (BE (ret != REG_NOERROR, 0))
+ 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 (BE (ret != REG_NOERROR, 0))
+ 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)) internal_function
+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 REG_MISSING if
+ there is no match, and return REG_ERROR 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 assume that the maching starts from the current
+ index of the buffer. */
+
+static Idx
+internal_function
+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 = REG_MISSING;
+ 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 (BE (cur_state == NULL, 0))
+ {
+ assert (err == REG_ESPACE);
+ return REG_ERROR;
+ }
+
+ 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 (BE (dfa->nbackref, 0))
+ {
+ at_init_state = false;
+ err = check_subexp_matching_top (mctx, &cur_state->nodes, 0);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ if (cur_state->has_backref)
+ {
+ err = transit_state_bkref (mctx, &cur_state->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ }
+
+ /* If the RE accepts NULL string. */
+ if (BE (cur_state->halt, 0))
+ {
+ 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 (BE (next_char_idx >= mctx->input.bufs_len, 0)
+ || (BE (next_char_idx >= mctx->input.valid_len, 0)
+ && mctx->input.valid_len < mctx->input.len))
+ {
+ err = extend_buffers (mctx);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ assert (err == REG_ESPACE);
+ return REG_ERROR;
+ }
+ }
+
+ 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 (BE (err != REG_NOERROR, 0))
+ return REG_ERROR;
+
+ if (mctx->state_log == NULL
+ || (match && !fl_longest_match)
+ || (cur_state = find_recover_state (&err, mctx)) == NULL)
+ break;
+ }
+
+ if (BE (at_init_state, 0))
+ {
+ 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
+internal_function
+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
+internal_function
+check_halt_state_context (const re_match_context_t *mctx,
+ const re_dfastate_t *state, Idx idx)
+{
+ Idx i;
+ unsigned int context;
+#ifdef DEBUG
+ assert (state->halt);
+#endif
+ 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 REG_MISSING in case of errors. */
+
+static Idx
+internal_function
+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 (BE (! ok, 0))
+ return REG_ERROR;
+ /* Pick up a valid destination, or return REG_MISSING if none
+ is found. */
+ for (dest_node = REG_MISSING, i = 0; i < edests->nelem; ++i)
+ {
+ Idx candidate = edests->elems[i];
+ if (!re_node_set_contains (cur_nodes, candidate))
+ continue;
+ if (dest_node == REG_MISSING)
+ 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 REG_ERROR;
+
+ /* 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;
+ naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so;
+ if (fs != NULL)
+ {
+ if (regs[subexp_idx].rm_so == -1 || regs[subexp_idx].rm_eo == -1)
+ return REG_MISSING;
+ else if (naccepted)
+ {
+ char *buf = (char *) re_string_get_buffer (&mctx->input);
+ if (memcmp (buf + regs[subexp_idx].rm_so, buf + *pidx,
+ naccepted) != 0)
+ return REG_MISSING;
+ }
+ }
+
+ if (naccepted == 0)
+ {
+ Idx dest_node;
+ ok = re_node_set_insert (eps_via_nodes, node);
+ if (BE (! ok, 0))
+ return REG_ERROR;
+ 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 REG_MISSING;
+ re_node_set_empty (eps_via_nodes);
+ return dest_node;
+ }
+ }
+ return REG_MISSING;
+}
+
+static reg_errcode_t
+internal_function
+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 = realloc (fs->stack, (sizeof (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
+internal_function
+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;
+ assert (REG_VALID_INDEX (num));
+ *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
+internal_function
+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 = (const re_dfa_t *) 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;
+
+#ifdef DEBUG
+ assert (nmatch > 1);
+ assert (mctx->state_log != NULL);
+#endif
+ 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 (BE (! REG_VALID_INDEX (cur_node), 0))
+ {
+ if (BE (cur_node == REG_ERROR, 0))
+ {
+ 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
+internal_function
+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
+internal_function
+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
+internal_function
+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;
+
+#ifdef DEBUG
+ assert (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL);
+#endif
+
+ /* 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 (BE (err != REG_NOERROR, 0))
+ return err;
+ err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
+ if (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ err = REG_NOERROR;
+ free_return:
+ re_node_set_free (&cur_dest);
+ return err;
+}
+
+static reg_errcode_t
+internal_function
+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;
+
+#ifdef DEBUG
+ re_token_type_t type = dfa->nodes[prev_node].type;
+ assert (!IS_EPSILON_NODE (type));
+#endif
+#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 (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+
+ return REG_NOERROR;
+}
+
+/* Helper functions. */
+
+static reg_errcode_t
+internal_function
+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
+ || (next_state_log_idx >= mctx->input.valid_len
+ && mctx->input.valid_len < mctx->input.len))
+ {
+ reg_errcode_t err;
+ err = extend_buffers (mctx);
+ if (BE (err != REG_NOERROR, 0))
+ 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
+internal_function
+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 (BE (err != REG_NOERROR, 0))
+ return err;
+ dst[st_idx] = re_acquire_state (&err, dfa, &merged_set);
+ re_node_set_free (&merged_set);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function
+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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+
+ sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ if (candidates && mctx->state_log[str_idx]->has_backref)
+ {
+ err = sift_states_bkref (mctx, sctx, str_idx, candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function
+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 (BE (err != REG_NOERROR, 0))
+ return err;
+
+ if (!state->inveclosure.alloc)
+ {
+ err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem);
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ESPACE;
+ for (i = 0; i < dest_nodes->nelem; i++)
+ re_node_set_merge (&state->inveclosure,
+ dfa->inveclosures + dest_nodes->elems[i]);
+ }
+ return re_node_set_add_intersect (dest_nodes, candidates,
+ &state->inveclosure);
+}
+
+static reg_errcode_t
+internal_function
+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] : REG_MISSING);
+ if ((!re_node_set_contains (inv_eclosure, edst1)
+ && re_node_set_contains (dest_nodes, edst1))
+ || (REG_VALID_NONZERO_INDEX (edst2)
+ && !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 (BE (err != REG_NOERROR, 0))
+ {
+ 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
+internal_function
+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
+internal_function
+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 != REG_MISSING)
+ {
+ 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
+internal_function
+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
+internal_function
+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 = REG_MISSING;
+ Idx cls_node = REG_MISSING;
+ 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 (REG_VALID_INDEX (ops_node))
+ {
+ err = sub_epsilon_src_nodes (dfa, ops_node, dest_nodes,
+ candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ /* Check the limitation of the close subexpression. */
+ if (REG_VALID_INDEX (cls_node))
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function
+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 == REG_MISSING)
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (! ok, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ cur_state = local_sctx.sifted_states[str_idx];
+ err = sift_states_backward (mctx, &local_sctx);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ if (sctx->limited_states != NULL)
+ {
+ err = merge_state_array (dfa, sctx->limited_states,
+ local_sctx.sifted_states,
+ str_idx + 1);
+ if (BE (err != REG_NOERROR, 0))
+ 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
+internal_function
+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
+ could'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 *
+internal_function
+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 (BE (state->accept_mb, 0))
+ {
+ *err = transit_state_mb (mctx, state);
+ if (BE (*err != REG_NOERROR, 0))
+ 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 (BE (trtable != NULL, 1))
+ return trtable[ch];
+
+ trtable = state->word_trtable;
+ if (BE (trtable != NULL, 1))
+ {
+ 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 *
+internal_function
+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 (BE (*err != REG_NOERROR, 0))
+ 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 (BE (dfa->nbackref, 0) && 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 (BE (*err != REG_NOERROR, 0))
+ return NULL;
+
+ /* If the next state has back references. */
+ if (next_state->has_backref)
+ {
+ *err = transit_state_bkref (mctx, &next_state->nodes);
+ if (BE (*err != REG_NOERROR, 0))
+ 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 *
+internal_function
+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
+ correspoding back references. */
+
+static reg_errcode_t
+internal_function
+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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (*err != REG_NOERROR, 0))
+ 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 (BE (*err != REG_NOERROR, 0))
+ {
+ 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
+internal_function
+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 (BE (err != REG_NOERROR, 0))
+ return err;
+#ifdef DEBUG
+ assert (dfa->nexts[cur_node_idx] != REG_MISSING);
+#endif
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (mctx->state_log[dest_idx] == NULL && err != REG_NOERROR, 0))
+ return err;
+ }
+ return REG_NOERROR;
+}
+#endif /* RE_ENABLE_I18N */
+
+static reg_errcode_t
+internal_function
+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 (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+ /* And add the epsilon closures (which is `new_dest_nodes') of
+ the backreference to appropriate state_log. */
+#ifdef DEBUG
+ assert (dfa->nexts[node_idx] != REG_MISSING);
+#endif
+ 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 (BE (mctx->state_log[dest_str_idx] == NULL
+ && err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ {
+ 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 (BE (mctx->state_log[dest_str_idx] == NULL
+ && err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ err = transit_state_bkref (mctx, new_dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ 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
+internal_function
+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 != REG_MISSING)
+ {
+ 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 (BE (bkref_str_off + sl_str_diff > mctx->input.valid_len, 0))
+ {
+ /* 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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (bkref_str_off >= mctx->input.valid_len, 0))
+ {
+ /* If we are at the end of the input, we cannot match. */
+ if (bkref_str_off >= mctx->input.len)
+ break;
+
+ err = extend_buffers (mctx);
+ if (BE (err != REG_NOERROR, 0))
+ 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 == REG_MISSING)
+ 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 (BE (err != REG_NOERROR, 0))
+ return err;
+ sub_last = match_ctx_add_sublast (sub_top, cls_node, sl_str);
+ if (BE (sub_last == NULL, 0))
+ return REG_ESPACE;
+ err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
+ bkref_str_idx);
+ if (err == REG_NOMATCH)
+ continue;
+ }
+ }
+ 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
+internal_function
+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 (BE (err != REG_NOERROR, 0))
+ 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
+internal_function
+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 REG_MISSING;
+}
+
+/* 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
+internal_function
+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 (BE (path->alloc < last_str + mctx->max_mb_elem_len + 1, 0))
+ {
+ re_dfastate_t **new_array;
+ Idx old_alloc = path->alloc;
+ Idx new_alloc = old_alloc + last_str + mctx->max_mb_elem_len + 1;
+ if (BE (new_alloc < old_alloc, 0)
+ || BE (SIZE_MAX / sizeof (re_dfastate_t *) < new_alloc, 0))
+ return REG_ESPACE;
+ new_array = re_realloc (path->array, re_dfastate_t *, new_alloc);
+ if (BE (new_array == NULL, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ return err;
+ err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ 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 (BE (err != REG_NOERROR, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
+ if (BE (cur_state == NULL && err != REG_NOERROR, 0))
+ {
+ 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 (BE (err != REG_NOERROR, 0))
+ {
+ 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 (BE (err != REG_NOERROR, 0))
+ {
+ 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 (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ err = expand_bkref_cache (mctx, &next_nodes, str_idx,
+ subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ 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 (BE (cur_state == NULL && err != REG_NOERROR, 0))
+ {
+ 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
+internal_function
+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;
+ reg_errcode_t err = REG_NOERROR;
+ 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];
+#ifdef DEBUG
+ re_token_type_t type = dfa->nodes[cur_node].type;
+ assert (!IS_EPSILON_NODE (type));
+#endif
+#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 (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&union_set);
+ return err;
+ }
+ }
+ ok = re_node_set_insert (&union_set, next_node);
+ if (BE (! ok, 0))
+ {
+ re_node_set_free (&union_set);
+ return REG_ESPACE;
+ }
+ mctx->state_log[next_idx] = re_acquire_state (&err, dfa,
+ &union_set);
+ if (BE (mctx->state_log[next_idx] == NULL
+ && err != REG_NOERROR, 0))
+ {
+ 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 (BE (! ok, 0))
+ {
+ 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
+internal_function
+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;
+#ifdef DEBUG
+ assert (cur_nodes->nelem);
+#endif
+ err = re_node_set_alloc (&new_nodes, cur_nodes->nelem);
+ if (BE (err != REG_NOERROR, 0))
+ 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 == REG_MISSING)
+ {
+ /* There are no problematic nodes, just merge them. */
+ err = re_node_set_merge (&new_nodes, eclosure);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ 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 (BE (err != REG_NOERROR, 0))
+ {
+ 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
+internal_function
+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 (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ break;
+ }
+ ok = re_node_set_insert (dst_nodes, cur_node);
+ if (BE (! ok, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ 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
+internal_function
+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 == REG_MISSING)
+ 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 (BE (err != REG_NOERROR || err2 != REG_NOERROR
+ || err3 != REG_NOERROR, 0))
+ {
+ 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 (BE (err != REG_NOERROR || ! ok, 0))
+ {
+ 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 (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set);
+ re_node_set_free (&union_set);
+ if (BE (mctx->state_log[to_idx] == NULL
+ && err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ while (ent++->more);
+ return REG_NOERROR;
+}
+
+/* Build transition table for the state.
+ Return true if successful. */
+
+static bool
+internal_function
+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 (BE (dests_alloc == NULL, 0))
+ return false;
+ dests_node_malloced = true;
+ }
+ dests_node = dests_alloc->dests_node;
+ dests_ch = dests_alloc->dests_ch;
+
+ /* Initialize transiton 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 (BE (! REG_VALID_NONZERO_INDEX (ndests), 0))
+ {
+ if (dests_node_malloced)
+ free (dests_alloc);
+ if (ndests == 0)
+ {
+ state->trtable = (re_dfastate_t **)
+ calloc (sizeof (re_dfastate_t *), SBC_MAX);
+ return true;
+ }
+ return false;
+ }
+
+ err = re_node_set_alloc (&follows, ndests + 1);
+ if (BE (err != REG_NOERROR, 0))
+ goto out_free;
+
+ /* Avoid arithmetic overflow in size calculation. */
+ if (BE ((((SIZE_MAX - (sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX)
+ / (3 * sizeof (re_dfastate_t *)))
+ < ndests),
+ 0))
+ 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_dfastate_t **)
+ malloc (ndests * 3 * sizeof (re_dfastate_t *));
+ if (BE (dest_states == NULL, 0))
+ {
+out_free:
+ if (dest_states_malloced)
+ 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)
+ 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 != REG_MISSING)
+ {
+ err = re_node_set_merge (&follows, dfa->eclosures + next_node);
+ if (BE (err != REG_NOERROR, 0))
+ goto out_free;
+ }
+ }
+ dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0);
+ if (BE (dest_states[i] == NULL && err != REG_NOERROR, 0))
+ 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 (BE (dest_states_word[i] == NULL && err != REG_NOERROR, 0))
+ 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 (BE (dest_states_nl[i] == NULL && err != REG_NOERROR, 0))
+ 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 (!BE (need_word_trtable, 0))
+ {
+ /* 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 (BE (trtable == NULL, 0))
+ 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 (BE (elem & 1, 0))
+ {
+ /* 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 (BE (trtable == NULL, 0))
+ 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 (BE (elem & 1, 0))
+ {
+ /* 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)
+ 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)
+ 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
+internal_function
+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 (BE (err != REG_NOERROR, 0))
+ goto error_return;
+ ++ndests;
+ }
+
+ /* Put the position in the current group. */
+ ok = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]);
+ if (BE (! ok, 0))
+ 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 (BE (err != REG_NOERROR, 0))
+ goto error_return;
+ ++ndests;
+ bitset_empty (accepts);
+ }
+ }
+ return ndests;
+ error_return:
+ for (j = 0; j < ndests; ++j)
+ re_node_set_free (dests_node + j);
+ return REG_MISSING;
+}
+
+#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. */
+
+static int
+internal_function
+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 (BE (node->type == OP_UTF8_PERIOD, 0))
+ {
+ unsigned char c = re_string_byte_at (input, str_idx), d;
+ if (BE (c < 0xc2, 1))
+ 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;
+ int32_t idx;
+ /* This #include defines a local function! */
+# include <locale/weight.h>
+
+ /* 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? */
+ 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);
+ idx = findidx (&cp);
+ if (idx > 0)
+ for (i = 0; i < cset->nequiv_classes; ++i)
+ {
+ int32_t equiv_class_idx = cset->equiv_classes[i];
+ size_t weight_len = weights[idx];
+ if (weight_len == weights[equiv_class_idx])
+ {
+ Idx cnt = 0;
+ while (cnt <= weight_len
+ && (weights[equiv_class_idx + 1 + cnt]
+ == weights[idx + 1 + cnt]))
+ ++cnt;
+ if (cnt > weight_len)
+ {
+ match_len = elem_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+ }
+ }
+ }
+ else
+# endif /* _LIBC */
+ {
+ /* match with range expression? */
+#if __GNUC__ >= 2 && ! (__STDC_VERSION__ < 199901L && __STRICT_ANSI__)
+ wchar_t cmp_buf[] = {L'\0', L'\0', wc, L'\0', L'\0', L'\0'};
+#else
+ wchar_t cmp_buf[] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
+ cmp_buf[2] = wc;
+#endif
+ for (i = 0; i < cset->nranges; ++i)
+ {
+ cmp_buf[0] = cset->range_starts[i];
+ cmp_buf[4] = cset->range_ends[i];
+ if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
+ && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+ {
+ 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
+internal_function
+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) * (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
+internal_function
+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
+internal_function
+extend_buffers (re_match_context_t *mctx)
+{
+ reg_errcode_t ret;
+ re_string_t *pstr = &mctx->input;
+
+ /* Avoid overflow. */
+ if (BE (SIZE_MAX / 2 / sizeof (re_dfastate_t *) <= pstr->bufs_len, 0))
+ return REG_ESPACE;
+
+ /* Double the lengthes of the buffers. */
+ ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
+ if (BE (ret != REG_NOERROR, 0))
+ 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 (BE (new_array == NULL, 0))
+ 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 (BE (ret != REG_NOERROR, 0))
+ 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
+internal_function
+match_ctx_init (re_match_context_t *mctx, int eflags, Idx n)
+{
+ mctx->eflags = eflags;
+ mctx->match_last = REG_MISSING;
+ if (n > 0)
+ {
+ /* Avoid overflow. */
+ size_t max_object_size =
+ MAX (sizeof (struct re_backref_cache_entry),
+ sizeof (re_sub_match_top_t *));
+ if (BE (SIZE_MAX / max_object_size < n, 0))
+ 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 (BE (mctx->bkref_ents == NULL || mctx->sub_tops == NULL, 0))
+ 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
+internal_function
+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);
+ }
+ free (top);
+ }
+
+ mctx->nsub_tops = 0;
+ mctx->nbkref_ents = 0;
+}
+
+/* Free all the memory associated with MCTX. */
+
+static void
+internal_function
+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
+internal_function
+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 (BE (new_entry == NULL, 0))
+ {
+ 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 REG_MISSING if none is
+ found. Note that MCTX->BKREF_ENTS is already sorted by MCTX->STR_IDX. */
+
+static Idx
+internal_function
+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 REG_MISSING;
+}
+
+/* Register the node NODE, whose type is OP_OPEN_SUBEXP, and which matches
+ at STR_IDX. */
+
+static reg_errcode_t
+internal_function
+match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx)
+{
+#ifdef DEBUG
+ assert (mctx->sub_tops != NULL);
+ assert (mctx->asub_tops > 0);
+#endif
+ if (BE (mctx->nsub_tops == mctx->asub_tops, 0))
+ {
+ 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 (BE (new_array == NULL, 0))
+ 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 (BE (mctx->sub_tops[mctx->nsub_tops] == NULL, 0))
+ 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 *
+internal_function
+match_ctx_add_sublast (re_sub_match_top_t *subtop, Idx node, Idx str_idx)
+{
+ re_sub_match_last_t *new_entry;
+ if (BE (subtop->nlasts == subtop->alasts, 0))
+ {
+ 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 (BE (new_array == NULL, 0))
+ return NULL;
+ subtop->lasts = new_array;
+ subtop->alasts = new_alasts;
+ }
+ new_entry = calloc (1, sizeof (re_sub_match_last_t));
+ if (BE (new_entry != NULL, 1))
+ {
+ subtop->lasts[subtop->nlasts] = new_entry;
+ new_entry->node = node;
+ new_entry->str_idx = str_idx;
+ ++subtop->nlasts;
+ }
+ return new_entry;
+}
+
+static void
+internal_function
+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/rmdir.c b/lib/rmdir.c
new file mode 100644
index 0000000..1221f4f
--- /dev/null
+++ b/lib/rmdir.c
@@ -0,0 +1,74 @@
+/* BSD compatible remove directory function for System V
+
+ Copyright (C) 1988, 1990, 1999, 2003, 2004, 2005, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+/* rmdir adapted from GNU tar. */
+
+/* Remove directory DIR.
+ Return 0 if successful, -1 if not. */
+
+int
+rmdir (char const *dir)
+{
+ pid_t cpid;
+ int status;
+ struct stat statbuf;
+
+ if (stat (dir, &statbuf) != 0)
+ return -1; /* errno already set */
+
+ if (!S_ISDIR (statbuf.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+
+ cpid = fork ();
+ switch (cpid)
+ {
+ case -1: /* cannot fork */
+ return -1; /* errno already set */
+
+ case 0: /* child process */
+ execl ("/bin/rmdir", "rmdir", dir, (char *) 0);
+ _exit (1);
+
+ default: /* parent process */
+
+ /* Wait for kid to finish. */
+
+ while (wait (&status) != cpid)
+ /* Do nothing. */ ;
+
+ if (status)
+ {
+
+ /* /bin/rmdir failed. */
+
+ errno = EIO;
+ return -1;
+ }
+ return 0;
+ }
+}
diff --git a/lib/rmt.h b/lib/rmt.h
new file mode 100644
index 0000000..9f96cdb
--- /dev/null
+++ b/lib/rmt.h
@@ -0,0 +1,99 @@
+/* Definitions for communicating with a remote tape drive.
+
+ Copyright (C) 1988, 1992, 1996, 1997, 2001, 2003, 2004 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+extern char *rmt_command;
+extern char *rmt_dev_name__;
+
+int rmt_open__ (const char *, int, int, const char *);
+int rmt_close__ (int);
+size_t rmt_read__ (int, char *, size_t);
+size_t rmt_write__ (int, char *, size_t);
+off_t rmt_lseek__ (int, off_t, int);
+int rmt_ioctl__ (int, int, char *);
+
+extern bool force_local_option;
+
+/* A filename is remote if it contains a colon not preceded by a slash,
+ to take care of `/:/' which is a shorthand for `/.../<CELL-NAME>/fs'
+ on machines running OSF's Distributing Computing Environment (DCE) and
+ Distributed File System (DFS). However, when --force-local, a
+ filename is never remote. */
+
+#define _remdev(dev_name) \
+ (!force_local_option && (rmt_dev_name__ = strchr (dev_name, ':')) \
+ && rmt_dev_name__ > (dev_name) \
+ && ! memchr (dev_name, '/', rmt_dev_name__ - (dev_name)))
+
+#define _isrmt(fd) \
+ ((fd) >= __REM_BIAS)
+
+#define __REM_BIAS (1 << 30)
+
+#ifndef O_CREAT
+# define O_CREAT 01000
+#endif
+
+#define rmtopen(dev_name, oflag, mode, command) \
+ (_remdev (dev_name) ? rmt_open__ (dev_name, oflag, __REM_BIAS, command) \
+ : open (dev_name, oflag, mode))
+
+#define rmtaccess(dev_name, amode) \
+ (_remdev (dev_name) ? 0 : access (dev_name, amode))
+
+#define rmtstat(dev_name, buffer) \
+ (_remdev (dev_name) ? (errno = EOPNOTSUPP), -1 : stat (dev_name, buffer))
+
+#define rmtcreat(dev_name, mode, command) \
+ (_remdev (dev_name) \
+ ? rmt_open__ (dev_name, 1 | O_CREAT, __REM_BIAS, command) \
+ : creat (dev_name, mode))
+
+#define rmtlstat(dev_name, muffer) \
+ (_remdev (dev_name) ? (errno = EOPNOTSUPP), -1 : lstat (dev_name, buffer))
+
+#define rmtread(fd, buffer, length) \
+ (_isrmt (fd) ? rmt_read__ (fd - __REM_BIAS, buffer, length) \
+ : safe_read (fd, buffer, length))
+
+#define rmtwrite(fd, buffer, length) \
+ (_isrmt (fd) ? rmt_write__ (fd - __REM_BIAS, buffer, length) \
+ : full_write (fd, buffer, length))
+
+#define rmtlseek(fd, offset, where) \
+ (_isrmt (fd) ? rmt_lseek__ (fd - __REM_BIAS, offset, where) \
+ : lseek (fd, offset, where))
+
+#define rmtclose(fd) \
+ (_isrmt (fd) ? rmt_close__ (fd - __REM_BIAS) : close (fd))
+
+#define rmtioctl(fd, request, argument) \
+ (_isrmt (fd) ? rmt_ioctl__ (fd - __REM_BIAS, request, argument) \
+ : ioctl (fd, request, argument))
+
+#define rmtdup(fd) \
+ (_isrmt (fd) ? (errno = EOPNOTSUPP), -1 : dup (fd))
+
+#define rmtfstat(fd, buffer) \
+ (_isrmt (fd) ? (errno = EOPNOTSUPP), -1 : fstat (fd, buffer))
+
+#define rmtfcntl(cd, command, argument) \
+ (_isrmt (fd) ? (errno = EOPNOTSUPP), -1 : fcntl (fd, command, argument))
+
+#define rmtisatty(fd) \
+ (_isrmt (fd) ? 0 : isatty (fd))
diff --git a/lib/rpmatch.c b/lib/rpmatch.c
new file mode 100644
index 0000000..e5f79f8
--- /dev/null
+++ b/lib/rpmatch.c
@@ -0,0 +1,79 @@
+/* Determine whether string value is affirmation or negative response
+ according to current locale's data.
+
+ Copyright (C) 1996, 1998, 2000, 2002, 2003, 2006 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#if ENABLE_NLS
+# include <sys/types.h>
+# include <limits.h>
+# include <regex.h>
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+
+static int
+try (const char *response, const char *pattern, const int match,
+ const int nomatch, const char **lastp, regex_t *re)
+{
+ if (pattern != *lastp)
+ {
+ /* The pattern has changed. */
+ if (*lastp)
+ {
+ /* Free the old compiled pattern. */
+ regfree (re);
+ *lastp = NULL;
+ }
+ /* Compile the pattern and cache it for future runs. */
+ if (regcomp (re, pattern, REG_EXTENDED) != 0)
+ return -1;
+ *lastp = pattern;
+ }
+
+ /* See if the regular expression matches RESPONSE. */
+ return regexec (re, response, 0, NULL, 0) == 0 ? match : nomatch;
+}
+#endif
+
+
+int
+rpmatch (const char *response)
+{
+#if ENABLE_NLS
+ /* Match against one of the response patterns, compiling the pattern
+ first if necessary. */
+
+ /* We cache the response patterns and compiled regexps here. */
+ static const char *yesexpr, *noexpr;
+ static regex_t yesre, nore;
+ int result;
+
+ return ((result = try (response, _("^[yY]"), 1, 0,
+ &yesexpr, &yesre))
+ ? result
+ : try (response, _("^[nN]"), 0, -1, &noexpr, &nore));
+#else
+ /* Test against "^[yY]" and "^[nN]", hardcoded to avoid requiring regex */
+ return (*response == 'y' || *response == 'Y' ? 1
+ : *response == 'n' || *response == 'N' ? 0 : -1);
+#endif
+}
diff --git a/lib/rtapelib.c b/lib/rtapelib.c
new file mode 100644
index 0000000..af19b04
--- /dev/null
+++ b/lib/rtapelib.c
@@ -0,0 +1,740 @@
+/* Functions for communicating with a remote tape drive.
+
+ Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2004,
+ 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* The man page rmt(8) for /etc/rmt documents the remote mag tape protocol
+ which rdump and rrestore use. Unfortunately, the man page is *WRONG*.
+ The author of the routines I'm including originally wrote his code just
+ based on the man page, and it didn't work, so he went to the rdump source
+ to figure out why. The only thing he had to change was to check for the
+ 'F' return code in addition to the 'E', and to separate the various
+ arguments with \n instead of a space. I personally don't think that this
+ is much of a problem, but I wanted to point it out. -- Arnold Robbins
+
+ Originally written by Jeff Lee, modified some by Arnold Robbins. Redone
+ as a library that can replace open, read, write, etc., by Fred Fish, with
+ some additional work by Arnold Robbins. Modified to make all rmt* calls
+ into macros for speed by Jay Fenlason. Use -DWITH_REXEC for rexec
+ code, courtesy of Dan Kegel. */
+
+#include "system.h"
+#include "system-ioctl.h"
+
+#include <safe-read.h>
+#include <full-write.h>
+
+/* Try hard to get EOPNOTSUPP defined. 486/ISC has it in net/errno.h,
+ 3B2/SVR3 has it in sys/inet.h. Otherwise, like on MSDOS, use EINVAL. */
+
+#ifndef EOPNOTSUPP
+# if HAVE_NET_ERRNO_H
+# include <net/errno.h>
+# endif
+# if HAVE_SYS_INET_H
+# include <sys/inet.h>
+# endif
+# ifndef EOPNOTSUPP
+# define EOPNOTSUPP EINVAL
+# endif
+#endif
+
+#include <signal.h>
+
+#if HAVE_NETDB_H
+# include <netdb.h>
+#endif
+
+#include <rmt.h>
+#include <rmt-command.h>
+
+/* Exit status if exec errors. */
+#define EXIT_ON_EXEC_ERROR 128
+
+/* FIXME: Size of buffers for reading and writing commands to rmt. */
+#define COMMAND_BUFFER_SIZE 64
+
+#ifndef RETSIGTYPE
+# define RETSIGTYPE void
+#endif
+
+/* FIXME: Maximum number of simultaneous remote tape connections. */
+#define MAXUNIT 4
+
+#define PREAD 0 /* read file descriptor from pipe() */
+#define PWRITE 1 /* write file descriptor from pipe() */
+
+/* Return the parent's read side of remote tape connection Fd. */
+#define READ_SIDE(Fd) (from_remote[Fd][PREAD])
+
+/* Return the parent's write side of remote tape connection Fd. */
+#define WRITE_SIDE(Fd) (to_remote[Fd][PWRITE])
+
+/* The pipes for receiving data from remote tape drives. */
+static int from_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}};
+
+/* The pipes for sending data to remote tape drives. */
+static int to_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}};
+
+char *rmt_command = DEFAULT_RMT_COMMAND;
+
+/* Temporary variable used by macros in rmt.h. */
+char *rmt_dev_name__;
+
+/* If true, always consider file names to be local, even if they contain
+ colons */
+bool force_local_option;
+
+
+
+/* Close remote tape connection HANDLE, and reset errno to ERRNO_VALUE. */
+static void
+_rmt_shutdown (int handle, int errno_value)
+{
+ close (READ_SIDE (handle));
+ close (WRITE_SIDE (handle));
+ READ_SIDE (handle) = -1;
+ WRITE_SIDE (handle) = -1;
+ errno = errno_value;
+}
+
+/* Attempt to perform the remote tape command specified in BUFFER on
+ remote tape connection HANDLE. Return 0 if successful, -1 on
+ error. */
+static int
+do_command (int handle, const char *buffer)
+{
+ /* Save the current pipe handler and try to make the request. */
+
+ size_t length = strlen (buffer);
+ RETSIGTYPE (*pipe_handler) () = signal (SIGPIPE, SIG_IGN);
+ ssize_t written = full_write (WRITE_SIDE (handle), buffer, length);
+ signal (SIGPIPE, pipe_handler);
+
+ if (written == length)
+ return 0;
+
+ /* Something went wrong. Close down and go home. */
+
+ _rmt_shutdown (handle, EIO);
+ return -1;
+}
+
+static char *
+get_status_string (int handle, char *command_buffer)
+{
+ char *cursor;
+ int counter;
+
+ /* Read the reply command line. */
+
+ for (counter = 0, cursor = command_buffer;
+ counter < COMMAND_BUFFER_SIZE;
+ counter++, cursor++)
+ {
+ if (safe_read (READ_SIDE (handle), cursor, 1) != 1)
+ {
+ _rmt_shutdown (handle, EIO);
+ return 0;
+ }
+ if (*cursor == '\n')
+ {
+ *cursor = '\0';
+ break;
+ }
+ }
+
+ if (counter == COMMAND_BUFFER_SIZE)
+ {
+ _rmt_shutdown (handle, EIO);
+ return 0;
+ }
+
+ /* Check the return status. */
+
+ for (cursor = command_buffer; *cursor; cursor++)
+ if (*cursor != ' ')
+ break;
+
+ if (*cursor == 'E' || *cursor == 'F')
+ {
+ /* Skip the error message line. */
+
+ /* FIXME: there is better to do than merely ignoring error messages
+ coming from the remote end. Translate them, too... */
+
+ {
+ char character;
+
+ while (safe_read (READ_SIDE (handle), &character, 1) == 1)
+ if (character == '\n')
+ break;
+ }
+
+ errno = atoi (cursor + 1);
+
+ if (*cursor == 'F')
+ _rmt_shutdown (handle, errno);
+
+ return 0;
+ }
+
+ /* Check for mis-synced pipes. */
+
+ if (*cursor != 'A')
+ {
+ _rmt_shutdown (handle, EIO);
+ return 0;
+ }
+
+ /* Got an `A' (success) response. */
+
+ return cursor + 1;
+}
+
+/* Read and return the status from remote tape connection HANDLE. If
+ an error occurred, return -1 and set errno. */
+static long int
+get_status (int handle)
+{
+ char command_buffer[COMMAND_BUFFER_SIZE];
+ const char *status = get_status_string (handle, command_buffer);
+ if (status)
+ {
+ long int result = atol (status);
+ if (0 <= result)
+ return result;
+ errno = EIO;
+ }
+ return -1;
+}
+
+static off_t
+get_status_off (int handle)
+{
+ char command_buffer[COMMAND_BUFFER_SIZE];
+ const char *status = get_status_string (handle, command_buffer);
+
+ if (! status)
+ return -1;
+ else
+ {
+ /* Parse status, taking care to check for overflow.
+ We can't use standard functions,
+ since off_t might be longer than long. */
+
+ off_t count = 0;
+ int negative;
+
+ for (; *status == ' ' || *status == '\t'; status++)
+ continue;
+
+ negative = *status == '-';
+ status += negative || *status == '+';
+
+ for (;;)
+ {
+ int digit = *status++ - '0';
+ if (9 < (unsigned) digit)
+ break;
+ else
+ {
+ off_t c10 = 10 * count;
+ off_t nc = negative ? c10 - digit : c10 + digit;
+ if (c10 / 10 != count || (negative ? c10 < nc : nc < c10))
+ return -1;
+ count = nc;
+ }
+ }
+
+ return count;
+ }
+}
+
+#if WITH_REXEC
+
+/* Execute /etc/rmt as user USER on remote system HOST using rexec.
+ Return a file descriptor of a bidirectional socket for stdin and
+ stdout. If USER is zero, use the current username.
+
+ By default, this code is not used, since it requires that the user
+ have a .netrc file in his/her home directory, or that the
+ application designer be willing to have rexec prompt for login and
+ password info. This may be unacceptable, and .rhosts files for use
+ with rsh are much more common on BSD systems. */
+static int
+_rmt_rexec (char *host, char *user)
+{
+ int saved_stdin = dup (STDIN_FILENO);
+ int saved_stdout = dup (STDOUT_FILENO);
+ struct servent *rexecserv;
+ int result;
+
+ /* When using cpio -o < filename, stdin is no longer the tty. But the
+ rexec subroutine reads the login and the passwd on stdin, to allow
+ remote execution of the command. So, reopen stdin and stdout on
+ /dev/tty before the rexec and give them back their original value
+ after. */
+
+ if (! freopen ("/dev/tty", "r", stdin))
+ freopen ("/dev/null", "r", stdin);
+ if (! freopen ("/dev/tty", "w", stdout))
+ freopen ("/dev/null", "w", stdout);
+
+ if (rexecserv = getservbyname ("exec", "tcp"), !rexecserv)
+ error (EXIT_ON_EXEC_ERROR, 0, _("exec/tcp: Service not available"));
+
+ result = rexec (&host, rexecserv->s_port, user, 0, rmt_command, 0);
+ if (fclose (stdin) == EOF)
+ error (0, errno, _("stdin"));
+ fdopen (saved_stdin, "r");
+ if (fclose (stdout) == EOF)
+ error (0, errno, _("stdout"));
+ fdopen (saved_stdout, "w");
+
+ return result;
+}
+
+#endif /* WITH_REXEC */
+
+/* Place into BUF a string representing OFLAG, which must be suitable
+ as argument 2 of `open'. BUF must be large enough to hold the
+ result. This function should generate a string that decode_oflag
+ can parse. */
+static void
+encode_oflag (char *buf, int oflag)
+{
+ sprintf (buf, "%d ", oflag);
+
+ switch (oflag & O_ACCMODE)
+ {
+ case O_RDONLY: strcat (buf, "O_RDONLY"); break;
+ case O_RDWR: strcat (buf, "O_RDWR"); break;
+ case O_WRONLY: strcat (buf, "O_WRONLY"); break;
+ default: abort ();
+ }
+
+#ifdef O_APPEND
+ if (oflag & O_APPEND) strcat (buf, "|O_APPEND");
+#endif
+ if (oflag & O_CREAT) strcat (buf, "|O_CREAT");
+#ifdef O_DSYNC
+ if (oflag & O_DSYNC) strcat (buf, "|O_DSYNC");
+#endif
+ if (oflag & O_EXCL) strcat (buf, "|O_EXCL");
+#ifdef O_LARGEFILE
+ if (oflag & O_LARGEFILE) strcat (buf, "|O_LARGEFILE");
+#endif
+#ifdef O_NOCTTY
+ if (oflag & O_NOCTTY) strcat (buf, "|O_NOCTTY");
+#endif
+ if (oflag & O_NONBLOCK) strcat (buf, "|O_NONBLOCK");
+#ifdef O_RSYNC
+ if (oflag & O_RSYNC) strcat (buf, "|O_RSYNC");
+#endif
+#ifdef O_SYNC
+ if (oflag & O_SYNC) strcat (buf, "|O_SYNC");
+#endif
+ if (oflag & O_TRUNC) strcat (buf, "|O_TRUNC");
+}
+
+/* Open a file (a magnetic tape device?) on the system specified in
+ FILE_NAME, as the given user. FILE_NAME has the form `[USER@]HOST:FILE'.
+ OPEN_MODE is O_RDONLY, O_WRONLY, etc. If successful, return the
+ remote pipe number plus BIAS. REMOTE_SHELL may be overridden. On
+ error, return -1. */
+int
+rmt_open__ (const char *file_name, int open_mode, int bias,
+ const char *remote_shell)
+{
+ int remote_pipe_number; /* pseudo, biased file descriptor */
+ char *file_name_copy; /* copy of file_name string */
+ char *remote_host; /* remote host name */
+ char *remote_file; /* remote file name (often a device) */
+ char *remote_user; /* remote user name */
+
+ /* Find an unused pair of file descriptors. */
+
+ for (remote_pipe_number = 0;
+ remote_pipe_number < MAXUNIT;
+ remote_pipe_number++)
+ if (READ_SIDE (remote_pipe_number) == -1
+ && WRITE_SIDE (remote_pipe_number) == -1)
+ break;
+
+ if (remote_pipe_number == MAXUNIT)
+ {
+ errno = EMFILE;
+ return -1;
+ }
+
+ /* Pull apart the system and device, and optional user. */
+
+ {
+ char *cursor;
+
+ file_name_copy = xstrdup (file_name);
+ remote_host = file_name_copy;
+ remote_user = 0;
+ remote_file = 0;
+
+ for (cursor = file_name_copy; *cursor; cursor++)
+ switch (*cursor)
+ {
+ default:
+ break;
+
+ case '\n':
+ /* Do not allow newlines in the file_name, since the protocol
+ uses newline delimiters. */
+ free (file_name_copy);
+ errno = ENOENT;
+ return -1;
+
+ case '@':
+ if (!remote_user)
+ {
+ remote_user = remote_host;
+ *cursor = '\0';
+ remote_host = cursor + 1;
+ }
+ break;
+
+ case ':':
+ if (!remote_file)
+ {
+ *cursor = '\0';
+ remote_file = cursor + 1;
+ }
+ break;
+ }
+ }
+
+ /* FIXME: Should somewhat validate the decoding, here. */
+
+ if (remote_user && *remote_user == '\0')
+ remote_user = 0;
+
+#if WITH_REXEC
+
+ /* Execute the remote command using rexec. */
+
+ READ_SIDE (remote_pipe_number) = _rmt_rexec (remote_host, remote_user);
+ if (READ_SIDE (remote_pipe_number) < 0)
+ {
+ int e = errno;
+ free (file_name_copy);
+ errno = e;
+ return -1;
+ }
+
+ WRITE_SIDE (remote_pipe_number) = READ_SIDE (remote_pipe_number);
+
+#else /* not WITH_REXEC */
+ {
+ const char *remote_shell_basename;
+ pid_t status;
+
+ /* Identify the remote command to be executed. */
+
+ if (!remote_shell)
+ {
+#ifdef REMOTE_SHELL
+ remote_shell = REMOTE_SHELL;
+#else
+ free (file_name_copy);
+ errno = EIO;
+ return -1;
+#endif
+ }
+ remote_shell_basename = base_name (remote_shell);
+
+ /* Set up the pipes for the `rsh' command, and fork. */
+
+ if (pipe (to_remote[remote_pipe_number]) == -1
+ || pipe (from_remote[remote_pipe_number]) == -1)
+ {
+ int e = errno;
+ free (file_name_copy);
+ errno = e;
+ return -1;
+ }
+
+ status = fork ();
+ if (status == -1)
+ {
+ int e = errno;
+ free (file_name_copy);
+ errno = e;
+ return -1;
+ }
+
+ if (status == 0)
+ {
+ /* Child. */
+
+ close (STDIN_FILENO);
+ dup (to_remote[remote_pipe_number][PREAD]);
+ close (to_remote[remote_pipe_number][PREAD]);
+ close (to_remote[remote_pipe_number][PWRITE]);
+
+ close (STDOUT_FILENO);
+ dup (from_remote[remote_pipe_number][PWRITE]);
+ close (from_remote[remote_pipe_number][PREAD]);
+ close (from_remote[remote_pipe_number][PWRITE]);
+
+ sys_reset_uid_gid ();
+
+ if (remote_user)
+ execl (remote_shell, remote_shell_basename, remote_host,
+ "-l", remote_user, rmt_command, (char *) 0);
+ else
+ execl (remote_shell, remote_shell_basename, remote_host,
+ rmt_command, (char *) 0);
+
+ /* Bad problems if we get here. */
+
+ /* In a previous version, _exit was used here instead of exit. */
+ error (EXIT_ON_EXEC_ERROR, errno, _("Cannot execute remote shell"));
+ }
+
+ /* Parent. */
+
+ close (from_remote[remote_pipe_number][PWRITE]);
+ close (to_remote[remote_pipe_number][PREAD]);
+ }
+#endif /* not WITH_REXEC */
+
+ /* Attempt to open the tape device. */
+
+ {
+ size_t remote_file_len = strlen (remote_file);
+ char *command_buffer = xmalloc (remote_file_len + 1000);
+ sprintf (command_buffer, "O%s\n", remote_file);
+ encode_oflag (command_buffer + remote_file_len + 2, open_mode);
+ strcat (command_buffer, "\n");
+ if (do_command (remote_pipe_number, command_buffer) == -1
+ || get_status (remote_pipe_number) == -1)
+ {
+ int e = errno;
+ free (command_buffer);
+ free (file_name_copy);
+ _rmt_shutdown (remote_pipe_number, e);
+ return -1;
+ }
+ free (command_buffer);
+ }
+
+ free (file_name_copy);
+ return remote_pipe_number + bias;
+}
+
+/* Close remote tape connection HANDLE and shut down. Return 0 if
+ successful, -1 on error. */
+int
+rmt_close__ (int handle)
+{
+ long int status;
+
+ if (do_command (handle, "C\n") == -1)
+ return -1;
+
+ status = get_status (handle);
+ _rmt_shutdown (handle, errno);
+ return status;
+}
+
+/* Read up to LENGTH bytes into BUFFER from remote tape connection HANDLE.
+ Return the number of bytes read on success, SAFE_READ_ERROR on error. */
+size_t
+rmt_read__ (int handle, char *buffer, size_t length)
+{
+ char command_buffer[COMMAND_BUFFER_SIZE];
+ size_t status;
+ size_t rlen;
+ size_t counter;
+
+ sprintf (command_buffer, "R%lu\n", (unsigned long) length);
+ if (do_command (handle, command_buffer) == -1
+ || (status = get_status (handle)) == SAFE_READ_ERROR)
+ return SAFE_READ_ERROR;
+
+ for (counter = 0; counter < status; counter += rlen, buffer += rlen)
+ {
+ rlen = safe_read (READ_SIDE (handle), buffer, status - counter);
+ if (rlen == SAFE_READ_ERROR || rlen == 0)
+ {
+ _rmt_shutdown (handle, EIO);
+ return SAFE_READ_ERROR;
+ }
+ }
+
+ return status;
+}
+
+/* Write LENGTH bytes from BUFFER to remote tape connection HANDLE.
+ Return the number of bytes written. */
+size_t
+rmt_write__ (int handle, char *buffer, size_t length)
+{
+ char command_buffer[COMMAND_BUFFER_SIZE];
+ RETSIGTYPE (*pipe_handler) ();
+ size_t written;
+
+ sprintf (command_buffer, "W%lu\n", (unsigned long) length);
+ if (do_command (handle, command_buffer) == -1)
+ return 0;
+
+ pipe_handler = signal (SIGPIPE, SIG_IGN);
+ written = full_write (WRITE_SIDE (handle), buffer, length);
+ signal (SIGPIPE, pipe_handler);
+ if (written == length)
+ {
+ long int r = get_status (handle);
+ if (r < 0)
+ return 0;
+ if (r == length)
+ return length;
+ written = r;
+ }
+
+ /* Write error. */
+
+ _rmt_shutdown (handle, EIO);
+ return written;
+}
+
+/* Perform an imitation lseek operation on remote tape connection
+ HANDLE. Return the new file offset if successful, -1 if on error. */
+off_t
+rmt_lseek__ (int handle, off_t offset, int whence)
+{
+ char command_buffer[COMMAND_BUFFER_SIZE];
+ char operand_buffer[UINTMAX_STRSIZE_BOUND];
+ uintmax_t u = offset < 0 ? - (uintmax_t) offset : (uintmax_t) offset;
+ char *p = operand_buffer + sizeof operand_buffer;
+
+ *--p = 0;
+ do
+ *--p = '0' + (int) (u % 10);
+ while ((u /= 10) != 0);
+ if (offset < 0)
+ *--p = '-';
+
+ switch (whence)
+ {
+ case SEEK_SET: whence = 0; break;
+ case SEEK_CUR: whence = 1; break;
+ case SEEK_END: whence = 2; break;
+ default: abort ();
+ }
+
+ sprintf (command_buffer, "L%s\n%d\n", p, whence);
+
+ if (do_command (handle, command_buffer) == -1)
+ return -1;
+
+ return get_status_off (handle);
+}
+
+/* Perform a raw tape operation on remote tape connection HANDLE.
+ Return the results of the ioctl, or -1 on error. */
+int
+rmt_ioctl__ (int handle, int operation, char *argument)
+{
+ switch (operation)
+ {
+ default:
+ errno = EOPNOTSUPP;
+ return -1;
+
+#ifdef MTIOCTOP
+ case MTIOCTOP:
+ {
+ char command_buffer[COMMAND_BUFFER_SIZE];
+ char operand_buffer[UINTMAX_STRSIZE_BOUND];
+ uintmax_t u = (((struct mtop *) argument)->mt_count < 0
+ ? - (uintmax_t) ((struct mtop *) argument)->mt_count
+ : (uintmax_t) ((struct mtop *) argument)->mt_count);
+ char *p = operand_buffer + sizeof operand_buffer;
+
+ *--p = 0;
+ do
+ *--p = '0' + (int) (u % 10);
+ while ((u /= 10) != 0);
+ if (((struct mtop *) argument)->mt_count < 0)
+ *--p = '-';
+
+ /* MTIOCTOP is the easy one. Nothing is transferred in binary. */
+
+ sprintf (command_buffer, "I%d\n%s\n",
+ ((struct mtop *) argument)->mt_op, p);
+ if (do_command (handle, command_buffer) == -1)
+ return -1;
+
+ return get_status (handle);
+ }
+#endif /* MTIOCTOP */
+
+#ifdef MTIOCGET
+ case MTIOCGET:
+ {
+ ssize_t status;
+ size_t counter;
+
+ /* Grab the status and read it directly into the structure. This
+ assumes that the status buffer is not padded and that 2 shorts
+ fit in a long without any word alignment problems; i.e., the
+ whole struct is contiguous. NOTE - this is probably NOT a good
+ assumption. */
+
+ if (do_command (handle, "S") == -1
+ || (status = get_status (handle), status == -1))
+ return -1;
+
+ for (; status > 0; status -= counter, argument += counter)
+ {
+ counter = safe_read (READ_SIDE (handle), argument, status);
+ if (counter == SAFE_READ_ERROR || counter == 0)
+ {
+ _rmt_shutdown (handle, EIO);
+ return -1;
+ }
+ }
+
+ /* Check for byte position. mt_type (or mt_model) is a small integer
+ field (normally) so we will check its magnitude. If it is larger
+ than 256, we will assume that the bytes are swapped and go through
+ and reverse all the bytes. */
+
+ if (((struct mtget *) argument)->MTIO_CHECK_FIELD < 256)
+ return 0;
+
+ for (counter = 0; counter < status; counter += 2)
+ {
+ char copy = argument[counter];
+
+ argument[counter] = argument[counter + 1];
+ argument[counter + 1] = copy;
+ }
+
+ return 0;
+ }
+#endif /* MTIOCGET */
+
+ }
+}
diff --git a/lib/safe-read.c b/lib/safe-read.c
new file mode 100644
index 0000000..b7bf1d5
--- /dev/null
+++ b/lib/safe-read.c
@@ -0,0 +1,78 @@
+/* An interface to read and write that retries after interrupts.
+
+ Copyright (C) 1993, 1994, 1998, 2002, 2003, 2004, 2005, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef SAFE_WRITE
+# include "safe-write.h"
+#else
+# include "safe-read.h"
+#endif
+
+/* Get ssize_t. */
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <errno.h>
+
+#ifdef EINTR
+# define IS_EINTR(x) ((x) == EINTR)
+#else
+# define IS_EINTR(x) 0
+#endif
+
+#include <limits.h>
+
+#ifdef SAFE_WRITE
+# define safe_rw safe_write
+# define rw write
+#else
+# define safe_rw safe_read
+# define rw read
+# undef const
+# define const /* empty */
+#endif
+
+/* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if
+ interrupted. Return the actual number of bytes read(written), zero for EOF,
+ or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error. */
+size_t
+safe_rw (int fd, void const *buf, size_t count)
+{
+ /* Work around a bug in Tru64 5.1. Attempting to read more than
+ INT_MAX bytes fails with errno == EINVAL. See
+ <http://lists.gnu.org/archive/html/bug-gnu-utils/2002-04/msg00010.html>.
+ When decreasing COUNT, keep it block-aligned. */
+ enum { BUGGY_READ_MAXIMUM = INT_MAX & ~8191 };
+
+ for (;;)
+ {
+ ssize_t result = rw (fd, buf, count);
+
+ if (0 <= result)
+ return result;
+ else if (IS_EINTR (errno))
+ continue;
+ else if (errno == EINVAL && BUGGY_READ_MAXIMUM < count)
+ count = BUGGY_READ_MAXIMUM;
+ else
+ return result;
+ }
+}
diff --git a/lib/safe-read.h b/lib/safe-read.h
new file mode 100644
index 0000000..3451955
--- /dev/null
+++ b/lib/safe-read.h
@@ -0,0 +1,35 @@
+/* An interface to read() that retries after interrupts.
+ Copyright (C) 2002, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define SAFE_READ_ERROR ((size_t) -1)
+
+/* Read up to COUNT bytes at BUF from descriptor FD, retrying if interrupted.
+ Return the actual number of bytes read, zero for EOF, or SAFE_READ_ERROR
+ upon error. */
+extern size_t safe_read (int fd, void *buf, size_t count);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/lib/safe-write.c b/lib/safe-write.c
new file mode 100644
index 0000000..4c375a6
--- /dev/null
+++ b/lib/safe-write.c
@@ -0,0 +1,19 @@
+/* An interface to write that retries after interrupts.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#define SAFE_WRITE
+#include "safe-read.c"
diff --git a/lib/safe-write.h b/lib/safe-write.h
new file mode 100644
index 0000000..c194636
--- /dev/null
+++ b/lib/safe-write.h
@@ -0,0 +1,25 @@
+/* An interface to write() that retries after interrupts.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <stddef.h>
+
+#define SAFE_WRITE_ERROR ((size_t) -1)
+
+/* Write up to COUNT bytes at BUF to descriptor FD, retrying if interrupted.
+ Return the actual number of bytes written, zero for EOF, or SAFE_WRITE_ERROR
+ upon error. */
+extern size_t safe_write (int fd, const void *buf, size_t count);
diff --git a/lib/same-inode.h b/lib/same-inode.h
new file mode 100644
index 0000000..deca87b
--- /dev/null
+++ b/lib/same-inode.h
@@ -0,0 +1,26 @@
+/* Determine whether two stat buffers refer to the same file.
+
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef SAME_INODE_H
+# define SAME_INODE_H 1
+
+# define SAME_INODE(Stat_buf_1, Stat_buf_2) \
+ ((Stat_buf_1).st_ino == (Stat_buf_2).st_ino \
+ && (Stat_buf_1).st_dev == (Stat_buf_2).st_dev)
+
+#endif
diff --git a/lib/save-cwd.c b/lib/save-cwd.c
new file mode 100644
index 0000000..f07973a
--- /dev/null
+++ b/lib/save-cwd.c
@@ -0,0 +1,103 @@
+/* save-cwd.c -- Save and restore current working directory.
+
+ Copyright (C) 1995, 1997, 1998, 2003, 2004, 2005, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "save-cwd.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "chdir-long.h"
+#include "fcntl--.h"
+#include "xgetcwd.h"
+
+/* On systems without the fchdir function (WOE), pretend that open
+ always returns -1 so that save_cwd resorts to using xgetcwd.
+ Since chdir_long requires fchdir, use chdir instead. */
+#if !HAVE_FCHDIR
+# undef open
+# define open(File, Flags) (-1)
+# undef fchdir
+# define fchdir(Fd) (abort (), -1)
+# undef chdir_long
+# define chdir_long(Dir) chdir (Dir)
+#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 xgetcwd) 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.
+
+ 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_RDONLY);
+ if (cwd->desc < 0)
+ {
+ cwd->name = xgetcwd ();
+ 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);
+ if (cwd->name)
+ free (cwd->name);
+}
diff --git a/lib/save-cwd.h b/lib/save-cwd.h
new file mode 100644
index 0000000..d646b55
--- /dev/null
+++ b/lib/save-cwd.h
@@ -0,0 +1,34 @@
+/* Save and restore current working directory.
+
+ Copyright (C) 1995, 1997, 1998, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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/savedir.c b/lib/savedir.c
new file mode 100644
index 0000000..d930fb4
--- /dev/null
+++ b/lib/savedir.c
@@ -0,0 +1,137 @@
+/* savedir.c -- save the list of files in a directory in a string
+
+ Copyright (C) 1990, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+ 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <config.h>
+
+#include "savedir.h"
+
+#include <sys/types.h>
+
+#include <errno.h>
+
+#include <dirent.h>
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "openat.h"
+#include "xalloc.h"
+
+#ifndef NAME_SIZE_DEFAULT
+# define NAME_SIZE_DEFAULT 512
+#endif
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef opendir
+#undef closedir
+
+/* Return a freshly allocated string containing the file names
+ in directory DIRP, separated by '\0' characters;
+ the end is marked by two '\0' characters in a row.
+ Return NULL (setting errno) if DIRP cannot be read or closed.
+ If DIRP is NULL, return NULL without affecting errno. */
+
+static char *
+savedirstream (DIR *dirp)
+{
+ char *name_space;
+ size_t allocated = NAME_SIZE_DEFAULT;
+ size_t used = 0;
+ int save_errno;
+
+ if (dirp == NULL)
+ return NULL;
+
+ name_space = xmalloc (allocated);
+
+ for (;;)
+ {
+ struct dirent const *dp;
+ char const *entry;
+
+ errno = 0;
+ dp = readdir (dirp);
+ if (! dp)
+ break;
+
+ /* Skip "", ".", and "..". "" is returned by at least one buggy
+ implementation: Solaris 2.4 readdir on NFS file systems. */
+ entry = dp->d_name;
+ if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0')
+ {
+ size_t entry_size = _D_EXACT_NAMLEN (dp) + 1;
+ if (used + entry_size < used)
+ xalloc_die ();
+ if (allocated <= used + entry_size)
+ {
+ do
+ {
+ if (2 * allocated < allocated)
+ xalloc_die ();
+ allocated *= 2;
+ }
+ while (allocated <= used + entry_size);
+
+ name_space = xrealloc (name_space, allocated);
+ }
+ memcpy (name_space + used, entry, entry_size);
+ used += entry_size;
+ }
+ }
+ name_space[used] = '\0';
+ save_errno = errno;
+ if (closedir (dirp) != 0)
+ save_errno = errno;
+ if (save_errno != 0)
+ {
+ free (name_space);
+ errno = save_errno;
+ return NULL;
+ }
+ return name_space;
+}
+
+/* Return a freshly allocated string containing the file names
+ in directory DIR, separated by '\0' characters;
+ the end is marked by two '\0' characters in a row.
+ Return NULL (setting errno) if DIR cannot be opened, read, or closed. */
+
+char *
+savedir (char const *dir)
+{
+ return savedirstream (opendir (dir));
+}
+
+/* Return a freshly allocated string containing the file names
+ in directory FD, separated by '\0' characters;
+ the end is marked by two '\0' characters in a row.
+ Return NULL (setting errno) if FD cannot be read or closed. */
+
+char *
+fdsavedir (int fd)
+{
+ return savedirstream (fdopendir (fd));
+}
diff --git a/lib/savedir.h b/lib/savedir.h
new file mode 100644
index 0000000..5b7bef9
--- /dev/null
+++ b/lib/savedir.h
@@ -0,0 +1,27 @@
+/* Save the list of files in a directory in a string.
+
+ Copyright (C) 1997, 1999, 2001, 2003, 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#if !defined SAVEDIR_H_
+# define SAVEDIR_H_
+
+char *savedir (char const *dir);
+char *fdsavedir (int fd);
+
+#endif
diff --git a/lib/setenv.c b/lib/setenv.c
new file mode 100644
index 0000000..c54c28d
--- /dev/null
+++ b/lib/setenv.c
@@ -0,0 +1,332 @@
+/* Copyright (C) 1992,1995-1999,2000-2003,2005-2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+#include <alloca.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#if _LIBC || HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if _LIBC || !HAVE_SETENV
+
+#if !_LIBC
+# include "allocsa.h"
+#endif
+
+#if !_LIBC
+# define __environ environ
+# ifndef HAVE_ENVIRON_DECL
+extern char **environ;
+# endif
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of `environ'. */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+/* In the GNU C library we must keep the namespace clean. */
+#ifdef _LIBC
+# define setenv __setenv
+# define clearenv __clearenv
+# define tfind __tfind
+# define tsearch __tsearch
+#endif
+
+/* In the GNU C library implementation we try to be more clever and
+ allow arbitrarily many changes of the environment given that the used
+ values are from a small set. Outside glibc this will eat up all
+ memory after a while. */
+#if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \
+ && defined __GNUC__)
+# define USE_TSEARCH 1
+# include <search.h>
+typedef int (*compar_fn_t) (const void *, const void *);
+
+/* This is a pointer to the root of the search tree with the known
+ values. */
+static void *known_values;
+
+# define KNOWN_VALUE(Str) \
+ ({ \
+ void *value = tfind (Str, &known_values, (compar_fn_t) strcmp); \
+ value != NULL ? *(char **) value : NULL; \
+ })
+# define STORE_VALUE(Str) \
+ tsearch (Str, &known_values, (compar_fn_t) strcmp)
+
+#else
+# undef USE_TSEARCH
+
+# define KNOWN_VALUE(Str) NULL
+# define STORE_VALUE(Str) do { } while (0)
+
+#endif
+
+
+/* If this variable is not a null pointer we allocated the current
+ environment. */
+static char **last_environ;
+
+
+/* This function is used by `setenv' and `putenv'. The difference between
+ the two functions is that for the former must create a new string which
+ is then placed in the environment, while the argument of `putenv'
+ must be used directly. This is all complicated by the fact that we try
+ to reuse values once generated for a `setenv' call since we can never
+ free the strings. */
+int
+__add_to_environ (const char *name, const char *value, const char *combined,
+ int replace)
+{
+ register char **ep;
+ register size_t size;
+ const size_t namelen = strlen (name);
+ const size_t vallen = value != NULL ? strlen (value) + 1 : 0;
+
+ LOCK;
+
+ /* We have to get the pointer now that we have the lock and not earlier
+ since another thread might have created a new environment. */
+ ep = __environ;
+
+ size = 0;
+ if (ep != NULL)
+ {
+ for (; *ep != NULL; ++ep)
+ if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
+ break;
+ else
+ ++size;
+ }
+
+ if (ep == NULL || *ep == NULL)
+ {
+ char **new_environ;
+#ifdef USE_TSEARCH
+ char *new_value;
+#endif
+
+ /* We allocated this space; we can extend it. */
+ new_environ =
+ (char **) (last_environ == NULL
+ ? malloc ((size + 2) * sizeof (char *))
+ : realloc (last_environ, (size + 2) * sizeof (char *)));
+ if (new_environ == NULL)
+ {
+ UNLOCK;
+ return -1;
+ }
+
+ /* If the whole entry is given add it. */
+ if (combined != NULL)
+ /* We must not add the string to the search tree since it belongs
+ to the user. */
+ new_environ[size] = (char *) combined;
+ else
+ {
+ /* See whether the value is already known. */
+#ifdef USE_TSEARCH
+# ifdef _LIBC
+ new_value = (char *) alloca (namelen + 1 + vallen);
+ __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+ value, vallen);
+# else
+ new_value = (char *) allocsa (namelen + 1 + vallen);
+ if (new_value == NULL)
+ {
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+ memcpy (new_value, name, namelen);
+ new_value[namelen] = '=';
+ memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+ new_environ[size] = KNOWN_VALUE (new_value);
+ if (new_environ[size] == NULL)
+#endif
+ {
+ new_environ[size] = (char *) malloc (namelen + 1 + vallen);
+ if (new_environ[size] == NULL)
+ {
+#if defined USE_TSEARCH && !defined _LIBC
+ freesa (new_value);
+#endif
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+
+#ifdef USE_TSEARCH
+ memcpy (new_environ[size], new_value, namelen + 1 + vallen);
+#else
+ memcpy (new_environ[size], name, namelen);
+ new_environ[size][namelen] = '=';
+ memcpy (&new_environ[size][namelen + 1], value, vallen);
+#endif
+ /* And save the value now. We cannot do this when we remove
+ the string since then we cannot decide whether it is a
+ user string or not. */
+ STORE_VALUE (new_environ[size]);
+ }
+#if defined USE_TSEARCH && !defined _LIBC
+ freesa (new_value);
+#endif
+ }
+
+ if (__environ != last_environ)
+ memcpy ((char *) new_environ, (char *) __environ,
+ size * sizeof (char *));
+
+ new_environ[size + 1] = NULL;
+
+ last_environ = __environ = new_environ;
+ }
+ else if (replace)
+ {
+ char *np;
+
+ /* Use the user string if given. */
+ if (combined != NULL)
+ np = (char *) combined;
+ else
+ {
+#ifdef USE_TSEARCH
+ char *new_value;
+# ifdef _LIBC
+ new_value = alloca (namelen + 1 + vallen);
+ __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+ value, vallen);
+# else
+ new_value = allocsa (namelen + 1 + vallen);
+ if (new_value == NULL)
+ {
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+ memcpy (new_value, name, namelen);
+ new_value[namelen] = '=';
+ memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+ np = KNOWN_VALUE (new_value);
+ if (np == NULL)
+#endif
+ {
+ np = malloc (namelen + 1 + vallen);
+ if (np == NULL)
+ {
+#if defined USE_TSEARCH && !defined _LIBC
+ freesa (new_value);
+#endif
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+
+#ifdef USE_TSEARCH
+ memcpy (np, new_value, namelen + 1 + vallen);
+#else
+ memcpy (np, name, namelen);
+ np[namelen] = '=';
+ memcpy (&np[namelen + 1], value, vallen);
+#endif
+ /* And remember the value. */
+ STORE_VALUE (np);
+ }
+#if defined USE_TSEARCH && !defined _LIBC
+ freesa (new_value);
+#endif
+ }
+
+ *ep = np;
+ }
+
+ UNLOCK;
+
+ return 0;
+}
+
+int
+setenv (const char *name, const char *value, int replace)
+{
+ return __add_to_environ (name, value, NULL, replace);
+}
+
+/* The `clearenv' was planned to be added to POSIX.1 but probably
+ never made it. Nevertheless the POSIX.9 standard (POSIX bindings
+ for Fortran 77) requires this function. */
+int
+clearenv (void)
+{
+ LOCK;
+
+ if (__environ == last_environ && __environ != NULL)
+ {
+ /* We allocated this environment so we can free it. */
+ free (__environ);
+ last_environ = NULL;
+ }
+
+ /* Clear the environment pointer removes the whole environment. */
+ __environ = NULL;
+
+ UNLOCK;
+
+ return 0;
+}
+
+#ifdef _LIBC
+static void
+free_mem (void)
+{
+ /* Remove all traces. */
+ clearenv ();
+
+ /* Now remove the search tree. */
+ __tdestroy (known_values, free);
+ known_values = NULL;
+}
+text_set_element (__libc_subfreeres, free_mem);
+
+
+# undef setenv
+# undef clearenv
+weak_alias (__setenv, setenv)
+weak_alias (__clearenv, clearenv)
+#endif
+
+#endif /* _LIBC || !HAVE_SETENV */
diff --git a/lib/setenv.h b/lib/setenv.h
new file mode 100644
index 0000000..92e7bba
--- /dev/null
+++ b/lib/setenv.h
@@ -0,0 +1,54 @@
+/* Setting environment variables.
+ Copyright (C) 2001-2004, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if HAVE_SETENV || HAVE_UNSETENV
+
+/* Get setenv(), unsetenv() declarations. */
+# include <stdlib.h>
+
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !HAVE_SETENV
+
+/* Set NAME to VALUE in the environment.
+ If REPLACE is nonzero, overwrite an existing value. */
+extern int setenv (const char *name, const char *value, int replace);
+
+#endif
+
+#if HAVE_UNSETENV
+
+# if VOID_UNSETENV
+/* On some systems, unsetenv() returns void.
+ This is the case for FreeBSD 4.8, NetBSD 1.6, OpenBSD 3.4. */
+# define unsetenv(name) ((unsetenv)(name), 0)
+# endif
+
+#else
+
+/* Remove the variable NAME from the environment. */
+extern int unsetenv (const char *name);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/lib/sleep.c b/lib/sleep.c
new file mode 100644
index 0000000..037559b
--- /dev/null
+++ b/lib/sleep.c
@@ -0,0 +1,47 @@
+/* Pausing execution of the current thread.
+ Copyright (C) 2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+unsigned int
+sleep (unsigned int seconds)
+{
+ unsigned int remaining;
+
+ /* Sleep for 1 second many times, because
+ 1. Sleep is not interruptiple by Ctrl-C,
+ 2. we want to avoid arithmetic overflow while multiplying with 1000. */
+ for (remaining = seconds; remaining > 0; remaining--)
+ Sleep (1000);
+
+ return remaining;
+}
+
+#else
+
+ #error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib."
+
+#endif
diff --git a/lib/stat-macros.h b/lib/stat-macros.h
new file mode 100644
index 0000000..690216c
--- /dev/null
+++ b/lib/stat-macros.h
@@ -0,0 +1,3 @@
+/* All the mode bits that can be affected by chmod. */
+#define CHMOD_MODE_BITS \
+ (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)
diff --git a/lib/stat-time.h b/lib/stat-time.h
new file mode 100644
index 0000000..649c848
--- /dev/null
+++ b/lib/stat-time.h
@@ -0,0 +1,184 @@
+/* stat-related time functions.
+
+ Copyright (C) 2005, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#ifndef STAT_TIME_H
+#define STAT_TIME_H 1
+
+#include <sys/stat.h>
+#include <time.h>
+
+/* 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 defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
+# ifdef 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. */
+static inline long int
+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. */
+static inline long int
+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. */
+static inline long int
+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. */
+static inline long int
+get_stat_birthtime_ns (struct stat const *st)
+{
+# 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. */
+static inline struct timespec
+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. */
+static inline struct timespec
+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. */
+static inline struct timespec
+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 negative tv_nsec. */
+static inline struct timespec
+get_stat_birthtime (struct stat const *st)
+{
+ 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 __WIN32__) && ! defined __CYGWIN__
+ /* Woe32 native platforms (but not Cygwin) put the "file creation
+ time" in st_ctime (!). See
+ <http://msdn2.microsoft.com/de-de/library/14h5k7ff(VS.80).aspx>. */
+ t.tv_sec = st->st_ctime;
+ t.tv_nsec = 0;
+#else
+ /* Birth time is not supported. Set tv_sec to avoid undefined behavior. */
+ 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 time stamps. Also, NetBSD
+ sometimes returns junk in the birth time fields; work around this
+ bug if it it is detected. There's no need to detect negative
+ tv_nsec junk as negative tv_nsec already indicates an error. */
+ if (t.tv_sec == 0 || 1000000000 <= t.tv_nsec)
+ t.tv_nsec = -1;
+#endif
+
+ return t;
+}
+
+#endif
diff --git a/lib/stdbool_.h b/lib/stdbool_.h
new file mode 100644
index 0000000..150a010
--- /dev/null
+++ b/lib/stdbool_.h
@@ -0,0 +1,118 @@
+/* Copyright (C) 2001, 2002, 2003, 2006, 2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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'.
+
+ 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. */
+#ifdef __BEOS__
+# include <OS.h> /* defines bool but not _Bool */
+# undef false
+# undef true
+#endif
+
+/* For the sake of symbolic names in gdb, we 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 if we do
+ this, values of type '_Bool' may 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 we add a negative value to the
+ enum; this ensures that '_Bool' promotes to 'int'. */
+#if defined __cplusplus || defined __BEOS__
+ /* 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
+ http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+ http://lists.gnu.org/archive/html/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".
+ The only benefit of the enum type, debuggability, is not important
+ with these compilers. So use 'signed char' and no typedef. */
+# define _Bool signed char
+enum { false = 0, true = 1 };
+# else
+ /* With this compiler, trust the _Bool type if the compiler has it. */
+# if !@HAVE__BOOL@
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+# endif
+# endif
+#endif
+#define bool _Bool
+
+/* The other macros must be usable in preprocessor directives. */
+#define false 0
+#define true 1
+#define __bool_true_false_are_defined 1
+
+#endif /* _GL_STDBOOL_H */
diff --git a/lib/stdint_.h b/lib/stdint_.h
new file mode 100644
index 0000000..d374535
--- /dev/null
+++ b/lib/stdint_.h
@@ -0,0 +1,512 @@
+/* Copyright (C) 2001-2002, 2004-2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/*
+ * ISO C 99 <stdint.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/stdint.h.html>
+ */
+
+#ifndef _GL_STDINT_H
+
+/* 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
+ /* 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
+ _GL_STDINT_H is defined.
+ The include_next requires a split double-inclusion guard. */
+# if @HAVE_INCLUDE_NEXT@
+# include_next <stdint.h>
+# else
+# include @ABSOLUTE_STDINT_H@
+# endif
+#endif
+
+#ifndef _GL_STDINT_H
+#define _GL_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.
+ MacOS 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 @ABSOLUTE_STDINT_H@. */
+#if @HAVE_SYS_TYPES_H@ && ! defined _AIX
+# include <sys/types.h>
+#endif
+
+/* Get LONG_MIN, LONG_MAX, ULONG_MAX. */
+#include <limits.h>
+
+#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. */
+# define _GL_JUST_INCLUDE_ABSOLUTE_INTTYPES_H
+# include <inttypes.h>
+# undef _GL_JUST_INCLUDE_ABSOLUTE_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
+
+#if ! defined __cplusplus || defined __STDC_CONSTANT_MACROS
+
+/* Get WCHAR_MIN, WCHAR_MAX. */
+# if ! (defined WCHAR_MIN && defined WCHAR_MAX)
+# include <wchar.h>
+# endif
+
+#endif
+
+/* Minimum and maximum values for a integer type under the usual assumption.
+ Return an unspecified value if BITS == 0, adding a check to pacify
+ picky compilers. */
+
+#define _STDINT_MIN(signed, bits, zero) \
+ ((signed) ? (- ((zero) + 1) << ((bits) ? (bits) - 1 : 0)) : (zero))
+
+#define _STDINT_MAX(signed, bits, zero) \
+ ((signed) \
+ ? ~ _STDINT_MIN (signed, bits, zero) \
+ : ((((zero) + 1) << ((bits) ? (bits) - 1 : 0)) - 1) * 2 + 1)
+
+/* 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
+#define int8_t signed char
+#define uint8_t unsigned char
+
+#undef int16_t
+#undef uint16_t
+#define int16_t short int
+#define uint16_t unsigned short int
+
+#undef int32_t
+#undef uint32_t
+#define int32_t int
+#define uint32_t unsigned int
+
+/* 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
+# define int64_t long int
+# define GL_INT64_T
+#elif defined _MSC_VER
+# undef int64_t
+# define int64_t __int64
+# define GL_INT64_T
+#elif @HAVE_LONG_LONG_INT@
+# undef int64_t
+# define int64_t long long int
+# define GL_INT64_T
+#endif
+
+#if ULONG_MAX >> 31 >> 31 >> 1 == 1
+# undef uint64_t
+# define uint64_t unsigned long int
+# define GL_UINT64_T
+#elif defined _MSC_VER
+# undef uint64_t
+# define uint64_t unsigned __int64
+# define GL_UINT64_T
+#elif @HAVE_UNSIGNED_LONG_LONG_INT@
+# undef uint64_t
+# define uint64_t unsigned long long int
+# define GL_UINT64_T
+#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. Assume that 'long int'
+ is fast enough for all narrower integers. */
+
+#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
+#define int_fast8_t long int
+#define uint_fast8_t unsigned int_fast8_t
+#define int_fast16_t long int
+#define uint_fast16_t unsigned int_fast16_t
+#define int_fast32_t long int
+#define uint_fast32_t unsigned int_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 */
+
+#undef intptr_t
+#undef uintptr_t
+#define intptr_t long int
+#define uintptr_t unsigned long int
+
+/* 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. */
+
+#undef intmax_t
+#if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# define intmax_t long long int
+#elif defined GL_INT64_T
+# define intmax_t int64_t
+#else
+# define intmax_t long int
+#endif
+
+#undef uintmax_t
+#if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# define uintmax_t unsigned long long int
+#elif defined GL_UINT64_T
+# define uintmax_t uint64_t
+#else
+# define uintmax_t unsigned long int
+#endif
+
+/* 7.18.2. Limits of specified-width integer types */
+
+#if ! defined __cplusplus || defined __STDC_LIMIT_MACROS
+
+/* 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
+
+#undef INT64_MIN
+#undef INT64_MAX
+#ifdef GL_INT64_T
+/* 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
+
+#undef UINT64_MAX
+#ifdef GL_UINT64_T
+# 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 LONG_MIN
+#define INT_FAST8_MAX LONG_MAX
+#define UINT_FAST8_MAX ULONG_MAX
+
+#undef INT_FAST16_MIN
+#undef INT_FAST16_MAX
+#undef UINT_FAST16_MAX
+#define INT_FAST16_MIN LONG_MIN
+#define INT_FAST16_MAX LONG_MAX
+#define UINT_FAST16_MAX ULONG_MAX
+
+#undef INT_FAST32_MIN
+#undef INT_FAST32_MAX
+#undef UINT_FAST32_MAX
+#define INT_FAST32_MIN LONG_MIN
+#define INT_FAST32_MAX LONG_MAX
+#define UINT_FAST32_MAX ULONG_MAX
+
+#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
+#define INTPTR_MIN LONG_MIN
+#define INTPTR_MAX LONG_MAX
+#define UINTPTR_MAX ULONG_MAX
+
+/* 7.18.2.5. Limits of greatest-width integer types */
+
+#undef INTMAX_MIN
+#undef INTMAX_MAX
+#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
+
+#undef UINTMAX_MAX
+#ifdef UINT64_MAX
+# define UINTMAX_MAX UINT64_MAX
+#else
+# define UINTMAX_MAX UINT32_MAX
+#endif
+
+/* 7.18.3. Limits of other integer types */
+
+/* ptrdiff_t limits */
+#undef PTRDIFF_MIN
+#undef PTRDIFF_MAX
+#define PTRDIFF_MIN \
+ _STDINT_MIN (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+#define PTRDIFF_MAX \
+ _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+
+/* sig_atomic_t limits */
+#undef SIG_ATOMIC_MIN
+#undef SIG_ATOMIC_MAX
+#define SIG_ATOMIC_MIN \
+ _STDINT_MIN (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
+ 0@SIG_ATOMIC_T_SUFFIX@)
+#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
+#define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@)
+
+/* wchar_t limits */
+#undef WCHAR_MIN
+#undef WCHAR_MAX
+#define WCHAR_MIN \
+ _STDINT_MIN (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+#define WCHAR_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+
+/* wint_t limits */
+#undef WINT_MIN
+#undef WINT_MAX
+#define WINT_MIN \
+ _STDINT_MIN (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+#define WINT_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+
+#endif /* !defined __cplusplus || defined __STDC_LIMIT_MACROS */
+
+/* 7.18.4. Macros for integer constants */
+
+#if ! defined __cplusplus || defined __STDC_CONSTANT_MACROS
+
+/* 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
+#elif @HAVE_LONG_LONG_INT@
+# 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
+#elif @HAVE_UNSIGNED_LONG_LONG_INT@
+# define UINT64_C(x) x##ULL
+#endif
+
+/* 7.18.4.2. Macros for greatest-width integer constants */
+
+#undef INTMAX_C
+#if @HAVE_LONG_LONG_INT@ && 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
+
+#undef UINTMAX_C
+#if @HAVE_UNSIGNED_LONG_LONG_INT@ && 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 /* !defined __cplusplus || defined __STDC_CONSTANT_MACROS */
+
+#endif /* _GL_STDINT_H */
+#endif /* _GL_STDINT_H */
diff --git a/lib/stdio_.h b/lib/stdio_.h
new file mode 100644
index 0000000..7afaede
--- /dev/null
+++ b/lib/stdio_.h
@@ -0,0 +1,320 @@
+/* A GNU-like <stdio.h>.
+
+ Copyright (C) 2004, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if defined __need_FILE || defined __need___FILE
+/* Special invocation convention inside glibc header files. */
+
+#if @HAVE_INCLUDE_NEXT@
+# include_next <stdio.h>
+#else
+# include @ABSOLUTE_STDIO_H@
+#endif
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _GL_STDIO_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_INCLUDE_NEXT@
+# include_next <stdio.h>
+#else
+# include @ABSOLUTE_STDIO_H@
+#endif
+
+#ifndef _GL_STDIO_H
+#define _GL_STDIO_H
+
+#include <stdarg.h>
+#include <stddef.h>
+
+#if (@GNULIB_FSEEKO@ && @REPLACE_FSEEKO@) || (@GNULIB_FTELLO@ && @REPLACE_FTELLO@)
+/* Get off_t. */
+# include <sys/types.h>
+#endif
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# define __attribute__(Spec) /* empty */
+# endif
+/* The __-protected variants of `format' and `printf' attributes
+ are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __format__ format
+# define __printf__ printf
+# endif
+#endif
+
+
+/* The definition of GL_LINK_WARNING is copied here. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @GNULIB_FPRINTF_POSIX@
+# if @REPLACE_FPRINTF@
+# define fprintf rpl_fprintf
+extern int fprintf (FILE *fp, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fprintf
+# define fprintf \
+ (GL_LINK_WARNING ("fprintf is not always POSIX compliant - " \
+ "use gnulib module fprintf-posix for portable " \
+ "POSIX compliance"), \
+ fprintf)
+#endif
+
+#if @GNULIB_VFPRINTF_POSIX@
+# if @REPLACE_VFPRINTF@
+# define vfprintf rpl_vfprintf
+extern int vfprintf (FILE *fp, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0)));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vfprintf
+# define vfprintf(s,f,a) \
+ (GL_LINK_WARNING ("vfprintf is not always POSIX compliant - " \
+ "use gnulib module vfprintf-posix for portable " \
+ "POSIX compliance"), \
+ vfprintf (s, f, a))
+#endif
+
+#if @GNULIB_PRINTF_POSIX@
+# if @REPLACE_PRINTF@
+/* Don't break __attribute__((format(printf,M,N))). */
+# define printf __printf__
+extern int printf (const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 1, 2)));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef printf
+# define printf \
+ (GL_LINK_WARNING ("printf is not always POSIX compliant - " \
+ "use gnulib module printf-posix for portable " \
+ "POSIX compliance"), \
+ printf)
+/* Don't break __attribute__((format(printf,M,N))). */
+# define format(kind,m,n) format (__##kind##__, m, n)
+# define __format__(kind,m,n) __format__ (__##kind##__, m, n)
+# define ____printf____ __printf__
+# define ____scanf____ __scanf__
+# define ____strftime____ __strftime__
+# define ____strfmon____ __strfmon__
+#endif
+
+#if @GNULIB_VPRINTF_POSIX@
+# if @REPLACE_VPRINTF@
+# define vprintf rpl_vprintf
+extern int vprintf (const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 1, 0)));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vprintf
+# define vprintf(f,a) \
+ (GL_LINK_WARNING ("vprintf is not always POSIX compliant - " \
+ "use gnulib module vprintf-posix for portable " \
+ "POSIX compliance"), \
+ vprintf (f, a))
+#endif
+
+#if @GNULIB_SNPRINTF@
+# if @REPLACE_SNPRINTF@
+# define snprintf rpl_snprintf
+# endif
+# if @REPLACE_SNPRINTF@ || !@HAVE_DECL_SNPRINTF@
+extern int snprintf (char *str, size_t size, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef snprintf
+# define snprintf \
+ (GL_LINK_WARNING ("snprintf is unportable - " \
+ "use gnulib module snprintf for portability"), \
+ snprintf)
+#endif
+
+#if @GNULIB_VSNPRINTF@
+# if @REPLACE_VSNPRINTF@
+# define vsnprintf rpl_vsnprintf
+# endif
+# if @REPLACE_VSNPRINTF@ || !@HAVE_DECL_VSNPRINTF@
+extern int vsnprintf (char *str, size_t size, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 3, 0)));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vsnprintf
+# define vsnprintf(b,s,f,a) \
+ (GL_LINK_WARNING ("vsnprintf is unportable - " \
+ "use gnulib module vsnprintf for portability"), \
+ vsnprintf (b, s, f, a))
+#endif
+
+#if @GNULIB_SPRINTF_POSIX@
+# if @REPLACE_SPRINTF@
+# define sprintf rpl_sprintf
+extern int sprintf (char *str, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sprintf
+# define sprintf \
+ (GL_LINK_WARNING ("sprintf is not always POSIX compliant - " \
+ "use gnulib module sprintf-posix for portable " \
+ "POSIX compliance"), \
+ sprintf)
+#endif
+
+#if @GNULIB_VSPRINTF_POSIX@
+# if @REPLACE_VSPRINTF@
+# define vsprintf rpl_vsprintf
+extern int vsprintf (char *str, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0)));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vsprintf
+# define vsprintf(b,f,a) \
+ (GL_LINK_WARNING ("vsprintf is not always POSIX compliant - " \
+ "use gnulib module vsprintf-posix for portable " \
+ "POSIX compliance"), \
+ vsprintf (b, f, a))
+#endif
+
+#if @GNULIB_VASPRINTF@
+# if @REPLACE_VASPRINTF@
+# define asprintf rpl_asprintf
+# define vasprintf rpl_vasprintf
+# endif
+# if @REPLACE_VASPRINTF@ || !@HAVE_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. */
+ extern int asprintf (char **result, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
+ extern int vasprintf (char **result, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0)));
+# endif
+#endif
+
+#if @GNULIB_FSEEKO@
+# if @REPLACE_FSEEKO@
+/* Provide fseek, fseeko functions that are aware of a preceding
+ fflush(), and which detect pipes. */
+# define fseeko rpl_fseeko
+extern int fseeko (FILE *fp, off_t offset, int whence);
+# define fseek(fp, offset, whence) fseeko (fp, (off_t)(offset), whence)
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fseeko
+# define fseeko(f,o,w) \
+ (GL_LINK_WARNING ("fseeko is unportable - " \
+ "use gnulib module fseeko for portability"), \
+ fseeko (f, o, w))
+#endif
+
+#if @GNULIB_FSEEK@ && @REPLACE_FSEEK@
+extern int rpl_fseek (FILE *fp, long offset, int whence);
+# undef fseek
+# if defined GNULIB_POSIXCHECK
+# define fseek(f,o,w) \
+ (GL_LINK_WARNING ("fseek cannot handle files larger than 4 GB " \
+ "on 32-bit platforms - " \
+ "use fseeko function for handling of large files"), \
+ rpl_fseek (f, o, w))
+# else
+# define fseek rpl_fseek
+# endif
+#elif defined GNULIB_POSIXCHECK
+# ifndef fseek
+# define fseek(f,o,w) \
+ (GL_LINK_WARNING ("fseek cannot handle files larger than 4 GB " \
+ "on 32-bit platforms - " \
+ "use fseeko function for handling of large files"), \
+ fseek (f, o, w))
+# endif
+#endif
+
+#if @GNULIB_FTELLO@
+# if @REPLACE_FTELLO@
+# define ftello rpl_ftello
+extern off_t ftello (FILE *fp);
+# define ftell(fp) ftello (fp)
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ftello
+# define ftello(f) \
+ (GL_LINK_WARNING ("ftello is unportable - " \
+ "use gnulib module ftello for portability"), \
+ ftello (f))
+#endif
+
+#if @GNULIB_FTELL@ && @REPLACE_FTELL@
+extern long rpl_ftell (FILE *fp);
+# undef ftell
+# if GNULIB_POSIXCHECK
+# define ftell(f) \
+ (GL_LINK_WARNING ("ftell cannot handle files larger than 4 GB " \
+ "on 32-bit platforms - " \
+ "use ftello function for handling of large files"), \
+ rpl_ftell (f))
+# else
+# define ftell rpl_ftell
+# endif
+#elif defined GNULIB_POSIXCHECK
+# ifndef ftell
+# define ftell(f) \
+ (GL_LINK_WARNING ("ftell cannot handle files larger than 4 GB " \
+ "on 32-bit platforms - " \
+ "use ftello function for handling of large files"), \
+ ftell (f))
+# endif
+#endif
+
+#if @GNULIB_FFLUSH@
+# if @REPLACE_FFLUSH@
+# define fflush rpl_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). */
+ extern int fflush (FILE *gl_stream);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fflush
+# define fflush(f) \
+ (GL_LINK_WARNING ("fflush is not always POSIX compliant - " \
+ "use gnulib module fflush for portable " \
+ "POSIX compliance"), \
+ fflush (f))
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_STDIO_H */
+#endif /* _GL_STDIO_H */
+#endif
diff --git a/lib/stdlib_.h b/lib/stdlib_.h
new file mode 100644
index 0000000..130f071
--- /dev/null
+++ b/lib/stdlib_.h
@@ -0,0 +1,140 @@
+/* A GNU-like <stdlib.h>.
+
+ Copyright (C) 1995, 2001-2002, 2006-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if defined __need_malloc_and_calloc
+/* Special invocation convention inside glibc header files. */
+
+#if @HAVE_INCLUDE_NEXT@
+# include_next <stdlib.h>
+#else
+# include @ABSOLUTE_STDLIB_H@
+#endif
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _GL_STDLIB_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_INCLUDE_NEXT@
+# include_next <stdlib.h>
+#else
+# include @ABSOLUTE_STDLIB_H@
+#endif
+
+#ifndef _GL_STDLIB_H
+#define _GL_STDLIB_H
+
+
+/* The definition of GL_LINK_WARNING 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
+
+
+#ifdef __cplusplus
+extern "C" {
+#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:2001 specification.
+ http://www.opengroup.org/susv3xsh/getsubopt.html */
+# if !@HAVE_GETSUBOPT@
+extern int getsubopt (char **optionp, char *const *tokens, char **valuep);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getsubopt
+# define getsubopt(o,t,v) \
+ (GL_LINK_WARNING ("getsubopt is unportable - " \
+ "use gnulib module getsubopt for portability"), \
+ getsubopt (o, t, v))
+#endif
+
+
+#if @GNULIB_MKDTEMP@
+# if !@HAVE_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. */
+extern char * mkdtemp (char * /*template*/);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkdtemp
+# define mkdtemp(t) \
+ (GL_LINK_WARNING ("mkdtemp is unportable - " \
+ "use gnulib module mkdtemp for portability"), \
+ mkdtemp (t))
+#endif
+
+
+#if @GNULIB_MKSTEMP@
+# if @REPLACE_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. */
+# define mkstemp rpl_mkstemp
+extern int mkstemp (char * /*template*/);
+# else
+/* On MacOS X 10.3, only <unistd.h> declares mkstemp. */
+# include <unistd.h>
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemp
+# define mkstemp(t) \
+ (GL_LINK_WARNING ("mkstemp is unportable - " \
+ "use gnulib module mkstemp for portability"), \
+ mkstemp (t))
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_STDLIB_H */
+#endif /* _GL_STDLIB_H */
+#endif
diff --git a/lib/stdopen.c b/lib/stdopen.c
new file mode 100644
index 0000000..92825b5
--- /dev/null
+++ b/lib/stdopen.c
@@ -0,0 +1,77 @@
+/* stdopen.c - ensure that the three standard file descriptors are in use
+
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "stdopen.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* Try to ensure that all of the standard file numbers (0, 1, 2)
+ are in use. Without this, each application would have to guard
+ every call to open, dup, fopen, etc. with tests to ensure they
+ don't use one of the special file numbers when opening a file.
+ Return false if at least one of the file descriptors is initially
+ closed and an attempt to reopen it fails. Otherwise, return true. */
+bool
+stdopen (void)
+{
+ int fd;
+ bool ok = true;
+
+ for (fd = 0; fd <= 2; fd++)
+ {
+ if (fcntl (fd, F_GETFD) < 0)
+ {
+ if (errno != EBADF)
+ ok = false;
+ else
+ {
+ static const int contrary_mode[]
+ = { O_WRONLY, O_RDONLY, O_RDONLY };
+ int mode = contrary_mode[fd];
+ int new_fd;
+ /* Open /dev/null with the contrary mode so that the typical
+ read (stdin) or write (stdout, stderr) operation will fail.
+ With descriptor 0, we can do even better on systems that
+ have /dev/full, by opening that write-only instead of
+ /dev/null. The only drawback is that a write-provoked
+ failure comes with a misleading errno value, ENOSPC. */
+ if (mode == O_RDONLY
+ || (new_fd = open ("/dev/full", mode) != fd))
+ new_fd = open ("/dev/null", mode);
+ if (new_fd != fd)
+ {
+ if (0 <= new_fd)
+ close (new_fd);
+ ok = false;
+ }
+ }
+ }
+ }
+
+ return ok;
+}
diff --git a/lib/stdopen.h b/lib/stdopen.h
new file mode 100644
index 0000000..d54e5f1
--- /dev/null
+++ b/lib/stdopen.h
@@ -0,0 +1,16 @@
+#ifndef STDOPEN_H
+# define STDOPEN_H 1
+
+# include <stdbool.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+bool stdopen (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/lib/stpcpy.c b/lib/stpcpy.c
new file mode 100644
index 0000000..4089d39
--- /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 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 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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/strcasecmp.c b/lib/strcasecmp.c
new file mode 100644
index 0000000..c605fb0
--- /dev/null
+++ b/lib/strcasecmp.c
@@ -0,0 +1,63 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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 (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/lib/strchrnul.c b/lib/strchrnul.c
new file mode 100644
index 0000000..07014be
--- /dev/null
+++ b/lib/strchrnul.c
@@ -0,0 +1,32 @@
+/* Searching in a string.
+ Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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)
+{
+ char c = c_in;
+ while (*s && (*s != c))
+ s++;
+
+ return (char *) s;
+}
diff --git a/lib/strdup.c b/lib/strdup.c
new file mode 100644
index 0000000..c614108
--- /dev/null
+++ b/lib/strdup.c
@@ -0,0 +1,55 @@
+/* Copyright (C) 1991, 1996, 1997, 1998, 2002, 2003, 2004, 2006, 2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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/strerror.c b/lib/strerror.c
new file mode 100644
index 0000000..54b851b
--- /dev/null
+++ b/lib/strerror.c
@@ -0,0 +1,57 @@
+/* strerror.c --- ANSI C compatible system error routine
+
+ Copyright (C) 1986, 1988, 1989, 1991, 2002, 2003, 2006, 2007 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#if !HAVE_STRERROR
+
+#include <limits.h>
+
+/* Don't include <stdio.h>, since it may or may not declare
+ sys_errlist and its declarations may collide with ours. Just
+ declare the stuff that we need directly. Standard hosted C89
+ implementations define strerror and they don't need this strerror
+ function, so take some liberties with the standard to cater to
+ ancient or limited freestanding implementations. */
+int sprintf (char *, char const *, ...);
+extern int sys_nerr;
+extern char *sys_errlist[];
+
+char *
+strerror (int n)
+{
+ static char const fmt[] = "Unknown error (%d)";
+ static char mesg[sizeof fmt + sizeof n * CHAR_BIT / 3];
+
+ if (n < 0 || n >= sys_nerr)
+ {
+ sprintf (mesg, fmt, n);
+ return mesg;
+ }
+ else
+ return sys_errlist[n];
+}
+
+#else
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#endif
diff --git a/lib/string_.h b/lib/string_.h
new file mode 100644
index 0000000..6ec72c3
--- /dev/null
+++ b/lib/string_.h
@@ -0,0 +1,546 @@
+/* A GNU-like <string.h>.
+
+ Copyright (C) 1995-1996, 2001-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_STRING_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_INCLUDE_NEXT@
+# include_next <string.h>
+#else
+# include @ABSOLUTE_STRING_H@
+#endif
+
+#ifndef _GL_STRING_H
+#define _GL_STRING_H
+
+
+/* The definition of GL_LINK_WARNING is copied here. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return the first occurrence of NEEDLE in HAYSTACK. */
+#if @GNULIB_MEMMEM@
+# if ! @HAVE_DECL_MEMMEM@
+extern void *memmem (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memmem
+# define memmem(a,al,b,bl) \
+ (GL_LINK_WARNING ("memmem is unportable - " \
+ "use gnulib module memmem for portability"), \
+ memmem (a, al, b, bl))
+#endif
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+ last written byte. */
+#if @GNULIB_MEMPCPY@
+# if ! @HAVE_MEMPCPY@
+extern void *mempcpy (void *restrict __dest, void const *restrict __src,
+ size_t __n);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mempcpy
+# define mempcpy(a,b,n) \
+ (GL_LINK_WARNING ("mempcpy is unportable - " \
+ "use gnulib module mempcpy for portability"), \
+ mempcpy (a, b, n))
+#endif
+
+/* Search backwards through a block for a byte (specified as an int). */
+#if @GNULIB_MEMRCHR@
+# if ! @HAVE_DECL_MEMRCHR@
+extern void *memrchr (void const *, int, size_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memrchr
+# define memrchr(a,b,c) \
+ (GL_LINK_WARNING ("memrchr is unportable - " \
+ "use gnulib module memrchr for portability"), \
+ memrchr (a, b, c))
+#endif
+
+/* Copy SRC to DST, returning the address of the terminating '\0' in DST. */
+#if @GNULIB_STPCPY@
+# if ! @HAVE_STPCPY@
+extern char *stpcpy (char *restrict __dst, char const *restrict __src);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef stpcpy
+# define stpcpy(a,b) \
+ (GL_LINK_WARNING ("stpcpy is unportable - " \
+ "use gnulib module stpcpy for portability"), \
+ stpcpy (a, b))
+#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 ! @HAVE_STPNCPY@
+# define stpncpy gnu_stpncpy
+extern char *stpncpy (char *restrict __dst, char const *restrict __src,
+ size_t __n);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef stpncpy
+# define stpncpy(a,b,n) \
+ (GL_LINK_WARNING ("stpncpy is unportable - " \
+ "use gnulib module stpncpy for portability"), \
+ stpncpy (a, b, n))
+#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);
+#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
+# define strcasecmp(a,b) \
+ (GL_LINK_WARNING ("strcasecmp cannot work correctly on character strings " \
+ "in multibyte locales - " \
+ "use mbscasecmp if you care about " \
+ "internationalization, or use c_strcasecmp (from " \
+ "gnulib module c-strcase) if you want a locale " \
+ "independent function"), \
+ strcasecmp (a, b))
+#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);
+#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
+# define strncasecmp(a,b,n) \
+ (GL_LINK_WARNING ("strncasecmp cannot work correctly on character " \
+ "strings in multibyte locales - " \
+ "use mbsncasecmp or mbspcasecmp if you care about " \
+ "internationalization, or use c_strncasecmp (from " \
+ "gnulib module c-strcase) if you want a locale " \
+ "independent function"), \
+ strncasecmp (a, b, n))
+#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
+# define strchr(s,c) \
+ (GL_LINK_WARNING ("strchr cannot work correctly on character strings " \
+ "in some multibyte locales - " \
+ "use mbschr if you care about internationalization"), \
+ strchr (s, c))
+#endif
+
+/* Find the first occurrence of C in S or the final NUL byte. */
+#if @GNULIB_STRCHRNUL@
+# if ! @HAVE_STRCHRNUL@
+extern char *strchrnul (char const *__s, int __c_in);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strchrnul
+# define strchrnul(a,b) \
+ (GL_LINK_WARNING ("strchrnul is unportable - " \
+ "use gnulib module strchrnul for portability"), \
+ strchrnul (a, b))
+#endif
+
+/* Duplicate S, returning an identical malloc'd string. */
+#if @GNULIB_STRDUP@
+# if ! @HAVE_DECL_STRDUP@ && ! defined strdup
+extern char *strdup (char const *__s);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strdup
+# define strdup(a) \
+ (GL_LINK_WARNING ("strdup is unportable - " \
+ "use gnulib module strdup for portability"), \
+ strdup (a))
+#endif
+
+/* Return a newly allocated copy of at most N bytes of STRING. */
+#if @GNULIB_STRNDUP@
+# if ! @HAVE_STRNDUP@
+# undef strndup
+# define strndup rpl_strndup
+# endif
+# if ! @HAVE_STRNDUP@ || ! @HAVE_DECL_STRNDUP@
+extern char *strndup (char const *__string, size_t __n);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strndup
+# define strndup(a,n) \
+ (GL_LINK_WARNING ("strndup is unportable - " \
+ "use gnulib module strndup for portability"), \
+ strndup (a, n))
+#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 ! @HAVE_DECL_STRNLEN@
+extern size_t strnlen (char const *__string, size_t __maxlen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strnlen
+# define strnlen(a,n) \
+ (GL_LINK_WARNING ("strnlen is unportable - " \
+ "use gnulib module strnlen for portability"), \
+ strnlen (a, n))
+#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
+# define strcspn(s,a) \
+ (GL_LINK_WARNING ("strcspn cannot work correctly on character strings " \
+ "in multibyte locales - " \
+ "use mbscspn if you care about internationalization"), \
+ strcspn (s, a))
+#endif
+
+/* Find the first occurrence in S of any character in ACCEPT. */
+#if @GNULIB_STRPBRK@
+# if ! @HAVE_STRPBRK@
+extern char *strpbrk (char const *__s, char const *__accept);
+# 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
+# define strpbrk(s,a) \
+ (GL_LINK_WARNING ("strpbrk cannot work correctly on character strings " \
+ "in multibyte locales - " \
+ "use mbspbrk if you care about internationalization"), \
+ strpbrk (s, a))
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strpbrk
+# define strpbrk(s,a) \
+ (GL_LINK_WARNING ("strpbrk is unportable - " \
+ "use gnulib module strpbrk for portability"), \
+ strpbrk (s, a))
+#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
+# define strspn(s,a) \
+ (GL_LINK_WARNING ("strspn cannot work correctly on character strings " \
+ "in multibyte locales - " \
+ "use mbsspn if you care about internationalization"), \
+ strspn (s, a))
+#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
+# define strrchr(s,c) \
+ (GL_LINK_WARNING ("strrchr cannot work correctly on character strings " \
+ "in some multibyte locales - " \
+ "use mbsrchr if you care about internationalization"), \
+ strrchr (s, c))
+#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@
+extern char *strsep (char **restrict __stringp, char const *restrict __delim);
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef strsep
+# define strsep(s,d) \
+ (GL_LINK_WARNING ("strsep cannot work correctly on character strings " \
+ "in multibyte locales - " \
+ "use mbssep if you care about internationalization"), \
+ strsep (s, d))
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strsep
+# define strsep(s,d) \
+ (GL_LINK_WARNING ("strsep is unportable - " \
+ "use gnulib module strsep for portability"), \
+ strsep (s, d))
+#endif
+
+#if 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
+# define strstr(a,b) \
+ (GL_LINK_WARNING ("strstr cannot work correctly on character strings " \
+ "in most multibyte locales - " \
+ "use mbsstr if you care about internationalization"), \
+ strstr (a, b))
+#endif
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison. */
+#if ! @HAVE_STRCASESTR@
+extern char *strcasestr (const char *haystack, const char *needle);
+#endif
+#if 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
+# define strcasestr(a,b) \
+ (GL_LINK_WARNING ("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"), \
+ strcasestr (a, b))
+#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:
+ http://www.opengroup.org/susv3xsh/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 ! @HAVE_DECL_STRTOK_R@
+extern char *strtok_r (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr);
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef strtok_r
+# define strtok_r(s,d,p) \
+ (GL_LINK_WARNING ("strtok_r cannot work correctly on character strings " \
+ "in multibyte locales - " \
+ "use mbstok_r if you care about internationalization"), \
+ strtok_r (s, d, p))
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtok_r
+# define strtok_r(s,d,p) \
+ (GL_LINK_WARNING ("strtok_r is unportable - " \
+ "use gnulib module strtok_r for portability"), \
+ strtok_r (s, d, p))
+#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. */
+extern size_t mbslen (const char *string);
+#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. */
+# define mbschr rpl_mbschr /* avoid collision with HP-UX function */
+extern char * mbschr (const char *string, int c);
+#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. */
+# define mbsrchr rpl_mbsrchr /* avoid collision with HP-UX function */
+extern char * mbsrchr (const char *string, int c);
+#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. */
+extern char * mbsstr (const char *haystack, const char *needle);
+#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. */
+extern int mbscasecmp (const char *s1, const char *s2);
+#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! */
+extern int mbsncasecmp (const char *s1, const char *s2, size_t n);
+#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, returning less than, equal to or greater than zero if this
+ initial segment is lexicographically less than, equal to or greater than
+ PREFIX.
+ Note: This function may, in multibyte locales, return 0 if STRING is of
+ smaller length than PREFIX!
+ Unlike strncasecmp(), this function works correctly in multibyte
+ locales. */
+extern char * mbspcasecmp (const char *string, const char *prefix);
+#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. */
+extern char * mbscasestr (const char *haystack, const char *needle);
+#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. */
+extern size_t mbscspn (const char *string, const char *accept);
+#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. */
+# define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
+extern char * mbspbrk (const char *string, const char *accept);
+#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. */
+extern size_t mbsspn (const char *string, const char *reject);
+#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(). */
+extern char * mbssep (char **stringp, const char *delim);
+#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(). */
+extern char * mbstok_r (char *string, const char *delim, char **save_ptr);
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_STRING_H */
+#endif /* _GL_STRING_H */
diff --git a/lib/stripslash.c b/lib/stripslash.c
new file mode 100644
index 0000000..342d497
--- /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 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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..473a610
--- /dev/null
+++ b/lib/strncasecmp.c
@@ -0,0 +1,63 @@
+/* strncasecmp.c -- case insensitive string comparator
+ Copyright (C) 1998-1999, 2005-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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 (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/lib/strndup.c b/lib/strndup.c
new file mode 100644
index 0000000..3a1b0ea
--- /dev/null
+++ b/lib/strndup.c
@@ -0,0 +1,37 @@
+/* A replacement function, for systems that lack strndup.
+
+ Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2005, 2006, 2007
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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..d346d32
--- /dev/null
+++ b/lib/strnlen.c
@@ -0,0 +1,31 @@
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ Copyright (C) 2005, 2006, 2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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..422ed9e
--- /dev/null
+++ b/lib/strnlen1.c
@@ -0,0 +1,36 @@
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ Copyright (C) 2005-2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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..7ce7d0c
--- /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 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRNLEN1_H */
diff --git a/lib/strtoimax.c b/lib/strtoimax.c
new file mode 100644
index 0000000..82dc4f0
--- /dev/null
+++ b/lib/strtoimax.c
@@ -0,0 +1,76 @@
+/* Convert string representation of a number into an intmax_t value.
+
+ Copyright (C) 1999, 2001, 2002, 2003, 2004, 2006 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+/* Verify interface. */
+#include <inttypes.h>
+
+#include <stdlib.h>
+
+#include "verify.h"
+
+#ifdef UNSIGNED
+# ifndef HAVE_DECL_STRTOULL
+"this configure-time declaration test was not run"
+# endif
+# if !HAVE_DECL_STRTOULL && HAVE_UNSIGNED_LONG_LONG_INT
+unsigned long long int strtoull (char const *, char **, int);
+# endif
+
+#else
+
+# ifndef HAVE_DECL_STRTOLL
+"this configure-time declaration test was not run"
+# endif
+# if !HAVE_DECL_STRTOLL && HAVE_LONG_LONG_INT
+long long int strtoll (char const *, char **, int);
+# endif
+#endif
+
+#ifdef UNSIGNED
+# define Have_long_long HAVE_UNSIGNED_LONG_LONG_INT
+# define Int uintmax_t
+# define Unsigned unsigned
+# define strtoimax strtoumax
+# define strtol strtoul
+# define strtoll strtoull
+#else
+# define Have_long_long HAVE_LONG_LONG_INT
+# define Int intmax_t
+# define Unsigned
+#endif
+
+Int
+strtoimax (char const *ptr, char **endptr, int base)
+{
+#if Have_long_long
+ verify (sizeof (Int) == sizeof (Unsigned long int)
+ || sizeof (Int) == sizeof (Unsigned long long int));
+
+ if (sizeof (Int) != sizeof (Unsigned long int))
+ return strtoll (ptr, endptr, base);
+#else
+ verify (sizeof (Int) == sizeof (Unsigned long int));
+#endif
+
+ return strtol (ptr, endptr, base);
+}
diff --git a/lib/strtol.c b/lib/strtol.c
new file mode 100644
index 0000000..e14d3cf
--- /dev/null
+++ b/lib/strtol.c
@@ -0,0 +1,436 @@
+/* Convert string representation of a number into an integer value.
+
+ Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2003, 2005,
+ 2006, 2007
+ 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 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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 LONG_LONG_MIN
+# define STRTOL_LONG_MAX LONG_LONG_MAX
+# define STRTOL_ULONG_MAX ULONG_LONG_MAX
+
+/* The extra casts in the following macros work around compiler bugs,
+ e.g., in Cray C 5.0.3.0. */
+
+/* True if negative values of the signed integer type T use two's
+ complement, ones' complement, or signed magnitude representation,
+ respectively. Much GNU code assumes two's complement, but some
+ people like to be portable to all possible C hosts. */
+# define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
+# define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
+# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
+
+/* True if the arithmetic type T is signed. */
+# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* The maximum and minimum values for the integer type T. These
+ macros have undefined behavior if T is signed and has padding bits.
+ If this is a problem for you, please let us know how to fix it for
+ your host. */
+# define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : TYPE_SIGNED_MAGNITUDE (t) \
+ ? ~ (t) 0 \
+ : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+# define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+
+# ifndef ULONG_LONG_MAX
+# define ULONG_LONG_MAX TYPE_MAXIMUM (unsigned long long)
+# endif
+# ifndef LONG_LONG_MAX
+# define LONG_LONG_MAX TYPE_MAXIMUM (long long int)
+# endif
+# ifndef LONG_LONG_MIN
+# define LONG_LONG_MIN TYPE_MINIMUM (long long int)
+# endif
+
+# if __GNUC__ == 2 && __GNUC_MINOR__ < 7
+ /* Work around gcc bug with using this constant. */
+ static const unsigned long long int maxquad = ULONG_LONG_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
+
+#include <wchar.h>
+
+#ifdef USE_WIDE_CHAR
+# 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..f61f5ad
--- /dev/null
+++ b/lib/strtoll.c
@@ -0,0 +1,33 @@
+/* Function to parse a `long long int' from text.
+ Copyright (C) 1995, 1996, 1997, 1999, 2001 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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/strtoul.c b/lib/strtoul.c
new file mode 100644
index 0000000..79ceed2
--- /dev/null
+++ b/lib/strtoul.c
@@ -0,0 +1,20 @@
+/* Copyright (C) 1991, 1997 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#define UNSIGNED 1
+
+#include "strtol.c"
diff --git a/lib/strtoull.c b/lib/strtoull.c
new file mode 100644
index 0000000..6186bfb
--- /dev/null
+++ b/lib/strtoull.c
@@ -0,0 +1,27 @@
+/* Function to parse an `unsigned long long int' from text.
+ Copyright (C) 1995, 1996, 1997, 1999 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 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#define QUAD 1
+
+#include "strtoul.c"
+
+#ifdef _LIBC
+strong_alias (__strtoull_internal, __strtouq_internal)
+weak_alias (strtoull, strtouq)
+#endif
diff --git a/lib/strtoumax.c b/lib/strtoumax.c
new file mode 100644
index 0000000..dc395d6
--- /dev/null
+++ b/lib/strtoumax.c
@@ -0,0 +1,2 @@
+#define UNSIGNED 1
+#include "strtoimax.c"
diff --git a/lib/sys_stat_.h b/lib/sys_stat_.h
new file mode 100644
index 0000000..13333d3
--- /dev/null
+++ b/lib/sys_stat_.h
@@ -0,0 +1,284 @@
+/* Provide a more complete sys/stat header file.
+ Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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. */
+
+#ifndef _GL_SYS_STAT_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_INCLUDE_NEXT@
+# include_next <sys/stat.h>
+#else
+# include @ABSOLUTE_SYS_STAT_H@
+#endif
+
+#ifndef _GL_SYS_STAT_H
+#define _GL_SYS_STAT_H
+
+#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_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
+
+/* S_IXUGO is a common extension to POSIX. */
+#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
+
+/* mingw does not support symlinks, therefore it does not have lstat. But
+ without links, stat does just fine. */
+#if ! @HAVE_LSTAT@
+# define lstat stat
+#endif
+
+/* 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 io.h. */
+#if ! @HAVE_DECL_MKDIR@ && @HAVE_IO_H@
+# include <io.h>
+
+static inline int
+rpl_mkdir (char const *name, mode_t mode)
+{
+ return _mkdir (name);
+}
+
+# define mkdir rpl_mkdir
+#endif
+
+#endif /* _GL_SYS_STAT_H */
+#endif /* _GL_SYS_STAT_H */
diff --git a/lib/sys_time_.h b/lib/sys_time_.h
new file mode 100644
index 0000000..253316f
--- /dev/null
+++ b/lib/sys_time_.h
@@ -0,0 +1,52 @@
+/* Provide a more complete sys/time.h.
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#ifndef _GL_SYS_TIME_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SYS_TIME_H@
+# if @HAVE_INCLUDE_NEXT@
+# include_next <sys/time.h>
+# else
+# include @ABSOLUTE_SYS_TIME_H@
+# endif
+#else
+# include <time.h>
+#endif
+
+#ifndef _GL_SYS_TIME_H
+#define _GL_SYS_TIME_H
+
+#if ! @HAVE_STRUCT_TIMEVAL@
+struct timeval
+{
+ time_t tv_sec;
+ long int tv_usec;
+};
+#endif
+
+#if @REPLACE_GETTIMEOFDAY@
+# undef gettimeofday
+# define gettimeofday rpl_gettimeofday
+int gettimeofday (struct timeval *restrict, void *restrict);
+#endif
+
+#endif /* _GL_SYS_TIME_H */
+#endif /* _GL_SYS_TIME_H */
diff --git a/lib/sysexits_.h b/lib/sysexits_.h
new file mode 100644
index 0000000..ba12aa2
--- /dev/null
+++ b/lib/sysexits_.h
@@ -0,0 +1,72 @@
+/* exit() exit codes for some BSD system programs.
+ Copyright (C) 2003, 2006-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson based on sysexits(3) man page */
+
+#ifndef _GL_SYSEXITS_H
+
+#if @HAVE_SYSEXITS_H@
+
+/* IRIX 6.5 has an <unistd.h> that defines a macro EX_OK with a nonzero
+ value. Override it. See
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-03/msg00361.html> */
+# ifdef __sgi
+# include <unistd.h>
+# undef EX_OK
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# if @HAVE_INCLUDE_NEXT@
+# include_next <sysexits.h>
+# else
+# include @ABSOLUTE_SYSEXITS_H@
+# endif
+
+/* HP-UX 11 <sysexits.h> ends at EX_NOPERM. */
+# ifndef EX_CONFIG
+# define EX_CONFIG 78
+# endif
+
+#endif
+
+#ifndef _GL_SYSEXITS_H
+#define _GL_SYSEXITS_H
+
+#if !@HAVE_SYSEXITS_H@
+
+# define EX_OK 0 /* same value as EXIT_SUCCESS */
+
+# define EX_USAGE 64
+# define EX_DATAERR 65
+# define EX_NOINPUT 66
+# define EX_NOUSER 67
+# define EX_NOHOST 68
+# define EX_UNAVAILABLE 69
+# define EX_SOFTWARE 70
+# define EX_OSERR 71
+# define EX_OSFILE 72
+# define EX_CANTCREAT 73
+# define EX_IOERR 74
+# define EX_TEMPFAIL 75
+# define EX_PROTOCOL 76
+# define EX_NOPERM 77
+# define EX_CONFIG 78
+
+#endif
+
+#endif /* _GL_SYSEXITS_H */
+#endif /* _GL_SYSEXITS_H */
diff --git a/lib/system-ioctl.h b/lib/system-ioctl.h
new file mode 100644
index 0000000..a61c5fd
--- /dev/null
+++ b/lib/system-ioctl.h
@@ -0,0 +1,55 @@
+/* System dependent definitions for GNU tar's use of ioctl macros.
+
+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003,
+ 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This is a real challenge to properly get MTIO* symbols :-(. ISC uses
+ <sys/gentape.h>. SCO and BSDi uses <sys/tape.h>; BSDi also requires
+ <sys/tprintf.h> and <sys/device.h> for defining tp_dev and tpr_t. It
+ seems that the rest use <sys/mtio.h>, which itself requires other files,
+ depending on systems. Pyramid defines _IOW in <sgtty.h>, for example. */
+
+#if HAVE_SYS_GENTAPE_H
+# include <sys/gentape.h>
+#else
+# if HAVE_SYS_TAPE_H
+# if HAVE_SYS_DEVICE_H
+# include <sys/device.h>
+# endif
+# if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# endif
+# if HAVE_SYS_BUF_H
+# include <sys/buf.h>
+# endif
+# if HAVE_SYS_TPRINTF_H
+# include <sys/tprintf.h>
+# endif
+# include <sys/tape.h>
+# else
+# if HAVE_SYS_MTIO_H
+# include <sys/ioctl.h>
+# if HAVE_SGTTY_H
+# include <sgtty.h>
+# endif
+# if HAVE_SYS_IO_TRIOCTL_H
+# include <sys/io/trioctl.h>
+# endif
+# include <sys/mtio.h>
+# endif
+# endif
+#endif
diff --git a/lib/system.h b/lib/system.h
new file mode 100644
index 0000000..7602263
--- /dev/null
+++ b/lib/system.h
@@ -0,0 +1,475 @@
+/* System dependent definitions for GNU tar.
+
+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003,
+ 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <alloca.h>
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# define __attribute__(spec) /* empty */
+# endif
+#endif
+
+#include <sys/types.h>
+#include <ctype.h>
+
+/* IN_CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given
+ as an argument to <ctype.h> macros like `isspace'. */
+#if STDC_HEADERS
+# define IN_CTYPE_DOMAIN(c) 1
+#else
+# define IN_CTYPE_DOMAIN(c) ((unsigned) (c) <= 0177)
+#endif
+
+#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
+#define ISODIGIT(c) ((unsigned) (c) - '0' <= 7)
+#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
+#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
+
+/* Declare string and memory handling routines. Take care that an ANSI
+ string.h and pre-ANSI memory.h might conflict, and that memory.h and
+ strings.h conflict on some systems. */
+
+#if STDC_HEADERS || HAVE_STRING_H
+# include <string.h>
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+#else
+# include <strings.h>
+# ifndef strchr
+# define strchr index
+# endif
+# ifndef strrchr
+# define strrchr rindex
+# endif
+# ifndef memcpy
+# define memcpy(d, s, n) bcopy ((char const *) (s), (char *) (d), n)
+# endif
+# ifndef memcmp
+# define memcmp(a, b, n) bcmp ((char const *) (a), (char const *) (b), n)
+# endif
+#endif
+
+/* Declare errno. */
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+/* Declare open parameters. */
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#else
+# include <sys/file.h>
+#endif
+ /* Pick only one of the next three: */
+#ifndef O_RDONLY
+# define O_RDONLY 0 /* only allow read */
+#endif
+#ifndef O_WRONLY
+# define O_WRONLY 1 /* only allow write */
+#endif
+#ifndef O_RDWR
+# define O_RDWR 2 /* both are allowed */
+#endif
+#ifndef O_ACCMODE
+# define O_ACCMODE (O_RDONLY | O_RDWR | O_WRONLY)
+#endif
+ /* The rest can be OR-ed in to the above: */
+#ifndef O_CREAT
+# define O_CREAT 8 /* create file if needed */
+#endif
+#ifndef O_EXCL
+# define O_EXCL 16 /* file cannot already exist */
+#endif
+#ifndef O_TRUNC
+# define O_TRUNC 32 /* truncate file on open */
+#endif
+
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+#ifndef O_DIRECTORY
+# define O_DIRECTORY 0
+#endif
+#ifndef O_NOATIME
+# define O_NOATIME 0
+#endif
+#ifndef O_NONBLOCK
+# define O_NONBLOCK 0
+#endif
+
+/* Declare file status routines and bits. */
+
+#include <sys/stat.h>
+
+#if !HAVE_LSTAT && !defined lstat
+# define lstat stat
+#endif
+
+#if STX_HIDDEN && !_LARGE_FILES /* AIX */
+# ifdef stat
+# undef stat
+# endif
+# define stat(file_name, buf) statx (file_name, buf, STATSIZE, STX_HIDDEN)
+# ifdef lstat
+# undef lstat
+# endif
+# define lstat(file_name, buf) statx (file_name, buf, STATSIZE, STX_HIDDEN | STX_LINK)
+#endif
+
+#if STAT_MACROS_BROKEN
+# undef S_ISBLK
+# undef S_ISCHR
+# undef S_ISCTG
+# undef S_ISDIR
+# undef S_ISFIFO
+# undef S_ISLNK
+# undef S_ISREG
+# undef S_ISSOCK
+#endif
+
+/* On MSDOS, there are missing things from <sys/stat.h>. */
+#if MSDOS
+# define S_ISUID 0
+# define S_ISGID 0
+# define S_ISVTX 0
+#endif
+
+#ifndef S_ISDIR
+# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+#endif
+#ifndef S_ISREG
+# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
+#endif
+
+#ifndef S_ISBLK
+# ifdef S_IFBLK
+# define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
+# else
+# define S_ISBLK(mode) 0
+# endif
+#endif
+#ifndef S_ISCHR
+# ifdef S_IFCHR
+# define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
+# else
+# define S_ISCHR(mode) 0
+# endif
+#endif
+#ifndef S_ISCTG
+# ifdef S_IFCTG
+# define S_ISCTG(mode) (((mode) & S_IFMT) == S_IFCTG)
+# else
+# define S_ISCTG(mode) 0
+# endif
+#endif
+#ifndef S_ISDOOR
+# define S_ISDOOR(mode) 0
+#endif
+#ifndef S_ISFIFO
+# ifdef S_IFIFO
+# define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
+# else
+# define S_ISFIFO(mode) 0
+# endif
+#endif
+#ifndef S_ISLNK
+# ifdef S_IFLNK
+# define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
+# else
+# define S_ISLNK(mode) 0
+# endif
+#endif
+#ifndef S_ISSOCK
+# ifdef S_IFSOCK
+# define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
+# else
+# define S_ISSOCK(mode) 0
+# endif
+#endif
+
+#if !HAVE_MKFIFO && !defined mkfifo && defined S_IFIFO
+# define mkfifo(file_name, mode) (mknod (file_name, (mode) | S_IFIFO, 0))
+#endif
+
+#ifndef S_ISUID
+# define S_ISUID 0004000
+#endif
+#ifndef S_ISGID
+# define S_ISGID 0002000
+#endif
+#ifndef S_ISVTX
+# define S_ISVTX 0001000
+#endif
+#ifndef S_IRUSR
+# define S_IRUSR 0000400
+#endif
+#ifndef S_IWUSR
+# define S_IWUSR 0000200
+#endif
+#ifndef S_IXUSR
+# define S_IXUSR 0000100
+#endif
+#ifndef S_IRGRP
+# define S_IRGRP 0000040
+#endif
+#ifndef S_IWGRP
+# define S_IWGRP 0000020
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0000010
+#endif
+#ifndef S_IROTH
+# define S_IROTH 0000004
+#endif
+#ifndef S_IWOTH
+# define S_IWOTH 0000002
+#endif
+#ifndef S_IXOTH
+# define S_IXOTH 0000001
+#endif
+
+#define MODE_WXUSR (S_IWUSR | S_IXUSR)
+#define MODE_R (S_IRUSR | S_IRGRP | S_IROTH)
+#define MODE_RW (S_IWUSR | S_IWGRP | S_IWOTH | MODE_R)
+#define MODE_RWX (S_IXUSR | S_IXGRP | S_IXOTH | MODE_RW)
+#define MODE_ALL (S_ISUID | S_ISGID | S_ISVTX | MODE_RWX)
+
+/* Include <unistd.h> before any preprocessor test of _POSIX_VERSION. */
+#include <unistd.h>
+
+#ifndef SEEK_SET
+# define SEEK_SET 0
+#endif
+#ifndef SEEK_CUR
+# define SEEK_CUR 1
+#endif
+#ifndef SEEK_END
+# define SEEK_END 2
+#endif
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* Declare make device, major and minor. Since major is a function on
+ SVR4, we have to resort to GOT_MAJOR instead of just testing if
+ major is #define'd. */
+
+#if MAJOR_IN_MKDEV
+# include <sys/mkdev.h>
+# if !defined(makedev) && defined(mkdev)
+# define makedev(a,b) mkdev((a),(b))
+# endif
+# define GOT_MAJOR
+#endif
+
+#if MAJOR_IN_SYSMACROS
+# include <sys/sysmacros.h>
+# define GOT_MAJOR
+#endif
+
+/* Some <sys/types.h> defines the macros. */
+#ifdef major
+# define GOT_MAJOR
+#endif
+
+#ifndef GOT_MAJOR
+# if MSDOS
+# define major(device) (device)
+# define minor(device) (device)
+# define makedev(major, minor) (((major) << 8) | (minor))
+# define GOT_MAJOR
+# endif
+#endif
+
+/* For HP-UX before HP-UX 8, major/minor are not in <sys/sysmacros.h>. */
+#ifndef GOT_MAJOR
+# if defined(hpux) || defined(__hpux__) || defined(__hpux)
+# include <sys/mknod.h>
+# define GOT_MAJOR
+# endif
+#endif
+
+#ifndef GOT_MAJOR
+# define major(device) (((device) >> 8) & 0xff)
+# define minor(device) ((device) & 0xff)
+# define makedev(major, minor) (((major) << 8) | (minor))
+#endif
+
+#undef GOT_MAJOR
+
+/* Declare wait status. */
+
+#if HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(s) (((s) >> 8) & 0xff)
+#endif
+#ifndef WIFSIGNALED
+# define WIFSIGNALED(s) (((s) & 0xffff) - 1 < (unsigned) 0xff)
+#endif
+#ifndef WTERMSIG
+# define WTERMSIG(s) ((s) & 0x7f)
+#endif
+
+/* FIXME: It is wrong to use BLOCKSIZE for buffers when the logical block
+ size is greater than 512 bytes; so ST_BLKSIZE code below, in preparation
+ for some cleanup in this area, later. */
+
+/* Extract or fake data from a `struct stat'. ST_BLKSIZE gives the
+ optimal I/O blocksize for the file, in bytes. Some systems, like
+ Sequents, return st_blksize of 0 on pipes. */
+
+#define DEFAULT_ST_BLKSIZE 512
+
+#if !HAVE_ST_BLKSIZE
+# define ST_BLKSIZE(statbuf) DEFAULT_ST_BLKSIZE
+#else
+# define ST_BLKSIZE(statbuf) \
+ ((statbuf).st_blksize > 0 ? (statbuf).st_blksize : DEFAULT_ST_BLKSIZE)
+#endif
+
+/* Extract or fake data from a `struct stat'. ST_NBLOCKS gives the
+ number of ST_NBLOCKSIZE-byte blocks in the file (including indirect blocks).
+ HP-UX counts st_blocks in 1024-byte units,
+ this loses when mixing HP-UX and BSD filesystems with NFS. AIX PS/2
+ counts st_blocks in 4K units. */
+
+#if !HAVE_ST_BLOCKS
+# if defined(_POSIX_SOURCE) || !defined(BSIZE)
+# define ST_NBLOCKS(statbuf) ((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0))
+# else
+ off_t st_blocks ();
+# define ST_NBLOCKS(statbuf) (st_blocks ((statbuf).st_size))
+# endif
+#else
+# define ST_NBLOCKS(statbuf) ((statbuf).st_blocks)
+# if defined(hpux) || defined(__hpux__) || defined(__hpux)
+# define ST_NBLOCKSIZE 1024
+# else
+# if defined(_AIX) && defined(_I386)
+# define ST_NBLOCKSIZE (4 * 1024)
+# endif
+# endif
+#endif
+
+#ifndef ST_NBLOCKSIZE
+# define ST_NBLOCKSIZE 512
+#endif
+
+#define ST_IS_SPARSE(st) \
+ (ST_NBLOCKS (st) \
+ < ((st).st_size / ST_NBLOCKSIZE + ((st).st_size % ST_NBLOCKSIZE != 0)))
+
+/* Declare standard functions. */
+
+#if STDC_HEADERS
+# include <stdlib.h>
+#else
+void *malloc ();
+char *getenv ();
+#endif
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#include <stdio.h>
+#if !defined _POSIX_VERSION && MSDOS
+# include <io.h>
+#endif
+
+#if WITH_DMALLOC
+# define DMALLOC_FUNC_CHECK
+# include <dmalloc.h>
+#endif
+
+#include <limits.h>
+
+#ifndef MB_LEN_MAX
+# define MB_LEN_MAX 1
+#endif
+
+#include <inttypes.h>
+
+#include <intprops.h>
+
+#define UINTMAX_STRSIZE_BOUND INT_BUFSIZE_BOUND (uintmax_t)
+
+/* Prototypes for external functions. */
+
+#if HAVE_LOCALE_H
+# include <locale.h>
+#endif
+#if !HAVE_SETLOCALE
+# define setlocale(category, locale) /* empty */
+#endif
+
+#include <time.h>
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+#endif
+
+/* Library modules. */
+
+#include <dirname.h>
+#include <error.h>
+#include <savedir.h>
+#include <unlocked-io.h>
+#include <xalloc.h>
+
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#if MSDOS
+# include <process.h>
+# define SET_BINARY_MODE(arc) setmode(arc, O_BINARY)
+# define ERRNO_IS_EACCES errno == EACCES
+# define mkdir(file, mode) (mkdir) (file)
+# define TTY_NAME "con"
+# define sys_reset_uid_gid()
+#else
+# include <pwd.h>
+# include <grp.h>
+# define SET_BINARY_MODE(arc)
+# define ERRNO_IS_EACCES 0
+# define TTY_NAME "/dev/tty"
+# define sys_reset_uid_gid() \
+ do { setuid (getuid ()); setgid (getgid ()); } while (0)
+#endif
+
+#if XENIX
+# include <sys/inode.h>
+#endif
diff --git a/lib/tempname.c b/lib/tempname.c
new file mode 100644
index 0000000..e213600
--- /dev/null
+++ b/lib/tempname.c
@@ -0,0 +1,315 @@
+/* tempname.c - generate the name of a temporary file.
+
+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2001, 2002, 2003, 2005, 2006, 2007 Free Software Foundation,
+ Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Extracted from glibc sysdeps/posix/tempname.c. See also tmpdir.c. */
+
+#if !_LIBC
+# include <config.h>
+# include "tempname.h"
+#endif
+
+#include <sys/types.h>
+#include <assert.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#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_BIGFILE 1
+# define __GT_DIR 2
+# define __GT_NOCREATE 3
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fcntl.h>
+#include <sys/time.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#include <sys/stat.h>
+
+#if _LIBC
+# define struct_stat64 struct stat64
+# define small_open __open
+# define large_open __open64
+#else
+# define struct_stat64 struct stat
+# define small_open open
+# define large_open open
+# define __gen_tempname gen_tempname
+# define __getpid getpid
+# define __gettimeofday gettimeofday
+# define __mkdir mkdir
+# define __lxstat64(version, file, buf) lstat (file, buf)
+# define __xstat64(version, file, buf) stat (file, buf)
+#endif
+
+#if ! (HAVE___SECURE_GETENV || _LIBC)
+# define __secure_getenv getenv
+#endif
+
+#ifdef _LIBC
+# include <hp-timing.h>
+# if HP_TIMING_AVAIL
+# define RANDOM_BITS(Var) \
+ if (__builtin_expect (value == UINT64_C (0), 0)) \
+ { \
+ /* If this is the first time this function is used initialize \
+ the variable we accumulate the value in to some somewhat \
+ random value. If we'd not do this programs at startup time \
+ might have a reduced set of possible names, at least on slow \
+ machines. */ \
+ struct timeval tv; \
+ __gettimeofday (&tv, NULL); \
+ value = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; \
+ } \
+ HP_TIMING_NOW (Var)
+# endif
+#endif
+
+/* Use the widest available unsigned type if uint64_t is not
+ available. The algorithm below extracts a number less than 62**6
+ (approximately 2**35.725) from uint64_t, so ancient hosts where
+ uintmax_t is only 32 bits lose about 3.725 bits of randomness,
+ which is better than not having mkstemp at all. */
+#if !defined UINT64_MAX && !defined uint64_t
+# define uint64_t uintmax_t
+#endif
+
+#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 */
+
+/* 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 "XXXXXX"). 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 the file using open(O_CREAT|O_EXCL)
+ and return a read-write fd. The file is mode 0600.
+ __GT_BIGFILE: same as __GT_FILE but use open64().
+ __GT_DIR: create a directory, which will be mode 0700.
+
+ We use a clever algorithm to get hard-to-predict names. */
+int
+__gen_tempname (char *tmpl, int kind)
+{
+ int len;
+ char *XXXXXX;
+ static uint64_t value;
+ uint64_t random_time_bits;
+ unsigned int count;
+ int fd = -1;
+ int save_errno = errno;
+ struct_stat64 st;
+
+ /* 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 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. */
+#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
+
+ len = strlen (tmpl);
+ if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ /* This is where the Xs start. */
+ XXXXXX = &tmpl[len - 6];
+
+ /* Get some more or less random data. */
+#ifdef RANDOM_BITS
+ RANDOM_BITS (random_time_bits);
+#else
+ {
+ struct timeval tv;
+ __gettimeofday (&tv, NULL);
+ random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
+ }
+#endif
+ value += random_time_bits ^ __getpid ();
+
+ for (count = 0; count < attempts; value += 7777, ++count)
+ {
+ uint64_t v = value;
+
+ /* Fill in the random bits. */
+ XXXXXX[0] = letters[v % 62];
+ v /= 62;
+ XXXXXX[1] = letters[v % 62];
+ v /= 62;
+ XXXXXX[2] = letters[v % 62];
+ v /= 62;
+ XXXXXX[3] = letters[v % 62];
+ v /= 62;
+ XXXXXX[4] = letters[v % 62];
+ v /= 62;
+ XXXXXX[5] = letters[v % 62];
+
+ switch (kind)
+ {
+ case __GT_FILE:
+ fd = small_open (tmpl, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ break;
+
+ case __GT_BIGFILE:
+ fd = large_open (tmpl, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ break;
+
+ case __GT_DIR:
+ fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
+ break;
+
+ case __GT_NOCREATE:
+ /* This case is backward from the other three. __gen_tempname
+ succeeds if __xstat fails because the name does not exist.
+ Note the continue to bypass the common logic at the bottom
+ of the loop. */
+ if (__lxstat64 (_STAT_VER, tmpl, &st) < 0)
+ {
+ if (errno == ENOENT)
+ {
+ __set_errno (save_errno);
+ return 0;
+ }
+ else
+ /* Give up now. */
+ return -1;
+ }
+ continue;
+
+ default:
+ assert (! "invalid KIND in __gen_tempname");
+ }
+
+ 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;
+}
diff --git a/lib/tempname.h b/lib/tempname.h
new file mode 100644
index 0000000..c51fa69
--- /dev/null
+++ b/lib/tempname.h
@@ -0,0 +1,40 @@
+/* Create a temporary file or directory.
+
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* header written by Eric Blake */
+
+/* In gnulib, always prefer large files. GT_FILE maps to
+ __GT_BIGFILE, not __GT_FILE, for a reason. */
+#define GT_FILE 1
+#define GT_DIR 2
+#define GT_NOCREATE 3
+
+/* Generate a temporary file name based on TMPL. TMPL must match the
+ rules for mk[s]temp (i.e. end in "XXXXXX"). 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 kind);
diff --git a/lib/time_.h b/lib/time_.h
new file mode 100644
index 0000000..9a0507e
--- /dev/null
+++ b/lib/time_.h
@@ -0,0 +1,125 @@
+/* A more-standard <time.h>.
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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. */
+#if defined __need_time_t || defined __need_clock_t || defined __need_timespec
+
+# if @HAVE_INCLUDE_NEXT@
+# include_next <time.h>
+# else
+# include @ABSOLUTE_TIME_H@
+# endif
+
+#else
+/* Normal invocation convention. */
+
+# if ! defined _GL_TIME_H
+
+/* The include_next requires a split double-inclusion guard. */
+# if @HAVE_INCLUDE_NEXT@
+# include_next <time.h>
+# else
+# include @ABSOLUTE_TIME_H@
+# endif
+
+# if ! defined _GL_TIME_H
+# define _GL_TIME_H
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3).
+ Or they define it with the wrong member names or define it in <sys/time.h>
+ (e.g., FreeBSD circa 1997). */
+# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@
+# if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+# include <sys/time.h>
+# else
+# undef timespec
+# define timespec rpl_timespec
+struct timespec
+{
+ time_t tv_sec;
+ long int tv_nsec;
+};
+# endif
+# endif
+
+/* Sleep for at least RQTP seconds unless interrupted, If interrupted,
+ return -1 and store the remaining time into RMTP. See
+ <http://www.opengroup.org/susv3xsh/nanosleep.html>. */
+# if @REPLACE_NANOSLEEP@
+# define nanosleep rpl_nanosleep
+int nanosleep (struct timespec const *__rqtp, struct timespec *__rmtp);
+# endif
+
+/* Convert TIMER to RESULT, assuming local time and UTC respectively. See
+ <http://www.opengroup.org/susv3xsh/localtime_r.html> and
+ <http://www.opengroup.org/susv3xsh/gmtime_r.html>. */
+# if @REPLACE_LOCALTIME_R@
+# undef localtime_r
+# define localtime_r rpl_localtime_r
+# undef gmtime_r
+# define gmtime_r rpl_gmtime_r
+struct tm *localtime_r (time_t const *restrict __timer,
+ struct tm *restrict __result);
+struct tm *gmtime_r (time_t const *restrict __timer,
+ struct tm *restrict __result);
+# endif
+
+/* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store
+ the resulting broken-down time into TM. See
+ <http://www.opengroup.org/susv3xsh/strptime.html>. */
+# if @REPLACE_STRPTIME@
+# undef strptime
+# define strptime rpl_strptime
+char *strptime (char const *restrict __buf, char const *restrict __format,
+ struct tm *restrict __tm);
+# endif
+
+/* Convert TM to a time_t value, assuming UTC. */
+# if @REPLACE_TIMEGM@
+# undef timegm
+# define timegm rpl_timegm
+time_t timegm (struct tm *__tm);
+# 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 GNULIB_PORTCHECK
+# undef asctime
+# define asctime eschew_asctime
+# undef asctime_r
+# define asctime_r eschew_asctime_r
+# undef ctime
+# define ctime eschew_ctime
+# undef ctime_r
+# define ctime_r eschew_ctime_r
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+# endif /* _GL_TIME_H */
+# endif /* _GL_TIME_H */
+#endif
diff --git a/lib/time_r.c b/lib/time_r.c
new file mode 100644
index 0000000..2b72692
--- /dev/null
+++ b/lib/time_r.c
@@ -0,0 +1,47 @@
+/* Reentrant time functions like localtime_r.
+
+ Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include <time.h>
+
+#include <string.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/timespec.h b/lib/timespec.h
new file mode 100644
index 0000000..cce2d66
--- /dev/null
+++ b/lib/timespec.h
@@ -0,0 +1,37 @@
+/* timespec -- System time interface
+
+ Copyright (C) 2000, 2002, 2004, 2005, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if ! defined TIMESPEC_H
+# define TIMESPEC_H
+
+# include <time.h>
+
+/* Return negative, zero, positive if A < B, A == B, A > B, respectively.
+ Assume the nanosecond components are in range, or close to it. */
+static inline int
+timespec_cmp (struct timespec a, struct timespec b)
+{
+ return (a.tv_sec < b.tv_sec ? -1
+ : a.tv_sec > b.tv_sec ? 1
+ : a.tv_nsec - b.tv_nsec);
+}
+
+void gettime (struct timespec *);
+int settime (struct timespec const *);
+
+#endif
diff --git a/lib/uinttostr.c b/lib/uinttostr.c
new file mode 100644
index 0000000..52d288e
--- /dev/null
+++ b/lib/uinttostr.c
@@ -0,0 +1,3 @@
+#define inttostr uinttostr
+#define inttype unsigned int
+#include "inttostr.c"
diff --git a/lib/umaxtostr.c b/lib/umaxtostr.c
new file mode 100644
index 0000000..4f49a7f
--- /dev/null
+++ b/lib/umaxtostr.c
@@ -0,0 +1,3 @@
+#define inttostr umaxtostr
+#define inttype uintmax_t
+#include "inttostr.c"
diff --git a/lib/unistd--.h b/lib/unistd--.h
new file mode 100644
index 0000000..1fe6ce8
--- /dev/null
+++ b/lib/unistd--.h
@@ -0,0 +1,28 @@
+/* Like unistd.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <unistd.h>
+#include "unistd-safer.h"
+
+#undef dup
+#define dup dup_safer
+
+#undef pipe
+#define pipe pipe_safer
diff --git a/lib/unistd-safer.h b/lib/unistd-safer.h
new file mode 100644
index 0000000..f95999d
--- /dev/null
+++ b/lib/unistd-safer.h
@@ -0,0 +1,23 @@
+/* Invoke unistd-like functions, but avoid some glitches.
+
+ Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+int dup_safer (int);
+int fd_safer (int);
+int pipe_safer (int[2]);
diff --git a/lib/unistd_.h b/lib/unistd_.h
new file mode 100644
index 0000000..f34bc66
--- /dev/null
+++ b/lib/unistd_.h
@@ -0,0 +1,242 @@
+/* Substitute for and wrapper around <unistd.h>.
+ Copyright (C) 2004-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_UNISTD_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_UNISTD_H@
+# if @HAVE_INCLUDE_NEXT@
+# include_next <unistd.h>
+# else
+# include @ABSOLUTE_UNISTD_H@
+# endif
+#endif
+
+#ifndef _GL_UNISTD_H
+#define _GL_UNISTD_H
+
+/* mingw doesn't define the SEEK_* macros in <unistd.h>. */
+#if !(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET)
+# include <stdio.h>
+#endif
+
+/* mingw fails to declare _exit in <unistd.h>. */
+#include <stdlib.h>
+
+/* The definition of GL_LINK_WARNING is copied here. */
+
+
+/* Declare overridden functions. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @GNULIB_CHOWN@
+# if @REPLACE_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).
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/chown.html>. */
+# define chown rpl_chown
+extern int chown (const char *file, uid_t uid, gid_t gid);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef chown
+# define chown(f,u,g) \
+ (GL_LINK_WARNING ("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"), \
+ chown (f, u, g))
+#endif
+
+
+#if @GNULIB_DUP2@
+# if !@HAVE_DUP2@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if
+ NEWFD = OLDFD, otherwise close NEWFD first if it is open.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/dup2.html>. */
+extern int dup2 (int oldfd, int newfd);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef dup2
+# define dup2(o,n) \
+ (GL_LINK_WARNING ("dup2 is unportable - " \
+ "use gnulib module dup2 for portability"), \
+ dup2 (o, n))
+#endif
+
+
+#if @GNULIB_FCHDIR@
+# if @REPLACE_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:2001 specification
+ <http://www.opengroup.org/susv3xsh/fchdir.html>. */
+extern int fchdir (int /*fd*/);
+
+# define close rpl_close
+extern int close (int);
+# define dup rpl_dup
+extern int dup (int);
+# define dup2 rpl_dup2
+extern int dup2 (int, int);
+
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fchdir
+# define fchdir(f) \
+ (GL_LINK_WARNING ("fchdir is unportable - " \
+ "use gnulib module fchdir for portability"), \
+ fchdir (f))
+#endif
+
+
+#if @GNULIB_FTRUNCATE@
+# if !@HAVE_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:2001 specification
+ <http://www.opengroup.org/susv3xsh/ftruncate.html>. */
+extern int ftruncate (int fd, off_t length);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ftruncate
+# define ftruncate(f,l) \
+ (GL_LINK_WARNING ("ftruncate is unportable - " \
+ "use gnulib module ftruncate for portability"), \
+ ftruncate (f, l))
+#endif
+
+
+#if @GNULIB_GETCWD@
+/* Include the headers that might declare getcwd so that they will not
+ cause confusion if included after this file. */
+# include <stdlib.h>
+# if @REPLACE_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:2001 specification
+ <http://www.opengroup.org/susv3xsh/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. */
+# define getcwd rpl_getcwd
+extern char * getcwd (char *buf, size_t size);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getcwd
+# define getcwd(b,s) \
+ (GL_LINK_WARNING ("getcwd is unportable - " \
+ "use gnulib module getcwd for portability"), \
+ getcwd (b, s))
+#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 <http://www.opengroup.org/susv3xsh/getlogin.html>.
+ */
+# if !@HAVE_DECL_GETLOGIN_R@
+# include <stddef.h>
+extern int getlogin_r (char *name, size_t size);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin_r
+# define getlogin_r(n,s) \
+ (GL_LINK_WARNING ("getlogin_r is unportable - " \
+ "use gnulib module getlogin_r for portability"), \
+ getlogin_r (n, s))
+#endif
+
+
+#if @GNULIB_LSEEK@
+# if @REPLACE_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:2001 specification
+ <http://www.opengroup.org/susv3xsh/lseek.html>. */
+# define lseek rpl_lseek
+ extern off_t lseek (int fd, off_t offset, int whence);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef lseek
+# define lseek(f,o,w) \
+ (GL_LINK_WARNING ("lseek does not fail with ESPIPE on pipes on some " \
+ "systems - use gnulib module lseek for portability"), \
+ lseek (f, o, w))
+#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:2001 specification
+ <http://www.opengroup.org/susv3xsh/readlink.html>. */
+# if !@HAVE_READLINK@
+# include <stddef.h>
+extern int readlink (const char *file, char *buf, size_t bufsize);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef readlink
+# define readlink(f,b,s) \
+ (GL_LINK_WARNING ("readlink is unportable - " \
+ "use gnulib module readlink for portability"), \
+ readlink (f, b, s))
+#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:2001 specification
+ <http://www.opengroup.org/susv3xsh/sleep.html>. */
+# if !@HAVE_SLEEP@
+extern unsigned int sleep (unsigned int n);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sleep
+# define sleep(n) \
+ (GL_LINK_WARNING ("sleep is unportable - " \
+ "use gnulib module sleep for portability"), \
+ sleep (n))
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_UNISTD_H */
+#endif /* _GL_UNISTD_H */
diff --git a/lib/unlinkdir.c b/lib/unlinkdir.c
new file mode 100644
index 0000000..07620db
--- /dev/null
+++ b/lib/unlinkdir.c
@@ -0,0 +1,68 @@
+/* unlinkdir.c - determine (and maybe change) whether we can unlink directories
+
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU 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. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#include <config.h>
+
+#include "unlinkdir.h"
+
+#if HAVE_PRIV_H
+# include <priv.h>
+#endif
+#include <unistd.h>
+
+#if ! UNLINK_CANNOT_UNLINK_DIR
+
+/* Return true if we cannot unlink directories, false if we might be
+ able to unlink directories. If possible, tell the kernel we don't
+ want to be able to unlink directories, so that we can return true. */
+
+bool
+cannot_unlink_dir (void)
+{
+ static bool initialized;
+ static bool cannot;
+
+ if (! initialized)
+ {
+# if defined PRIV_EFFECTIVE && defined PRIV_SYS_LINKDIR
+ /* We might be able to unlink directories if we cannot
+ determine our privileges, or if we have the
+ PRIV_SYS_LINKDIR privilege and cannot delete it. */
+ priv_set_t *pset = priv_allocset ();
+ if (pset)
+ {
+ cannot =
+ (getppriv (PRIV_EFFECTIVE, pset) == 0
+ && (! priv_ismember (pset, PRIV_SYS_LINKDIR)
+ || (priv_delset (pset, PRIV_SYS_LINKDIR) == 0
+ && setppriv (PRIV_SET, PRIV_EFFECTIVE, pset) == 0)));
+ priv_freeset (pset);
+ }
+# else
+ /* In traditional Unix, only root can unlink directories. */
+ cannot = (geteuid () != 0);
+# endif
+ initialized = true;
+ }
+
+ return cannot;
+}
+
+#endif
diff --git a/lib/unlinkdir.h b/lib/unlinkdir.h
new file mode 100644
index 0000000..6582418
--- /dev/null
+++ b/lib/unlinkdir.h
@@ -0,0 +1,27 @@
+/* unlinkdir.h - determine (and maybe change) whether we can unlink directories
+
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU 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. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#include <stdbool.h>
+
+#if UNLINK_CANNOT_UNLINK_DIR
+# define cannot_unlink_dir() true
+#else
+bool cannot_unlink_dir (void);
+#endif
diff --git a/lib/unlocked-io.h b/lib/unlocked-io.h
new file mode 100644
index 0000000..d009303
--- /dev/null
+++ b/lib/unlocked-io.h
@@ -0,0 +1,137 @@
+/* Prefer faster, non-thread-safe stdio functions if available.
+
+ Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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/unsetenv.c b/lib/unsetenv.c
new file mode 100644
index 0000000..0f83744
--- /dev/null
+++ b/lib/unsetenv.c
@@ -0,0 +1,92 @@
+/* Copyright (C) 1992,1995-1999,2000-2002,2005-2006 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <errno.h>
+#if !_LIBC
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __environ environ
+# ifndef HAVE_ENVIRON_DECL
+extern char **environ;
+# endif
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of `environ'. */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+/* In the GNU C library we must keep the namespace clean. */
+#ifdef _LIBC
+# define unsetenv __unsetenv
+#endif
+
+
+int
+unsetenv (const char *name)
+{
+ size_t len;
+ char **ep;
+
+ if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ len = strlen (name);
+
+ LOCK;
+
+ ep = __environ;
+ while (*ep != NULL)
+ if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
+ {
+ /* Found it. Remove this pointer by moving later ones back. */
+ char **dp = ep;
+
+ do
+ dp[0] = dp[1];
+ while (*dp++);
+ /* Continue the loop in case NAME appears again. */
+ }
+ else
+ ++ep;
+
+ UNLOCK;
+
+ return 0;
+}
+
+#ifdef _LIBC
+# undef unsetenv
+weak_alias (__unsetenv, unsetenv)
+#endif
diff --git a/lib/utime.c b/lib/utime.c
new file mode 100644
index 0000000..273a5fb
--- /dev/null
+++ b/lib/utime.c
@@ -0,0 +1,109 @@
+/* Copyright (C) 1998, 2001, 2002, 2003, 2004, 2006 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* derived from a function in touch.c */
+
+#include <config.h>
+#undef utime
+
+#include <sys/types.h>
+
+#ifdef HAVE_UTIME_H
+# include <utime.h>
+#endif
+
+#if !HAVE_UTIMES_NULL
+# include <sys/stat.h>
+# include <fcntl.h>
+#endif
+
+#include <unistd.h>
+#include <errno.h>
+
+#include "full-write.h"
+#include "safe-read.h"
+
+/* Some systems (even some that do have <utime.h>) don't declare this
+ structure anywhere. */
+#ifndef HAVE_STRUCT_UTIMBUF
+struct utimbuf
+{
+ long actime;
+ long modtime;
+};
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+/* Emulate utime (file, NULL) for systems (like 4.3BSD) that do not
+ interpret it to set the access and modification times of FILE to
+ the current time. Return 0 if successful, -1 if not. */
+
+static int
+utime_null (const char *file)
+{
+#if HAVE_UTIMES_NULL
+ return utimes (file, 0);
+#else
+ int fd;
+ char c;
+ int status = 0;
+ struct stat st;
+ int saved_errno = 0;
+
+ fd = open (file, O_RDWR);
+ if (fd < 0
+ || fstat (fd, &st) < 0
+ || safe_read (fd, &c, sizeof c) == SAFE_READ_ERROR
+ || lseek (fd, (off_t) 0, SEEK_SET) < 0
+ || full_write (fd, &c, sizeof c) != sizeof c
+ /* Maybe do this -- it's necessary on SunOS 4.1.3 with some combination
+ of patches, but that system doesn't use this code: it has utimes.
+ || fsync (fd) < 0
+ */
+ || (st.st_size == 0 && ftruncate (fd, st.st_size) < 0))
+ {
+ saved_errno = errno;
+ status = -1;
+ }
+
+ if (0 <= fd)
+ {
+ if (close (fd) < 0)
+ status = -1;
+
+ /* If there was a prior failure, use the saved errno value.
+ But if the only failure was in the close, don't change errno. */
+ if (saved_errno)
+ errno = saved_errno;
+ }
+
+ return status;
+#endif
+}
+
+int
+rpl_utime (const char *file, const struct utimbuf *times)
+{
+ if (times)
+ return utime (file, times);
+
+ return utime_null (file);
+}
diff --git a/lib/utimens.c b/lib/utimens.c
new file mode 100644
index 0000000..7e3175a
--- /dev/null
+++ b/lib/utimens.c
@@ -0,0 +1,189 @@
+/* Set file access and modification times.
+
+ Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+/* derived from a function in touch.c */
+
+#include <config.h>
+
+#include "utimens.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#if HAVE_UTIME_H
+# include <utime.h>
+#endif
+
+/* Some systems (even some that do have <utime.h>) don't declare this
+ structure anywhere. */
+#ifndef HAVE_STRUCT_UTIMBUF
+struct utimbuf
+{
+ long actime;
+ long modtime;
+};
+#endif
+
+/* Some systems don't have ENOSYS. */
+#ifndef ENOSYS
+# ifdef ENOTSUP
+# define ENOSYS ENOTSUP
+# else
+/* Some systems don't have ENOTSUP either. */
+# define ENOSYS EINVAL
+# endif
+#endif
+
+#ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
+# define __attribute__(x)
+# endif
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
+/* Set the access and modification time stamps 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 time stamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
+
+int
+gl_futimens (int fd ATTRIBUTE_UNUSED,
+ char const *file, struct timespec const timespec[2])
+{
+ /* Some Linux-based NFS clients are buggy, and mishandle time stamps
+ of files in NFS file systems in some cases. We have no
+ configure-time test for this, but please see
+ <http://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
+
+ /* There's currently no interface to set file timestamps with
+ nanosecond resolution, so do the best we can, discarding any
+ fractional part of the timestamp. */
+#if HAVE_FUTIMESAT || HAVE_WORKING_UTIMES
+ struct timeval timeval[2];
+ struct timeval const *t;
+ if (timespec)
+ {
+ timeval[0].tv_sec = timespec[0].tv_sec;
+ timeval[0].tv_usec = timespec[0].tv_nsec / 1000;
+ timeval[1].tv_sec = timespec[1].tv_sec;
+ timeval[1].tv_usec = timespec[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
+ if (futimesat (fd, NULL, t) == 0)
+ return 0;
+# elif HAVE_FUTIMES
+ if (futimes (fd, t) == 0)
+ return 0;
+# endif
+ }
+#endif
+
+ if (!file)
+ {
+#if ! (HAVE_FUTIMESAT || (HAVE_WORKING_UTIMES && HAVE_FUTIMES))
+ errno = ENOSYS;
+#endif
+
+ /* Prefer EBADF to ENOSYS if both error numbers apply. */
+ if (errno == ENOSYS)
+ {
+ int fd2 = dup (fd);
+ int dup_errno = errno;
+ if (0 <= fd2)
+ close (fd2);
+ errno = (fd2 < 0 && dup_errno == EBADF ? EBADF : ENOSYS);
+ }
+
+ return -1;
+ }
+
+#if HAVE_WORKING_UTIMES
+ return utimes (file, t);
+#else
+ {
+ struct utimbuf utimbuf;
+ struct utimbuf const *ut;
+ if (timespec)
+ {
+ utimbuf.actime = timespec[0].tv_sec;
+ utimbuf.modtime = timespec[1].tv_sec;
+ ut = &utimbuf;
+ }
+ else
+ ut = NULL;
+
+ return utime (file, ut);
+ }
+#endif
+}
+
+/* Set the access and modification time stamps of FILE to be
+ TIMESPEC[0] and TIMESPEC[1], respectively. */
+int
+utimens (char const *file, struct timespec const timespec[2])
+{
+ return gl_futimens (-1, file, timespec);
+}
diff --git a/lib/utimens.h b/lib/utimens.h
new file mode 100644
index 0000000..169521d
--- /dev/null
+++ b/lib/utimens.h
@@ -0,0 +1,3 @@
+#include <time.h>
+int gl_futimens (int, char const *, struct timespec const [2]);
+int utimens (char const *, struct timespec const [2]);
diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c
new file mode 100644
index 0000000..78ead8e
--- /dev/null
+++ b/lib/vasnprintf.c
@@ -0,0 +1,918 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 1999, 2002-2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* 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
+
+#include <config.h>
+
+#ifndef IN_LIBINTL
+# include <alloca.h>
+#endif
+
+/* Specification. */
+#if WIDE_CHAR_VERSION
+# include "vasnwprintf.h"
+#else
+# include "vasnprintf.h"
+#endif
+
+#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, INT_MAX */
+#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
+#if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+#else
+# include "printf-parse.h"
+#endif
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */
+#ifndef EOVERFLOW
+# define EOVERFLOW E2BIG
+#endif
+
+#ifdef HAVE_WCHAR_T
+# ifdef HAVE_WCSLEN
+# define local_wcslen wcslen
+# else
+ /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+ a dependency towards this library, here is a local substitute.
+ Define this substitute only once, even if this file is included
+ twice in the same compilation unit. */
+# ifndef local_wcslen_defined
+# define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if WIDE_CHAR_VERSION
+# define VASNPRINTF vasnwprintf
+# define CHAR_T wchar_t
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+# define PRINTF_PARSE wprintf_parse
+# define USE_SNPRINTF 1
+# if HAVE_DECL__SNWPRINTF
+ /* On Windows, the function swprintf() has a different signature than
+ on Unix; we use the _snwprintf() function instead. */
+# define SNPRINTF _snwprintf
+# else
+ /* Unix. */
+# define SNPRINTF swprintf
+# endif
+#else
+# define VASNPRINTF vasnprintf
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+# define PRINTF_PARSE printf_parse
+# define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF)
+# if HAVE_DECL__SNPRINTF
+ /* Windows. */
+# define SNPRINTF _snprintf
+# else
+ /* Unix. */
+# define SNPRINTF snprintf
+# endif
+#endif
+
+CHAR_T *
+VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args)
+{
+ DIRECTIVES d;
+ arguments a;
+
+ if (PRINTF_PARSE (format, &d, &a) < 0)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+#define CLEANUP() \
+ free (d.dir); \
+ if (a.arg) \
+ free (a.arg);
+
+ if (printf_fetchargs (args, &a) < 0)
+ {
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+ {
+ size_t buf_neededlength;
+ CHAR_T *buf;
+ CHAR_T *buf_malloced;
+ const CHAR_T *cp;
+ size_t i;
+ DIRECTIVE *dp;
+ /* Output string accumulator. */
+ CHAR_T *result;
+ size_t allocated;
+ size_t length;
+
+ /* Allocate a small buffer that will hold a directive passed to
+ sprintf or snprintf. */
+ buf_neededlength = 7 + d.max_width_length + d.max_precision_length + 6;
+#if HAVE_ALLOCA
+ if (buf_neededlength < 4000 / sizeof (CHAR_T))
+ {
+ buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T));
+ buf_malloced = NULL;
+ }
+ else
+#endif
+ {
+ if (SIZE_MAX / sizeof (CHAR_T) < buf_neededlength)
+ goto out_of_memory_1;
+ buf = (CHAR_T *) malloc (buf_neededlength * sizeof (CHAR_T));
+ 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 >= length + extra. Aborts through a jump to
+ out_of_memory if size is too big. */
+#define ENSURE_ALLOCATION(extra) \
+ { \
+ size_t needed = length + (extra); \
+ if (needed < length) \
+ goto out_of_memory; \
+ if (needed > allocated) \
+ { \
+ size_t memory_size; \
+ CHAR_T *memory; \
+ \
+ allocated = (allocated > 0 ? 2 * allocated : 12); \
+ if (needed > allocated) \
+ allocated = needed; \
+ if (SIZE_MAX / sizeof (CHAR_T) < allocated) \
+ goto out_of_memory; \
+ memory_size = allocated * sizeof (CHAR_T); \
+ if (result == resultbuf || result == NULL) \
+ memory = (CHAR_T *) malloc (memory_size); \
+ else \
+ memory = (CHAR_T *) realloc (result, memory_size); \
+ if (memory == NULL) \
+ goto out_of_memory; \
+ if (result == resultbuf && length > 0) \
+ memcpy (memory, result, length * sizeof (CHAR_T)); \
+ result = memory; \
+ } \
+ }
+
+ for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
+ {
+ if (cp != dp->dir_start)
+ {
+ size_t n = dp->dir_start - cp;
+
+ ENSURE_ALLOCATION (n);
+ memcpy (result + length, cp, n * sizeof (CHAR_T));
+ length += n;
+ }
+ if (i == d.count)
+ break;
+
+ /* Execute a single directive. */
+ if (dp->conversion == '%')
+ {
+ if (!(dp->arg_index == ARG_NONE))
+ abort ();
+ ENSURE_ALLOCATION (1);
+ result[length] = '%';
+ length += 1;
+ }
+ 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;
+#ifdef HAVE_LONG_LONG
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+ break;
+#endif
+ default:
+ abort ();
+ }
+ }
+ else
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ CHAR_T *p;
+ unsigned int prefix_count;
+ int prefixes[2];
+#if !USE_SNPRINTF
+ size_t tmp_length;
+ CHAR_T tmpbuf[700];
+ CHAR_T *tmp;
+
+ /* Allocate a temporary buffer of sufficient size for calling
+ sprintf. */
+ {
+ size_t width;
+ size_t 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 < 0 ? (unsigned int) (-arg) : arg);
+ }
+ else
+ {
+ const CHAR_T *digitp = dp->width_start;
+
+ do
+ {
+ size_t w_tmp = width * 10 + (*digitp++ - '0');
+ if (SIZE_MAX / 10 < width || w_tmp < width)
+ goto out_of_memory;
+ width = w_tmp;
+ }
+ while (digitp != dp->width_end);
+ }
+ }
+
+ 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;
+ precision = (arg < 0 ? 0 : arg);
+ }
+ else
+ {
+ const CHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ {
+ size_t p1 = 10 * precision + (*digitp++ - '0');
+ precision = ((SIZE_MAX / 10 < precision
+ || p1 < precision)
+ ? SIZE_MAX : p1);
+ }
+ }
+ }
+
+ switch (dp->conversion)
+ {
+
+ case 'd': case 'i': case 'u':
+# ifdef HAVE_LONG_LONG
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Multiply by 2, as an estimate for FLAG_GROUP. */
+ /* Add 1, to account for a leading sign. */
+ tmp_length = (tmp_length < SIZE_MAX / 2
+ ? 2 * tmp_length + 1
+ : SIZE_MAX);
+ break;
+
+ case 'o':
+# ifdef HAVE_LONG_LONG
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 1, to account for a leading sign. */
+ tmp_length += (tmp_length < SIZE_MAX);
+ break;
+
+ case 'x': case 'X':
+# ifdef HAVE_LONG_LONG
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 2, to account for a leading sign or alternate form. */
+ if (tmp_length <= SIZE_MAX / 2)
+ tmp_length *= 2;
+ break;
+
+ case 'f': case 'F':
+# ifdef HAVE_LONG_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ else
+# endif
+ tmp_length =
+ (unsigned int) (DBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ tmp_length += precision;
+ if (tmp_length < precision)
+ goto out_of_memory;
+ break;
+
+ case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+ tmp_length =
+ 12; /* sign, decimal point, exponent etc. */
+ tmp_length += precision;
+ if (tmp_length < precision)
+ goto out_of_memory;
+ break;
+
+ case 'c':
+# if defined HAVE_WINT_T && !WIDE_CHAR_VERSION
+ if (type == TYPE_WIDE_CHAR)
+ tmp_length = MB_CUR_MAX;
+ else
+# endif
+ tmp_length = 1;
+ break;
+
+ case 's':
+# ifdef HAVE_WCHAR_T
+ if (type == TYPE_WIDE_STRING)
+ {
+ tmp_length =
+ local_wcslen (a.arg[dp->arg_index].a.a_wide_string);
+
+# if !WIDE_CHAR_VERSION
+ if (SIZE_MAX / MB_CUR_MAX < tmp_length)
+ goto out_of_memory;
+ tmp_length *= MB_CUR_MAX;
+# endif
+ }
+ else
+# endif
+ tmp_length = strlen (a.arg[dp->arg_index].a.a_string);
+ break;
+
+ case 'p':
+ tmp_length =
+ (unsigned int) (sizeof (void *) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading 0x */
+ break;
+
+ default:
+ abort ();
+ }
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length++; /* account for trailing NUL */
+ if (!tmp_length)
+ goto out_of_memory;
+ }
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ if (SIZE_MAX / sizeof (CHAR_T) < tmp_length)
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (CHAR_T *) malloc (tmp_length * sizeof (CHAR_T));
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+#endif
+
+ /* Construct the format string for calling snprintf or
+ sprintf. */
+ p = buf;
+ *p++ = '%';
+ if (dp->flags & FLAG_GROUP)
+ *p++ = '\'';
+ if (dp->flags & FLAG_LEFT)
+ *p++ = '-';
+ if (dp->flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ if (dp->flags & FLAG_SPACE)
+ *p++ = ' ';
+ if (dp->flags & FLAG_ALT)
+ *p++ = '#';
+ if (dp->flags & FLAG_ZERO)
+ *p++ = '0';
+ if (dp->width_start != dp->width_end)
+ {
+ size_t n = dp->width_end - dp->width_start;
+ memcpy (p, dp->width_start, n * sizeof (CHAR_T));
+ p += n;
+ }
+ if (dp->precision_start != dp->precision_end)
+ {
+ size_t n = dp->precision_end - dp->precision_start;
+ memcpy (p, dp->precision_start, n * sizeof (CHAR_T));
+ p += n;
+ }
+
+ switch (type)
+ {
+#ifdef HAVE_LONG_LONG
+ case TYPE_LONGLONGINT:
+ case TYPE_ULONGLONGINT:
+ *p++ = 'l';
+ /*FALLTHROUGH*/
+#endif
+ case TYPE_LONGINT:
+ case TYPE_ULONGINT:
+#ifdef HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+#endif
+#ifdef HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+#endif
+ *p++ = 'l';
+ break;
+#ifdef HAVE_LONG_DOUBLE
+ case TYPE_LONGDOUBLE:
+ *p++ = 'L';
+ break;
+#endif
+ default:
+ break;
+ }
+ *p = dp->conversion;
+#if USE_SNPRINTF
+ p[1] = '%';
+ p[2] = 'n';
+ p[3] = '\0';
+#else
+ p[1] = '\0';
+#endif
+
+ /* Construct the arguments for calling snprintf or sprintf. */
+ prefix_count = 0;
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
+ }
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+ }
+
+#if USE_SNPRINTF
+ /* Prepare checking whether snprintf returns the count
+ via %n. */
+ ENSURE_ALLOCATION (1);
+ result[length] = '\0';
+#endif
+
+ for (;;)
+ {
+ size_t maxlen;
+ int count;
+ int retcount;
+
+ maxlen = allocated - length;
+ count = -1;
+ retcount = 0;
+
+#if USE_SNPRINTF
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ retcount = SNPRINTF (result + length, maxlen, buf, \
+ arg, &count); \
+ break; \
+ case 1: \
+ retcount = SNPRINTF (result + length, maxlen, buf, \
+ prefixes[0], arg, &count); \
+ break; \
+ case 2: \
+ retcount = SNPRINTF (result + length, maxlen, buf, \
+ prefixes[0], prefixes[1], arg, \
+ &count); \
+ break; \
+ default: \
+ abort (); \
+ }
+#else
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ count = sprintf (tmp, buf, arg); \
+ break; \
+ case 1: \
+ count = sprintf (tmp, buf, prefixes[0], arg); \
+ break; \
+ case 2: \
+ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
+ arg); \
+ break; \
+ default: \
+ abort (); \
+ }
+#endif
+
+ switch (type)
+ {
+ case TYPE_SCHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_schar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UCHAR:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_SHORT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_short;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_USHORT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_INT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_int;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UINT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGINT:
+ {
+ long int arg = a.arg[dp->arg_index].a.a_longint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGINT:
+ {
+ unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_LONG_LONG
+ case TYPE_LONGLONGINT:
+ {
+ long long int arg = a.arg[dp->arg_index].a.a_longlongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGLONGINT:
+ {
+ unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_DOUBLE:
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_LONG_DOUBLE
+ case TYPE_LONGDOUBLE:
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_CHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ {
+ wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_STRING:
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ {
+ void *arg = a.arg[dp->arg_index].a.a_pointer;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+#if USE_SNPRINTF
+ /* Portability: Not all implementations of snprintf()
+ are ISO C 99 compliant. Determine the number of
+ bytes that snprintf() has produced or would have
+ produced. */
+ if (count >= 0)
+ {
+ /* Verify that snprintf() has NUL-terminated its
+ result. */
+ if (count < maxlen && result[length + count] != '\0')
+ abort ();
+ /* Portability hack. */
+ if (retcount > count)
+ count = retcount;
+ }
+ else
+ {
+ /* snprintf() doesn't understand the '%n'
+ directive. */
+ if (p[1] != '\0')
+ {
+ /* Don't use the '%n' directive; instead, look
+ at the snprintf() return value. */
+ p[1] = '\0';
+ continue;
+ }
+ else
+ {
+ /* Look at the snprintf() return value. */
+ if (retcount < 0)
+ {
+ /* HP-UX 10.20 snprintf() is doubly deficient:
+ It doesn't understand the '%n' directive,
+ *and* it returns -1 (rather than the length
+ that would have been required) when the
+ buffer is too small. */
+ size_t bigger_need =
+ (allocated > 12 ? allocated : 12);
+ ENSURE_ALLOCATION (bigger_need);
+ continue;
+ }
+ else
+ count = retcount;
+ }
+ }
+#endif
+
+ /* Attempt to handle failure. */
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+#if !USE_SNPRINTF
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+#endif
+
+ /* Make room for the result. */
+ if (count >= maxlen)
+ {
+ /* Need at least count bytes. But allocate
+ proportionally, to avoid looping eternally if
+ snprintf() reports a too small count. */
+ ENSURE_ALLOCATION (count < allocated
+ ? allocated : count);
+#if USE_SNPRINTF
+ continue;
+#endif
+ }
+
+#if USE_SNPRINTF
+ /* The snprintf() result did fit. */
+#else
+ /* Append the sprintf() result. */
+ memcpy (result + length, tmp, count * sizeof (CHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+#endif
+
+ length += count;
+ break;
+ }
+ }
+ }
+ }
+
+ /* Add the final NUL. */
+ ENSURE_ALLOCATION (1);
+ result[length] = '\0';
+
+ if (result != resultbuf && length + 1 < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ CHAR_T *memory;
+
+ memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ *lengthp = length;
+ if (length > INT_MAX)
+ goto length_overflow;
+ return result;
+
+ length_overflow:
+ /* We could produce such a big string, but its length doesn't fit into
+ an 'int'. POSIX says that snprintf() fails with errno = EOVERFLOW in
+ this case. */
+ if (result != resultbuf)
+ free (result);
+ errno = EOVERFLOW;
+ return NULL;
+
+ out_of_memory:
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ out_of_memory_1:
+ CLEANUP ();
+ errno = ENOMEM;
+ return NULL;
+ }
+}
+
+#undef SNPRINTF
+#undef USE_SNPRINTF
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T
+#undef VASNPRINTF
diff --git a/lib/vasnprintf.h b/lib/vasnprintf.h
new file mode 100644
index 0000000..7a0c01f
--- /dev/null
+++ b/lib/vasnprintf.h
@@ -0,0 +1,81 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 2002-2004, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _VASNPRINTF_H
+#define _VASNPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# define __attribute__(Spec) /* empty */
+# endif
+/* The __-protected variants of `format' and `printf' attributes
+ are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __format__ format
+# define __printf__ printf
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+ You can pass a preallocated buffer for the result in RESULTBUF and its
+ size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+ If successful, return the address of the string (this may be = RESULTBUF
+ if no dynamic memory allocation was necessary) and set *LENGTHP to the
+ number of resulting bytes, excluding the trailing NUL. Upon error, set
+ errno and return NULL.
+
+ When dynamic memory allocation occurs, the preallocated buffer is left
+ alone (with possibly modified contents). This makes it possible to use
+ a statically allocated or stack-allocated buffer, like this:
+
+ char buf[100];
+ size_t len = sizeof (buf);
+ char *output = vasnprintf (buf, &len, format, args);
+ if (output == NULL)
+ ... error handling ...;
+ else
+ {
+ ... use the output string ...;
+ if (output != buf)
+ free (output);
+ }
+ */
+#if REPLACE_VASNPRINTF
+# define asnprintf rpl_asnprintf
+# define vasnprintf rpl_vasnprintf
+#endif
+extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 3, 0)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNPRINTF_H */
diff --git a/lib/verify.h b/lib/verify.h
new file mode 100644
index 0000000..d603b17
--- /dev/null
+++ b/lib/verify.h
@@ -0,0 +1,141 @@
+/* Compile-time assert-like macros.
+
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
+
+#ifndef VERIFY_H
+# define VERIFY_H 1
+
+/* 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_true (R) is for scalar contexts, including
+ integer constant expression contexts. verify (R) is for declaration
+ contexts, e.g., the top level.
+
+ Symbols ending in "__" are private to this header.
+
+ The code below uses several ideas.
+
+ * 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 verify_type__ { unsigned int verify_error_if_negative_size__: 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 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.
+
+ 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 verify_type__ {...})];
+ extern void dummy (int [sizeof (struct {...})]);
+ extern void dummy (int [sizeof (struct verify_type__ {...})]);
+ extern int (*dummy (void)) [sizeof (struct {...})];
+ extern int (*dummy (void)) [sizeof (struct 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 {...})];
+
+ * This implementation exploits the fact that GCC does not warn about
+ the last declaration mentioned above. If a future version of GCC
+ introduces a warning for this, the problem could be worked around
+ by using code specialized to GCC, e.g.,:
+
+ #if 4 <= __GNUC__
+ # define verify(R) \
+ extern int (* verify_function__ (void)) \
+ [__builtin_constant_p (R) && (R) ? 1 : -1]
+ #endif
+
+ * In C++, any struct definition inside sizeof is invalid.
+ Use a template type to work around the problem. */
+
+
+/* Verify requirement R at compile-time, as an integer constant expression.
+ Return 1. */
+
+# ifdef __cplusplus
+template <int w>
+ struct verify_type__ { unsigned int verify_error_if_negative_size__: w; };
+# define verify_true(R) \
+ (!!sizeof (verify_type__<(R) ? 1 : -1>))
+# else
+# define verify_true(R) \
+ (!!sizeof \
+ (struct { unsigned int verify_error_if_negative_size__: (R) ? 1 : -1; }))
+# endif
+
+/* Verify requirement R at compile-time, as a declaration without a
+ trailing ';'. */
+
+# define verify(R) extern int (* verify_function__ (void)) [verify_true (R)]
+
+#endif
diff --git a/lib/version-etc-fsf.c b/lib/version-etc-fsf.c
new file mode 100644
index 0000000..f25eb65
--- /dev/null
+++ b/lib/version-etc-fsf.c
@@ -0,0 +1,31 @@
+/* Variable with FSF copyright information, for version-etc.
+ Copyright (C) 1999-2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "version-etc.h"
+
+/* Default copyright goes to the FSF. */
+
+const char version_etc_copyright[] =
+ /* Do *not* mark this string for translation. %s is a copyright
+ symbol suitable for this locale, and %d is the copyright
+ year. */
+ "Copyright %s %d Free Software Foundation, Inc.";
diff --git a/lib/version-etc.c b/lib/version-etc.c
new file mode 100644
index 0000000..1ae82c4
--- /dev/null
+++ b/lib/version-etc.c
@@ -0,0 +1,173 @@
+/* Utility to help print --version output in a consistent format.
+ Copyright (C) 1999-2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "version-etc.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+enum { COPYRIGHT_YEAR = 2007 };
+
+/* Like version_etc, below, but with the NULL-terminated author list
+ provided via a variable of type va_list. */
+void
+version_etc_va (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, va_list authors)
+{
+ size_t n_authors;
+
+ /* Count the number of authors. */
+ {
+ va_list tmp_authors;
+
+ va_copy (tmp_authors, authors);
+
+ n_authors = 0;
+ while (va_arg (tmp_authors, const char *) != NULL)
+ ++n_authors;
+ }
+
+ if (command_name)
+ fprintf (stream, "%s (%s) %s\n", command_name, package, version);
+ else
+ fprintf (stream, "%s %s\n", package, version);
+
+ /* TRANSLATORS: Translate "(C)" to the copyright symbol
+ (C-in-a-circle), if this symbol is available in the user's
+ locale. Otherwise, do not translate "(C)"; leave it as-is. */
+ fprintf (stream, version_etc_copyright, _("(C)"), COPYRIGHT_YEAR);
+
+ fputs (_("\
+\n\
+License GPLv2+: GNU GPL version 2 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\
+"),
+ stream);
+
+ switch (n_authors)
+ {
+ case 0:
+ /* The caller must provide at least one author name. */
+ abort ();
+ case 1:
+ /* TRANSLATORS: %s denotes an author name. */
+ vfprintf (stream, _("Written by %s.\n"), authors);
+ break;
+ case 2:
+ /* TRANSLATORS: Each %s denotes an author name. */
+ vfprintf (stream, _("Written by %s and %s.\n"), authors);
+ break;
+ case 3:
+ /* TRANSLATORS: Each %s denotes an author name. */
+ vfprintf (stream, _("Written by %s, %s, and %s.\n"), authors);
+ break;
+ case 4:
+ /* 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. */
+ vfprintf (stream, _("Written by %s, %s, %s,\nand %s.\n"), authors);
+ break;
+ case 5:
+ /* 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. */
+ vfprintf (stream, _("Written by %s, %s, %s,\n%s, and %s.\n"), authors);
+ break;
+ case 6:
+ /* 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. */
+ vfprintf (stream, _("Written by %s, %s, %s,\n%s, %s, and %s.\n"),
+ authors);
+ break;
+ case 7:
+ /* 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. */
+ vfprintf (stream, _("Written by %s, %s, %s,\n%s, %s, %s, and %s.\n"),
+ authors);
+ break;
+ case 8:
+ /* 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. */
+ vfprintf (stream, _("\
+Written by %s, %s, %s,\n%s, %s, %s, %s,\nand %s.\n"),
+ authors);
+ break;
+ case 9:
+ /* 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. */
+ vfprintf (stream, _("\
+Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"),
+ authors);
+ break;
+ default:
+ /* 10 or more authors. Use an abbreviation, since the human reader
+ will probably not want to read the entire list anyway. */
+ /* 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. */
+ vfprintf (stream, _("\
+Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, %s, and others.\n"),
+ authors);
+ break;
+ }
+ va_end (authors);
+}
+
+
+/* Display the --version information the standard way.
+
+ If COMMAND_NAME is NULL, the PACKAGE is asumed to be the name of
+ the program. The formats are therefore:
+
+ PACKAGE VERSION
+
+ or
+
+ COMMAND_NAME (PACKAGE) VERSION.
+
+ The author names are passed as separate arguments, with an additional
+ NULL argument at the end. */
+void
+version_etc (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, /* const char *author1, ...*/ ...)
+{
+ va_list authors;
+
+ va_start (authors, version);
+ version_etc_va (stream, command_name, package, version, authors);
+}
diff --git a/lib/version-etc.h b/lib/version-etc.h
new file mode 100644
index 0000000..84da535
--- /dev/null
+++ b/lib/version-etc.h
@@ -0,0 +1,37 @@
+/* Utility to help print --version output in a consistent format.
+ Copyright (C) 1999, 2003, 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#ifndef VERSION_ETC_H
+# define VERSION_ETC_H 1
+
+# include <stdarg.h>
+# include <stdio.h>
+
+extern const char version_etc_copyright[];
+
+extern void version_etc_va (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, va_list authors);
+
+extern void version_etc (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version,
+ /* const char *author1, ...*/ ...);
+
+#endif /* VERSION_ETC_H */
diff --git a/lib/vsnprintf.c b/lib/vsnprintf.c
new file mode 100644
index 0000000..4f841fc
--- /dev/null
+++ b/lib/vsnprintf.c
@@ -0,0 +1,76 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2007 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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"
+
+/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */
+#ifndef EOVERFLOW
+# define EOVERFLOW E2BIG
+#endif
+
+/* 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/waitpid.c b/lib/waitpid.c
new file mode 100644
index 0000000..b6f585e
--- /dev/null
+++ b/lib/waitpid.c
@@ -0,0 +1,75 @@
+/* Emulate waitpid on systems that just have wait.
+ Copyright 1994, 1995, 1998, 1999 Free Software Foundation, Inc.
+
+ This program is free software; you can 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; see the file COPYING.
+ If not, write to the Free Software Foundation,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+#define WAITPID_CHILDREN 8
+static pid_t waited_pid[WAITPID_CHILDREN];
+static int waited_status[WAITPID_CHILDREN];
+
+pid_t
+waitpid (pid_t pid, int *stat_loc, int options)
+{
+ int i;
+ pid_t p;
+
+ if (!options && (pid == -1 || 0 < pid))
+ {
+ /* If we have already waited for this child, return it immediately. */
+ for (i = 0; i < WAITPID_CHILDREN; i++)
+ {
+ p = waited_pid[i];
+ if (p && (p == pid || pid == -1))
+ {
+ waited_pid[i] = 0;
+ goto success;
+ }
+ }
+
+ /* The child has not returned yet; wait for it, accumulating status. */
+ for (i = 0; i < WAITPID_CHILDREN; i++)
+ if (! waited_pid[i])
+ {
+ p = wait (&waited_status[i]);
+ if (p < 0)
+ return p;
+ if (p == pid || pid == -1)
+ goto success;
+ waited_pid[i] = p;
+ }
+ }
+
+ /* We cannot emulate this wait call, e.g. because of too many children. */
+ errno = EINVAL;
+ return -1;
+
+success:
+ if (stat_loc)
+ *stat_loc = waited_status[i];
+ return p;
+}
diff --git a/lib/wchar_.h b/lib/wchar_.h
new file mode 100644
index 0000000..2a71b8b
--- /dev/null
+++ b/lib/wchar_.h
@@ -0,0 +1,50 @@
+/* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake. */
+
+/*
+ * ISO C 99 <wchar.h> for platforms that have issues.
+ * <http://www.opengroup.org/susv3xbd/wchar.h.html>
+ *
+ * For now, this just ensures proper prerequisite inclusion order.
+ */
+
+#ifndef _GL_WCHAR_H
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+
+/* Include the original <wchar.h>. */
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_INCLUDE_NEXT@
+# include_next <wchar.h>
+#else
+# include @ABSOLUTE_WCHAR_H@
+#endif
+
+#ifndef _GL_WCHAR_H
+#define _GL_WCHAR_H
+
+#endif /* _GL_WCHAR_H */
+#endif /* _GL_WCHAR_H */
diff --git a/lib/wctype_.h b/lib/wctype_.h
new file mode 100644
index 0000000..ebbfca4
--- /dev/null
+++ b/lib/wctype_.h
@@ -0,0 +1,165 @@
+/* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
+
+ Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible and Paul Eggert. */
+
+/*
+ * ISO C 99 <wctype.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/wctype.h.html>
+ *
+ * iswctype, towctrans, towlower, towupper, wctrans, wctype,
+ * wctrans_t, and wctype_t are not yet implemented.
+ */
+
+#ifndef _GL_WCTYPE_H
+
+#if @HAVE_WINT_T@
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
+ Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+# include <stddef.h>
+# include <stdio.h>
+# include <time.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@
+# if @HAVE_INCLUDE_NEXT@
+# include_next <wctype.h>
+# else
+# include @ABSOLUTE_WCTYPE_H@
+# endif
+#endif
+
+#ifndef _GL_WCTYPE_H
+#define _GL_WCTYPE_H
+
+#if @HAVE_WINT_T@
+typedef wint_t __wctype_wint_t;
+#else
+typedef int __wctype_wint_t;
+#endif
+
+/* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
+ Assume all 12 functions are implemented the same way, or not at all. */
+#if ! @HAVE_ISWCNTRL@
+
+/* 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
+
+static inline int
+iswalnum (__wctype_wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
+}
+
+static inline int
+iswalpha (__wctype_wint_t wc)
+{
+ return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
+}
+
+static inline int
+iswblank (__wctype_wint_t wc)
+{
+ return wc == ' ' || wc == '\t';
+}
+
+static inline int
+iswcntrl (__wctype_wint_t wc)
+{
+ return (wc & ~0x1f) == 0 || wc == 0x7f;
+}
+
+static inline int
+iswdigit (__wctype_wint_t wc)
+{
+ return wc >= '0' && wc <= '9';
+}
+
+static inline int
+iswgraph (__wctype_wint_t wc)
+{
+ return wc >= '!' && wc <= '~';
+}
+
+static inline int
+iswlower (__wctype_wint_t wc)
+{
+ return wc >= 'a' && wc <= 'z';
+}
+
+static inline int
+iswprint (__wctype_wint_t wc)
+{
+ return wc >= ' ' && wc <= '~';
+}
+
+static inline int
+iswpunct (__wctype_wint_t wc)
+{
+ return (wc >= '!' && wc <= '~'
+ && !((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
+}
+
+static inline int
+iswspace (__wctype_wint_t wc)
+{
+ return (wc == ' ' || wc == '\t'
+ || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
+}
+
+static inline int
+iswupper (__wctype_wint_t wc)
+{
+ return wc >= 'A' && wc <= 'Z';
+}
+
+static inline int
+iswxdigit (__wctype_wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
+}
+
+# endif /* ! HAVE_ISWCNTRL */
+
+#endif /* _GL_WCTYPE_H */
+#endif /* _GL_WCTYPE_H */
diff --git a/lib/wcwidth.h b/lib/wcwidth.h
new file mode 100644
index 0000000..8ed5ff8
--- /dev/null
+++ b/lib/wcwidth.h
@@ -0,0 +1,57 @@
+/* Determine the number of screen columns needed for a character.
+ Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _gl_WCWIDTH_H
+#define _gl_WCWIDTH_H
+
+#if HAVE_WCHAR_T
+
+/* Get wcwidth if available, along with wchar_t. */
+# include <wchar.h>
+
+/* Get iswprint. */
+# include <wctype.h>
+
+# ifndef HAVE_DECL_WCWIDTH
+"this configure-time declaration test was not run"
+# endif
+# ifndef wcwidth
+# if !HAVE_WCWIDTH
+
+/* wcwidth doesn't exist, so assume all printable characters have
+ width 1. */
+static inline int
+wcwidth (wchar_t wc)
+{
+ return wc == 0 ? 0 : iswprint (wc) ? 1 : -1;
+}
+
+# elif !HAVE_DECL_WCWIDTH
+
+/* wcwidth exists but is not declared. */
+extern
+# ifdef __cplusplus
+"C"
+# endif
+int wcwidth (int /* actually wchar_t */);
+
+# endif
+# endif
+
+#endif /* HAVE_WCHAR_T */
+
+#endif /* _gl_WCWIDTH_H */
diff --git a/lib/xalloc-die.c b/lib/xalloc-die.c
new file mode 100644
index 0000000..090f060
--- /dev/null
+++ b/lib/xalloc-die.c
@@ -0,0 +1,42 @@
+/* Report a memory allocation failure and exit.
+
+ Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2006 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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"));
+
+ /* The `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.h b/lib/xalloc.h
new file mode 100644
index 0000000..0c6d8dc
--- /dev/null
+++ b/lib/xalloc.h
@@ -0,0 +1,271 @@
+/* xalloc.h -- malloc with out-of-memory checking
+
+ Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef XALLOC_H_
+# define XALLOC_H_
+
+# include <stddef.h>
+
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+
+# ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
+# define __attribute__(x)
+# endif
+# endif
+
+# ifndef ATTRIBUTE_NORETURN
+# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+# endif
+
+/* 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 void xalloc_die (void) ATTRIBUTE_NORETURN;
+
+void *xmalloc (size_t s);
+void *xzalloc (size_t s);
+void *xcalloc (size_t n, size_t s);
+void *xrealloc (void *p, size_t s);
+void *x2realloc (void *p, size_t *pn);
+void *xmemdup (void const *p, size_t s);
+char *xstrdup (char const *str);
+
+/* Return 1 if an array of N objects, each of size S, cannot exist due
+ to size arithmetic overflow. S must be positive and N must be
+ nonnegative. This is a macro, not an inline function, so that it
+ works correctly even when SIZE_MAX < N.
+
+ By gnulib convention, SIZE_MAX represents overflow in size
+ calculations, so the conservative dividend to use here is
+ SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
+ However, malloc (SIZE_MAX) fails on all known hosts where
+ sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
+ exactly-SIZE_MAX allocations on such hosts; this avoids a test and
+ branch when S is known to be 1. */
+# define xalloc_oversized(n, s) \
+ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
+
+
+/* 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))))
+
+
+# if HAVE_INLINE
+# define static_inline static inline
+# else
+ void *xnmalloc (size_t n, size_t s);
+ void *xnrealloc (void *p, size_t n, size_t s);
+ void *x2nrealloc (void *p, size_t *pn, size_t s);
+ char *xcharalloc (size_t n);
+# endif
+
+# ifdef static_inline
+
+/* Allocate an array of N objects, each with S bytes of memory,
+ dynamically, with error checking. S must be nonzero. */
+
+static_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. */
+
+static_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. *PN must be nonzero unless P is null, and 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;
+ }
+
+ */
+
+static_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. 64 bytes is the largest "small" request for the
+ GNU C library malloc. */
+ enum { DEFAULT_MXFAST = 64 };
+
+ n = DEFAULT_MXFAST / s;
+ n += !n;
+ }
+ }
+ else
+ {
+ /* Set N = ceil (1.5 * N) so that progress is made if N == 1.
+ Check for overflow, so that N * S stays in size_t range.
+ The check is slightly conservative, but an exact check isn't
+ worth the trouble. */
+ if ((size_t) -1 / 3 * 2 / s <= n)
+ xalloc_die ();
+ n += (n + 1) / 2;
+ }
+
+ *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 *. */
+
+static_inline char *
+xcharalloc (size_t n)
+{
+ return XNMALLOC (n, char);
+}
+
+# endif
+
+# ifdef __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
+
+
+#endif /* !XALLOC_H_ */
diff --git a/lib/xgetcwd.c b/lib/xgetcwd.c
new file mode 100644
index 0000000..26ea5da
--- /dev/null
+++ b/lib/xgetcwd.c
@@ -0,0 +1,41 @@
+/* xgetcwd.c -- return current directory with unlimited length
+
+ Copyright (C) 2001, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "xgetcwd.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "xalloc.h"
+
+/* Return the current directory, newly allocated.
+ Upon an out-of-memory error, call xalloc_die.
+ Upon any other type of error, return NULL. */
+
+char *
+xgetcwd (void)
+{
+ char *cwd = getcwd (NULL, 0);
+ if (! cwd && errno == ENOMEM)
+ xalloc_die ();
+ return cwd;
+}
diff --git a/lib/xgetcwd.h b/lib/xgetcwd.h
new file mode 100644
index 0000000..70afe35
--- /dev/null
+++ b/lib/xgetcwd.h
@@ -0,0 +1,18 @@
+/* prototype for xgetcwd
+ Copyright (C) 1995, 2001, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+extern char *xgetcwd (void);
diff --git a/lib/xmalloc.c b/lib/xmalloc.c
new file mode 100644
index 0000000..318e0dd
--- /dev/null
+++ b/lib/xmalloc.c
@@ -0,0 +1,123 @@
+/* xmalloc.c -- malloc with out of memory checking
+
+ Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+ Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#if ! HAVE_INLINE
+# define static_inline
+#endif
+#include "xalloc.h"
+#undef static_inline
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* 1 if calloc is known to be compatible with GNU calloc. This
+ matters if we are not also using the calloc module, which defines
+ HAVE_CALLOC and supports the GNU API even on non-GNU platforms. */
+#if defined HAVE_CALLOC || defined __GLIBC__
+enum { HAVE_GNU_CALLOC = 1 };
+#else
+enum { HAVE_GNU_CALLOC = 0 };
+#endif
+
+/* Allocate N bytes of memory dynamically, with error checking. */
+
+void *
+xmalloc (size_t n)
+{
+ void *p = malloc (n);
+ if (!p && n != 0)
+ 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)
+{
+ p = realloc (p, n);
+ if (!p && n != 0)
+ xalloc_die ();
+ return p;
+}
+
+/* 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 S 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 s)
+{
+ return memset (xmalloc (s), 0, s);
+}
+
+/* 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 some calloc implementations don't have
+ proper overflow checks. But omit overflow and size-zero tests if
+ HAVE_GNU_CALLOC, since GNU calloc catches overflow and never
+ returns NULL if successful. */
+ if ((! HAVE_GNU_CALLOC && 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/xstrndup.c b/lib/xstrndup.c
new file mode 100644
index 0000000..7ccefd7
--- /dev/null
+++ b/lib/xstrndup.c
@@ -0,0 +1,37 @@
+/* Duplicate a bounded initial segment of a string, with out-of-memory
+ checking.
+ Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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..88354cf
--- /dev/null
+++ b/lib/xstrndup.h
@@ -0,0 +1,24 @@
+/* Duplicate a bounded initial segment of a string, with out-of-memory
+ checking.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#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);
diff --git a/lib/xstrtol.c b/lib/xstrtol.c
new file mode 100644
index 0000000..c4557a0
--- /dev/null
+++ b/lib/xstrtol.c
@@ -0,0 +1,263 @@
+/* A more useful interface to strtol.
+
+ Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Jim Meyering. */
+
+#ifndef __strtol
+# define __strtol strtol
+# define __strtol_t long int
+# define __xstrtol xstrtol
+# define STRTOL_T_MINIMUM LONG_MIN
+# define STRTOL_T_MAXIMUM LONG_MAX
+#endif
+
+#include <config.h>
+
+#include "xstrtol.h"
+
+/* Some pre-ANSI implementations (e.g. SunOS 4)
+ need stderr defined if assertion checking is enabled. */
+#include <stdio.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "intprops.h"
+
+static strtol_error
+bkm_scale (__strtol_t *x, int scale_factor)
+{
+ if (TYPE_SIGNED (__strtol_t) && *x < STRTOL_T_MINIMUM / scale_factor)
+ {
+ *x = STRTOL_T_MINIMUM;
+ return LONGINT_OVERFLOW;
+ }
+ if (STRTOL_T_MAXIMUM / scale_factor < *x)
+ {
+ *x = STRTOL_T_MAXIMUM;
+ return LONGINT_OVERFLOW;
+ }
+ *x *= scale_factor;
+ return LONGINT_OK;
+}
+
+static strtol_error
+bkm_scale_by_power (__strtol_t *x, int base, int power)
+{
+ strtol_error err = LONGINT_OK;
+ while (power--)
+ err |= bkm_scale (x, base);
+ return err;
+}
+
+/* FIXME: comment. */
+
+strtol_error
+__xstrtol (const char *s, char **ptr, int strtol_base,
+ __strtol_t *val, const char *valid_suffixes)
+{
+ char *t_ptr;
+ char **p;
+ __strtol_t tmp;
+ strtol_error err = LONGINT_OK;
+
+ assert (0 <= strtol_base && strtol_base <= 36);
+
+ p = (ptr ? ptr : &t_ptr);
+
+ if (! TYPE_SIGNED (__strtol_t))
+ {
+ const char *q = s;
+ unsigned char ch = *q;
+ while (isspace (ch))
+ ch = *++q;
+ if (ch == '-')
+ return LONGINT_INVALID;
+ }
+
+ errno = 0;
+ tmp = __strtol (s, p, strtol_base);
+
+ if (*p == s)
+ {
+ /* If there is no number but there is a valid suffix, assume the
+ number is 1. The string is invalid otherwise. */
+ if (valid_suffixes && **p && strchr (valid_suffixes, **p))
+ tmp = 1;
+ else
+ return LONGINT_INVALID;
+ }
+ else if (errno != 0)
+ {
+ if (errno != ERANGE)
+ return LONGINT_INVALID;
+ err = LONGINT_OVERFLOW;
+ }
+
+ /* Let valid_suffixes == NULL mean `allow any suffix'. */
+ /* FIXME: update all callers except the ones that allow suffixes
+ after the number, changing last parameter NULL to `""'. */
+ if (!valid_suffixes)
+ {
+ *val = tmp;
+ return err;
+ }
+
+ if (**p != '\0')
+ {
+ int base = 1024;
+ int suffixes = 1;
+ strtol_error overflow;
+
+ if (!strchr (valid_suffixes, **p))
+ {
+ *val = tmp;
+ return err | LONGINT_INVALID_SUFFIX_CHAR;
+ }
+
+ if (strchr (valid_suffixes, '0'))
+ {
+ /* The ``valid suffix'' '0' is a special flag meaning that
+ an optional second suffix is allowed, which can change
+ the base. A suffix "B" (e.g. "100MB") stands for a power
+ of 1000, whereas a suffix "iB" (e.g. "100MiB") stands for
+ a power of 1024. If no suffix (e.g. "100M"), assume
+ power-of-1024. */
+
+ switch (p[0][1])
+ {
+ case 'i':
+ if (p[0][2] == 'B')
+ suffixes += 2;
+ break;
+
+ case 'B':
+ case 'D': /* 'D' is obsolescent */
+ base = 1000;
+ suffixes++;
+ break;
+ }
+ }
+
+ switch (**p)
+ {
+ case 'b':
+ overflow = bkm_scale (&tmp, 512);
+ break;
+
+ case 'B':
+ overflow = bkm_scale (&tmp, 1024);
+ break;
+
+ case 'c':
+ overflow = 0;
+ break;
+
+ case 'E': /* exa or exbi */
+ overflow = bkm_scale_by_power (&tmp, base, 6);
+ break;
+
+ case 'G': /* giga or gibi */
+ case 'g': /* 'g' is undocumented; for compatibility only */
+ overflow = bkm_scale_by_power (&tmp, base, 3);
+ break;
+
+ case 'k': /* kilo */
+ case 'K': /* kibi */
+ overflow = bkm_scale_by_power (&tmp, base, 1);
+ break;
+
+ case 'M': /* mega or mebi */
+ case 'm': /* 'm' is undocumented; for compatibility only */
+ overflow = bkm_scale_by_power (&tmp, base, 2);
+ break;
+
+ case 'P': /* peta or pebi */
+ overflow = bkm_scale_by_power (&tmp, base, 5);
+ break;
+
+ case 'T': /* tera or tebi */
+ case 't': /* 't' is undocumented; for compatibility only */
+ overflow = bkm_scale_by_power (&tmp, base, 4);
+ break;
+
+ case 'w':
+ overflow = bkm_scale (&tmp, 2);
+ break;
+
+ case 'Y': /* yotta or 2**80 */
+ overflow = bkm_scale_by_power (&tmp, base, 8);
+ break;
+
+ case 'Z': /* zetta or 2**70 */
+ overflow = bkm_scale_by_power (&tmp, base, 7);
+ break;
+
+ default:
+ *val = tmp;
+ return err | LONGINT_INVALID_SUFFIX_CHAR;
+ }
+
+ err |= overflow;
+ *p += suffixes;
+ if (**p)
+ err |= LONGINT_INVALID_SUFFIX_CHAR;
+ }
+
+ *val = tmp;
+ return err;
+}
+
+#ifdef TESTING_XSTRTO
+
+# include <stdio.h>
+# include "error.h"
+
+char *program_name;
+
+int
+main (int argc, char **argv)
+{
+ strtol_error s_err;
+ int i;
+
+ program_name = argv[0];
+ for (i=1; i<argc; i++)
+ {
+ char *p;
+ __strtol_t val;
+
+ s_err = __xstrtol (argv[i], &p, 0, &val, "bckmw");
+ if (s_err == LONGINT_OK)
+ {
+ printf ("%s->%lu (%s)\n", argv[i], val, p);
+ }
+ else
+ {
+ STRTOL_FATAL_ERROR (argv[i], "arg", s_err);
+ }
+ }
+ exit (0);
+}
+
+#endif /* TESTING_XSTRTO */
diff --git a/lib/xstrtol.h b/lib/xstrtol.h
new file mode 100644
index 0000000..475728a
--- /dev/null
+++ b/lib/xstrtol.h
@@ -0,0 +1,87 @@
+/* A more useful interface to strtol.
+
+ Copyright (C) 1995, 1996, 1998, 1999, 2001, 2002, 2003, 2004, 2006
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef XSTRTOL_H_
+# define XSTRTOL_H_ 1
+
+# include "exitfail.h"
+
+# include <inttypes.h>
+
+# include "gettext.h"
+
+# ifndef _STRTOL_ERROR
+enum strtol_error
+ {
+ LONGINT_OK = 0,
+
+ /* These two values can be ORed together, to indicate that both
+ errors occurred. */
+ LONGINT_OVERFLOW = 1,
+ LONGINT_INVALID_SUFFIX_CHAR = 2,
+
+ LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW = (LONGINT_INVALID_SUFFIX_CHAR
+ | LONGINT_OVERFLOW),
+ LONGINT_INVALID = 4
+ };
+typedef enum strtol_error strtol_error;
+# endif
+
+# define _DECLARE_XSTRTOL(name, type) \
+ strtol_error name (const char *, char **, int, type *, const char *);
+_DECLARE_XSTRTOL (xstrtol, long int)
+_DECLARE_XSTRTOL (xstrtoul, unsigned long int)
+_DECLARE_XSTRTOL (xstrtoimax, intmax_t)
+_DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
+
+# define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err) \
+ do \
+ { \
+ switch ((Err)) \
+ { \
+ default: \
+ abort (); \
+ \
+ case LONGINT_INVALID: \
+ error ((Exit_code), 0, gettext ("invalid %s `%s'"), \
+ (Argument_type_string), (Str)); \
+ break; \
+ \
+ case LONGINT_INVALID_SUFFIX_CHAR: \
+ case LONGINT_INVALID_SUFFIX_CHAR | LONGINT_OVERFLOW: \
+ error ((Exit_code), 0, \
+ gettext ("invalid character following %s in `%s'"), \
+ (Argument_type_string), (Str)); \
+ break; \
+ \
+ case LONGINT_OVERFLOW: \
+ error ((Exit_code), 0, gettext ("%s `%s' too large"), \
+ (Argument_type_string), (Str)); \
+ break; \
+ } \
+ } \
+ while (0)
+
+# define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err) \
+ _STRTOL_ERROR (exit_failure, Str, Argument_type_string, Err)
+
+# define STRTOL_FAIL_WARN(Str, Argument_type_string, Err) \
+ _STRTOL_ERROR (0, Str, Argument_type_string, Err)
+
+#endif /* not XSTRTOL_H_ */
diff --git a/lib/xstrtoul.c b/lib/xstrtoul.c
new file mode 100644
index 0000000..285f7b9
--- /dev/null
+++ b/lib/xstrtoul.c
@@ -0,0 +1,6 @@
+#define __strtol strtoul
+#define __strtol_t unsigned long int
+#define __xstrtol xstrtoul
+#define STRTOL_T_MINIMUM 0
+#define STRTOL_T_MAXIMUM ULONG_MAX
+#include "xstrtol.c"
diff --git a/lib/xstrtoumax.c b/lib/xstrtoumax.c
new file mode 100644
index 0000000..9a2349f
--- /dev/null
+++ b/lib/xstrtoumax.c
@@ -0,0 +1,6 @@
+#define __strtol strtoumax
+#define __strtol_t uintmax_t
+#define __xstrtol xstrtoumax
+#define STRTOL_T_MINIMUM 0
+#define STRTOL_T_MAXIMUM UINTMAX_MAX
+#include "xstrtol.c"
diff --git a/m4/absolute-header.m4 b/m4/absolute-header.m4
new file mode 100644
index 0000000..c649df0
--- /dev/null
+++ b/m4/absolute-header.m4
@@ -0,0 +1,44 @@
+# absolute-header.m4 serial 6
+dnl Copyright (C) 2006 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, assuming 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.
+AC_DEFUN([gl_ABSOLUTE_HEADER],
+[AC_LANG_PREPROC_REQUIRE()dnl
+AC_FOREACH([gl_HEADER_NAME], [$1],
+ [AS_VAR_PUSHDEF([gl_absolute_header],
+ [gl_cv_absolute_]m4_quote(m4_defn([gl_HEADER_NAME])))dnl
+ AC_CACHE_CHECK([absolute name of <]m4_quote(m4_defn([gl_HEADER_NAME]))[>],
+ m4_quote(m4_defn([gl_absolute_header])),
+ [AS_VAR_PUSHDEF([ac_header_exists],
+ [ac_cv_header_]m4_quote(m4_defn([gl_HEADER_NAME])))dnl
+ AC_CHECK_HEADERS_ONCE(m4_quote(m4_defn([gl_HEADER_NAME])))dnl
+ if test AS_VAR_GET(ac_header_exists) = yes; then
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote(m4_defn([gl_HEADER_NAME]))[[>]])])
+dnl eval is necessary to expand ac_cpp.
+dnl Ultrix and Pyramid sh refuse to redirect output of eval, so use subshell.
+ AS_VAR_SET(gl_absolute_header,
+[`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
+sed -n '\#/]m4_quote(m4_defn([gl_HEADER_NAME]))[#{s#.*"\(.*/]m4_quote(m4_defn([gl_HEADER_NAME]))[\)".*#\1#;s#^/[^/]#//&#;p;q;}'`])
+ fi
+ AS_VAR_POPDEF([ac_header_exists])dnl
+ ])dnl
+ AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_quote(m4_defn([gl_HEADER_NAME]))),
+ ["AS_VAR_GET(gl_absolute_header)"],
+ [Define this to an absolute name of <]m4_quote(m4_defn([gl_HEADER_NAME]))[>.])
+ AS_VAR_POPDEF([gl_absolute_header])dnl
+])dnl
+])# gl_ABSOLUTE_HEADER
diff --git a/m4/alloca.m4 b/m4/alloca.m4
new file mode 100644
index 0000000..eb62e0e
--- /dev/null
+++ b/m4/alloca.m4
@@ -0,0 +1,50 @@
+# alloca.m4 serial 7
+dnl Copyright (C) 2002-2004, 2006 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_ALLOCA],
+[
+ dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
+ AC_REQUIRE([AC_PROG_CPP])
+ AC_REQUIRE([AC_PROG_EGREP])
+
+ 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])
+
+ AC_DEFINE(HAVE_ALLOCA_H, 1,
+ [Define HAVE_ALLOCA_H for backward compatibility with older code
+ that includes <alloca.h> only if HAVE_ALLOCA_H is defined.])
+])
+
+# Prerequisites of lib/alloca.c.
+# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA.
+AC_DEFUN([gl_PREREQ_ALLOCA], [:])
diff --git a/m4/allocsa.m4 b/m4/allocsa.m4
new file mode 100644
index 0000000..5f51c98
--- /dev/null
+++ b/m4/allocsa.m4
@@ -0,0 +1,14 @@
+# allocsa.m4 serial 7
+dnl Copyright (C) 2003-2004, 2006-2007 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_ALLOCSA],
+[
+ 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])
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+])
diff --git a/m4/argmatch.m4 b/m4/argmatch.m4
new file mode 100644
index 0000000..beda5a1
--- /dev/null
+++ b/m4/argmatch.m4
@@ -0,0 +1,10 @@
+#serial 3
+dnl Copyright (C) 2005, 2006 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_ARGMATCH],
+[
+ AC_LIBOBJ([argmatch])
+])
diff --git a/m4/argp.m4 b/m4/argp.m4
new file mode 100644
index 0000000..77f1510
--- /dev/null
+++ b/m4/argp.m4
@@ -0,0 +1,65 @@
+# argp.m4 serial 8
+dnl Copyright (C) 2003-2007 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_ARGP],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl argp-parse.c depends on GNU getopt internals, therefore use GNU getopt
+ dnl always.
+ gl_GETOPT_SUBSTITUTE
+ dnl Note: gl_GETOPT_SUBSTITUTE does AC_LIBOBJ(getopt), AC_LIBOBJ(getopt1).
+
+ AC_CHECK_DECL([program_invocation_name],
+ [AC_DEFINE(HAVE_DECL_PROGRAM_INVOCATION_NAME, 1,
+ [Define if program_invocation_name is declared])],
+ [AC_DEFINE(GNULIB_PROGRAM_INVOCATION_NAME, 1,
+ [Define to 1 to add extern declaration of program_invocation_name to argp.h])],
+ [#include <errno.h>])
+ AC_CHECK_DECL([program_invocation_short_name],
+ [AC_DEFINE(HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME, 1,
+ [Define if program_invocation_short_name is declared])],
+ [AC_DEFINE(GNULIB_PROGRAM_INVOCATION_SHORT_NAME, 1,
+ [Define to 1 to add extern declaration of program_invocation_short_name to argp.h])],
+ [#include <errno.h>])
+
+ # Check if program_invocation_name and program_invocation_short_name
+ # are defined elsewhere. It is improbable that only one of them will
+ # be defined and other not, I prefer to stay on the safe side and to
+ # test each one separately.
+ AC_MSG_CHECKING(whether program_invocation_name is defined)
+ AC_TRY_COMPILE([#include <argp.h>],
+ [ program_invocation_name = "test"; ],
+ [ AC_DEFINE(HAVE_PROGRAM_INVOCATION_NAME,1,
+ [Define if program_invocation_name is defined])
+ AC_MSG_RESULT(yes)],
+ [ AC_MSG_RESULT(no)] )
+
+ AC_MSG_CHECKING(whether program_invocation_short_name is defined)
+ AC_TRY_COMPILE([#include <argp.h>],
+ [ program_invocation_short_name = "test"; ],
+ [ AC_DEFINE(HAVE_PROGRAM_INVOCATION_SHORT_NAME,1,
+ [Define if program_invocation_short_name is defined])
+ AC_MSG_RESULT(yes)],
+ [ AC_MSG_RESULT(no)] )
+
+ 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])
+ AC_CHECK_FUNCS_ONCE([flockfile funlockfile])
+ AC_CHECK_HEADERS_ONCE([features.h linewrap.h])
+])
diff --git a/m4/backupfile.m4 b/m4/backupfile.m4
new file mode 100644
index 0000000..effbce6
--- /dev/null
+++ b/m4/backupfile.m4
@@ -0,0 +1,16 @@
+# backupfile.m4 serial 12
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 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_BACKUPFILE],
+[
+ AC_LIBOBJ([backupfile])
+
+ dnl Prerequisites of lib/backupfile.c.
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO])
+ AC_REQUIRE([gl_AC_DOS])
+ AC_REQUIRE([AC_SYS_LONG_FILE_NAMES])
+ AC_CHECK_FUNCS_ONCE([pathconf])
+])
diff --git a/m4/bison.m4 b/m4/bison.m4
new file mode 100644
index 0000000..91039b1
--- /dev/null
+++ b/m4/bison.m4
@@ -0,0 +1,24 @@
+#serial 4
+
+# Copyright (C) 2002, 2005 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_BISON],
+[
+ # getdate.y works with bison only.
+ : ${YACC='bison -y'}
+dnl
+dnl Declaring YACC & YFLAGS precious will not be necessary after GNULIB
+dnl requires an Autoconf greater than 2.59c, but it will probably still be
+dnl useful to override the description of YACC in the --help output, re
+dnl getdate.y assuming `bison -y'.
+ AC_ARG_VAR(YACC,
+[The `Yet Another C Compiler' implementation to use. Defaults to `bison -y'.
+Values other than `bison -y' will most likely break on most systems.])dnl
+ AC_ARG_VAR(YFLAGS,
+[YFLAGS contains the list arguments that will be passed by default to Bison.
+This script will default YFLAGS to the empty string to avoid a default value of
+`-d' given by some make applications.])dnl
+])
diff --git a/m4/canonicalize-lgpl.m4 b/m4/canonicalize-lgpl.m4
new file mode 100755
index 0000000..b0a7902
--- /dev/null
+++ b/m4/canonicalize-lgpl.m4
@@ -0,0 +1,35 @@
+# canonicalize-lgpl.m4 serial 4
+dnl Copyright (C) 2003, 2006-2007 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_CANONICALIZE_LGPL],
+[
+ dnl Do this replacement check manually because the file name is shorter
+ dnl than the function name.
+ AC_CHECK_DECLS_ONCE(canonicalize_file_name)
+ AC_CHECK_FUNCS_ONCE(canonicalize_file_name)
+ if test $ac_cv_func_canonicalize_file_name = no; then
+ AC_LIBOBJ(canonicalize-lgpl)
+ AC_DEFINE([realpath], [rpl_realpath],
+ [Define to a replacement function name for realpath().])
+ gl_PREREQ_CANONICALIZE_LGPL
+ fi
+])
+
+# Like gl_CANONICALIZE_LGPL, except prepare for separate compilation
+# (no AC_LIBOBJ).
+AC_DEFUN([gl_CANONICALIZE_LGPL_SEPARATE],
+[
+ AC_CHECK_DECLS_ONCE(canonicalize_file_name)
+ AC_CHECK_FUNCS_ONCE(canonicalize_file_name)
+ gl_PREREQ_CANONICALIZE_LGPL
+])
+
+# Prerequisites of lib/canonicalize-lgpl.c.
+AC_DEFUN([gl_PREREQ_CANONICALIZE_LGPL],
+[
+ AC_CHECK_HEADERS_ONCE(sys/param.h unistd.h)
+ AC_CHECK_FUNCS_ONCE(getcwd readlink)
+])
diff --git a/m4/chdir-long.m4 b/m4/chdir-long.m4
new file mode 100644
index 0000000..7f34f60
--- /dev/null
+++ b/m4/chdir-long.m4
@@ -0,0 +1,38 @@
+#serial 10
+
+# 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, 2005, 2006, 2007 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_CACHE_CHECK([whether this system has an arbitrary file name length limit],
+ gl_cv_have_arbitrary_file_name_length_limit,
+ [AC_EGREP_CPP([have_arbitrary_file_name_length_limit],
+ [#include <unistd.h>
+#include <limits.h>
+#if defined PATH_MAX || defined MAXPATHLEN
+have_arbitrary_file_name_length_limit
+#endif],
+ gl_cv_have_arbitrary_file_name_length_limit=yes,
+ gl_cv_have_arbitrary_file_name_length_limit=no)])
+
+ if test $gl_cv_have_arbitrary_file_name_length_limit = yes; then
+ AC_LIBOBJ([chdir-long])
+ gl_PREREQ_CHDIR_LONG
+ fi
+])
+
+AC_DEFUN([gl_PREREQ_CHDIR_LONG],
+[
+ :
+])
diff --git a/m4/chown.m4 b/m4/chown.m4
new file mode 100644
index 0000000..89761f5
--- /dev/null
+++ b/m4/chown.m4
@@ -0,0 +1,83 @@
+#serial 17
+# Determine whether we need the chown wrapper.
+
+dnl Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007 Free
+dnl 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.
+
+# chown should accept arguments of -1 for uid and gid, and it should
+# dereference symlinks. If it doesn't, arrange to use the replacement
+# function.
+
+# From Jim Meyering.
+
+AC_DEFUN([gl_FUNC_CHOWN],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_TYPE_UID_T])
+ AC_REQUIRE([AC_FUNC_CHOWN])
+ AC_REQUIRE([gl_FUNC_CHOWN_FOLLOWS_SYMLINK])
+
+ if test $ac_cv_func_chown_works = no; then
+ AC_DEFINE(CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE, 1,
+ [Define if chown is not POSIX compliant regarding IDs of -1.])
+ fi
+
+ # If chown has either of the above problems, then we need the wrapper.
+ if test $ac_cv_func_chown_works$gl_cv_func_chown_follows_symlink = yesyes; then
+ : # no wrapper needed
+ else
+ REPLACE_CHOWN=1
+ AC_LIBOBJ(chown)
+ gl_PREREQ_CHOWN
+ fi
+])
+
+# Determine whether chown follows symlinks (it should).
+AC_DEFUN([gl_FUNC_CHOWN_FOLLOWS_SYMLINK],
+[
+ AC_CACHE_CHECK(
+ [whether chown(2) dereferences symlinks],
+ gl_cv_func_chown_follows_symlink,
+ [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+ int
+ main ()
+ {
+ char const *dangling_symlink = "conftest.dangle";
+
+ unlink (dangling_symlink);
+ if (symlink ("conftest.no-such", dangling_symlink))
+ abort ();
+
+ /* Exit successfully on a conforming system,
+ i.e., where chown must fail with ENOENT. */
+ exit ( ! (chown (dangling_symlink, getuid (), getgid ()) != 0
+ && errno == ENOENT));
+ }
+ ]])],
+ [gl_cv_func_chown_follows_symlink=yes],
+ [gl_cv_func_chown_follows_symlink=no],
+ [gl_cv_func_chown_follows_symlink=yes]
+ )
+ ]
+ )
+
+ if test $gl_cv_func_chown_follows_symlink = no; then
+ AC_DEFINE(CHOWN_MODIFIES_SYMLINK, 1,
+ [Define if chown modifies symlinks.])
+ fi
+])
+
+# Prerequisites of lib/chown.c.
+AC_DEFUN([gl_PREREQ_CHOWN],
+[
+ AC_CHECK_FUNC([fchown], , [AC_LIBOBJ(fchown-stub)])
+])
diff --git a/m4/clock_time.m4 b/m4/clock_time.m4
new file mode 100644
index 0000000..227a597
--- /dev/null
+++ b/m4/clock_time.m4
@@ -0,0 +1,30 @@
+# clock_time.m4 serial 8
+dnl Copyright (C) 2002-2006 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.
+ 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_SUBST([LIB_CLOCK_GETTIME])
+ AC_CHECK_FUNCS(clock_gettime clock_settime)
+ LIBS=$gl_saved_libs
+])
diff --git a/m4/close-stream.m4 b/m4/close-stream.m4
new file mode 100644
index 0000000..b1f9d54
--- /dev/null
+++ b/m4/close-stream.m4
@@ -0,0 +1,13 @@
+#serial 3
+dnl Copyright (C) 2006-2007 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_CLOSE_STREAM],
+[
+ AC_LIBOBJ([close-stream])
+
+ dnl Prerequisites of lib/close-stream.c.
+ :
+])
diff --git a/m4/closeout.m4 b/m4/closeout.m4
new file mode 100644
index 0000000..55a65f0
--- /dev/null
+++ b/m4/closeout.m4
@@ -0,0 +1,13 @@
+# closeout.m4 serial 5
+dnl Copyright (C) 2002, 2003, 2005, 2006 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_CLOSEOUT],
+[
+ AC_LIBOBJ([closeout])
+
+ dnl Prerequisites of lib/closeout.c.
+ :
+])
diff --git a/m4/codeset.m4 b/m4/codeset.m4
new file mode 100644
index 0000000..223955b
--- /dev/null
+++ b/m4/codeset.m4
@@ -0,0 +1,21 @@
+# codeset.m4 serial 2 (gettext-0.16)
+dnl Copyright (C) 2000-2002, 2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+ [AC_TRY_LINK([#include <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/d-ino.m4 b/m4/d-ino.m4
new file mode 100644
index 0000000..6e6dab3
--- /dev/null
+++ b/m4/d-ino.m4
@@ -0,0 +1,41 @@
+#serial 10
+
+dnl From Jim Meyering.
+dnl
+dnl Check whether struct dirent has a member named d_ino.
+dnl
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2006, 2007 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_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);
+ return ! (e
+ && stat (e->d_name, &st) == 0
+ && e->d_ino == st.st_ino);]])],
+ [gl_cv_struct_dirent_d_ino=yes],
+ [gl_cv_struct_dirent_d_ino=no],
+ [gl_cv_struct_dirent_d_ino=no])])
+ if test $gl_cv_struct_dirent_d_ino = yes; then
+ AC_DEFINE(D_INO_IN_DIRENT, 1,
+ [Define if struct dirent has a member d_ino that actually works.])
+ fi
+ ]
+)
diff --git a/m4/dirfd.m4 b/m4/dirfd.m4
new file mode 100644
index 0000000..125966b
--- /dev/null
+++ b/m4/dirfd.m4
@@ -0,0 +1,74 @@
+#serial 14 -*- Autoconf -*-
+
+dnl Find out how to get the file descriptor associated with an open DIR*.
+
+# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 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],
+[
+ dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
+ AC_REQUIRE([AC_PROG_CPP])
+ AC_REQUIRE([AC_PROG_EGREP])
+ AC_CHECK_FUNCS(dirfd)
+ AC_CHECK_DECLS([dirfd], , ,
+ [#include <sys/types.h>
+ #include <dirent.h>])
+
+ 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 only if we have no function, macro,
+ # or declaration with that name.
+ if test $ac_cv_func_dirfd,$ac_cv_have_decl_dirfd,$gl_cv_func_dirfd_macro \
+ = no,no,no; then
+ AC_REPLACE_FUNCS([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_TRY_COMPILE(
+ [#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
+])
+ fi
+])
diff --git a/m4/dirname.m4 b/m4/dirname.m4
new file mode 100644
index 0000000..e35da96
--- /dev/null
+++ b/m4/dirname.m4
@@ -0,0 +1,18 @@
+#serial 7 -*- autoconf -*-
+dnl Copyright (C) 2002-2006 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_DIRNAME],
+[
+ AC_LIBOBJ([basename])
+ AC_LIBOBJ([dirname])
+ AC_LIBOBJ([stripslash])
+
+ dnl Prerequisites of lib/dirname.h.
+ AC_REQUIRE([gl_AC_DOS])
+ AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
+
+ dnl No prerequisites of lib/basename.c, lib/dirname.c, lib/stripslash.c.
+])
diff --git a/m4/dos.m4 b/m4/dos.m4
new file mode 100644
index 0000000..dd59571
--- /dev/null
+++ b/m4/dos.m4
@@ -0,0 +1,71 @@
+#serial 10 -*- autoconf -*-
+
+# Define some macros required for proper operation of code in lib/*.c
+# on MSDOS/Windows systems.
+
+# Copyright (C) 2000, 2001, 2004, 2005, 2006 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_AC_DOS],
+ [
+ AC_CACHE_CHECK([whether system is Windows or MSDOS], [ac_cv_win_or_dos],
+ [
+ AC_TRY_COMPILE([],
+ [#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__
+neither MSDOS nor Windows
+#endif],
+ [ac_cv_win_or_dos=yes],
+ [ac_cv_win_or_dos=no])
+ ])
+
+ if test x"$ac_cv_win_or_dos" = xyes; then
+ ac_fs_accepts_drive_letter_prefix=1
+ ac_fs_backslash_is_file_name_separator=1
+ AC_CACHE_CHECK([whether drive letter can start relative path],
+ [ac_cv_drive_letter_can_be_relative],
+ [
+ AC_TRY_COMPILE([],
+ [#if defined __CYGWIN__
+drive letters are always absolute
+#endif],
+ [ac_cv_drive_letter_can_be_relative=yes],
+ [ac_cv_drive_letter_can_be_relative=no])
+ ])
+ if test x"$ac_cv_drive_letter_can_be_relative" = xyes; then
+ ac_fs_drive_letter_can_be_relative=1
+ else
+ ac_fs_drive_letter_can_be_relative=0
+ fi
+ else
+ ac_fs_accepts_drive_letter_prefix=0
+ ac_fs_backslash_is_file_name_separator=0
+ ac_fs_drive_letter_can_be_relative=0
+ fi
+
+ AC_DEFINE_UNQUOTED([FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX],
+ $ac_fs_accepts_drive_letter_prefix,
+ [Define on systems for which file names may have a so-called
+ `drive letter' prefix, define this to compute the length of that
+ prefix, including the colon.])
+
+ AH_VERBATIM(ISSLASH,
+ [#if FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#else
+# define ISSLASH(C) ((C) == '/')
+#endif])
+
+ AC_DEFINE_UNQUOTED([FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR],
+ $ac_fs_backslash_is_file_name_separator,
+ [Define if the backslash character may also serve as a file name
+ component separator.])
+
+ AC_DEFINE_UNQUOTED([FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE],
+ $ac_fs_drive_letter_can_be_relative,
+ [Define if a drive letter prefix denotes a relative path if it is
+ not followed by a file name component separator.])
+ ])
diff --git a/m4/double-slash-root.m4 b/m4/double-slash-root.m4
new file mode 100644
index 0000000..69d60d0
--- /dev/null
+++ b/m4/double-slash-root.m4
@@ -0,0 +1,38 @@
+# double-slash-root.m4 serial 2 -*- Autoconf -*-
+dnl Copyright (C) 2006 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 / //`
+ 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/dup2.m4 b/m4/dup2.m4
new file mode 100644
index 0000000..0549823
--- /dev/null
+++ b/m4/dup2.m4
@@ -0,0 +1,15 @@
+#serial 5
+dnl Copyright (C) 2002, 2005, 2007 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_CHECK_FUNCS_ONCE([dup2])
+ if test $ac_cv_func_dup2 = no; then
+ HAVE_DUP2=0
+ AC_LIBOBJ([dup2])
+ fi
+])
diff --git a/m4/eealloc.m4 b/m4/eealloc.m4
new file mode 100644
index 0000000..adcfd06
--- /dev/null
+++ b/m4/eealloc.m4
@@ -0,0 +1,32 @@
+# eealloc.m4 serial 1
+dnl Copyright (C) 2003 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_REQUIRE([AC_C_INLINE])
+])
+
+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/eoverflow.m4 b/m4/eoverflow.m4
new file mode 100644
index 0000000..3bffd10
--- /dev/null
+++ b/m4/eoverflow.m4
@@ -0,0 +1,70 @@
+# eoverflow.m4 serial 2
+dnl Copyright (C) 2004, 2006 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.
+
+# The EOVERFLOW errno value ought to be defined in <errno.h>, according to
+# POSIX. But some systems (like AIX 3) don't define it, and some systems
+# (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined.
+
+# Define EOVERFLOW as a C macro and as a substituted macro in such a way that
+# 1. on all systems, after inclusion of <errno.h>, EOVERFLOW is usable,
+# 2. on systems where EOVERFLOW is defined elsewhere, we use the same numeric
+# value.
+
+AC_DEFUN([gl_EOVERFLOW],
+[
+ AC_REQUIRE([AC_PROG_CC])dnl
+
+ AC_CACHE_CHECK([for EOVERFLOW], ac_cv_decl_EOVERFLOW, [
+ AC_EGREP_CPP(yes,[
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
+ ], have_eoverflow=1)
+ if test -n "$have_eoverflow"; then
+ dnl EOVERFLOW exists in <errno.h>. Don't need to define EOVERFLOW ourselves.
+ ac_cv_decl_EOVERFLOW=yes
+ else
+ AC_EGREP_CPP(yes,[
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
+ ], have_eoverflow=1)
+ if test -n "$have_eoverflow"; then
+ dnl EOVERFLOW exists but is hidden.
+ dnl Define it to the same value.
+ AC_COMPUTE_INT([ac_cv_decl_EOVERFLOW], [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>
+])
+ else
+ dnl EOVERFLOW isn't defined by the system. Define EOVERFLOW ourselves, but
+ dnl don't define it as EINVAL, because snprintf() callers want to
+ dnl distinguish EINVAL and EOVERFLOW.
+ ac_cv_decl_EOVERFLOW=E2BIG
+ fi
+ fi
+ ])
+ if test "$ac_cv_decl_EOVERFLOW" != yes; then
+ AC_DEFINE_UNQUOTED([EOVERFLOW], [$ac_cv_decl_EOVERFLOW],
+ [Define as good substitute value for EOVERFLOW.])
+ EOVERFLOW="$ac_cv_decl_EOVERFLOW"
+ AC_SUBST(EOVERFLOW)
+ fi
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
diff --git a/m4/error.m4 b/m4/error.m4
new file mode 100644
index 0000000..7c7746e
--- /dev/null
+++ b/m4/error.m4
@@ -0,0 +1,22 @@
+#serial 11
+
+# Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2004 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],
+[
+ AC_FUNC_ERROR_AT_LINE
+ dnl Note: AC_FUNC_ERROR_AT_LINE does AC_LIBSOURCES([error.h, error.c]).
+ gl_PREREQ_ERROR
+])
+
+# Prerequisites of lib/error.c.
+AC_DEFUN([gl_PREREQ_ERROR],
+[
+ AC_REQUIRE([AC_FUNC_STRERROR_R])
+ :
+])
diff --git a/m4/exclude.m4 b/m4/exclude.m4
new file mode 100644
index 0000000..23727e6
--- /dev/null
+++ b/m4/exclude.m4
@@ -0,0 +1,10 @@
+# exclude.m4 serial 7
+dnl Copyright (C) 2002, 2003, 2005, 2006 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_EXCLUDE],
+[
+ AC_LIBOBJ([exclude])
+])
diff --git a/m4/exitfail.m4 b/m4/exitfail.m4
new file mode 100644
index 0000000..b7a691e
--- /dev/null
+++ b/m4/exitfail.m4
@@ -0,0 +1,13 @@
+# exitfail.m4 serial 6
+dnl Copyright (C) 2002, 2003, 2005, 2006 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_EXITFAIL],
+[
+ AC_LIBOBJ([exitfail])
+
+ dnl No prerequisites of lib/exitfail.c.
+ :
+])
diff --git a/m4/extensions.m4 b/m4/extensions.m4
new file mode 100644
index 0000000..143a9e5
--- /dev/null
+++ b/m4/extensions.m4
@@ -0,0 +1,58 @@
+# serial 4 -*- Autoconf -*-
+# Enable extensions on systems that normally disable them.
+
+# Copyright (C) 2003, 2006 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 definition of AC_USE_SYSTEM_EXTENSIONS is stolen from CVS
+# Autoconf. Perhaps we can remove this once we can assume Autoconf
+# 2.61 or later everywhere, but since CVS Autoconf mutates rapidly
+# enough in this area it's likely we'll need to redefine
+# AC_USE_SYSTEM_EXTENSIONS for quite some time.
+
+# AC_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+AC_DEFUN([AC_USE_SYSTEM_EXTENSIONS],
+[
+ AC_BEFORE([$0], [AC_COMPILE_IFELSE])
+ AC_BEFORE([$0], [AC_RUN_IFELSE])
+
+ AC_REQUIRE([AC_GNU_SOURCE])
+ AC_REQUIRE([AC_AIX])
+ AC_REQUIRE([AC_MINIX])
+
+ AH_VERBATIM([__EXTENSIONS__],
+[/* Enable extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif])
+ 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])])
+ test $ac_cv_safe_to_define___extensions__ = yes &&
+ AC_DEFINE([__EXTENSIONS__])
+ AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
+ AC_DEFINE([_TANDEM_SOURCE])
+])
+
+# gl_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+AC_DEFUN([gl_USE_SYSTEM_EXTENSIONS],
+ [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])])
diff --git a/m4/fchdir.m4 b/m4/fchdir.m4
new file mode 100644
index 0000000..58c933c
--- /dev/null
+++ b/m4/fchdir.m4
@@ -0,0 +1,28 @@
+# fchdir.m4 serial 3
+dnl Copyright (C) 2006-2007 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_CHECK_FUNCS_ONCE([fchdir])
+ if test $ac_cv_func_fchdir = no; then
+ REPLACE_FCHDIR=1
+ AC_LIBOBJ([fchdir])
+ gl_PREREQ_FCHDIR
+ AC_DEFINE([FCHDIR_REPLACEMENT], 1,
+ [Define if gnulib's fchdir() replacement is used.])
+ gl_ABSOLUTE_HEADER([dirent.h])
+ ABSOLUTE_DIRENT_H=\"$gl_cv_absolute_dirent_h\"
+ DIRENT_H='dirent.h'
+ else
+ DIRENT_H=
+ fi
+ AC_SUBST([ABSOLUTE_DIRENT_H])
+ AC_SUBST([DIRENT_H])
+])
+
+# Prerequisites of lib/fchdir.c.
+AC_DEFUN([gl_PREREQ_FCHDIR], [:])
diff --git a/m4/fcntl-safer.m4 b/m4/fcntl-safer.m4
new file mode 100644
index 0000000..3475b0a
--- /dev/null
+++ b/m4/fcntl-safer.m4
@@ -0,0 +1,11 @@
+#serial 5
+dnl Copyright (C) 2005-2007 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_FCNTL_SAFER],
+[
+ AC_LIBOBJ([open-safer])
+ AC_LIBOBJ([creat-safer])
+])
diff --git a/m4/fcntl_h.m4 b/m4/fcntl_h.m4
new file mode 100644
index 0000000..9846b2f
--- /dev/null
+++ b/m4/fcntl_h.m4
@@ -0,0 +1,81 @@
+# Configure fcntl.h.
+dnl Copyright (C) 2006 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_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>
+ #include <unistd.h>
+ #include <fcntl.h>
+ #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 status = !constants;
+ {
+ static char const sym[] = "conftest.sym";
+ if (symlink (".", sym) != 0
+ || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0)
+ status |= 32;
+ }
+ {
+ static char const file[] = "confdefs.h";
+ int fd = open (file, O_RDONLY | O_NOATIME);
+ char c;
+ struct stat st0, st1;
+ if (fd < 0
+ || fstat (fd, &st0) != 0
+ || sleep (1) != 0
+ || read (fd, &c, 1) != 1
+ || close (fd) != 0
+ || stat (file, &st1) != 0
+ || st0.st_atime != st1.st_atime)
+ status |= 64;
+ }
+ return status;]])],
+ [gl_cv_header_working_fcntl_h=yes],
+ [case $? in #(
+ 32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+ 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+ 96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+ *) gl_cv_header_working_fcntl_h='no';;
+ esac],
+ [gl_cv_header_working_fcntl_h=cross-compiling])])
+
+ 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.])
+
+ gl_ABSOLUTE_HEADER([fcntl.h])
+ ABSOLUTE_FCNTL_H=\"$gl_cv_absolute_fcntl_h\"
+ AC_SUBST([ABSOLUTE_FCNTL_H])
+ FCNTL_H='fcntl.h'
+ AC_SUBST([FCNTL_H])
+])
diff --git a/m4/fileblocks.m4 b/m4/fileblocks.m4
new file mode 100644
index 0000000..5fb6311
--- /dev/null
+++ b/m4/fileblocks.m4
@@ -0,0 +1,20 @@
+# fileblocks.m4 serial 4
+dnl Copyright (C) 2002, 2005, 2006 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_FILEBLOCKS],
+[
+ AC_STRUCT_ST_BLOCKS
+ dnl Note: AC_STRUCT_ST_BLOCKS does AC_LIBOBJ(fileblocks).
+ if test $ac_cv_member_struct_stat_st_blocks = no; then
+ gl_PREREQ_FILEBLOCKS
+ fi
+])
+
+# Prerequisites of lib/fileblocks.c.
+AC_DEFUN([gl_PREREQ_FILEBLOCKS], [
+ AC_CHECK_HEADERS_ONCE(sys/param.h)
+ :
+])
diff --git a/m4/float_h.m4 b/m4/float_h.m4
new file mode 100644
index 0000000..36a07dc
--- /dev/null
+++ b/m4/float_h.m4
@@ -0,0 +1,21 @@
+# float_h.m4 serial 1
+dnl Copyright (C) 2007 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=
+ case "$host_os" in
+ beos*)
+ FLOAT_H=float.h
+ gl_ABSOLUTE_HEADER([float.h])
+ ABSOLUTE_FLOAT_H=\"$gl_cv_absolute_float_h\"
+ AC_SUBST([ABSOLUTE_FLOAT_H])
+ ;;
+ esac
+ AC_SUBST([FLOAT_H])
+])
diff --git a/m4/fnmatch.m4 b/m4/fnmatch.m4
new file mode 100644
index 0000000..3778742
--- /dev/null
+++ b/m4/fnmatch.m4
@@ -0,0 +1,127 @@
+# Check for fnmatch.
+
+# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 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.
+
+# _AC_FUNC_FNMATCH_IF(STANDARD = GNU | POSIX, CACHE_VAR, IF-TRUE, IF-FALSE)
+# -------------------------------------------------------------------------
+# If a STANDARD compliant fnmatch is found, run IF-TRUE, otherwise
+# IF-FALSE. Use CACHE_VAR.
+AC_DEFUN([_AC_FUNC_FNMATCH_IF],
+[AC_CACHE_CHECK(
+ [for working $1 fnmatch],
+ [$2],
+ [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 test.
+ 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 };
+ return
+ !(n ("a*", "", 0)
+ && y ("a*", "abc", 0)
+ && n ("d*/*1", "d/s/1", FNM_PATHNAME)
+ && y ("a\\\\bc", "abc", 0)
+ && n ("a\\\\bc", "abc", FNM_NOESCAPE)
+ && y ("*x", ".x", 0)
+ && n ("*x", ".x", FNM_PERIOD)
+ && y (Apat, "\\\\", 0) && y (Apat, "A", 0)
+ && y (apat, "\\\\", 0) && y (apat, "a", 0)
+ && n (Apat, A_1, 0) == ('A' < '\\\\')
+ && n (apat, a_1, 0) == ('a' < '\\\\')
+ && y (Apat, A01, 0) == ('A' < '\\\\')
+ && y (apat, a01, 0) == ('a' < '\\\\')
+ && y (Apat, bs_1, 0) == ('A' < '\\\\')
+ && y (apat, bs_1, 0) == ('a' < '\\\\')
+ && n (Apat, bs01, 0) == ('A' < '\\\\')
+ && n (apat, bs01, 0) == ('a' < '\\\\')
+ && ]m4_if([$1], [GNU],
+ [y ("xxXX", "xXxX", FNM_CASEFOLD)
+ && y ("a++(x|yy)b", "a+xyyyyxb", FNM_EXTMATCH)
+ && n ("d*/*1", "d/s/1", FNM_FILE_NAME)
+ && y ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR)
+ && y ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR)
+ && y ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR)],
+ 1))[;]])],
+ [$2=yes],
+ [$2=no],
+ [$2=cross])])
+AS_IF([test $$2 = yes], [$3], [$4])
+])# _AC_FUNC_FNMATCH_IF
+
+
+# _AC_LIBOBJ_FNMATCH
+# ------------------
+# Prepare the replacement of fnmatch.
+AC_DEFUN([_AC_LIBOBJ_FNMATCH],
+[AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+AC_REQUIRE([AC_TYPE_MBSTATE_T])dnl
+AC_CHECK_DECLS([isblank], [], [], [#include <ctype.h>])
+AC_CHECK_FUNCS_ONCE([btowc iswctype mbsrtowcs mempcpy wmemchr wmemcpy wmempcpy])
+AC_CHECK_HEADERS_ONCE([wctype.h])
+AC_LIBOBJ([fnmatch])
+FNMATCH_H=fnmatch.h
+])# _AC_LIBOBJ_FNMATCH
+
+
+AC_DEFUN([gl_FUNC_FNMATCH_POSIX],
+[
+ FNMATCH_H=
+ _AC_FUNC_FNMATCH_IF([POSIX], [ac_cv_func_fnmatch_posix],
+ [rm -f lib/fnmatch.h],
+ [_AC_LIBOBJ_FNMATCH])
+ if test $ac_cv_func_fnmatch_posix != yes; then
+ dnl We must choose a different name for our function, since on ELF systems
+ dnl a broken fnmatch() in libc.so would override our fnmatch() if it is
+ dnl compiled into a shared library.
+ AC_DEFINE([fnmatch], [posix_fnmatch],
+ [Define to a replacement function name for fnmatch().])
+ fi
+ AC_SUBST([FNMATCH_H])
+])
+
+
+AC_DEFUN([gl_FUNC_FNMATCH_GNU],
+[
+ dnl Persuade glibc <fnmatch.h> to declare FNM_CASEFOLD etc.
+ AC_REQUIRE([AC_GNU_SOURCE])
+
+ FNMATCH_H=
+ _AC_FUNC_FNMATCH_IF([GNU], [ac_cv_func_fnmatch_gnu],
+ [rm -f lib/fnmatch.h],
+ [_AC_LIBOBJ_FNMATCH])
+ if test $ac_cv_func_fnmatch_gnu != yes; then
+ dnl We must choose a different name for our function, since on ELF systems
+ dnl a broken fnmatch() in libc.so would override our fnmatch() if it is
+ dnl compiled into a shared library.
+ AC_DEFINE([fnmatch], [gnu_fnmatch],
+ [Define to a replacement function name for fnmatch().])
+ fi
+ AC_SUBST([FNMATCH_H])
+])
diff --git a/m4/fpending.m4 b/m4/fpending.m4
new file mode 100644
index 0000000..a073483
--- /dev/null
+++ b/m4/fpending.m4
@@ -0,0 +1,78 @@
+#serial 10
+
+# Copyright (C) 2000, 2001, 2004, 2005, 2006 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 Using code from emacs, based on suggestions from Paul Eggert
+dnl and Ulrich Drepper.
+
+dnl Find out how to determine the number of pending output bytes on a stream.
+dnl glibc (2.1.93 and newer) and Solaris provide __fpending. On other systems,
+dnl we have to grub around in the FILE struct.
+
+AC_DEFUN([gl_FUNC_FPENDING],
+[
+ AC_CHECK_HEADERS_ONCE(stdio_ext.h)
+ AC_REPLACE_FUNCS([__fpending])
+ fp_headers='
+# include <stdio.h>
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+'
+ AC_CHECK_DECLS([__fpending], , , $fp_headers)
+ if test $ac_cv_func___fpending = no; then
+ AC_CACHE_CHECK(
+ [how to determine the number of pending output bytes on a stream],
+ ac_cv_sys_pending_output_n_bytes,
+ [
+ for ac_expr in \
+ \
+ '# glibc2' \
+ 'fp->_IO_write_ptr - fp->_IO_write_base' \
+ \
+ '# traditional Unix' \
+ 'fp->_ptr - fp->_base' \
+ \
+ '# BSD' \
+ 'fp->_p - fp->_bf._base' \
+ \
+ '# SCO, Unixware' \
+ '(fp->__ptr ? fp->__ptr - fp->__base : 0)' \
+ \
+ '# old glibc?' \
+ 'fp->__bufp - fp->__buffer' \
+ \
+ '# old glibc iostream?' \
+ 'fp->_pptr - fp->_pbase' \
+ \
+ '# VMS' \
+ '(*fp)->_ptr - (*fp)->_base' \
+ \
+ '# e.g., DGUX R4.11; the info is not available' \
+ 1 \
+ ; do
+
+ # Skip each embedded comment.
+ case "$ac_expr" in '#'*) continue;; esac
+
+ AC_TRY_COMPILE(
+ [#include <stdio.h>
+ ],
+ [FILE *fp = stdin; (void) ($ac_expr);],
+ fp_done=yes
+ )
+ test "$fp_done" = yes && break
+ done
+
+ ac_cv_sys_pending_output_n_bytes=$ac_expr
+ ]
+ )
+ AC_DEFINE_UNQUOTED(PENDING_OUTPUT_N_BYTES,
+ $ac_cv_sys_pending_output_n_bytes,
+ [the number of pending output bytes on stream `fp'])
+ fi
+])
diff --git a/m4/ftruncate.m4 b/m4/ftruncate.m4
new file mode 100644
index 0000000..b7f346a
--- /dev/null
+++ b/m4/ftruncate.m4
@@ -0,0 +1,46 @@
+#serial 13
+
+# See if we need to emulate a missing ftruncate function using fcntl or chsize.
+
+# Copyright (C) 2000, 2001, 2003-2007 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.
+
+# FIXME: remove this macro, along with all uses of HAVE_FTRUNCATE in 2010,
+# if the check below provokes no more reports. So far, the only report
+# arose from a test build of this gnulib module, cross-compiling to mingw:
+# <http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/9203>
+
+AC_DEFUN([gl_FUNC_FTRUNCATE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([ftruncate])
+ if test $ac_cv_func_ftruncate = no; then
+ HAVE_FTRUNCATE=0
+ AC_LIBOBJ([ftruncate])
+ gl_PREREQ_FTRUNCATE
+ case "$host_os" in
+ mingw*)
+ # Yes, we know mingw lacks ftruncate.
+ ;;
+ *)
+ # If someone lacks ftruncate, make configure fail, and request
+ # a bug report to inform us about it.
+ if test x"$SKIP_FTRUNCATE_CHECK" != xyes; then
+ AC_MSG_FAILURE([Your system lacks the ftruncate function.
+ Please report this, along with the output of "uname -a", to the
+ bug-coreutils@gnu.org mailing list. To continue past this point,
+ rerun configure with SKIP_FTRUNCATE_CHECK=yes.
+ E.g., ./configure SKIP_FTRUNCATE_CHECK=yes])
+ fi
+ esac
+ fi
+])
+
+# Prerequisites of lib/ftruncate.c.
+AC_DEFUN([gl_PREREQ_FTRUNCATE],
+[
+ AC_CHECK_FUNCS(chsize)
+])
diff --git a/m4/getcwd-abort-bug.m4 b/m4/getcwd-abort-bug.m4
new file mode 100644
index 0000000..a431a7c
--- /dev/null
+++ b/m4/getcwd-abort-bug.m4
@@ -0,0 +1,106 @@
+#serial 1
+# 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 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-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([gl_FUNC_GETCWD_ABORT_BUG],
+[
+ AC_CHECK_DECLS_ONCE(getcwd)
+ AC_CHECK_FUNCS(getpagesize)
+ AC_CACHE_CHECK([whether getcwd aborts when 4k < cwd_length < 16k],
+ gl_cv_func_getcwd_abort_bug,
+ [# 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---"
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[
+#include <stdlib.h>
+#include <unistd.h>
+#include <limits.h>
+#include <string.h>
+#include <sys/stat.h>
+
+/* Don't get link errors because mkdir is redefined to rpl_mkdir. */
+#undef mkdir
+
+#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 const *dir_name = "confdir-14B---";
+ char *cwd;
+ size_t initial_cwd_len;
+ int fail = 0;
+ size_t desired_depth;
+ size_t d;
+
+ /* The bug is triggered when PATH_MAX < getpagesize (), so skip
+ this relative expensive and invasive test if that's not true. */
+ if (getpagesize () <= PATH_MAX)
+ return 0;
+
+ cwd = getcwd (NULL, 0);
+ if (cwd == NULL)
+ return 0;
+
+ initial_cwd_len = strlen (cwd);
+ free (cwd);
+ desired_depth = ((TARGET_LEN - 1 - initial_cwd_len)
+ / (1 + strlen (dir_name)));
+ for (d = 0; d < desired_depth; d++)
+ {
+ if (mkdir (dir_name, S_IRWXU) < 0 || chdir (dir_name) < 0)
+ {
+ 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 failed. This is ok, and expected. */
+ free (cwd);
+
+ /* Call rmdir first, in case the above chdir failed. */
+ rmdir (dir_name);
+ while (0 < d--)
+ {
+ if (chdir ("..") < 0)
+ break;
+ rmdir (dir_name);
+ }
+
+ return 0;
+}
+ ]])],
+ [gl_cv_func_getcwd_abort_bug=no],
+ [gl_cv_func_getcwd_abort_bug=yes],
+ [gl_cv_func_getcwd_abort_bug=yes])
+ ])
+ AS_IF([test $gl_cv_func_getcwd_abort_bug = yes], [$1], [$2])
+])
diff --git a/m4/getcwd-path-max.m4 b/m4/getcwd-path-max.m4
new file mode 100644
index 0000000..5e6d58b
--- /dev/null
+++ b/m4/getcwd-path-max.m4
@@ -0,0 +1,190 @@
+#serial 13
+# 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, 2004, 2005, 2006, 2007 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([gl_USE_SYSTEM_EXTENSIONS])
+ 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"
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#ifndef AT_FDCWD
+# define AT_FDCWD 0
+#endif
+#ifdef ENAMETOOLONG
+# define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
+#else
+# define is_ENAMETOOLONG(x) 0
+#endif
+
+/* Don't get link errors because mkdir is redefined to rpl_mkdir. */
+#undef mkdir
+
+#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 (1);
+
+ 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. 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)))
+ fail = 2;
+ break;
+ }
+
+ if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE)
+ {
+ c = getcwd (buf, PATH_MAX);
+ if (!c && errno == ENOENT)
+ {
+ fail = 1;
+ break;
+ }
+ if (c || ! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+ {
+ fail = 2;
+ 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 = 2;
+ break;
+ }
+ if (AT_FDCWD || errno == ERANGE || errno == ENOENT)
+ {
+ fail = 1;
+ break;
+ }
+ }
+ }
+
+ if (c && strlen (c) != cwd_len)
+ {
+ fail = 2;
+ 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
+ 1) gl_cv_func_getcwd_path_max='no, but it is partly working';;
+ *) gl_cv_func_getcwd_path_max=no;;
+ esac],
+ [gl_cv_func_getcwd_path_max=no])
+ ])
+ case $gl_cv_func_getcwd_path_max in
+ no,*)
+ 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. If __GETCWD_PREFIX
+ is not defined, it doesn't matter whether HAVE_PARTLY_WORKING_GETCWD
+ is defined.]);;
+ esac
+])
diff --git a/m4/getcwd.m4 b/m4/getcwd.m4
new file mode 100644
index 0000000..6ebe2fc
--- /dev/null
+++ b/m4/getcwd.m4
@@ -0,0 +1,64 @@
+# getcwd.m4 - check for working getcwd that is compatible with glibc
+
+# Copyright (C) 2001, 2003, 2004, 2005, 2006, 2007 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([gl_FUNC_GETCWD_NULL],
+ [
+ AC_CACHE_CHECK([whether getcwd (NULL, 0) allocates memory for result],
+ [gl_cv_func_getcwd_null],
+ [AC_TRY_RUN(
+ [
+# include <stdlib.h>
+# include <unistd.h>
+# ifndef getcwd
+ char *getcwd ();
+# endif
+ int
+ main ()
+ {
+ if (chdir ("/") != 0)
+ exit (1);
+ else
+ {
+ char *f = getcwd (NULL, 0);
+ exit (! (f && f[0] == '/' && !f[1]));
+ }
+ }],
+ [gl_cv_func_getcwd_null=yes],
+ [gl_cv_func_getcwd_null=no],
+ [gl_cv_func_getcwd_null=no])])
+])
+
+AC_DEFUN([gl_FUNC_GETCWD],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_GETCWD_NULL])
+
+ gl_abort_bug=no
+ case $gl_cv_func_getcwd_null in
+ yes)
+ gl_FUNC_GETCWD_PATH_MAX
+ gl_FUNC_GETCWD_ABORT_BUG([gl_abort_bug=yes]);;
+ esac
+
+ case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_path_max,$gl_abort_bug in
+ yes,yes,no) ;;
+ *)
+ REPLACE_GETCWD=1
+ AC_LIBOBJ([getcwd])
+ gl_PREREQ_GETCWD;;
+ esac
+])
+
+# Prerequisites of lib/getcwd.c.
+AC_DEFUN([gl_PREREQ_GETCWD],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO])
+ :
+])
diff --git a/m4/getdate.m4 b/m4/getdate.m4
new file mode 100644
index 0000000..d160329
--- /dev/null
+++ b/m4/getdate.m4
@@ -0,0 +1,33 @@
+# getdate.m4 serial 12
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 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_C_COMPOUND_LITERALS],
+[
+ AC_CACHE_CHECK([for compound literals], gl_cv_compound_literals,
+ [AC_TRY_COMPILE([struct s { int i, j; }; struct s s = (struct s) { 1, 2 };],
+ [struct s t = (struct s) { 3, 4 };
+ if (t.i != 0) return 0;],
+ gl_cv_compound_literals=yes,
+ gl_cv_compound_literals=no)])
+ if test $gl_cv_compound_literals = yes; then
+ AC_DEFINE(HAVE_COMPOUND_LITERALS, 1,
+ [Define if you have compound literals.])
+ fi
+])
+
+AC_DEFUN([gl_GETDATE],
+[
+ dnl Prerequisites of lib/getdate.h.
+ AC_REQUIRE([AM_STDBOOL_H])
+ AC_REQUIRE([gl_TIMESPEC])
+
+ dnl Prerequisites of lib/getdate.y.
+ AC_REQUIRE([gl_BISON])
+ AC_REQUIRE([gl_C_COMPOUND_LITERALS])
+ AC_STRUCT_TIMEZONE
+ AC_REQUIRE([gl_CLOCK_TIME])
+ AC_REQUIRE([gl_TM_GMTOFF])
+])
diff --git a/m4/getdelim.m4 b/m4/getdelim.m4
new file mode 100644
index 0000000..2a738f6
--- /dev/null
+++ b/m4/getdelim.m4
@@ -0,0 +1,29 @@
+# getdelim.m4 serial 2
+
+dnl Copyright (C) 2005, 2006 Free Software dnl 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.52)
+
+AC_DEFUN([gl_FUNC_GETDELIM],
+[
+
+ dnl Persuade glibc <stdio.h> to declare getdelim().
+ AC_REQUIRE([AC_GNU_SOURCE])
+
+ AC_REPLACE_FUNCS(getdelim)
+ AC_CHECK_DECLS_ONCE(getdelim)
+
+ if test $ac_cv_func_getdelim = no; then
+ gl_PREREQ_GETDELIM
+ fi
+])
+
+# Prerequisites of lib/getdelim.c.
+AC_DEFUN([gl_PREREQ_GETDELIM],
+[
+ AC_CHECK_FUNCS([flockfile funlockfile])
+])
diff --git a/m4/getline.m4 b/m4/getline.m4
new file mode 100644
index 0000000..5b55c30
--- /dev/null
+++ b/m4/getline.m4
@@ -0,0 +1,79 @@
+# getline.m4 serial 15
+
+dnl Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006 Free Software
+dnl 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.52)
+
+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],
+[
+ dnl Persuade glibc <stdio.h> to declare getline().
+ AC_REQUIRE([AC_GNU_SOURCE])
+
+ AC_CHECK_DECLS([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 fooN |tr -d '\012'|tr N '\012' > conftest.data
+ AC_TRY_RUN([
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+ int main ()
+ { /* Based on a test program from Karl Heuer. */
+ char *line = NULL;
+ size_t siz = 0;
+ int len;
+ FILE *in = fopen ("./conftest.data", "r");
+ if (!in)
+ return 1;
+ len = getline (&line, &siz, in);
+ exit ((len == 4 && line && strcmp (line, "foo\n") == 0) ? 0 : 1);
+ }
+ ], am_cv_func_working_getline=yes dnl The library version works.
+ , am_cv_func_working_getline=no dnl The library version does NOT work.
+ , dnl We're cross compiling. Assume it works on glibc2 systems.
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ [am_cv_func_working_getline=yes],
+ [am_cv_func_working_getline=no])]
+ )])
+ fi
+
+ if test $am_cv_func_working_getline = no; then
+ dnl We must choose a different name for our function, since on ELF systems
+ dnl a broken getline() in libc.so would override our getline() in
+ dnl libgettextlib.so.
+ AC_DEFINE([getline], [gnu_getline],
+ [Define to a replacement function name for getline().])
+ AC_LIBOBJ(getline)
+
+ gl_PREREQ_GETLINE
+ fi
+])
+
+# Prerequisites of lib/getline.c.
+AC_DEFUN([gl_PREREQ_GETLINE],
+[
+ gl_FUNC_GETDELIM
+])
diff --git a/m4/getopt.m4 b/m4/getopt.m4
new file mode 100644
index 0000000..c0a73b2
--- /dev/null
+++ b/m4/getopt.m4
@@ -0,0 +1,83 @@
+# getopt.m4 serial 13
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 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.
+
+# The getopt module assume you want GNU getopt, with getopt_long etc,
+# rather than vanilla POSIX getopt. This means your code should
+# always include <getopt.h> for the getopt prototypes.
+
+AC_DEFUN([gl_GETOPT_SUBSTITUTE],
+[
+ AC_LIBOBJ([getopt])
+ AC_LIBOBJ([getopt1])
+ gl_GETOPT_SUBSTITUTE_HEADER
+ gl_PREREQ_GETOPT
+])
+
+AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER],
+[
+ GETOPT_H=getopt.h
+ AC_DEFINE([__GETOPT_PREFIX], [[rpl_]],
+ [Define to rpl_ if the getopt replacement functions and variables
+ should be used.])
+ AC_SUBST([GETOPT_H])
+])
+
+AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
+[
+ if test -z "$GETOPT_H"; then
+ AC_CHECK_HEADERS([getopt.h], [], [GETOPT_H=getopt.h])
+ fi
+
+ if test -z "$GETOPT_H"; then
+ AC_CHECK_FUNCS([getopt_long_only], [], [GETOPT_H=getopt.h])
+ fi
+
+ dnl BSD getopt_long uses an incompatible method to reset option processing,
+ dnl and (as of 2004-10-15) mishandles optional option-arguments.
+ if test -z "$GETOPT_H"; then
+ AC_CHECK_DECL([optreset], [GETOPT_H=getopt.h], [], [#include <getopt.h>])
+ fi
+
+ dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
+ dnl option string (as of 2005-05-05).
+ if test -z "$GETOPT_H"; then
+ AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_gnu_getopt],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([#include <getopt.h>],
+ [[
+ char *myargv[3];
+ myargv[0] = "conftest";
+ myargv[1] = "-+";
+ myargv[2] = 0;
+ return getopt (2, myargv, "+a") != '?';
+ ]])],
+ [gl_cv_func_gnu_getopt=yes],
+ [gl_cv_func_gnu_getopt=no],
+ [dnl cross compiling - pessimistically guess based on decls
+ dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
+ dnl option string (as of 2005-05-05).
+ AC_CHECK_DECL([getopt_clip],
+ [gl_cv_func_gnu_getopt=no], [gl_cv_func_gnu_getopt=yes],
+ [#include <getopt.h>])])])
+ if test "$gl_cv_func_gnu_getopt" = "no"; then
+ GETOPT_H=getopt.h
+ fi
+ fi
+])
+
+AC_DEFUN([gl_GETOPT_IFELSE],
+[
+ AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
+ AS_IF([test -n "$GETOPT_H"], [$1], [$2])
+])
+
+AC_DEFUN([gl_GETOPT], [gl_GETOPT_IFELSE([gl_GETOPT_SUBSTITUTE])])
+
+# Prerequisites of lib/getopt*.
+AC_DEFUN([gl_PREREQ_GETOPT],
+[
+ AC_CHECK_DECLS_ONCE([getenv])
+])
diff --git a/m4/getpagesize.m4 b/m4/getpagesize.m4
new file mode 100644
index 0000000..e8697bd
--- /dev/null
+++ b/m4/getpagesize.m4
@@ -0,0 +1,13 @@
+# getpagesize.m4 serial 6
+dnl Copyright (C) 2002, 2004, 2005 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_GETPAGESIZE],
+[
+ dnl Prerequisites of lib/getpagesize.h.
+ AC_CHECK_HEADERS_ONCE(sys/param.h)
+ AC_CHECK_HEADERS(OS.h)
+ AC_CHECK_FUNCS(getpagesize)
+])
diff --git a/m4/gettext.m4 b/m4/gettext.m4
new file mode 100644
index 0000000..4ffe433
--- /dev/null
+++ b/m4/gettext.m4
@@ -0,0 +1,420 @@
+# gettext.m4 serial 59 (gettext-0.16.1)
+dnl Copyright (C) 1995-2006 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.
+
+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([$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 MacOS 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_TRY_LINK([#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_TRY_LINK([#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_TRY_LINK([#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 Checks for special options needed on MacOS X.
+dnl Defines INTL_MACOSX_LIBS.
+AC_DEFUN([gt_INTL_MACOSX],
+[
+ dnl Check for API introduced in MacOS X 10.2.
+ AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
+ gt_cv_func_CFPreferencesCopyAppValue,
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_TRY_LINK([#include <CoreFoundation/CFPreferences.h>],
+ [CFPreferencesCopyAppValue(NULL, NULL)],
+ [gt_cv_func_CFPreferencesCopyAppValue=yes],
+ [gt_cv_func_CFPreferencesCopyAppValue=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+ AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1,
+ [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+ fi
+ dnl Check for API introduced in MacOS X 10.3.
+ AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent,
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_TRY_LINK([#include <CoreFoundation/CFLocale.h>], [CFLocaleCopyCurrent();],
+ [gt_cv_func_CFLocaleCopyCurrent=yes],
+ [gt_cv_func_CFLocaleCopyCurrent=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1,
+ [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
+ 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])
+])
+
+
+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], [])
+ AC_DEFUN([gl_LOCK_EARLY], [])
diff --git a/m4/gettime.m4 b/m4/gettime.m4
new file mode 100644
index 0000000..601a5e6
--- /dev/null
+++ b/m4/gettime.m4
@@ -0,0 +1,15 @@
+# gettime.m4 serial 6
+dnl Copyright (C) 2002, 2004, 2005, 2006 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],
+[
+ AC_LIBOBJ([gettime])
+
+ dnl Prerequisites of lib/gettime.c.
+ AC_REQUIRE([gl_CLOCK_TIME])
+ AC_REQUIRE([gl_TIMESPEC])
+ AC_CHECK_FUNCS_ONCE(gettimeofday nanotime)
+])
diff --git a/m4/gettimeofday.m4 b/m4/gettimeofday.m4
new file mode 100644
index 0000000..b9bbb10
--- /dev/null
+++ b/m4/gettimeofday.m4
@@ -0,0 +1,101 @@
+#serial 11
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2007 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([AC_C_RESTRICT])
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H])
+ AC_CHECK_FUNCS_ONCE([gettimeofday])
+
+ 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 (*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],
+ [gl_cv_func_gettimeofday_posix_signature=no])])
+
+ gl_FUNC_GETTIMEOFDAY_CLOBBER
+
+ if test $gl_cv_func_gettimeofday_posix_signature != yes; then
+ REPLACE_GETTIMEOFDAY=1
+ SYS_TIME_H=sys/time.h
+ if test $gl_cv_func_gettimeofday_clobber != yes; then
+ AC_LIBOBJ(gettimeofday)
+ gl_PREREQ_GETTIMEOFDAY
+ fi
+ fi
+])
+
+
+dnl See if gettimeofday clobbers the static buffer that localtime uses
+dnl for its return value. The gettimeofday function from Mac OS X 10.0.4
+dnl (i.e., Darwin 1.3.7) has this problem.
+dnl
+dnl If it does, then arrange to use gettimeofday and localtime only via
+dnl the wrapper functions that work around the problem.
+
+AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER],
+[
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H])
+
+ AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer],
+ [gl_cv_func_gettimeofday_clobber],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <string.h>
+ #include <sys/time.h>
+ #include <time.h>
+ #include <stdlib.h>
+ ]],
+ [[
+ time_t t = 0;
+ struct tm *lt;
+ struct tm saved_lt;
+ struct timeval tv;
+ lt = localtime (&t);
+ saved_lt = *lt;
+ gettimeofday (&tv, NULL);
+ return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0;
+ ]])],
+ [gl_cv_func_gettimeofday_clobber=no],
+ [gl_cv_func_gettimeofday_clobber=yes],
+ dnl When crosscompiling, assume it is broken.
+ [gl_cv_func_gettimeofday_clobber=yes])])
+
+ if test $gl_cv_func_gettimeofday_clobber = yes; then
+ REPLACE_GETTIMEOFDAY=1
+ SYS_TIME_H=sys/time.h
+ gl_GETTIMEOFDAY_REPLACE_LOCALTIME
+ AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], 1,
+ [Define if gettimeofday clobbers the localtime buffer.])
+ fi
+])
+
+AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [
+ AC_LIBOBJ(gettimeofday)
+ gl_PREREQ_GETTIMEOFDAY
+ AC_DEFINE([gmtime], [rpl_gmtime],
+ [Define to rpl_gmtime if the replacement function should be used.])
+ AC_DEFINE([localtime], [rpl_localtime],
+ [Define to rpl_localtime if the replacement function should be used.])
+])
+
+# Prerequisites of lib/gettimeofday.c.
+AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [
+ AC_CHECK_HEADERS([sys/timeb.h])
+ AC_CHECK_FUNCS([_ftime])
+])
diff --git a/m4/glibc21.m4 b/m4/glibc21.m4
new file mode 100644
index 0000000..d95fd98
--- /dev/null
+++ b/m4/glibc21.m4
@@ -0,0 +1,30 @@
+# glibc21.m4 serial 3
+dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([gl_GLIBC21],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+ ac_cv_gnu_library_2_1,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2_1=yes,
+ ac_cv_gnu_library_2_1=no)
+ ]
+ )
+ AC_SUBST(GLIBC21)
+ GLIBC21="$ac_cv_gnu_library_2_1"
+ ]
+)
diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4
new file mode 100644
index 0000000..5398010
--- /dev/null
+++ b/m4/gnulib-common.m4
@@ -0,0 +1,22 @@
+# gnulib-common.m4 serial 2
+dnl Copyright (C) 2007 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_MODULE_INDICATOR([modulename])
+# defines a C macro indicating the presence of the given module.
+AC_DEFUN([gl_MODULE_INDICATOR],
+[
+ AC_DEFINE([GNULIB_]translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1],
+ [Define to 1 when using the gnulib module ]$1[.])
+])
+
+# AC_PROG_MKDIR_P
+# is a backport of autoconf-2.60's AC_PROG_MKDIR_P.
+# Remove this macro when we can assume autoconf >= 2.60.
+m4_ifdef([AC_PROG_MKDIR_P], [], [
+ AC_DEFUN([AC_PROG_MKDIR_P],
+ [AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ MKDIR_P='$(mkdir_p)'
+ AC_SUBST([MKDIR_P])])])
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
new file mode 100644
index 0000000..0f2229b
--- /dev/null
+++ b/m4/gnulib-comp.m4
@@ -0,0 +1,613 @@
+# -*- buffer-read-only: t -*- vi: set ro:
+# DO NOT EDIT! GENERATED AUTOMATICALLY!
+# DO NOT EDIT! GENERATED AUTOMATICALLY!
+# Copyright (C) 2004-2007 Free Software Foundation, Inc.
+#
+# This file is free software, distributed under the terms of the GNU
+# General Public License. As a special exception to the GNU General
+# Public License, this file may be distributed as part of a program
+# that contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# 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 using CVS, 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
+ AC_REQUIRE([AC_PROG_RANLIB])
+ AC_REQUIRE([AC_GNU_SOURCE])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl Some compilers (e.g., AIX 5.3 cc) need to be in c99 mode
+ dnl for the builtin va_copy to work. With Autoconf 2.60 or later,
+ dnl AC_PROG_CC_STDC arranges for this. With older Autoconf AC_PROG_CC_STDC
+ dnl shouldn't hurt, though installers are on their own to set c99 mode.
+ AC_REQUIRE([AC_PROG_CC_STDC])
+])
+
+# This macro should be invoked from ./configure.ac, in the section
+# "Check for header files, types and library functions".
+AC_DEFUN([gl_INIT],
+[
+ 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]))
+ AM_CONDITIONAL([GL_COND_LIBTOOL], [false])
+ gl_cond_libtool=false
+ gl_libdeps=
+ gl_ltlibdeps=
+ gl_source_base='.#bootmp/lib'
+ gl_FUNC_ALLOCA
+ gl_ALLOCSA
+ gl_ARGMATCH
+ gl_ARGP
+ gl_BACKUPFILE
+ gl_CANONICALIZE_LGPL
+ gl_FUNC_CHDIR_LONG
+ gl_FUNC_CHOWN
+ gl_UNISTD_MODULE_INDICATOR([chown])
+ gl_CLOCK_TIME
+ gl_CLOSE_STREAM
+ gl_MODULE_INDICATOR([close-stream])
+ gl_CLOSEOUT
+ gl_CHECK_TYPE_STRUCT_DIRENT_D_INO
+ gl_FUNC_DIRFD
+ gl_DIRNAME
+ gl_DOUBLE_SLASH_ROOT
+ gl_FUNC_DUP2
+ gl_UNISTD_MODULE_INDICATOR([dup2])
+ gl_ERROR
+ gl_EXCLUDE
+ gl_EXITFAIL
+ gl_FUNC_FCHDIR
+ gl_UNISTD_MODULE_INDICATOR([fchdir])
+ gl_FCNTL_H
+ gl_FCNTL_SAFER
+ gl_MODULE_INDICATOR([fcntl-safer])
+ gl_FILEBLOCKS
+ gl_FLOAT_H
+ # No macro. You should also use one of fnmatch-posix or fnmatch-gnu.
+ gl_FUNC_FNMATCH_GNU
+ gl_FUNC_FPENDING
+ gl_FUNC_FTRUNCATE
+ gl_UNISTD_MODULE_INDICATOR([ftruncate])
+ gl_FUNC_GETCWD
+ gl_UNISTD_MODULE_INDICATOR([getcwd])
+ gl_GETDATE
+ gl_FUNC_GETDELIM
+ gl_FUNC_GETLINE
+ gl_GETOPT
+ gl_GETPAGESIZE
+ dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac.
+ AM_GNU_GETTEXT_VERSION([0.16.1])
+ AC_SUBST([LIBINTL])
+ AC_SUBST([LTLIBINTL])
+ gl_GETTIME
+ gl_FUNC_GETTIMEOFDAY
+ gl_HASH
+ gl_HUMAN
+ gl_INLINE
+ gl_INTTOSTR
+ gl_INTTYPES_H
+ gl_FUNC_LCHOWN
+ gl_LOCALCHARSET
+ gl_FUNC_LSTAT
+ AC_FUNC_MALLOC
+ gl_MBCHAR
+ gl_FUNC_MBSCASECMP
+ gl_STRING_MODULE_INDICATOR([mbscasecmp])
+ gl_MBITER
+ gl_FUNC_MEMCHR
+ gl_FUNC_MEMPCPY
+ gl_STRING_MODULE_INDICATOR([mempcpy])
+ gl_FUNC_MEMRCHR
+ gl_STRING_MODULE_INDICATOR([memrchr])
+ gl_FUNC_MEMSET
+ gt_FUNC_MKDTEMP
+ gl_STDLIB_MODULE_INDICATOR([mkdtemp])
+ gl_FUNC_MKTIME
+ gl_MODECHANGE
+ AC_FUNC_OBSTACK
+ dnl Note: AC_FUNC_OBSTACK does AC_LIBSOURCES([obstack.h, obstack.c]).
+ gl_FUNC_OPENAT
+ gl_PATHMAX
+ gl_QUOTE
+ gl_QUOTEARG
+ gl_FUNC_READLINK
+ gl_UNISTD_MODULE_INDICATOR([readlink])
+ gl_REGEX
+ gl_FUNC_RMDIR
+ gl_FUNC_RPMATCH
+ gl_SAFE_READ
+ gl_SAFE_WRITE
+ gl_SAVE_CWD
+ gl_SAVEDIR
+ gl_FUNC_SETENV
+ gl_FUNC_UNSETENV
+ gl_FUNC_SLEEP
+ gl_UNISTD_MODULE_INDICATOR([sleep])
+ gt_TYPE_SSIZE_T
+ gl_STAT_TIME
+ gl_STAT_BIRTHTIME
+ gl_STDARG_H
+ AM_STDBOOL_H
+ gl_STDINT_H
+ gl_STDIO_H
+ gl_STDLIB_H
+ gl_FUNC_STPCPY
+ gl_STRING_MODULE_INDICATOR([stpcpy])
+ gl_STRCASE
+ gl_FUNC_STRCHRNUL
+ gl_STRING_MODULE_INDICATOR([strchrnul])
+ gl_FUNC_STRDUP
+ gl_STRING_MODULE_INDICATOR([strdup])
+ gl_FUNC_STRERROR
+ gl_HEADER_STRING_H
+ gl_FUNC_STRNDUP
+ gl_STRING_MODULE_INDICATOR([strndup])
+ gl_FUNC_STRNLEN
+ gl_STRING_MODULE_INDICATOR([strnlen])
+ gl_FUNC_STRTOIMAX
+ gl_INTTYPES_MODULE_INDICATOR([strtoimax])
+ gl_FUNC_STRTOL
+ gl_FUNC_STRTOLL
+ gl_FUNC_STRTOUL
+ gl_FUNC_STRTOULL
+ gl_FUNC_STRTOUMAX
+ gl_INTTYPES_MODULE_INDICATOR([strtoumax])
+ gl_HEADER_SYS_STAT_H
+ AC_PROG_MKDIR_P
+ gl_HEADER_SYS_TIME_H
+ AC_PROG_MKDIR_P
+ gl_SYSEXITS
+ gl_FUNC_GEN_TEMPNAME
+ gl_HEADER_TIME_H
+ gl_TIME_R
+ gl_TIMESPEC
+ gl_UNISTD_H
+ gl_UNISTD_SAFER
+ gl_UNLINKDIR
+ gl_FUNC_GLIBC_UNLOCKED_IO
+ gl_FUNC_UTIME
+ gl_UTIMENS
+ gl_FUNC_VASNPRINTF
+ gl_FUNC_VSNPRINTF
+ gl_STDIO_MODULE_INDICATOR([vsnprintf])
+ gl_WCHAR_H
+ gl_WCTYPE_H
+ gl_FUNC_WCWIDTH
+ gl_XALLOC
+ gl_XGETCWD
+ gl_XSTRNDUP
+ gl_XSTRTOL
+ LIBTAR_LIBDEPS="$gl_libdeps"
+ AC_SUBST([LIBTAR_LIBDEPS])
+ LIBTAR_LTLIBDEPS="$gl_ltlibdeps"
+ AC_SUBST([LIBTAR_LTLIBDEPS])
+ 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 "$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])
+ ])
+])
+
+# Like AC_LIBOBJ, except that the module name goes
+# into gl_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gl_LIBOBJ],
+ [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],
+ [AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)])])
+
+# Like AC_LIBSOURCES, except that it does nothing.
+# We rely on EXTRA_lib..._SOURCES instead.
+AC_DEFUN([gl_LIBSOURCES],
+ [])
+
+# 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/config.rpath
+ build-aux/link-warning.h
+ doc/getdate.texi
+ lib/__fpending.c
+ lib/__fpending.h
+ lib/alloca.c
+ lib/alloca_.h
+ lib/allocsa.c
+ lib/allocsa.h
+ lib/allocsa.valgrind
+ lib/argmatch.c
+ lib/argmatch.h
+ lib/argp-ba.c
+ lib/argp-eexst.c
+ lib/argp-fmtstream.c
+ lib/argp-fmtstream.h
+ lib/argp-fs-xinl.c
+ lib/argp-help.c
+ lib/argp-namefrob.h
+ lib/argp-parse.c
+ lib/argp-pin.c
+ lib/argp-pv.c
+ lib/argp-pvh.c
+ lib/argp-xinl.c
+ lib/argp.h
+ lib/asnprintf.c
+ lib/at-func.c
+ lib/backupfile.c
+ lib/backupfile.h
+ lib/basename.c
+ lib/canonicalize-lgpl.c
+ lib/canonicalize.h
+ lib/chdir-long.c
+ lib/chdir-long.h
+ lib/chown.c
+ lib/close-stream.c
+ lib/close-stream.h
+ lib/closeout.c
+ lib/closeout.h
+ lib/config.charset
+ lib/creat-safer.c
+ lib/dirent_.h
+ lib/dirfd.c
+ lib/dirfd.h
+ lib/dirname.c
+ lib/dirname.h
+ lib/dup-safer.c
+ lib/dup2.c
+ lib/error.c
+ lib/error.h
+ lib/exclude.c
+ lib/exclude.h
+ lib/exitfail.c
+ lib/exitfail.h
+ lib/fchdir.c
+ lib/fchmodat.c
+ lib/fchown-stub.c
+ lib/fchownat.c
+ lib/fcntl--.h
+ lib/fcntl-safer.h
+ lib/fcntl_.h
+ lib/fd-safer.c
+ lib/fileblocks.c
+ lib/float+.h
+ lib/float_.h
+ lib/fnmatch.c
+ lib/fnmatch_.h
+ lib/fnmatch_loop.c
+ lib/fstatat.c
+ lib/ftruncate.c
+ lib/full-write.c
+ lib/full-write.h
+ lib/getcwd.c
+ lib/getdate.h
+ lib/getdate.y
+ lib/getdelim.c
+ lib/getdelim.h
+ lib/getline.c
+ lib/getline.h
+ lib/getopt.c
+ lib/getopt1.c
+ lib/getopt_.h
+ lib/getopt_int.h
+ lib/getpagesize.h
+ lib/gettext.h
+ lib/gettime.c
+ lib/gettimeofday.c
+ lib/hash.c
+ lib/hash.h
+ lib/human.c
+ lib/human.h
+ lib/imaxtostr.c
+ lib/intprops.h
+ lib/inttostr.c
+ lib/inttostr.h
+ lib/inttypes_.h
+ lib/lchown.c
+ lib/lchown.h
+ lib/localcharset.c
+ lib/localcharset.h
+ lib/lstat.c
+ lib/lstat.h
+ lib/malloc.c
+ lib/mbchar.c
+ lib/mbchar.h
+ lib/mbscasecmp.c
+ lib/mbuiter.h
+ lib/memchr.c
+ lib/mempcpy.c
+ lib/memrchr.c
+ lib/memset.c
+ lib/mkdirat.c
+ lib/mkdtemp.c
+ lib/mktime.c
+ lib/modechange.c
+ lib/modechange.h
+ lib/obstack.c
+ lib/obstack.h
+ lib/offtostr.c
+ lib/open-safer.c
+ lib/openat-die.c
+ lib/openat-priv.h
+ lib/openat-proc.c
+ lib/openat.c
+ lib/openat.h
+ lib/pathmax.h
+ lib/pipe-safer.c
+ lib/printf-args.c
+ lib/printf-args.h
+ lib/printf-parse.c
+ lib/printf-parse.h
+ lib/quote.c
+ lib/quote.h
+ lib/quotearg.c
+ lib/quotearg.h
+ lib/readlink.c
+ lib/ref-add.sin
+ lib/ref-del.sin
+ lib/regcomp.c
+ lib/regex.c
+ lib/regex.h
+ lib/regex_internal.c
+ lib/regex_internal.h
+ lib/regexec.c
+ lib/rmdir.c
+ lib/rpmatch.c
+ lib/safe-read.c
+ lib/safe-read.h
+ lib/safe-write.c
+ lib/safe-write.h
+ lib/same-inode.h
+ lib/save-cwd.c
+ lib/save-cwd.h
+ lib/savedir.c
+ lib/savedir.h
+ lib/setenv.c
+ lib/setenv.h
+ lib/sleep.c
+ lib/stat-macros.h
+ lib/stat-time.h
+ lib/stdbool_.h
+ lib/stdint_.h
+ lib/stdio_.h
+ lib/stdlib_.h
+ lib/stpcpy.c
+ lib/strcasecmp.c
+ lib/strchrnul.c
+ lib/strdup.c
+ lib/strerror.c
+ lib/string_.h
+ lib/stripslash.c
+ lib/strncasecmp.c
+ lib/strndup.c
+ lib/strnlen.c
+ lib/strnlen1.c
+ lib/strnlen1.h
+ lib/strtoimax.c
+ lib/strtol.c
+ lib/strtoll.c
+ lib/strtoul.c
+ lib/strtoull.c
+ lib/strtoumax.c
+ lib/sys_stat_.h
+ lib/sys_time_.h
+ lib/sysexits_.h
+ lib/tempname.c
+ lib/tempname.h
+ lib/time_.h
+ lib/time_r.c
+ lib/timespec.h
+ lib/uinttostr.c
+ lib/umaxtostr.c
+ lib/unistd--.h
+ lib/unistd-safer.h
+ lib/unistd_.h
+ lib/unlinkdir.c
+ lib/unlinkdir.h
+ lib/unlocked-io.h
+ lib/unsetenv.c
+ lib/utime.c
+ lib/utimens.c
+ lib/utimens.h
+ lib/vasnprintf.c
+ lib/vasnprintf.h
+ lib/verify.h
+ lib/version-etc-fsf.c
+ lib/version-etc.c
+ lib/version-etc.h
+ lib/vsnprintf.c
+ lib/wchar_.h
+ lib/wctype_.h
+ lib/wcwidth.h
+ lib/xalloc-die.c
+ lib/xalloc.h
+ lib/xgetcwd.c
+ lib/xgetcwd.h
+ lib/xmalloc.c
+ lib/xstrndup.c
+ lib/xstrndup.h
+ lib/xstrtol.c
+ lib/xstrtol.h
+ lib/xstrtoul.c
+ lib/xstrtoumax.c
+ m4/absolute-header.m4
+ m4/alloca.m4
+ m4/allocsa.m4
+ m4/argmatch.m4
+ m4/argp.m4
+ m4/backupfile.m4
+ m4/bison.m4
+ m4/canonicalize-lgpl.m4
+ m4/chdir-long.m4
+ m4/chown.m4
+ m4/clock_time.m4
+ m4/close-stream.m4
+ m4/closeout.m4
+ m4/codeset.m4
+ m4/d-ino.m4
+ m4/dirfd.m4
+ m4/dirname.m4
+ m4/dos.m4
+ m4/double-slash-root.m4
+ m4/dup2.m4
+ m4/eealloc.m4
+ m4/eoverflow.m4
+ m4/error.m4
+ m4/exclude.m4
+ m4/exitfail.m4
+ m4/extensions.m4
+ m4/fchdir.m4
+ m4/fcntl-safer.m4
+ m4/fcntl_h.m4
+ m4/fileblocks.m4
+ m4/float_h.m4
+ m4/fnmatch.m4
+ m4/fpending.m4
+ m4/ftruncate.m4
+ m4/getcwd-abort-bug.m4
+ m4/getcwd-path-max.m4
+ m4/getcwd.m4
+ m4/getdate.m4
+ m4/getdelim.m4
+ m4/getline.m4
+ m4/getopt.m4
+ m4/getpagesize.m4
+ m4/gettext.m4
+ m4/gettime.m4
+ m4/gettimeofday.m4
+ m4/glibc2.m4
+ m4/glibc21.m4
+ m4/gnulib-common.m4
+ m4/hash.m4
+ m4/human.m4
+ m4/iconv.m4
+ m4/inline.m4
+ m4/intdiv0.m4
+ m4/intl.m4
+ m4/intldir.m4
+ m4/intmax.m4
+ m4/intmax_t.m4
+ m4/inttostr.m4
+ m4/inttypes-pri.m4
+ m4/inttypes.m4
+ m4/inttypes_h.m4
+ m4/lchown.m4
+ m4/lcmessage.m4
+ m4/lib-ld.m4
+ m4/lib-link.m4
+ m4/lib-prefix.m4
+ m4/localcharset.m4
+ m4/lock.m4
+ m4/longlong.m4
+ m4/lstat.m4
+ m4/mbchar.m4
+ m4/mbiter.m4
+ m4/mbrtowc.m4
+ m4/mbscasecmp.m4
+ m4/mbstate_t.m4
+ m4/memchr.m4
+ m4/mempcpy.m4
+ m4/memrchr.m4
+ m4/memset.m4
+ m4/mkdtemp.m4
+ m4/mktime.m4
+ m4/modechange.m4
+ m4/nls.m4
+ m4/openat.m4
+ m4/pathmax.m4
+ m4/po.m4
+ m4/printf-posix.m4
+ m4/progtest.m4
+ m4/quote.m4
+ m4/quotearg.m4
+ m4/readlink.m4
+ m4/regex.m4
+ m4/rmdir.m4
+ m4/rpmatch.m4
+ m4/safe-read.m4
+ m4/safe-write.m4
+ m4/save-cwd.m4
+ m4/savedir.m4
+ m4/setenv.m4
+ m4/size_max.m4
+ m4/sleep.m4
+ m4/ssize_t.m4
+ m4/stat-time.m4
+ m4/stdarg.m4
+ m4/stdbool.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/string_h.m4
+ m4/strndup.m4
+ m4/strnlen.m4
+ m4/strtoimax.m4
+ m4/strtol.m4
+ m4/strtoll.m4
+ m4/strtoul.m4
+ m4/strtoull.m4
+ m4/strtoumax.m4
+ m4/sys_stat_h.m4
+ m4/sys_time_h.m4
+ m4/sysexits.m4
+ m4/tempname.m4
+ m4/time_h.m4
+ m4/time_r.m4
+ m4/timespec.m4
+ m4/tm_gmtoff.m4
+ m4/uintmax_t.m4
+ m4/ulonglong.m4
+ m4/unistd-safer.m4
+ m4/unistd_h.m4
+ m4/unlinkdir.m4
+ m4/unlocked-io.m4
+ m4/utimbuf.m4
+ m4/utime.m4
+ m4/utimens.m4
+ m4/utimes-null.m4
+ m4/utimes.m4
+ m4/vasnprintf.m4
+ m4/visibility.m4
+ m4/vsnprintf.m4
+ m4/wchar.m4
+ m4/wchar_t.m4
+ m4/wctype.m4
+ m4/wcwidth.m4
+ m4/wint_t.m4
+ m4/xalloc.m4
+ m4/xgetcwd.m4
+ m4/xsize.m4
+ m4/xstrndup.m4
+ m4/xstrtol.m4
+])
diff --git a/m4/hash.m4 b/m4/hash.m4
new file mode 100644
index 0000000..1b1873c
--- /dev/null
+++ b/m4/hash.m4
@@ -0,0 +1,13 @@
+# hash.m4 serial 6
+dnl Copyright (C) 2002, 2003, 2005, 2006 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_HASH],
+[
+ AC_LIBOBJ([hash])
+
+ dnl Prerequisites of lib/hash.c.
+ AC_REQUIRE([AM_STDBOOL_H])
+])
diff --git a/m4/human.m4 b/m4/human.m4
new file mode 100644
index 0000000..72f2176
--- /dev/null
+++ b/m4/human.m4
@@ -0,0 +1,13 @@
+#serial 10
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 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_HUMAN],
+[
+ AC_LIBOBJ([human])
+
+ dnl Prerequisites of lib/human.c.
+ :
+])
diff --git a/m4/iconv.m4 b/m4/iconv.m4
new file mode 100644
index 0000000..8e36b52
--- /dev/null
+++ b/m4/iconv.m4
@@ -0,0 +1,180 @@
+# iconv.m4 serial AM6 (gettext-0.16.2)
+dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_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_TRY_LINK will then fail, the second AC_TRY_LINK 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_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_func_iconv=yes)
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes)
+ LIBS="$am_save_LIBS"
+ fi
+ ])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [
+ dnl This tests against bugs in AIX 5.1 and HP-UX 11.11.
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ AC_TRY_RUN([
+#include <iconv.h>
+#include <string.h>
+int main ()
+{
+ /* 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 const char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ return 1;
+ }
+ }
+#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 const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ 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,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ return 1;
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ if (/* Try standardized names. */
+ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+ /* Try IRIX, OSF/1 names. */
+ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+ /* Try AIX names. */
+ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+ /* Try HP-UX names. */
+ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+ return 1;
+ return 0;
+}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no],
+ [case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac])
+ 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)
+])
+
+AC_DEFUN([AM_ICONV],
+[
+ AM_ICONV_LINK
+ if test "$am_cv_func_iconv" = yes; then
+ AC_MSG_CHECKING([for iconv declaration])
+ AC_CACHE_VAL(am_cv_proto_iconv, [
+ AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+ am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ AC_MSG_RESULT([$]{ac_t:-
+ }[$]am_cv_proto_iconv)
+ AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+ [Define as const if the declaration of iconv() needs const.])
+ fi
+])
diff --git a/m4/inline.m4 b/m4/inline.m4
new file mode 100644
index 0000000..a07076c
--- /dev/null
+++ b/m4/inline.m4
@@ -0,0 +1,40 @@
+# inline.m4 serial 3
+dnl Copyright (C) 2006 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/intmax_t.m4 b/m4/intmax_t.m4
new file mode 100644
index 0000000..17c7b0a
--- /dev/null
+++ b/m4/intmax_t.m4
@@ -0,0 +1,61 @@
+# intmax_t.m4 serial 5
+dnl Copyright (C) 1997-2004, 2006 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_PREREQ(2.13)
+
+# 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_REQUIRE([gl_AC_TYPE_LONG_LONG])
+ test $ac_cv_type_long_long = yes \
+ && ac_type='long long' \
+ || ac_type='long'
+ AC_DEFINE_UNQUOTED(intmax_t, $ac_type,
+ [Define to long or long long if <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_TRY_COMPILE([
+#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_REQUIRE([gl_AC_TYPE_LONG_LONG])
+ test $ac_cv_type_long_long = yes \
+ && ac_type='long long' \
+ || ac_type='long'
+ AC_DEFINE_UNQUOTED(intmax_t, $ac_type,
+ [Define to long or long long if <stdint.h> and <inttypes.h> don't define.])
+ fi
+])
diff --git a/m4/inttostr.m4 b/m4/inttostr.m4
new file mode 100644
index 0000000..0a41fad
--- /dev/null
+++ b/m4/inttostr.m4
@@ -0,0 +1,37 @@
+#serial 7
+dnl Copyright (C) 2004, 2005, 2006 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_INTTOSTR],
+[
+ AC_LIBOBJ([imaxtostr])
+ AC_LIBOBJ([offtostr])
+ AC_LIBOBJ([umaxtostr])
+ AC_LIBOBJ([uinttostr])
+
+ gl_PREREQ_INTTOSTR
+ gl_PREREQ_IMAXTOSTR
+ gl_PREREQ_OFFTOSTR
+ gl_PREREQ_UMAXTOSTR
+ gl_PREREQ_UINTTOSTR
+])
+
+# Prerequisites of lib/inttostr.h.
+AC_DEFUN([gl_PREREQ_INTTOSTR], [
+ AC_REQUIRE([AC_TYPE_OFF_T])
+ :
+])
+
+# Prerequisites of lib/imaxtostr.c.
+AC_DEFUN([gl_PREREQ_IMAXTOSTR], [:])
+
+# Prerequisites of lib/offtostr.c.
+AC_DEFUN([gl_PREREQ_OFFTOSTR], [:])
+
+# Prerequisites of lib/umaxtostr.c.
+AC_DEFUN([gl_PREREQ_UMAXTOSTR], [:])
+
+# Prerequisites of lib/uinttostr.c.
+AC_DEFUN([gl_PREREQ_UINTTOSTR], [:])
diff --git a/m4/inttypes-pri.m4 b/m4/inttypes-pri.m4
new file mode 100644
index 0000000..7c7f894
--- /dev/null
+++ b/m4/inttypes-pri.m4
@@ -0,0 +1,36 @@
+# inttypes-pri.m4 serial 4 (gettext-0.16)
+dnl Copyright (C) 1997-2002, 2006 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.52)
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values. This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+ AC_CHECK_HEADERS([inttypes.h])
+ if test $ac_cv_header_inttypes_h = yes; then
+ AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+ gt_cv_inttypes_pri_broken,
+ [
+ AC_TRY_COMPILE([#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes)
+ ])
+ fi
+ if test "$gt_cv_inttypes_pri_broken" = yes; then
+ AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1,
+ [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+ PRI_MACROS_BROKEN=1
+ else
+ PRI_MACROS_BROKEN=0
+ fi
+ AC_SUBST([PRI_MACROS_BROKEN])
+])
diff --git a/m4/inttypes.m4 b/m4/inttypes.m4
new file mode 100644
index 0000000..095ace9
--- /dev/null
+++ b/m4/inttypes.m4
@@ -0,0 +1,223 @@
+# inttypes.m4 serial 8
+dnl Copyright (C) 2006-2007 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_STDINT_H])
+ AC_REQUIRE([gt_INTTYPES_PRI])
+ AC_CHECK_DECLS_ONCE([imaxabs])
+ AC_CHECK_DECLS_ONCE([imaxdiv])
+ AC_CHECK_DECLS_ONCE([strtoimax])
+ AC_CHECK_DECLS_ONCE([strtoumax])
+
+ dnl Now see if we need a substitute <inttypes.h>.
+ dnl A complete <inttypes.h> requires
+ dnl - a complete <stdint.h>,
+ dnl - the existence of an <inttypes.h>,
+ dnl - that imaxabs, imaxdiv, strtoimax, strtoumax are declared,
+ dnl - some additional tests.
+ AC_CACHE_CHECK([whether inttypes.h conforms to C99],
+ [gl_cv_header_working_inttypes_h],
+ [gl_cv_header_working_inttypes_h=no
+ if test "$gl_cv_header_working_stdint_h" = yes \
+ && test $ac_cv_header_inttypes_h = yes \
+ && test "$ac_cv_have_decl_imaxabs" = yes \
+ && test "$ac_cv_have_decl_imaxdiv" = yes \
+ && test "$ac_cv_have_decl_strtoimax" = yes \
+ && test "$ac_cv_have_decl_strtoumax" = yes; then
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([
+#include <stddef.h>
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_FORMAT_MACROS 1 /* to make it work also in C++ mode */
+#include ABSOLUTE_INTTYPES_H
+
+/* No need to duplicate the tests of stdint.m4; they are subsumed by
+ $gl_cv_header_working_stdint_h = yes. */
+
+/* Tests for macros supposed to be defined in inttypes.h. */
+
+const char *k = /* implicit string concatenation */
+#ifdef INT8_MAX
+ PRId8 PRIi8
+#endif
+#ifdef UINT8_MAX
+ PRIo8 PRIu8 PRIx8 PRIX8
+#endif
+#ifdef INT16_MAX
+ PRId16 PRIi16
+#endif
+#ifdef UINT16_MAX
+ PRIo16 PRIu16 PRIx16 PRIX16
+#endif
+#ifdef INT32_MAX
+ PRId32 PRIi32
+#endif
+#ifdef UINT32_MAX
+ PRIo32 PRIu32 PRIx32 PRIX32
+#endif
+#ifdef INT64_MAX
+ PRId64 PRIi64
+#endif
+#ifdef UINT64_MAX
+ PRIo64 PRIu64 PRIx64 PRIX64
+#endif
+ PRIdLEAST8 PRIiLEAST8 PRIoLEAST8 PRIuLEAST8 PRIxLEAST8 PRIXLEAST8
+ PRIdLEAST16 PRIiLEAST16 PRIoLEAST16 PRIuLEAST16 PRIxLEAST16 PRIXLEAST16
+ PRIdLEAST32 PRIiLEAST32 PRIoLEAST32 PRIuLEAST32 PRIxLEAST32 PRIXLEAST32
+ PRIdLEAST64 PRIiLEAST64
+ PRIoLEAST64 PRIuLEAST64 PRIxLEAST64 PRIXLEAST64
+ PRIdFAST8 PRIiFAST8 PRIoFAST8 PRIuFAST8 PRIxFAST8 PRIXFAST8
+ PRIdFAST16 PRIiFAST16 PRIoFAST16 PRIuFAST16 PRIxFAST16 PRIXFAST16
+ PRIdFAST32 PRIiFAST32 PRIoFAST32 PRIuFAST32 PRIxFAST32 PRIXFAST32
+ PRIdFAST64 PRIiFAST64
+ PRIoFAST64 PRIuFAST64 PRIxFAST64 PRIXFAST64
+ PRIdMAX PRIiMAX PRIoMAX PRIuMAX PRIxMAX PRIXMAX
+#ifdef INTPTR_MAX
+ PRIdPTR PRIiPTR
+#endif
+#ifdef UINTPTR_MAX
+ PRIoPTR PRIuPTR PRIxPTR PRIXPTR
+#endif
+ ;
+const char *l = /* implicit string concatenation */
+#ifdef INT8_MAX
+ SCNd8 SCNi8
+#endif
+#ifdef UINT8_MAX
+ SCNo8 SCNu8 SCNx8
+#endif
+#ifdef INT16_MAX
+ SCNd16 SCNi16
+#endif
+#ifdef UINT16_MAX
+ SCNo16 SCNu16 SCNx16
+#endif
+#ifdef INT32_MAX
+ SCNd32 SCNi32
+#endif
+#ifdef UINT32_MAX
+ SCNo32 SCNu32 SCNx32
+#endif
+#ifdef INT64_MAX
+ SCNd64 SCNi64
+#endif
+#ifdef UINT64_MAX
+ SCNo64 SCNu64 SCNx64
+#endif
+ SCNdLEAST8 SCNiLEAST8 SCNoLEAST8 SCNuLEAST8 SCNxLEAST8
+ SCNdLEAST16 SCNiLEAST16 SCNoLEAST16 SCNuLEAST16 SCNxLEAST16
+ SCNdLEAST32 SCNiLEAST32 SCNoLEAST32 SCNuLEAST32 SCNxLEAST32
+ SCNdLEAST64 SCNiLEAST64
+ SCNoLEAST64 SCNuLEAST64 SCNxLEAST64
+ SCNdFAST8 SCNiFAST8 SCNoFAST8 SCNuFAST8 SCNxFAST8
+ SCNdFAST16 SCNiFAST16 SCNoFAST16 SCNuFAST16 SCNxFAST16
+ SCNdFAST32 SCNiFAST32 SCNoFAST32 SCNuFAST32 SCNxFAST32
+ SCNdFAST64 SCNiFAST64
+ SCNoFAST64 SCNuFAST64 SCNxFAST64
+ SCNdMAX SCNiMAX SCNoMAX SCNuMAX SCNxMAX
+#ifdef INTPTR_MAX
+ SCNdPTR SCNiPTR
+#endif
+#ifdef UINTPTR_MAX
+ SCNoPTR SCNuPTR SCNxPTR
+#endif
+ ;
+ ])],
+ [gl_cv_header_working_inttypes_h=yes])
+ fi])
+
+ dnl Override <inttypes.h> always, so that the portability warnings work.
+ if false && test $gl_cv_header_working_inttypes_h = yes; then
+ dnl Use the existing <inttypes.h>.
+ INTTYPES_H=''
+ else
+
+ AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
+ dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h.
+ if test $ac_cv_header_inttypes_h = yes; then
+ gl_ABSOLUTE_HEADER([inttypes.h])
+ ABSOLUTE_INTTYPES_H=\"$gl_cv_absolute_inttypes_h\"
+ else
+ ABSOLUTE_INTTYPES_H=\"no/such/file/inttypes.h\"
+ fi
+ AC_SUBST([ABSOLUTE_INTTYPES_H])
+
+ PRIPTR_PREFIX=
+ if test -n "$STDINT_H"; then
+ dnl Using the gnulib <stdint.h>. It always defines intptr_t to 'long'.
+ PRIPTR_PREFIX='"l"'
+ 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])
+
+ if test "$ac_cv_have_decl_imaxabs" = yes; then
+ HAVE_DECL_IMAXABS=1
+ else
+ HAVE_DECL_IMAXABS=0
+ fi
+
+ if test "$ac_cv_have_decl_imaxdiv" = yes; then
+ HAVE_DECL_IMAXDIV=1
+ else
+ HAVE_DECL_IMAXDIV=0
+ fi
+
+ if test "$ac_cv_have_decl_strtoimax" = yes; then
+ HAVE_DECL_STRTOIMAX=1
+ else
+ HAVE_DECL_STRTOIMAX=0
+ fi
+
+ if test "$ac_cv_have_decl_strtoumax" = yes; then
+ HAVE_DECL_STRTOUMAX=1
+ else
+ HAVE_DECL_STRTOUMAX=0
+ fi
+
+ INTTYPES_H='inttypes.h'
+ fi
+ AC_SUBST(INTTYPES_H)
+])
+
+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])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=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])
+])
diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4
new file mode 100644
index 0000000..edc8ecb
--- /dev/null
+++ b/m4/inttypes_h.m4
@@ -0,0 +1,26 @@
+# inttypes_h.m4 serial 7
+dnl Copyright (C) 1997-2004, 2006 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_TRY_COMPILE(
+ [#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/lchown.m4 b/m4/lchown.m4
new file mode 100644
index 0000000..a7b3572
--- /dev/null
+++ b/m4/lchown.m4
@@ -0,0 +1,19 @@
+#serial 11
+
+dnl Copyright (C) 1998, 2001, 2003, 2004, 2005, 2006 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 Jim Meyering.
+dnl Provide lchown on systems that lack it.
+
+AC_DEFUN([gl_FUNC_LCHOWN],
+[
+ AC_REQUIRE([AC_TYPE_UID_T])
+ AC_REQUIRE([gl_FUNC_CHOWN])
+ AC_CHECK_DECLS_ONCE([lchown])
+ AC_REPLACE_FUNCS(lchown)
+])
diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4
new file mode 100644
index 0000000..96c4e2c
--- /dev/null
+++ b/m4/lib-ld.m4
@@ -0,0 +1,110 @@
+# lib-ld.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+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-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]* | [A-Za-z]:[\\/]*)]
+ [re_direlt='/[^/][^/]*/\.\./']
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # 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="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
new file mode 100644
index 0000000..f157d98
--- /dev/null
+++ b/m4/lib-link.m4
@@ -0,0 +1,709 @@
+# lib-link.m4 serial 13 (gettext-0.16.2)
+dnl Copyright (C) 2001-2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ(2.54)
+
+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])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[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
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #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])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[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"
+ LIBS="$LIBS $LIB[]NAME"
+ AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+ LIBS="$ac_save_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+ AC_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])
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl acl_libext,
+dnl acl_shlibext,
+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 Tell automake >= 1.10 to complain if config.rpath is missing.
+ m4_ifdef([AC_REQUIRE_AUX_FILE], [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_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])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ dnl Autoconf >= 2.61 supports dots in --with options.
+ define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix],
+[ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
+ --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir],
+[
+ 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
+])
+ 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=
+ 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
+ dir="$additional_libdir"
+ 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"; 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"; 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"; 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"; 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
+ 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"; 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"; 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"; 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"; 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"; 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/"'*$,,'`
+ LIB[]NAME[]_PREFIX="$basedir"
+ 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*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $additional_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$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; 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$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_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$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_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.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.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
+])
+
+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"; 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"; 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..a8684e1
--- /dev/null
+++ b/m4/lib-prefix.m4
@@ -0,0 +1,185 @@
+# lib-prefix.m4 serial 5 (gettext-0.15)
+dnl Copyright (C) 2001-2005 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_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+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_LIB_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 a variable acl_libdirstem, containing
+dnl the basename of the libdir, either "lib" or "lib64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+ dnl There is no formal standard regarding lib and lib64. The current
+ dnl practice is that on a system supporting 32-bit and 64-bit instruction
+ dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit
+ dnl libraries go under $prefix/lib. We determine the compiler's default
+ dnl mode by looking at the compiler's library search path. If at least
+ dnl of its elements ends in /lib64 or points to a directory whose absolute
+ dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the
+ dnl default, namely "lib".
+ acl_libdirstem=lib
+ searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib64 ) acl_libdirstem=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ fi
+])
diff --git a/m4/localcharset.m4 b/m4/localcharset.m4
new file mode 100644
index 0000000..b2b7733
--- /dev/null
+++ b/m4/localcharset.m4
@@ -0,0 +1,16 @@
+# localcharset.m4 serial 5
+dnl Copyright (C) 2002, 2004, 2006 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])
+ AC_CHECK_DECLS_ONCE(getc_unlocked)
+
+ dnl Prerequisites of the lib/Makefile.am snippet.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_GLIBC21])
+])
diff --git a/m4/longlong.m4 b/m4/longlong.m4
new file mode 100644
index 0000000..1f9e862
--- /dev/null
+++ b/m4/longlong.m4
@@ -0,0 +1,72 @@
+# longlong.m4 serial 10
+dnl Copyright (C) 1999-2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG_INT if 'long long int' works.
+# This fixes a bug in Autoconf 2.60, but can be removed once we
+# assume 2.61 everywhere.
+
+# Note: If the type 'long long int' exists but is only 32 bits large
+# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
+# defined. In this case you can treat 'long long int' like 'long int'.
+
+AC_DEFUN([AC_TYPE_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[long long int ll = 9223372036854775807ll;
+ long long int nll = -9223372036854775807LL;
+ typedef int a[((-9223372036854775807LL < 0
+ && 0 < 9223372036854775807ll)
+ ? 1 : -1)];
+ int i = 63;]],
+ [[long long int llmax = 9223372036854775807ll;
+ return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+ | (llmax / ll) | (llmax % ll));]])],
+ [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
+ dnl If cross compiling, assume the bug isn't important, since
+ dnl nobody cross compiles for this platform as far as we know.
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[@%:@include <limits.h>
+ @%:@ifndef LLONG_MAX
+ @%:@ define HALF \
+ (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+ @%:@ define LLONG_MAX (HALF - 1 + HALF)
+ @%:@endif]],
+ [[long long int n = 1;
+ int i;
+ for (i = 0; ; i++)
+ {
+ long long int m = n << i;
+ if (m >> i != n)
+ return 1;
+ if (LLONG_MAX / 2 < m)
+ break;
+ }
+ return 0;]])],
+ [ac_cv_type_long_long_int=yes],
+ [ac_cv_type_long_long_int=no],
+ [ac_cv_type_long_long_int=yes])],
+ [ac_cv_type_long_long_int=no])])
+ if test $ac_cv_type_long_long_int = yes; then
+ AC_DEFINE([HAVE_LONG_LONG_INT], 1,
+ [Define to 1 if the system has the type `long long int'.])
+ fi
+])
+
+# This macro is obsolescent and should go away soon.
+AC_DEFUN([gl_AC_TYPE_LONG_LONG],
+[
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ ac_cv_type_long_long=$ac_cv_type_long_long_int
+ if test $ac_cv_type_long_long = yes; then
+ AC_DEFINE(HAVE_LONG_LONG, 1,
+ [Define if you have the 'long long' type.])
+ fi
+])
diff --git a/m4/lstat.m4 b/m4/lstat.m4
new file mode 100644
index 0000000..b9777a6
--- /dev/null
+++ b/m4/lstat.m4
@@ -0,0 +1,17 @@
+#serial 16
+
+# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007
+# 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_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
+ dnl Note: AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK does AC_LIBOBJ(lstat).
+ :
+])
diff --git a/m4/mbchar.m4 b/m4/mbchar.m4
new file mode 100644
index 0000000..02f9eff
--- /dev/null
+++ b/m4/mbchar.m4
@@ -0,0 +1,13 @@
+# mbchar.m4 serial 6
+dnl Copyright (C) 2005-2007 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_GNU_SOURCE])
+])
diff --git a/m4/mbiter.m4 b/m4/mbiter.m4
new file mode 100644
index 0000000..7d51af1
--- /dev/null
+++ b/m4/mbiter.m4
@@ -0,0 +1,17 @@
+# mbiter.m4 serial 2
+dnl Copyright (C) 2005 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])
+ dnl The following line is that so the user can test HAVE_MBRTOWC before
+ dnl #include "mbiter.h" or "mbuiter.h".
+ AC_REQUIRE([gl_FUNC_MBRTOWC])
+ :
+])
diff --git a/m4/mbrtowc.m4 b/m4/mbrtowc.m4
new file mode 100644
index 0000000..a3bd911
--- /dev/null
+++ b/m4/mbrtowc.m4
@@ -0,0 +1,31 @@
+# mbrtowc.m4 serial 8
+dnl Copyright (C) 2001-2002, 2004-2005 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
+
+dnl This file can be removed, and gl_FUNC_MBRTOWC replaced with
+dnl AC_FUNC_MBRTOWC, when autoconf 2.60 can be assumed everywhere.
+
+AC_DEFUN([gl_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/mbscasecmp.m4 b/m4/mbscasecmp.m4
new file mode 100644
index 0000000..7357769
--- /dev/null
+++ b/m4/mbscasecmp.m4
@@ -0,0 +1,16 @@
+# mbscasecmp.m4 serial 1
+dnl Copyright (C) 2007 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_MBSCASECMP],
+[
+ gl_PREREQ_MBSCASECMP
+])
+
+# Prerequisites of lib/mbscasecmp.c.
+AC_DEFUN([gl_PREREQ_MBSCASECMP], [
+ AC_REQUIRE([gl_FUNC_MBRTOWC])
+ :
+])
diff --git a/m4/mbstate_t.m4 b/m4/mbstate_t.m4
new file mode 100644
index 0000000..df2a275
--- /dev/null
+++ b/m4/mbstate_t.m4
@@ -0,0 +1,30 @@
+# mbstate_t.m4 serial 9
+dnl Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# 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_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/memchr.m4 b/m4/memchr.m4
new file mode 100644
index 0000000..91b8636
--- /dev/null
+++ b/m4/memchr.m4
@@ -0,0 +1,18 @@
+# memchr.m4 serial 4
+dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMCHR],
+[
+ AC_REPLACE_FUNCS(memchr)
+ if test $ac_cv_func_memchr = no; then
+ gl_PREREQ_MEMCHR
+ fi
+])
+
+# 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..9e854e8
--- /dev/null
+++ b/m4/mempcpy.m4
@@ -0,0 +1,26 @@
+# mempcpy.m4 serial 7
+dnl Copyright (C) 2003, 2004, 2006, 2007 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_MEMPCPY],
+[
+ dnl Persuade glibc <string.h> to declare mempcpy().
+ AC_REQUIRE([AC_GNU_SOURCE])
+
+ dnl The mempcpy() declaration in lib/string_.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS(mempcpy)
+ if test $ac_cv_func_mempcpy = no; then
+ HAVE_MEMPCPY=0
+ gl_PREREQ_MEMPCPY
+ 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..69674ff
--- /dev/null
+++ b/m4/memrchr.m4
@@ -0,0 +1,25 @@
+# memrchr.m4 serial 7
+dnl Copyright (C) 2002, 2003, 2005, 2006, 2007 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_MEMRCHR],
+[
+ dnl Persuade glibc <string.h> to declare memrchr().
+ AC_REQUIRE([AC_GNU_SOURCE])
+
+ 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_REPLACE_FUNCS(memrchr)
+ if test $ac_cv_func_memrchr = no; then
+ gl_PREREQ_MEMRCHR
+ fi
+])
+
+# Prerequisites of lib/memrchr.c.
+AC_DEFUN([gl_PREREQ_MEMRCHR], [:])
diff --git a/m4/memset.m4 b/m4/memset.m4
new file mode 100644
index 0000000..14ac267
--- /dev/null
+++ b/m4/memset.m4
@@ -0,0 +1,18 @@
+# memset.m4 serial 2
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMSET],
+[
+ AC_REPLACE_FUNCS(memset)
+ if test $ac_cv_func_memset = no; then
+ gl_PREREQ_MEMSET
+ fi
+])
+
+# Prerequisites of lib/memset.c.
+AC_DEFUN([gl_PREREQ_MEMSET], [
+ :
+])
diff --git a/m4/mkdtemp.m4 b/m4/mkdtemp.m4
new file mode 100644
index 0000000..0eeafbc
--- /dev/null
+++ b/m4/mkdtemp.m4
@@ -0,0 +1,20 @@
+# mkdtemp.m4 serial 5
+dnl Copyright (C) 2001-2003, 2006-2007 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_FUNC_MKDTEMP],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_REPLACE_FUNCS(mkdtemp)
+ if test $ac_cv_func_mkdtemp = no; then
+ HAVE_MKDTEMP=0
+ gl_PREREQ_MKDTEMP
+ fi
+])
+
+# Prerequisites of lib/mkdtemp.c
+AC_DEFUN([gl_PREREQ_MKDTEMP],
+[:
+])
diff --git a/m4/mktime.m4 b/m4/mktime.m4
new file mode 100644
index 0000000..5faf393
--- /dev/null
+++ b/m4/mktime.m4
@@ -0,0 +1,227 @@
+#serial 13
+dnl Copyright (C) 2002, 2003, 2005, 2006, 2007 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 Jim Meyering.
+
+# Redefine AC_FUNC_MKTIME, to fix a bug in Autoconf 2.61a and earlier.
+# This redefinition can be removed once a new version of Autoconf is assumed.
+# The redefinition is taken from
+# <http://cvs.sv.gnu.org/viewcvs/*checkout*/autoconf/autoconf/lib/autoconf/functions.m4?rev=1.119>.
+# AC_FUNC_MKTIME
+# --------------
+AC_DEFUN([AC_FUNC_MKTIME],
+[AC_CHECK_HEADERS_ONCE(unistd.h)
+AC_CHECK_FUNCS_ONCE(alarm)
+AC_CACHE_CHECK([for working mktime], ac_cv_func_working_mktime,
+[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
+
+#ifndef HAVE_ALARM
+# define alarm(X) /* empty */
+#endif
+
+/* Work around redefinition to rpl_putenv by other config tests. */
+#undef putenv
+
+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 (now)
+ time_t now;
+{
+ struct tm *lt;
+ return ! (lt = localtime (&now)) || mktime (lt) == now;
+}
+
+static int
+mktime_test (now)
+ 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 (j)
+ 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 ()
+{
+ time_t t, delta;
+ int i, j;
+
+ /* This test makes some buggy mktime implementations loop.
+ Give up after 60 seconds; a mktime slower than that
+ isn't worth using anyway. */
+ alarm (60);
+
+ for (;;)
+ {
+ t = (time_t_max << 1) + 1;
+ if (t <= time_t_max)
+ break;
+ time_t_max = t;
+ }
+ time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - 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; t += delta)
+ if (! mktime_test (t))
+ return 1;
+ if (! (mktime_test ((time_t) 1)
+ && mktime_test ((time_t) (60 * 60))
+ && mktime_test ((time_t) (60 * 60 * 24))))
+ return 1;
+
+ for (j = 1; ; j <<= 1)
+ if (! bigtime_test (j))
+ return 1;
+ else if (INT_MAX / 2 < j)
+ break;
+ if (! bigtime_test (INT_MAX))
+ return 1;
+ }
+ return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ());
+}]])],
+ [ac_cv_func_working_mktime=yes],
+ [ac_cv_func_working_mktime=no],
+ [ac_cv_func_working_mktime=no])])
+if test $ac_cv_func_working_mktime = no; then
+ AC_LIBOBJ([mktime])
+fi
+])# AC_FUNC_MKTIME
+
+AC_DEFUN([gl_FUNC_MKTIME],
+[
+ AC_FUNC_MKTIME
+ dnl Note: AC_FUNC_MKTIME does AC_LIBOBJ(mktime).
+ if test $ac_cv_func_working_mktime = no; then
+ AC_DEFINE(mktime, rpl_mktime,
+ [Define to rpl_mktime if the replacement function should be used.])
+ gl_PREREQ_MKTIME
+ fi
+])
+
+# Prerequisites of lib/mktime.c.
+AC_DEFUN([gl_PREREQ_MKTIME],
+[
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/m4/modechange.m4 b/m4/modechange.m4
new file mode 100644
index 0000000..3b23955
--- /dev/null
+++ b/m4/modechange.m4
@@ -0,0 +1,10 @@
+# modechange.m4 serial 6
+dnl Copyright (C) 2002, 2003, 2005, 2006 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_MODECHANGE],
+[
+ AC_LIBOBJ([modechange])
+])
diff --git a/m4/nls.m4 b/m4/nls.m4
new file mode 100644
index 0000000..7967cc2
--- /dev/null
+++ b/m4/nls.m4
@@ -0,0 +1,31 @@
+# nls.m4 serial 3 (gettext-0.15)
+dnl Copyright (C) 1995-2003, 2005-2006 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.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/openat.m4 b/m4/openat.m4
new file mode 100644
index 0000000..43f46d0
--- /dev/null
+++ b/m4/openat.m4
@@ -0,0 +1,90 @@
+#serial 15
+# See if we need to use our replacement for Solaris' openat et al functions.
+
+dnl Copyright (C) 2004, 2005, 2006, 2007 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_LIBOBJ([openat-proc])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([lchmod])
+ AC_CHECK_FUNCS_ONCE([fdopendir])
+ AC_REPLACE_FUNCS([fchmodat mkdirat openat])
+ case $ac_cv_func_openat+$ac_cv_func_lstat_dereferences_slashed_symlink in
+ yes+yes) ;;
+ yes+*) AC_LIBOBJ([fstatat]);;
+ *)
+ AC_DEFINE([__OPENAT_PREFIX], [[rpl_]],
+ [Define to rpl_ if the openat replacement function should be used.])
+ gl_PREREQ_OPENAT;;
+ esac
+ gl_FUNC_FCHOWNAT
+])
+
+# gl_FUNC_FCHOWNAT_DEREF_BUG([ACTION-IF-BUGGY[, ACTION-IF-NOT_BUGGY]])
+AC_DEFUN([gl_FUNC_FCHOWNAT_DEREF_BUG],
+[
+ AC_CACHE_CHECK([whether fchownat works with AT_SYMLINK_NOFOLLOW],
+ gl_cv_func_fchownat_nofollow_works,
+ [
+ gl_dangle=conftest.dangle
+ # Remove any remnants of a previous test.
+ rm -f $gl_dangle
+ # Arrange for deletion of the temporary file this test creates.
+ ac_clean_files="$ac_clean_files $gl_dangle"
+ ln -s conftest.no-such $gl_dangle
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+int
+main ()
+{
+ return (fchownat (AT_FDCWD, "$gl_dangle", -1, getgid (),
+ AT_SYMLINK_NOFOLLOW) != 0
+ && errno == ENOENT);
+}
+ ]])],
+ [gl_cv_func_fchownat_nofollow_works=yes],
+ [gl_cv_func_fchownat_nofollow_works=no],
+ [gl_cv_func_fchownat_nofollow_works=no],
+ )
+ ])
+ AS_IF([test $gl_cv_func_fchownat_nofollow_works = no], [$1], [$2])
+])
+
+# If we have the fchownat function, and it has the bug (in glibc-2.4)
+# that it dereferences symlinks even with AT_SYMLINK_NOFOLLOW, then
+# use the replacement function.
+# Also use the replacement function if fchownat is simply not available.
+AC_DEFUN([gl_FUNC_FCHOWNAT],
+[
+ # Assume we'll use the replacement function.
+ # The only case in which we won't is when we have fchownat, and it works.
+ use_replacement_fchownat=yes
+
+ AC_CHECK_FUNC([fchownat], [have_fchownat=yes], [have_fchownat=no])
+ if test $have_fchownat = yes; then
+ gl_FUNC_FCHOWNAT_DEREF_BUG([], [use_replacement_fchownat=no])
+ fi
+
+ if test $use_replacement_fchownat = yes; then
+ AC_LIBOBJ(fchownat)
+ AC_DEFINE(fchownat, rpl_fchownat,
+ [Define to rpl_fchownat if the replacement function should be used.])
+ fi
+])
+
+AC_DEFUN([gl_PREREQ_OPENAT],
+[
+ :
+])
diff --git a/m4/pathmax.m4 b/m4/pathmax.m4
new file mode 100644
index 0000000..64bf26f
--- /dev/null
+++ b/m4/pathmax.m4
@@ -0,0 +1,11 @@
+# pathmax.m4 serial 6
+dnl Copyright (C) 2002, 2003, 2005, 2006 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_PATHMAX],
+[
+ dnl Prerequisites of lib/pathmax.h.
+ AC_CHECK_HEADERS_ONCE(sys/param.h)
+])
diff --git a/m4/paxutils.m4 b/m4/paxutils.m4
new file mode 100644
index 0000000..f7f9c84
--- /dev/null
+++ b/m4/paxutils.m4
@@ -0,0 +1,7 @@
+# This file is generated automatically. Please, do not edit.
+#
+AC_DEFUN([tar_PAXUTILS],[
+PU_RMT
+PU_RTAPELIB
+PU_SYSTEM
+])
diff --git a/m4/po.m4 b/m4/po.m4
new file mode 100644
index 0000000..00133ef
--- /dev/null
+++ b/m4/po.m4
@@ -0,0 +1,428 @@
+# po.m4 serial 13 (gettext-0.15)
+dnl Copyright (C) 1995-2006 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.50)
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+ AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ AC_REQUIRE([AM_NLS])dnl
+
+ 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])
+
+ 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"
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/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 assigment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ 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.
+ 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.
+/^[ ]*VARIABLE[ ]*=/{
+ # Seen the first line of the variable definition.
+ s/^[ ]*VARIABLE[ ]*=//
+ 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 assigment 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"
+ if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+ @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+ \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+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
+ @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+ \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if test -n "$POMAKEFILEDEPS"; then
+ cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+ fi
+ mv "$ac_file.tmp" "$ac_file"
+])
diff --git a/m4/progtest.m4 b/m4/progtest.m4
new file mode 100644
index 0000000..a56365c
--- /dev/null
+++ b/m4/progtest.m4
@@ -0,0 +1,92 @@
+# progtest.m4 serial 4 (gettext-0.14.2)
+dnl Copyright (C) 1996-2003, 2005 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>, 1996.
+
+AC_PREREQ(2.50)
+
+# Search path for a program which passes the given test.
+
+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],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ [[\\/]]* | ?:[[\\/]]*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
diff --git a/m4/quote.m4 b/m4/quote.m4
new file mode 100644
index 0000000..0f08791
--- /dev/null
+++ b/m4/quote.m4
@@ -0,0 +1,13 @@
+# quote.m4 serial 5
+dnl Copyright (C) 2002, 2003, 2005, 2006 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_QUOTE],
+[
+ AC_LIBOBJ([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..db635d0
--- /dev/null
+++ b/m4/quotearg.m4
@@ -0,0 +1,15 @@
+# quotearg.m4 serial 6
+dnl Copyright (C) 2002, 2004, 2005, 2006, 2007 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_LIBOBJ([quotearg])
+
+ dnl Prerequisites of lib/quotearg.c.
+ AC_CHECK_FUNCS_ONCE([mbsinit])
+ AC_TYPE_MBSTATE_T
+ gl_FUNC_MBRTOWC
+])
diff --git a/m4/readlink.m4 b/m4/readlink.m4
new file mode 100644
index 0000000..1c347a0
--- /dev/null
+++ b/m4/readlink.m4
@@ -0,0 +1,29 @@
+# readlink.m4 serial 4
+dnl Copyright (C) 2003, 2007 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_CHECK_FUNCS_ONCE([readlink])
+ if test $ac_cv_func_readlink = no; then
+ HAVE_READLINK=0
+ AC_LIBOBJ(readlink)
+ gl_PREREQ_READLINK
+ fi
+])
+
+# Like gl_FUNC_READLINK, except prepare for separate compilation (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/regex.m4 b/m4/regex.m4
new file mode 100644
index 0000000..b8d5b1e
--- /dev/null
+++ b/m4/regex.m4
@@ -0,0 +1,211 @@
+#serial 46
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+# 2006, 2007 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_CHECK_HEADERS_ONCE([locale.h])
+
+ AC_ARG_WITH([included-regex],
+ [AC_HELP_STRING([--without-included-regex],
+ [don't compile regex; this is the default on 32-bit
+ systems with recent-enough versions of the GNU C
+ Library (use with caution on other systems).
+ On systems with 64-bit ptrdiff_t and 32-bit int,
+ --with-included-regex is the default, in case
+ regex functions operate on very long strings (>2GB)])])
+
+ 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_CACHE_CHECK([for working re_compile_pattern],
+ [gl_cv_func_re_compile_pattern_working],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [AC_INCLUDES_DEFAULT
+ #if HAVE_LOCALE_H
+ #include <locale.h>
+ #endif
+ #include <limits.h>
+ #include <regex.h>
+ ],
+ [[static struct re_pattern_buffer regex;
+ unsigned char folded_chars[UCHAR_MAX + 1];
+ int i;
+ const char *s;
+ struct re_registers regs;
+
+ #if HAVE_LOCALE_H
+ /* http://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. */
+ if (setlocale (LC_ALL, "en_US.UTF-8"))
+ {
+ 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)
+ return 1;
+ if (re_search (&regex, data, sizeof data - 1,
+ 0, sizeof data - 1, &regs)
+ != -1)
+ return 1;
+ if (! setlocale (LC_ALL, "C"))
+ return 1;
+ }
+ #endif
+
+ /* 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)
+ return 1;
+
+ /* This should fail, but succeeds for glibc-2.5. */
+ if (re_search (&regex, "a\nb", 3, 0, 3, &regs) != -1)
+ return 1;
+
+ /* 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)
+ return 1;
+
+ /* 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)
+ return 1;
+
+ /* 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)
+ return 1;
+
+ /* This should match, but does not for glibc-2.2.1. */
+ if (re_match (&regex, "an", 2, 0, &regs) != 2)
+ return 1;
+
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("x", 1, &regex);
+ if (s)
+ return 1;
+
+ /* glibc-2.2.93 does not work with a negative RANGE argument. */
+ if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1)
+ return 1;
+
+ /* 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)
+ return 1;
+
+ if (re_search (&regex, "WXY", 3, 0, 3, &regs) < 0)
+ return 1;
+
+ /* REG_STARTEND was added to glibc on 2004-01-15.
+ Reject older versions. */
+ if (! REG_STARTEND)
+ return 1;
+
+ /* Reject hosts whose regoff_t values are too narrow.
+ These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t
+ and 32-bit int. */
+ if (sizeof (regoff_t) < sizeof (ptrdiff_t)
+ || sizeof (regoff_t) < sizeof (ssize_t))
+ return 1;
+
+ return 0;]])],
+ [gl_cv_func_re_compile_pattern_working=yes],
+ [gl_cv_func_re_compile_pattern_working=no],
+ dnl When crosscompiling, assume it is not working.
+ [gl_cv_func_re_compile_pattern_working=no])])
+ 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_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.])
+ AC_LIBOBJ([regex])
+ gl_PREREQ_REGEX
+ fi
+])
+
+# Prerequisites of lib/regex.c and lib/regex_internal.c.
+AC_DEFUN([gl_PREREQ_REGEX],
+[
+ AC_REQUIRE([AC_GNU_SOURCE])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_CHECK_FUNCS_ONCE([iswctype mbrtowc wcrtomb wcscoll])
+ AC_CHECK_DECLS([isblank], [], [], [#include <ctype.h>])
+])
diff --git a/m4/rmdir.m4 b/m4/rmdir.m4
new file mode 100644
index 0000000..7235203
--- /dev/null
+++ b/m4/rmdir.m4
@@ -0,0 +1,10 @@
+# rmdir.m4 serial 3
+dnl Copyright (C) 2002, 2005 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_RMDIR],
+[
+ AC_REPLACE_FUNCS(rmdir)
+])
diff --git a/m4/rmt.m4 b/m4/rmt.m4
new file mode 100644
index 0000000..4a82e09
--- /dev/null
+++ b/m4/rmt.m4
@@ -0,0 +1,74 @@
+
+AC_DEFUN([PU_RMT],[
+ # Set LIB_SETSOCKOPT to -lnsl -lsocket if necessary.
+ pu_save_LIBS=$LIBS
+ LIB_SETSOCKOPT=
+ AC_SEARCH_LIBS(setsockopt, [socket], ,
+ [AC_SEARCH_LIBS(setsockopt, [socket], , , [-lnsl])])
+ AC_SEARCH_LIBS(setsockopt, [nsl])
+
+ case "$ac_cv_search_setsockopt" in
+ -l*) LIB_SETSOCKOPT=$ac_cv_search_setsockopt
+ esac
+ AC_SUBST(LIB_SETSOCKOPT)
+ LIBS=$pu_save_LIBS
+
+ AC_CHECK_FUNCS_ONCE([strerror])
+ enable_rmt() {
+ if test $ac_cv_header_sys_mtio_h = yes; then
+ AC_CACHE_CHECK(for remote tape header files, pu_cv_header_rmt,
+ [AC_TRY_CPP([
+#if HAVE_SGTTY_H
+# include <sgtty.h>
+#endif
+#include <sys/socket.h>],
+ pu_cv_header_rmt=yes,
+ pu_cv_header_rmt=no)])
+ test $pu_cv_header_rmt = yes && PU_RMT_PROG='rmt$(EXEEXT)'
+ AC_SUBST(PU_RMT_PROG)
+ fi
+ }
+
+ AC_CHECK_HEADERS([sys/mtio.h])
+ AC_CACHE_CHECK(which ioctl field to test for reversed bytes,
+ pu_cv_header_mtio_check_field,
+ [AC_EGREP_HEADER(mt_model, sys/mtio.h,
+ pu_cv_header_mtio_check_field=mt_model,
+ pu_cv_header_mtio_check_field=mt_type)])
+ AC_DEFINE_UNQUOTED(MTIO_CHECK_FIELD,
+ $pu_cv_header_mtio_check_field,
+ [Define to mt_model (v.g., for DG/UX), else to mt_type.])
+
+
+ AC_ARG_VAR([DEFAULT_RMT_DIR],
+ [Define full file name of the directory where to install `rmt'. (default: $(libexecdir))])
+ if test "x$DEFAULT_RMT_DIR" != x; then
+ DEFAULT_RMT_COMMAND=$DEFAULT_RMT_DIR/rmt
+ else
+ DEFAULT_RMT_DIR='$(libexecdir)'
+ fi
+
+ AC_MSG_CHECKING([whether to build rmt])
+ AC_ARG_WITH([rmt],
+ AC_HELP_STRING([--with-rmt=FILE],
+ [Use FILE as the default `rmt' program. Do not build included copy of `rmt'.]),
+ [case $withval in
+ yes|no) AC_MSG_ERROR([Invalid argument to --with-rmt]);;
+ /*) DEFAULT_RMT_COMMAND=$withval
+ AC_MSG_RESULT([no, use $withval instead]);;
+ *) AC_MSG_ERROR([Argument to --with-rmt must be an absolute file name]);;
+ esac],
+ [AC_MSG_RESULT([yes])
+ enable_rmt
+ if test "$PU_RMT_PROG" = ""; then
+ AC_MSG_WARN([not building rmt, required header files are missing])
+ fi])
+
+ AC_SUBST(DEFAULT_RMT_COMMAND)
+ if test "x$DEFAULT_RMT_COMMAND" != x; then
+ AC_DEFINE_UNQUOTED(DEFAULT_RMT_COMMAND, "$DEFAULT_RMT_COMMAND",
+ [Define full file name of rmt program.])
+ fi
+])
+
+
diff --git a/m4/rpmatch.m4 b/m4/rpmatch.m4
new file mode 100644
index 0000000..4a471ac
--- /dev/null
+++ b/m4/rpmatch.m4
@@ -0,0 +1,16 @@
+# rpmatch.m4 serial 5
+dnl Copyright (C) 2002, 2003 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_RPMATCH],
+[
+ AC_REPLACE_FUNCS(rpmatch)
+ if test $ac_cv_func_rpmatch = no; then
+ gl_PREREQ_RPMATCH
+ fi
+])
+
+# Prerequisites of lib/rpmatch.c.
+AC_DEFUN([gl_PREREQ_RPMATCH], [:])
diff --git a/m4/rtapelib.m4 b/m4/rtapelib.m4
new file mode 100644
index 0000000..7b2c503
--- /dev/null
+++ b/m4/rtapelib.m4
@@ -0,0 +1,3 @@
+AC_DEFUN([PU_RTAPELIB],[
+ AC_CHECK_HEADERS_ONCE([net/errno.h sys/inet.h netdb.h])
+])
diff --git a/m4/safe-read.m4 b/m4/safe-read.m4
new file mode 100644
index 0000000..7a89d0a
--- /dev/null
+++ b/m4/safe-read.m4
@@ -0,0 +1,18 @@
+# safe-read.m4 serial 5
+dnl Copyright (C) 2002, 2003, 2005, 2006 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_SAFE_READ],
+[
+ AC_LIBOBJ([safe-read])
+
+ gl_PREREQ_SAFE_READ
+])
+
+# Prerequisites of lib/safe-read.c.
+AC_DEFUN([gl_PREREQ_SAFE_READ],
+[
+ AC_REQUIRE([gt_TYPE_SSIZE_T])
+])
diff --git a/m4/safe-write.m4 b/m4/safe-write.m4
new file mode 100644
index 0000000..db119ff
--- /dev/null
+++ b/m4/safe-write.m4
@@ -0,0 +1,18 @@
+# safe-write.m4 serial 3
+dnl Copyright (C) 2002, 2005, 2006 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_SAFE_WRITE],
+[
+ AC_LIBOBJ([safe-write])
+
+ gl_PREREQ_SAFE_WRITE
+])
+
+# Prerequisites of lib/safe-write.c.
+AC_DEFUN([gl_PREREQ_SAFE_WRITE],
+[
+ gl_PREREQ_SAFE_READ
+])
diff --git a/m4/save-cwd.m4 b/m4/save-cwd.m4
new file mode 100644
index 0000000..7a2286b
--- /dev/null
+++ b/m4/save-cwd.m4
@@ -0,0 +1,12 @@
+#serial 8
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 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_SAVE_CWD],
+[
+ AC_LIBOBJ([save-cwd])
+ dnl Prerequisites for lib/save-cwd.c.
+ AC_CHECK_FUNCS_ONCE(fchdir)
+])
diff --git a/m4/savedir.m4 b/m4/savedir.m4
new file mode 100644
index 0000000..1fc6c81
--- /dev/null
+++ b/m4/savedir.m4
@@ -0,0 +1,10 @@
+# savedir.m4 serial 9
+dnl Copyright (C) 2002, 2003, 2005, 2006 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_SAVEDIR],
+[
+ AC_LIBOBJ([savedir])
+])
diff --git a/m4/setenv.m4 b/m4/setenv.m4
new file mode 100644
index 0000000..d6901de
--- /dev/null
+++ b/m4/setenv.m4
@@ -0,0 +1,82 @@
+# setenv.m4 serial 8
+dnl Copyright (C) 2001-2004, 2006-2007 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_SETENV],
+[
+ AC_CHECK_FUNCS_ONCE([setenv])
+ if test $ac_cv_func_setenv = no; then
+ AC_LIBOBJ([setenv])
+ gl_PREREQ_SETENV
+ fi
+])
+
+# Like gl_FUNC_SETENV, except prepare for separate compilation (no AC_LIBOBJ).
+AC_DEFUN([gl_FUNC_SETENV_SEPARATE],
+[
+ AC_CHECK_FUNCS_ONCE([setenv])
+ gl_PREREQ_SETENV
+])
+
+AC_DEFUN([gl_FUNC_UNSETENV],
+[
+ AC_CHECK_FUNCS([unsetenv])
+ if test $ac_cv_func_unsetenv = no; then
+ AC_LIBOBJ([unsetenv])
+ gl_PREREQ_UNSETENV
+ else
+ AC_CACHE_CHECK([for unsetenv() return type], gt_cv_func_unsetenv_ret,
+ [AC_TRY_COMPILE([#include <stdlib.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+int unsetenv (const char *name);
+#else
+int unsetenv();
+#endif
+], , gt_cv_func_unsetenv_ret='int', gt_cv_func_unsetenv_ret='void')])
+ if test $gt_cv_func_unsetenv_ret = 'void'; then
+ AC_DEFINE(VOID_UNSETENV, 1, [Define if unsetenv() returns void, not int.])
+ fi
+ 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_MSG_CHECKING([if $2 is properly declared])
+ AC_CACHE_VAL(gt_cv_var, [
+ AC_TRY_COMPILE([$1
+ extern struct { int foo; } $2;],
+ [$2.foo = 1;],
+ gt_cv_var=no,
+ gt_cv_var=yes)])
+ AC_MSG_RESULT($gt_cv_var)
+ if test $gt_cv_var = yes; then
+ AC_DEFINE([HAVE_]translit($2, [a-z], [A-Z])[_DECL], 1,
+ [Define if you have the declaration of $2.])
+ fi
+])
+
+# Prerequisites of lib/setenv.c.
+AC_DEFUN([gl_PREREQ_SETENV],
+[
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ AC_CHECK_HEADERS_ONCE(unistd.h)
+ AC_CHECK_HEADERS(search.h)
+ AC_CHECK_FUNCS(tsearch)
+ gt_CHECK_VAR_DECL([#include <unistd.h>], environ)
+])
+
+# Prerequisites of lib/unsetenv.c.
+AC_DEFUN([gl_PREREQ_UNSETENV],
+[
+ AC_CHECK_HEADERS_ONCE(unistd.h)
+ gt_CHECK_VAR_DECL([#include <unistd.h>], environ)
+])
diff --git a/m4/sleep.m4 b/m4/sleep.m4
new file mode 100644
index 0000000..2c9d75c
--- /dev/null
+++ b/m4/sleep.m4
@@ -0,0 +1,19 @@
+# sleep.m4 serial 1
+dnl Copyright (C) 2007 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_SLEEP],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([sleep])
+ if test $ac_cv_func_sleep = no; then
+ HAVE_SLEEP=0
+ AC_LIBOBJ([sleep])
+ gl_PREREQ_SLEEP
+ fi
+])
+
+# Prerequisites of lib/sleep.c.
+AC_DEFUN([gl_PREREQ_SLEEP], [:])
diff --git a/m4/ssize_t.m4 b/m4/ssize_t.m4
new file mode 100644
index 0000000..4eaef93
--- /dev/null
+++ b/m4/ssize_t.m4
@@ -0,0 +1,21 @@
+# ssize_t.m4 serial 4 (gettext-0.15)
+dnl Copyright (C) 2001-2003, 2006 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_TRY_COMPILE([#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..84dc26f
--- /dev/null
+++ b/m4/stat-time.m4
@@ -0,0 +1,85 @@
+# Checks for stat-related time functions.
+
+# Copyright (C) 1998, 1999, 2001, 2003, 2005, 2006, 2007 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([AC_C_INLINE])
+ 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_TRY_COMPILE(
+ [
+ #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([AC_C_INLINE])
+ 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/stdarg.m4 b/m4/stdarg.m4
new file mode 100644
index 0000000..e8e680a
--- /dev/null
+++ b/m4/stdarg.m4
@@ -0,0 +1,40 @@
+# stdarg.m4 serial 1
+dnl Copyright (C) 2006 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 Provide a working va_copy in combination with <stdarg.h>.
+
+AC_DEFUN([gl_STDARG_H],
+[
+ AC_MSG_CHECKING([for va_copy])
+ AC_CACHE_VAL([gl_cv_func_va_copy], [
+ AC_TRY_COMPILE([#include <stdarg.h>], [
+#ifndef va_copy
+void (*func) (va_list, va_list) = va_copy;
+#endif
+],
+ [gl_cv_func_va_copy=yes], [gl_cv_func_va_copy=no])])
+ AC_MSG_RESULT([$gl_cv_func_va_copy])
+ if test $gl_cv_func_va_copy = no; then
+ # Provide a substitute, either __va_copy or as a simple assignment.
+ AC_CACHE_VAL([gl_cv_func___va_copy], [
+ AC_TRY_COMPILE([#include <stdarg.h>], [
+#ifndef __va_copy
+error, bail out
+#endif
+],
+ [gl_cv_func___va_copy=yes], [gl_cv_func___va_copy=no])])
+ if test $gl_cv_func___va_copy = yes; then
+ AC_DEFINE([va_copy], [__va_copy],
+ [Define as a macro for copying va_list variables.])
+ else
+ AH_VERBATIM([gl_VA_COPY], [/* A replacement for va_copy, if needed. */
+#define gl_va_copy(a,b) ((a) = (b))])
+ AC_DEFINE([va_copy], [gl_va_copy],
+ [Define as a macro for copying va_list variables.])
+ fi
+ fi
+])
diff --git a/m4/stdbool.m4 b/m4/stdbool.m4
new file mode 100644
index 0000000..2204ecd
--- /dev/null
+++ b/m4/stdbool.m4
@@ -0,0 +1,115 @@
+# Check for stdbool.h that conforms to C99.
+
+dnl Copyright (C) 2002-2006 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 <stdbool.h> if it is not supported.
+
+AC_DEFUN([AM_STDBOOL_H],
+[
+ AC_REQUIRE([AC_HEADER_STDBOOL])
+
+ # Define two additional variables used in the Makefile substitution.
+
+ if test "$ac_cv_header_stdbool_h" = yes; then
+ STDBOOL_H=''
+ else
+ STDBOOL_H='stdbool.h'
+ fi
+ AC_SUBST([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 macro is only needed in autoconf <= 2.59. Newer versions of autoconf
+# have this macro built-in.
+
+AC_DEFUN([AC_HEADER_STDBOOL],
+ [AC_CACHE_CHECK([for stdbool.h that conforms to C99],
+ [ac_cv_header_stdbool_h],
+ [AC_TRY_COMPILE(
+ [
+ #include <stdbool.h>
+ #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
+ #ifndef __bool_true_false_are_defined
+ "error: __bool_true_false_are_defined is not defined"
+ #endif
+
+ struct s { _Bool s: 1; _Bool t; } 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];
+ bool e = &s;
+ 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 };
+ _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];
+ #if defined __xlc__ || defined __GNUC__
+ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
+ reported by James Lemley on 2005-10-05; see
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
+ This test is not quite right, since xlc is allowed to
+ reject this program, as the initializer for xlcbug is
+ not one of the forms that C requires support for.
+ However, doing the test right would require a run-time
+ test, and that would make cross-compilation harder.
+ Let us hope that IBM fixes the xlc bug, and also adds
+ support for this kind of constant expression. In the
+ meantime, this test will reject xlc, which is OK, since
+ our stdbool.h substitute should suffice. We also test
+ this with GCC, where it should work, to detect more
+ quickly whether someone messes up the test in the
+ future. */
+ char digs[] = "0123456789";
+ int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
+ #endif
+ /* Catch a bug in an HP-UX C compiler. See
+ http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+ */
+ _Bool q = true;
+ _Bool *pq = &q;
+ ],
+ [
+ *pq |= q;
+ *pq |= ! 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);
+ ],
+ [ac_cv_header_stdbool_h=yes],
+ [ac_cv_header_stdbool_h=no])])
+ AC_CHECK_TYPES([_Bool])
+ if test $ac_cv_header_stdbool_h = yes; then
+ AC_DEFINE(HAVE_STDBOOL_H, 1, [Define to 1 if stdbool.h conforms to C99.])
+ fi])
diff --git a/m4/stdint.m4 b/m4/stdint.m4
new file mode 100644
index 0000000..3de7e13
--- /dev/null
+++ b/m4/stdint.m4
@@ -0,0 +1,371 @@
+# stdint.m4 serial 24
+dnl Copyright (C) 2001-2002, 2004-2007 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_DEFUN([gl_STDINT_H],
+[
+ AC_PREREQ(2.59)dnl
+
+ dnl Check for long long int and unsigned long long int.
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ if test $ac_cv_type_long_long_int = yes; then
+ HAVE_LONG_LONG_INT=1
+ else
+ HAVE_LONG_LONG_INT=0
+ fi
+ AC_SUBST([HAVE_LONG_LONG_INT])
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ HAVE_UNSIGNED_LONG_LONG_INT=1
+ else
+ HAVE_UNSIGNED_LONG_LONG_INT=0
+ fi
+ AC_SUBST([HAVE_UNSIGNED_LONG_LONG_INT])
+
+ dnl Check for <inttypes.h>.
+ dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_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>.
+ dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_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])
+
+ dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_stdint_h.
+ if test $ac_cv_header_stdint_h = yes; then
+ gl_ABSOLUTE_HEADER([stdint.h])
+ ABSOLUTE_STDINT_H=\"$gl_cv_absolute_stdint_h\"
+ HAVE_STDINT_H=1
+ else
+ ABSOLUTE_STDINT_H=\"no/such/file/stdint.h\"
+ HAVE_STDINT_H=0
+ fi
+ AC_SUBST([ABSOLUTE_STDINT_H])
+ AC_SUBST([HAVE_STDINT_H])
+
+ dnl Now see whether we need a substitute <stdint.h>. Use
+ dnl ABSOLUTE_STDINT_H, not <stdint.h>, so that it also works during
+ dnl a "config.status --recheck" if a stdint.h has been
+ dnl created in the build directory.
+ 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([gl_STDINT_INCLUDES
+ [
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
+#include ABSOLUTE_STDINT_H
+#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;
+struct s {
+ int check_PTRDIFF: PTRDIFF_MIN < (ptrdiff_t) 0 && (ptrdiff_t) 0 < PTRDIFF_MAX ? 1 : -1;
+ int check_SIG_ATOMIC: SIG_ATOMIC_MIN <= (sig_atomic_t) 0 && (sig_atomic_t) 0 < SIG_ATOMIC_MAX ? 1 : -1;
+ int check_SIZE: (size_t) 0 < SIZE_MAX ? 1 : -1;
+ int check_WCHAR: WCHAR_MIN <= (wchar_t) 0 && (wchar_t) 0 < WCHAR_MAX ? 1 : -1;
+ int check_WINT: WINT_MIN <= (wint_t) 0 && (wint_t) 0 < WINT_MAX
+ && (WINT_MIN < (wint_t) 0 || (wint_t) -1 == (wint_t) WINT_MAX)
+ ? 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;
+};
+ ]])],
+ [gl_cv_header_working_stdint_h=yes])])
+ fi
+ if test "$gl_cv_header_working_stdint_h" = yes; then
+ STDINT_H=
+ else
+ 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
+ else
+ HAVE_SYS_INTTYPES_H=0
+ fi
+ AC_SUBST([HAVE_SYS_INTTYPES_H])
+ if test $ac_cv_header_sys_bitypes_h = yes; then
+ HAVE_SYS_BITYPES_H=1
+ else
+ HAVE_SYS_BITYPES_H=0
+ fi
+ AC_SUBST([HAVE_SYS_BITYPES_H])
+
+ gl_STDINT_TYPE_PROPERTIES
+ STDINT_H=stdint.h
+ fi
+ AC_SUBST(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.
+ AC_FOREACH([gltype], [$1],
+ [AH_TEMPLATE([BITSIZEOF_]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
+ AC_FOREACH([gltype], [$1],
+ [AC_SUBST([BITSIZEOF_]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.
+ AC_FOREACH([gltype], [$1],
+ [AH_TEMPLATE([HAVE_SIGNED_]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
+ AC_FOREACH([gltype], [$1],
+ [AC_SUBST([HAVE_SIGNED_]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.
+ AC_FOREACH([gltype], [$1],
+ [AH_TEMPLATE(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
+ AC_FOREACH([gltype], [$1],
+ [AC_SUBST(translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])])
+])
+
+dnl gl_STDINT_INCLUDES
+AC_DEFUN([gl_STDINT_INCLUDES],
+[[
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+]])
+
+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_.h.
+AC_DEFUN([gl_STDINT_TYPE_PROPERTIES],
+[
+ gl_STDINT_BITSIZEOF([ptrdiff_t sig_atomic_t size_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
+ gl_INTEGER_TYPE_SUFFIX([ptrdiff_t sig_atomic_t size_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
+
+# Hey Emacs!
+# Local Variables:
+# indent-tabs-mode: nil
+# End:
diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4
new file mode 100644
index 0000000..db9a8ac
--- /dev/null
+++ b/m4/stdint_h.m4
@@ -0,0 +1,26 @@
+# stdint_h.m4 serial 6
+dnl Copyright (C) 1997-2004, 2006 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_TRY_COMPILE(
+ [#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..955c912
--- /dev/null
+++ b/m4/stdio_h.m4
@@ -0,0 +1,79 @@
+# stdio_h.m4 serial 6
+dnl Copyright (C) 2007 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],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_ABSOLUTE_HEADER([stdio.h])
+ ABSOLUTE_STDIO_H=\"$gl_cv_absolute_stdio_h\"
+ AC_SUBST([ABSOLUTE_STDIO_H])
+])
+
+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])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_STDIO_H_DEFAULTS],
+[
+ GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX])
+ GNULIB_PRINTF_POSIX=0; AC_SUBST([GNULIB_PRINTF_POSIX])
+ GNULIB_SNPRINTF=0; AC_SUBST([GNULIB_SNPRINTF])
+ GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX])
+ GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX])
+ 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])
+ GNULIB_VASPRINTF=0; AC_SUBST([GNULIB_VASPRINTF])
+ 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_FFLUSH=0; AC_SUBST([GNULIB_FFLUSH])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ REPLACE_FPRINTF=0; AC_SUBST([REPLACE_FPRINTF])
+ REPLACE_VFPRINTF=0; AC_SUBST([REPLACE_VFPRINTF])
+ REPLACE_PRINTF=0; AC_SUBST([REPLACE_PRINTF])
+ REPLACE_VPRINTF=0; AC_SUBST([REPLACE_VPRINTF])
+ REPLACE_SNPRINTF=0; AC_SUBST([REPLACE_SNPRINTF])
+ HAVE_DECL_SNPRINTF=1; AC_SUBST([HAVE_DECL_SNPRINTF])
+ REPLACE_VSNPRINTF=0; AC_SUBST([REPLACE_VSNPRINTF])
+ HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF])
+ REPLACE_SPRINTF=0; AC_SUBST([REPLACE_SPRINTF])
+ REPLACE_VSPRINTF=0; AC_SUBST([REPLACE_VSPRINTF])
+ HAVE_VASPRINTF=1; AC_SUBST([HAVE_VASPRINTF])
+ REPLACE_VASPRINTF=0; AC_SUBST([REPLACE_VASPRINTF])
+ HAVE_FSEEKO=1; AC_SUBST([HAVE_FSEEKO])
+ REPLACE_FSEEKO=0; AC_SUBST([REPLACE_FSEEKO])
+ REPLACE_FSEEK=0; AC_SUBST([REPLACE_FSEEK])
+ HAVE_FTELLO=1; AC_SUBST([HAVE_FTELLO])
+ REPLACE_FTELLO=0; AC_SUBST([REPLACE_FTELLO])
+ REPLACE_FTELL=0; AC_SUBST([REPLACE_FTELL])
+ REPLACE_FFLUSH=0; AC_SUBST([REPLACE_FFLUSH])
+])
+
+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 at the same time
+ that cygwin started exporting asnprintf (cygwin 1.7.0), so we use
+ that as a link-time test for cross-compiles rather than building
+ a runtime test. */
+ size_t s;
+ if (asnprintf (NULL, &s, ""))
+ return 0;
+#endif])],
+ [gl_cv_var_stdin_large_offset=yes],
+ [gl_cv_var_stdin_large_offset=no])])
+])
diff --git a/m4/stdlib_h.m4 b/m4/stdlib_h.m4
new file mode 100644
index 0000000..d46a5f0
--- /dev/null
+++ b/m4/stdlib_h.m4
@@ -0,0 +1,31 @@
+# stdlib_h.m4 serial 1
+dnl Copyright (C) 2007 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_ABSOLUTE_HEADER([stdlib.h])
+ ABSOLUTE_STDLIB_H=\"$gl_cv_absolute_stdlib_h\"
+ AC_SUBST([ABSOLUTE_STDLIB_H])
+])
+
+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])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_STDLIB_H_DEFAULTS],
+[
+ GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT])
+ GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP])
+ GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT])
+ HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP])
+ REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP])
+])
diff --git a/m4/stpcpy.m4 b/m4/stpcpy.m4
new file mode 100644
index 0000000..c48aa9c
--- /dev/null
+++ b/m4/stpcpy.m4
@@ -0,0 +1,26 @@
+# stpcpy.m4 serial 4
+dnl Copyright (C) 2002, 2007 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_GNU_SOURCE])
+
+ dnl The stpcpy() declaration in lib/string_.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS(stpcpy)
+ if test $ac_cv_func_stpcpy = no; then
+ HAVE_STPCPY=0
+ gl_PREREQ_STPCPY
+ 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..ae24215
--- /dev/null
+++ b/m4/strcase.m4
@@ -0,0 +1,44 @@
+# strcase.m4 serial 8
+dnl Copyright (C) 2002, 2005-2007 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_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS(strcasecmp)
+ if test $ac_cv_func_strcasecmp = no; then
+ HAVE_STRCASECMP=0
+ gl_PREREQ_STRCASECMP
+ fi
+])
+
+AC_DEFUN([gl_FUNC_STRNCASECMP],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS(strncasecmp)
+ if test $ac_cv_func_strncasecmp = no; then
+ gl_PREREQ_STRNCASECMP
+ 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..fec2a10
--- /dev/null
+++ b/m4/strchrnul.m4
@@ -0,0 +1,21 @@
+# strchrnul.m4 serial 5
+dnl Copyright (C) 2003, 2007 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_GNU_SOURCE])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS(strchrnul)
+ if test $ac_cv_func_strchrnul = no; then
+ HAVE_STRCHRNUL=0
+ gl_PREREQ_STRCHRNUL
+ 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..8796e9e
--- /dev/null
+++ b/m4/strdup.m4
@@ -0,0 +1,22 @@
+# strdup.m4 serial 9
+
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 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.
+
+AC_DEFUN([gl_FUNC_STRDUP],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS(strdup)
+ AC_CHECK_DECLS_ONCE(strdup)
+ if test $ac_cv_have_decl_strdup = no; then
+ HAVE_DECL_STRDUP=0
+ fi
+ gl_PREREQ_STRDUP
+])
+
+# 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..bbcda30
--- /dev/null
+++ b/m4/strerror.m4
@@ -0,0 +1,26 @@
+# strerror.m4 serial 3
+dnl Copyright (C) 2002, 2007 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_CHECK_FUNCS_ONCE([strerror])
+ if test $ac_cv_func_strerror = no; then
+ AC_LIBOBJ([strerror])
+ gl_PREREQ_STRERROR
+ fi
+])
+
+# Like gl_FUNC_STRERROR, except prepare for separate compilation (no AC_LIBOBJ).
+AC_DEFUN([gl_FUNC_STRERROR_SEPARATE],
+[
+ AC_CHECK_FUNCS_ONCE([strerror])
+ gl_PREREQ_STRERROR
+])
+
+# Prerequisites of lib/strerror.c.
+AC_DEFUN([gl_PREREQ_STRERROR], [
+ :
+])
diff --git a/m4/string_h.m4 b/m4/string_h.m4
new file mode 100644
index 0000000..f706d49
--- /dev/null
+++ b/m4/string_h.m4
@@ -0,0 +1,78 @@
+# Configure a GNU-like replacement for <string.h>.
+
+# Copyright (C) 2007 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([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([AC_C_RESTRICT])
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ gl_ABSOLUTE_HEADER([string.h])
+ ABSOLUTE_STRING_H=\"$gl_cv_absolute_string_h\"
+ AC_SUBST([ABSOLUTE_STRING_H])
+])
+
+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])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS],
+[
+ GNULIB_MEMMEM=0; AC_SUBST([GNULIB_MEMMEM])
+ GNULIB_MEMPCPY=0; AC_SUBST([GNULIB_MEMPCPY])
+ GNULIB_MEMRCHR=0; AC_SUBST([GNULIB_MEMRCHR])
+ 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_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_STRCASESTR=0; AC_SUBST([GNULIB_STRCASESTR])
+ GNULIB_STRTOK_R=0; AC_SUBST([GNULIB_STRTOK_R])
+ GNULIB_MBSLEN=0; AC_SUBST([GNULIB_MBSLEN])
+ 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])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ 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_STPCPY=1; AC_SUBST([HAVE_STPCPY])
+ HAVE_STPNCPY=1; AC_SUBST([HAVE_STPNCPY])
+ HAVE_STRCASECMP=1; AC_SUBST([HAVE_STRCASECMP])
+ HAVE_DECL_STRNCASECMP=1; AC_SUBST([HAVE_DECL_STRNCASECMP])
+ HAVE_STRCHRNUL=1; AC_SUBST([HAVE_STRCHRNUL])
+ HAVE_DECL_STRDUP=1; AC_SUBST([HAVE_DECL_STRDUP])
+ HAVE_STRNDUP=1; AC_SUBST([HAVE_STRNDUP])
+ 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])
+])
diff --git a/m4/strndup.m4 b/m4/strndup.m4
new file mode 100644
index 0000000..baa6c03
--- /dev/null
+++ b/m4/strndup.m4
@@ -0,0 +1,53 @@
+# strndup.m4 serial 13
+dnl Copyright (C) 2002-2003, 2005-2007 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_GNU_SOURCE])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_DECLS_ONCE([strndup])
+ if test $ac_cv_have_decl_strndup = no; then
+ HAVE_DECL_STRNDUP=0
+ fi
+
+ # 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,
+ [AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([#include <string.h>
+ #include <stdlib.h>], [[
+#ifndef HAVE_DECL_STRNDUP
+ extern char *strndup (const char *, size_t);
+#endif
+ char *s;
+ s = strndup ("some longer string", 15);
+ free (s);
+ s = strndup ("shorter string", 13);
+ return s[13] != '\0';]])],
+ [gl_cv_func_strndup=yes],
+ [gl_cv_func_strndup=no],
+ [AC_CHECK_FUNC([strndup],
+ [AC_EGREP_CPP([too risky], [
+#ifdef _AIX
+ too risky
+#endif
+ ],
+ [gl_cv_func_strndup=no],
+ [gl_cv_func_strndup=yes])],
+ [gl_cv_func_strndup=no])])])
+ if test $gl_cv_func_strndup = yes; then
+ AC_DEFINE([HAVE_STRNDUP], 1,
+ [Define if you have the strndup() function and it works.])
+ else
+ HAVE_STRNDUP=0
+ AC_LIBOBJ([strndup])
+ gl_PREREQ_STRNDUP
+ fi
+])
+
+# Prerequisites of lib/strndup.c.
+AC_DEFUN([gl_PREREQ_STRNDUP], [:])
diff --git a/m4/strnlen.m4 b/m4/strnlen.m4
new file mode 100644
index 0000000..0e2815b
--- /dev/null
+++ b/m4/strnlen.m4
@@ -0,0 +1,31 @@
+# strnlen.m4 serial 8
+dnl Copyright (C) 2002-2003, 2005-2007 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_STRNLEN],
+[
+ dnl Persuade glibc <string.h> to declare strnlen().
+ AC_REQUIRE([AC_GNU_SOURCE])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_DECLS_ONCE([strnlen])
+ if test $ac_cv_have_decl_strnlen = no; then
+ HAVE_DECL_STRNLEN=0
+ fi
+
+ AC_FUNC_STRNLEN
+ if test $ac_cv_func_strnlen_working = no; then
+ # This is necessary because automake-1.6.1 doens't understand
+ # that the above use of AC_FUNC_STRNLEN means we may have to use
+ # lib/strnlen.c.
+ #AC_LIBOBJ(strnlen)
+ AC_DEFINE(strnlen, rpl_strnlen,
+ [Define to rpl_strnlen if the replacement function should be used.])
+ gl_PREREQ_STRNLEN
+ fi
+])
+
+# Prerequisites of lib/strnlen.c.
+AC_DEFUN([gl_PREREQ_STRNLEN], [:])
diff --git a/m4/strtoimax.m4 b/m4/strtoimax.m4
new file mode 100644
index 0000000..9957637
--- /dev/null
+++ b/m4/strtoimax.m4
@@ -0,0 +1,34 @@
+# strtoimax.m4 serial 6
+dnl Copyright (C) 2002, 2003, 2004, 2006 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_STRTOIMAX],
+[
+ dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
+ AC_REQUIRE([AC_PROG_CPP])
+ AC_REQUIRE([AC_PROG_EGREP])
+
+ AC_CACHE_CHECK([whether <inttypes.h> defines strtoimax as a macro],
+ jm_cv_func_strtoimax_macro,
+ [AC_EGREP_CPP([inttypes_h_defines_strtoimax], [#include <inttypes.h>
+#ifdef strtoimax
+ inttypes_h_defines_strtoimax
+#endif],
+ jm_cv_func_strtoimax_macro=yes,
+ jm_cv_func_strtoimax_macro=no)])
+
+ if test "$jm_cv_func_strtoimax_macro" != yes; then
+ AC_REPLACE_FUNCS(strtoimax)
+ if test $ac_cv_func_strtoimax = no; then
+ gl_PREREQ_STRTOIMAX
+ fi
+ fi
+])
+
+# Prerequisites of lib/strtoimax.c.
+AC_DEFUN([gl_PREREQ_STRTOIMAX], [
+ AC_CHECK_DECLS(strtoll)
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+])
diff --git a/m4/strtol.m4 b/m4/strtol.m4
new file mode 100644
index 0000000..7fbae60
--- /dev/null
+++ b/m4/strtol.m4
@@ -0,0 +1,10 @@
+# strtol.m4 serial 4
+dnl Copyright (C) 2002, 2003, 2006 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_REPLACE_FUNCS(strtol)
+])
diff --git a/m4/strtoll.m4 b/m4/strtoll.m4
new file mode 100644
index 0000000..53cbed2
--- /dev/null
+++ b/m4/strtoll.m4
@@ -0,0 +1,23 @@
+# strtoll.m4 serial 4
+dnl Copyright (C) 2002, 2004, 2006 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],
+[
+ dnl We don't need (and can't compile) the replacement strtoll
+ dnl unless the type 'long long int' exists.
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ if test "$ac_cv_type_long_long_int" = yes; then
+ AC_REPLACE_FUNCS(strtoll)
+ if test $ac_cv_func_strtoll = no; then
+ gl_PREREQ_STRTOLL
+ fi
+ fi
+])
+
+# Prerequisites of lib/strtoll.c.
+AC_DEFUN([gl_PREREQ_STRTOLL], [
+ :
+])
diff --git a/m4/strtoul.m4 b/m4/strtoul.m4
new file mode 100644
index 0000000..5ec54aa
--- /dev/null
+++ b/m4/strtoul.m4
@@ -0,0 +1,10 @@
+# strtoul.m4 serial 3
+dnl Copyright (C) 2002, 2006 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_STRTOUL],
+[
+ AC_REPLACE_FUNCS(strtoul)
+])
diff --git a/m4/strtoull.m4 b/m4/strtoull.m4
new file mode 100644
index 0000000..fcec3de
--- /dev/null
+++ b/m4/strtoull.m4
@@ -0,0 +1,23 @@
+# strtoull.m4 serial 4
+dnl Copyright (C) 2002, 2004, 2006 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_STRTOULL],
+[
+ dnl We don't need (and can't compile) the replacement strtoull
+ dnl unless the type 'unsigned long long int' exists.
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+ if test "$ac_cv_type_unsigned_long_long_int" = yes; then
+ AC_REPLACE_FUNCS(strtoull)
+ if test $ac_cv_func_strtoull = no; then
+ gl_PREREQ_STRTOULL
+ fi
+ fi
+])
+
+# Prerequisites of lib/strtoull.c.
+AC_DEFUN([gl_PREREQ_STRTOULL], [
+ :
+])
diff --git a/m4/strtoumax.m4 b/m4/strtoumax.m4
new file mode 100644
index 0000000..1935250
--- /dev/null
+++ b/m4/strtoumax.m4
@@ -0,0 +1,34 @@
+# strtoumax.m4 serial 6
+dnl Copyright (C) 2002, 2003, 2004, 2006 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_STRTOUMAX],
+[
+ dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
+ AC_REQUIRE([AC_PROG_CPP])
+ AC_REQUIRE([AC_PROG_EGREP])
+
+ AC_CACHE_CHECK([whether <inttypes.h> defines strtoumax as a macro],
+ jm_cv_func_strtoumax_macro,
+ [AC_EGREP_CPP([inttypes_h_defines_strtoumax], [#include <inttypes.h>
+#ifdef strtoumax
+ inttypes_h_defines_strtoumax
+#endif],
+ jm_cv_func_strtoumax_macro=yes,
+ jm_cv_func_strtoumax_macro=no)])
+
+ if test "$jm_cv_func_strtoumax_macro" != yes; then
+ AC_REPLACE_FUNCS(strtoumax)
+ if test $ac_cv_func_strtoumax = no; then
+ gl_PREREQ_STRTOUMAX
+ fi
+ fi
+])
+
+# Prerequisites of lib/strtoumax.c.
+AC_DEFUN([gl_PREREQ_STRTOUMAX], [
+ AC_CHECK_DECLS(strtoull)
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+])
diff --git a/m4/sys_stat_h.m4 b/m4/sys_stat_h.m4
new file mode 100644
index 0000000..2283138
--- /dev/null
+++ b/m4/sys_stat_h.m4
@@ -0,0 +1,50 @@
+# sys_stat_h.m4 serial 5 -*- Autoconf -*-
+dnl Copyright (C) 2006-2007 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 Test whether <sys/stat.h> contains lstat and mkdir or must be substituted.
+
+AC_DEFUN([gl_HEADER_SYS_STAT_H],
+[
+ dnl Check for lstat. Systems that lack it (mingw) also lack symlinks, so
+ dnl stat is a good replacement.
+ AC_CHECK_FUNCS_ONCE([lstat])
+ if test $ac_cv_func_lstat = yes; then
+ HAVE_LSTAT=1
+ else
+ HAVE_LSTAT=0
+ fi
+ AC_SUBST([HAVE_LSTAT])
+
+ dnl Check for mkdir. Mingw has _mkdir(name) in the nonstandard <io.h>
+ dnl instead.
+ AC_CHECK_DECLS([mkdir],
+ [],
+ [AC_CHECK_HEADERS([io.h])],
+ [#include <sys/stat.h>])
+ if test $ac_cv_have_decl_mkdir = yes; then
+ HAVE_DECL_MKDIR=1
+ else
+ HAVE_DECL_MKDIR=0
+ fi
+ AC_SUBST([HAVE_DECL_MKDIR])
+ if test "$ac_cv_header_io_h" = yes; then
+ HAVE_IO_H=1
+ else
+ HAVE_IO_H=0
+ fi
+ AC_SUBST([HAVE_IO_H])
+ AC_REQUIRE([AC_C_INLINE])
+
+ dnl Check for broken stat macros.
+ AC_REQUIRE([AC_HEADER_STAT])
+
+ gl_ABSOLUTE_HEADER([sys/stat.h])
+ ABSOLUTE_SYS_STAT_H=\"$gl_cv_absolute_sys_stat_h\"
+ AC_SUBST([ABSOLUTE_SYS_STAT_H])
+ SYS_STAT_H='sys/stat.h'
+ AC_SUBST([SYS_STAT_H])
+]) # gl_HEADER_SYS_STAT_H
diff --git a/m4/sys_time_h.m4 b/m4/sys_time_h.m4
new file mode 100644
index 0000000..b38e1bc
--- /dev/null
+++ b/m4/sys_time_h.m4
@@ -0,0 +1,61 @@
+# Configure a replacement for <sys/time.h>.
+
+# Copyright (C) 2007 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_CHECK_HEADERS_ONCE([sys/time.h])
+
+ if test $ac_cv_header_sys_time_h = yes; then
+ gl_ABSOLUTE_HEADER([sys/time.h])
+ ABSOLUTE_SYS_TIME_H=\"$gl_cv_absolute_sys_time_h\"
+ HAVE_SYS_TIME_H=1
+ else
+ ABSOLUTE_SYS_TIME_H=\"no/such/file/sys/time.h\"
+ HAVE_SYS_TIME_H=0
+ fi
+ AC_SUBST([ABSOLUTE_SYS_TIME_H])
+ AC_SUBST([HAVE_SYS_TIME_H])
+
+ 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>
+ ]],
+ [[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=1
+ else
+ HAVE_STRUCT_TIMEVAL=0
+ fi
+ AC_SUBST([HAVE_STRUCT_TIMEVAL])
+
+ dnl Assume POSIX behavior unless another module says otherwise.
+ REPLACE_GETTIMEOFDAY=0
+ AC_SUBST([REPLACE_GETTIMEOFDAY])
+ if test $HAVE_SYS_TIME_H = 0 || test $HAVE_STRUCT_TIMEVAL = 0; then
+ SYS_TIME_H=sys/time.h
+ else
+ SYS_TIME_H=
+ fi
+ AC_SUBST([SYS_TIME_H])
+])
diff --git a/m4/sysexits.m4 b/m4/sysexits.m4
new file mode 100644
index 0000000..17d5aee
--- /dev/null
+++ b/m4/sysexits.m4
@@ -0,0 +1,45 @@
+# sysexits.m4 serial 3
+dnl Copyright (C) 2003, 2005, 2007 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_SYSEXITS],
+[
+ AC_CHECK_HEADERS_ONCE([sysexits.h])
+ if test $ac_cv_header_sysexits_h = yes; then
+ HAVE_SYSEXITS_H=1
+ gl_ABSOLUTE_HEADER([sysexits.h])
+ ABSOLUTE_SYSEXITS_H=\"$gl_cv_absolute_sysexits_h\"
+ AC_TRY_COMPILE([#include <sysexits.h>],
+ [switch (0)
+ {
+ case EX_OK:
+ case EX_USAGE:
+ case EX_DATAERR:
+ case EX_NOINPUT:
+ case EX_NOUSER:
+ case EX_NOHOST:
+ case EX_UNAVAILABLE:
+ case EX_SOFTWARE:
+ case EX_OSERR:
+ case EX_OSFILE:
+ case EX_CANTCREAT:
+ case EX_IOERR:
+ case EX_TEMPFAIL:
+ case EX_PROTOCOL:
+ case EX_NOPERM:
+ case EX_CONFIG:
+ break;
+ }
+ ],
+ [SYSEXITS_H=],
+ [SYSEXITS_H=sysexits.h])
+ else
+ HAVE_SYSEXITS_H=0
+ SYSEXITS_H=sysexits.h
+ fi
+ AC_SUBST([HAVE_SYSEXITS_H])
+ AC_SUBST([ABSOLUTE_SYSEXITS_H])
+ AC_SUBST([SYSEXITS_H])
+])
diff --git a/m4/system.m4 b/m4/system.m4
new file mode 100644
index 0000000..0e00364
--- /dev/null
+++ b/m4/system.m4
@@ -0,0 +1,29 @@
+# Configuration for paxutils/lib/system.h.
+
+# Copyright (C) 2005, 2006 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([PU_SYSTEM],[
+ AC_REQUIRE([AC_HEADER_STDC])
+
+ AC_CHECK_HEADERS_ONCE([string.h memory.h fcntl.h sys/wait.h \
+ sys/gentape.h sys/tape.h sys/device.h sys/param.h sys/tprintf.h sys/mtio.h \
+ sgtty.h sys/io/trioctl.h locale.h])
+
+ AC_CHECK_HEADERS([sys/buf.h], [], [],
+ [#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif])
+
+ AC_REQUIRE([AC_HEADER_TIME])
+
+ AC_CHECK_MEMBERS([struct stat.st_blksize]) dnl instead of AC_STRUCT_ST_BLKSIZE
+ AC_REQUIRE([AC_STRUCT_ST_BLOCKS])
+ AC_REQUIRE([AC_STRUCT_ST_BLKSIZE])
+
+ AC_CHECK_FUNCS_ONCE(lstat mkfifo setlocale)
+ AC_REQUIRE([gl_INTTYPES_H])
+ AC_REQUIRE([gl_STDINT_H])
+])
diff --git a/m4/tempname.m4 b/m4/tempname.m4
new file mode 100644
index 0000000..4c44d37
--- /dev/null
+++ b/m4/tempname.m4
@@ -0,0 +1,22 @@
+#serial 3
+
+# Copyright (C) 2006-2007 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],
+[
+ AC_REQUIRE([AC_SYS_LARGEFILE])
+
+ AC_LIBOBJ([tempname])
+ gl_PREREQ_TEMPNAME
+])
+
+# Prerequisites of lib/tempname.c.
+AC_DEFUN([gl_PREREQ_TEMPNAME],
+[
+ :
+])
diff --git a/m4/time_h.m4 b/m4/time_h.m4
new file mode 100644
index 0000000..e90ed7a
--- /dev/null
+++ b/m4/time_h.m4
@@ -0,0 +1,76 @@
+# Configure a more-standard replacement for <time.h>.
+
+# Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2007 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 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([AC_C_RESTRICT])
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ gl_ABSOLUTE_HEADER([time.h])
+ ABSOLUTE_TIME_H=\"$gl_cv_absolute_time_h\"
+ AC_SUBST([ABSOLUTE_TIME_H])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC])
+])
+
+AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS],
+[
+ 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_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R])
+ REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP])
+ REPLACE_STRPTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_STRPTIME])
+ REPLACE_TIMEGM=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TIMEGM])
+])
+
+dnl Define HAVE_STRUCT_TIMESPEC if `struct timespec' is declared
+dnl in time.h or sys/time.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
+ 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_time_h = yes; then
+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1
+ fi
+ fi
+ AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC])
+ AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC])
+])
diff --git a/m4/time_r.m4 b/m4/time_r.m4
new file mode 100644
index 0000000..dbb6396
--- /dev/null
+++ b/m4/time_r.m4
@@ -0,0 +1,41 @@
+dnl Reentrant time functions like localtime_r.
+
+dnl Copyright (C) 2003, 2006, 2007 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])
+
+ AC_CACHE_CHECK([whether localtime_r is compatible with its POSIX signature],
+ [gl_cv_time_r_posix],
+ [AC_TRY_COMPILE(
+ [#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;],
+ [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
+ AC_LIBOBJ([time_r])
+ gl_PREREQ_TIME_R
+ fi
+])
+
+# Prerequisites of lib/time_r.c.
+AC_DEFUN([gl_PREREQ_TIME_R], [
+ :
+])
diff --git a/m4/timespec.m4 b/m4/timespec.m4
new file mode 100644
index 0000000..36f1238
--- /dev/null
+++ b/m4/timespec.m4
@@ -0,0 +1,16 @@
+#serial 14
+
+# Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2007 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],
+[
+ dnl Prerequisites of lib/timespec.h.
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/m4/tm_gmtoff.m4 b/m4/tm_gmtoff.m4
new file mode 100644
index 0000000..cb0b3c8
--- /dev/null
+++ b/m4/tm_gmtoff.m4
@@ -0,0 +1,14 @@
+# tm_gmtoff.m4 serial 2
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+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/unistd-safer.m4 b/m4/unistd-safer.m4
new file mode 100644
index 0000000..09adf93
--- /dev/null
+++ b/m4/unistd-safer.m4
@@ -0,0 +1,13 @@
+#serial 8
+dnl Copyright (C) 2002, 2005, 2006 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])
+ AC_LIBOBJ([dup-safer])
+ AC_LIBOBJ([fd-safer])
+ AC_LIBOBJ([pipe-safer])
+])
diff --git a/m4/unistd_h.m4 b/m4/unistd_h.m4
new file mode 100644
index 0000000..60dd730
--- /dev/null
+++ b/m4/unistd_h.m4
@@ -0,0 +1,55 @@
+# unistd_h.m4 serial 7
+dnl Copyright (C) 2006-2007 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])
+
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ if test $ac_cv_header_unistd_h = yes; then
+ HAVE_UNISTD_H=1
+ gl_ABSOLUTE_HEADER([unistd.h])
+ ABSOLUTE_UNISTD_H=\"$gl_cv_absolute_unistd_h\"
+ else
+ HAVE_UNISTD_H=0
+ fi
+ AC_SUBST([HAVE_UNISTD_H])
+ AC_SUBST([ABSOLUTE_UNISTD_H])
+])
+
+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])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_UNISTD_H_DEFAULTS],
+[
+ GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN])
+ GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2])
+ GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR])
+ GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE])
+ GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD])
+ GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R])
+ GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK])
+ GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK])
+ GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DUP2=1; AC_SUBST([HAVE_DUP2])
+ HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE])
+ HAVE_READLINK=1; AC_SUBST([HAVE_READLINK])
+ HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP])
+ HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R])
+ REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN])
+ REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR])
+ REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD])
+ REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK])
+])
diff --git a/m4/unlinkdir.m4 b/m4/unlinkdir.m4
new file mode 100644
index 0000000..6ef7168
--- /dev/null
+++ b/m4/unlinkdir.m4
@@ -0,0 +1,33 @@
+#serial 5
+
+# Copyright (C) 2005, 2006, 2007 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([gl_UNLINKDIR],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_HEADERS_ONCE(priv.h)
+
+ AC_LIBOBJ([unlinkdir])
+
+ # The Hurd, the Linux kernel, the FreeBSD kernel version 2.2 and later,
+ # and Cygwin never let anyone (even root) unlink directories.
+ # If anyone knows of another system for which unlink can never
+ # remove a directory, please report it to <bug-coreutils@gnu.org>.
+ # Unfortunately this is difficult to test for, since it requires root access
+ # and might create garbage in the file system,
+ # so the code below simply relies on the kernel name and version number.
+ case $host in
+ *-*-gnu[[0-9]]* | \
+ *-*-linux-* | *-*-linux | \
+ *-*-freebsd2.2* | *-*-freebsd[[3-9]]* | *-*-freebsd[[1-9]][[0-9]]* | \
+ *-cygwin)
+ AC_DEFINE([UNLINK_CANNOT_UNLINK_DIR], 1,
+ [Define to 1 if unlink (dir) cannot possibly succeed.]);;
+ esac
+])
diff --git a/m4/unlocked-io.m4 b/m4/unlocked-io.m4
new file mode 100644
index 0000000..20b2da2
--- /dev/null
+++ b/m4/unlocked-io.m4
@@ -0,0 +1,42 @@
+# unlocked-io.m4 serial 14
+
+# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+# 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/utimbuf.m4 b/m4/utimbuf.m4
new file mode 100644
index 0000000..9927908
--- /dev/null
+++ b/m4/utimbuf.m4
@@ -0,0 +1,39 @@
+#serial 8
+
+# Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2007 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 Define HAVE_STRUCT_UTIMBUF if `struct utimbuf' is declared --
+dnl usually in <utime.h>.
+dnl Some systems have utime.h but don't declare the struct anywhere.
+
+AC_DEFUN([gl_CHECK_TYPE_STRUCT_UTIMBUF],
+[
+ AC_CHECK_HEADERS_ONCE(sys/time.h utime.h)
+ AC_CACHE_CHECK([for struct utimbuf], [gl_cv_sys_struct_utimbuf],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #ifdef HAVE_UTIME_H
+ #include <utime.h>
+ #endif
+ ]],
+ [[static struct utimbuf x; x.actime = x.modtime;]])],
+ [gl_cv_sys_struct_utimbuf=yes],
+ [gl_cv_sys_struct_utimbuf=no])])
+
+ if test $gl_cv_sys_struct_utimbuf = yes; then
+ AC_DEFINE(HAVE_STRUCT_UTIMBUF, 1,
+ [Define if struct utimbuf is declared -- usually in <utime.h>.
+ Some systems have utime.h but don't declare the struct anywhere. ])
+ fi
+])
diff --git a/m4/utime.m4 b/m4/utime.m4
new file mode 100644
index 0000000..967faa2
--- /dev/null
+++ b/m4/utime.m4
@@ -0,0 +1,30 @@
+#serial 7
+
+dnl From Jim Meyering
+dnl Replace the utime function on systems that need it.
+
+# Copyright (C) 1998, 2000, 2001, 2003, 2004 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 FIXME
+
+AC_DEFUN([gl_FUNC_UTIME],
+[
+ AC_REQUIRE([AC_FUNC_UTIME_NULL])
+ if test $ac_cv_func_utime_null = no; then
+ AC_LIBOBJ(utime)
+ AC_DEFINE(utime, rpl_utime,
+ [Define to rpl_utime if the replacement function should be used.])
+ gl_PREREQ_UTIME
+ fi
+])
+
+# Prerequisites of lib/utime.c.
+AC_DEFUN([gl_PREREQ_UTIME],
+[
+ AC_CHECK_HEADERS_ONCE(utime.h)
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_UTIMBUF])
+ gl_FUNC_UTIMES_NULL
+])
diff --git a/m4/utimens.m4 b/m4/utimens.m4
new file mode 100644
index 0000000..9ac9c3e
--- /dev/null
+++ b/m4/utimens.m4
@@ -0,0 +1,15 @@
+dnl Copyright (C) 2003, 2004, 2005, 2006, 2007 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_UTIMENS],
+[
+ AC_LIBOBJ([utimens])
+
+ dnl Prerequisites of lib/utimens.c.
+ AC_REQUIRE([gl_FUNC_UTIMES])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_UTIMBUF])
+ AC_CHECK_FUNCS_ONCE([futimes futimesat])
+])
diff --git a/m4/utimes-null.m4 b/m4/utimes-null.m4
new file mode 100644
index 0000000..8d5c8ae
--- /dev/null
+++ b/m4/utimes-null.m4
@@ -0,0 +1,41 @@
+#serial 7
+
+# Copyright (C) 1998, 1999, 2001, 2003, 2004, 2006 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 Shamelessly cloned from acspecific.m4's AC_FUNC_UTIME_NULL,
+dnl then do case-insensitive s/utime/utimes/.
+
+AC_DEFUN([gl_FUNC_UTIMES_NULL],
+[AC_CACHE_CHECK(whether utimes accepts a null argument, ac_cv_func_utimes_null,
+[rm -f conftest.data; > conftest.data
+AC_TRY_RUN([
+/* In case stat has been defined to rpl_stat, undef it here. */
+#undef stat
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+int
+main () {
+struct stat s, t;
+return ! (stat ("conftest.data", &s) == 0
+ && utimes ("conftest.data", 0) == 0
+ && stat ("conftest.data", &t) == 0
+ && t.st_mtime >= s.st_mtime
+ && t.st_mtime - s.st_mtime < 120));
+}],
+ ac_cv_func_utimes_null=yes,
+ ac_cv_func_utimes_null=no,
+ ac_cv_func_utimes_null=no)
+rm -f core core.* *.core])
+
+ if test $ac_cv_func_utimes_null = yes; then
+ AC_DEFINE(HAVE_UTIMES_NULL, 1,
+ [Define if utimes accepts a null argument])
+ fi
+ ]
+)
diff --git a/m4/utimes.m4 b/m4/utimes.m4
new file mode 100644
index 0000000..7efb2b0
--- /dev/null
+++ b/m4/utimes.m4
@@ -0,0 +1,83 @@
+# Detect some bugs in glibc's implementation of utimes.
+
+dnl Copyright (C) 2003, 2004, 2005 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_CACHE_CHECK([determine 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>
+
+int
+main ()
+{
+ static struct timeval timeval[2] = {{9, 10}, {999999, 999999}};
+ struct stat sbuf;
+ char const *file = "conftest.utimes";
+ FILE *f;
+ time_t now;
+ int fd;
+
+ int ok = ((f = fopen (file, "w"))
+ && fclose (f) == 0
+ && utimes (file, timeval) == 0
+ && lstat (file, &sbuf) == 0
+ && sbuf.st_atime == timeval[0].tv_sec
+ && sbuf.st_mtime == timeval[1].tv_sec);
+ unlink (file);
+ if (!ok)
+ exit (1);
+
+ ok =
+ ((f = fopen (file, "w"))
+ && fclose (f) == 0
+ && time (&now) != (time_t)-1
+ && utimes (file, NULL) == 0
+ && lstat (file, &sbuf) == 0
+ && now - sbuf.st_atime <= 2
+ && now - sbuf.st_mtime <= 2);
+ unlink (file);
+ if (!ok)
+ exit (1);
+
+ ok = (0 <= (fd = open (file, O_WRONLY|O_CREAT, 0444))
+ && close (fd) == 0
+ && utimes (file, NULL) == 0);
+ unlink (file);
+
+ exit (!ok);
+}
+ ]])],
+ [gl_cv_func_working_utimes=yes],
+ [gl_cv_func_working_utimes=no],
+ [gl_cv_func_working_utimes=no])])
+
+ if test $gl_cv_func_working_utimes = yes; then
+ AC_DEFINE([HAVE_WORKING_UTIMES], 1, [Define if utimes works properly. ])
+ fi
+])
diff --git a/m4/vasnprintf.m4 b/m4/vasnprintf.m4
new file mode 100644
index 0000000..fa953aa
--- /dev/null
+++ b/m4/vasnprintf.m4
@@ -0,0 +1,181 @@
+# vasnprintf.m4 serial 17
+dnl Copyright (C) 2002-2004, 2006-2007 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_REQUIRE([gl_EOVERFLOW])
+ 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
+])
+
+# Prequisites of lib/printf-args.h, lib/printf-args.c.
+AC_DEFUN([gl_PREREQ_PRINTF_ARGS],
+[
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+])
+
+# Prequisites of lib/printf-parse.h, lib/printf-parse.c.
+AC_DEFUN([gl_PREREQ_PRINTF_PARSE],
+[
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ AC_REQUIRE([AC_TYPE_SIZE_T])
+ AC_CHECK_TYPES(ptrdiff_t)
+ AC_REQUIRE([gt_AC_TYPE_INTMAX_T])
+])
+
+# Prerequisites of lib/vasnprintf.c.
+AC_DEFUN([gl_PREREQ_VASNPRINTF],
+[
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ AC_CHECK_FUNCS(snprintf wcslen)
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting 'long double'
+# arguments.
+AC_DEFUN([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" 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 ' 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 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
+])
+
+# Prerequisites of lib/asnprintf.c.
+AC_DEFUN([gl_PREREQ_ASNPRINTF],
+[
+])
diff --git a/m4/vsnprintf.m4 b/m4/vsnprintf.m4
new file mode 100644
index 0000000..accc79f
--- /dev/null
+++ b/m4/vsnprintf.m4
@@ -0,0 +1,31 @@
+# vsnprintf.m4 serial 4
+dnl Copyright (C) 2002, 2003, 2004, 2007 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_VSNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_CHECK_FUNCS([vsnprintf])
+ if test $ac_cv_func_vsnprintf = 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
+ fi
+ gl_PREREQ_VSNPRINTF
+])
+
+# Prerequisites of lib/vsnprintf.c.
+AC_DEFUN([gl_PREREQ_VSNPRINTF], [:])
diff --git a/m4/wchar.m4 b/m4/wchar.m4
new file mode 100644
index 0000000..068f22d
--- /dev/null
+++ b/m4/wchar.m4
@@ -0,0 +1,29 @@
+dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
+
+dnl Copyright (C) 2007 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.m4 serial 1
+
+AC_DEFUN([gl_WCHAR_H],
+[
+ AC_CACHE_CHECK([whether <wchar.h> is standalone],
+ [gl_cv_header_wchar_h_standalone],
+ [AC_COMPILE_IFELSE([[#include <wchar.h>
+wchar_t w;]],
+ [gl_cv_header_wchar_h_standalone=yes],
+ [gl_cv_header_wchar_h_standalone=no])])
+ if test $gl_cv_header_wchar_h_standalone = yes; then
+ WCHAR_H=
+ else
+ gl_ABSOLUTE_HEADER([wchar.h])
+ ABSOLUTE_WCHAR_H=\"$gl_cv_absolute_wchar_h\"
+ WCHAR_H=wchar.h
+ fi
+ AC_SUBST([ABSOLUTE_WCHAR_H])
+ AC_SUBST([WCHAR_H])
+])
diff --git a/m4/wchar_t.m4 b/m4/wchar_t.m4
new file mode 100644
index 0000000..cde2129
--- /dev/null
+++ b/m4/wchar_t.m4
@@ -0,0 +1,20 @@
+# wchar_t.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 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_TRY_COMPILE([#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/wctype.m4 b/m4/wctype.m4
new file mode 100644
index 0000000..a56834d
--- /dev/null
+++ b/m4/wctype.m4
@@ -0,0 +1,47 @@
+dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it.
+
+dnl Copyright (C) 2006, 2007 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_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_CHECK_HEADERS_ONCE([wctype.h])
+ AC_REQUIRE([AC_C_INLINE])
+
+ 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])
+
+ WCTYPE_H=wctype.h
+ if test $ac_cv_header_wctype_h = yes; then
+ if test $ac_cv_func_iswcntrl = yes; then
+ WCTYPE_H=
+ fi
+ dnl Compute ABSOLUTE_WCTYPE_H even if WCTYPE_H is empty,
+ dnl for the benefit of builds from non-distclean directories.
+ gl_ABSOLUTE_HEADER([wctype.h])
+ ABSOLUTE_WCTYPE_H=\"$gl_cv_absolute_wctype_h\"
+ HAVE_WCTYPE_H=1
+ else
+ ABSOLUTE_WCTYPE_H=\"no/such/file/wctype.h\"
+ HAVE_WCTYPE_H=0
+ fi
+ AC_SUBST([ABSOLUTE_WCTYPE_H])
+ AC_SUBST([HAVE_WCTYPE_H])
+ AC_SUBST([WCTYPE_H])
+])
diff --git a/m4/wcwidth.m4 b/m4/wcwidth.m4
new file mode 100644
index 0000000..b483499
--- /dev/null
+++ b/m4/wcwidth.m4
@@ -0,0 +1,30 @@
+# wcwidth.m4 serial 8
+dnl Copyright (C) 2006, 2007 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],
+[
+ dnl Persuade glibc <wchar.h> to declare wcwidth().
+ AC_REQUIRE([AC_GNU_SOURCE])
+
+ AC_REQUIRE([AC_C_INLINE])
+ 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], [], [], [
+/* AIX 3.2.5 declares wcwidth in <string.h>. */
+#include <string.h>
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+])])
diff --git a/m4/wint_t.m4 b/m4/wint_t.m4
new file mode 100644
index 0000000..2cac1a7
--- /dev/null
+++ b/m4/wint_t.m4
@@ -0,0 +1,28 @@
+# wint_t.m4 serial 2 (gettext-0.16.2)
+dnl Copyright (C) 2003, 2007 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.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+ AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t,
+ [AC_TRY_COMPILE([
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#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.])
+ fi
+])
diff --git a/m4/xalloc.m4 b/m4/xalloc.m4
new file mode 100644
index 0000000..837a948
--- /dev/null
+++ b/m4/xalloc.m4
@@ -0,0 +1,24 @@
+# xalloc.m4 serial 16
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 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],
+[
+ AC_LIBOBJ([xmalloc])
+
+ gl_PREREQ_XALLOC
+ gl_PREREQ_XMALLOC
+])
+
+# Prerequisites of lib/xalloc.h.
+AC_DEFUN([gl_PREREQ_XALLOC], [
+ AC_REQUIRE([gl_INLINE])
+ :
+])
+
+# Prerequisites of lib/xmalloc.c.
+AC_DEFUN([gl_PREREQ_XMALLOC], [
+ :
+])
diff --git a/m4/xgetcwd.m4 b/m4/xgetcwd.m4
new file mode 100644
index 0000000..d8609d1
--- /dev/null
+++ b/m4/xgetcwd.m4
@@ -0,0 +1,12 @@
+#serial 6
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 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_XGETCWD],
+[
+ AC_LIBOBJ([xgetcwd])
+
+ AC_REQUIRE([gl_FUNC_GETCWD])
+])
diff --git a/m4/xstrndup.m4 b/m4/xstrndup.m4
new file mode 100644
index 0000000..8a30ab1
--- /dev/null
+++ b/m4/xstrndup.m4
@@ -0,0 +1,15 @@
+# xstrndup.m4 serial 2
+dnl Copyright (C) 2003 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/xstrtol.m4 b/m4/xstrtol.m4
new file mode 100644
index 0000000..cd5a549
--- /dev/null
+++ b/m4/xstrtol.m4
@@ -0,0 +1,11 @@
+#serial 9
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 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_XSTRTOL],
+[
+ AC_LIBOBJ([xstrtol])
+ AC_LIBOBJ([xstrtoul])
+])
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 0000000..50e2a85
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1,36 @@
+bg
+cs
+da
+de
+el
+es
+et
+eu
+fi
+fr
+ga
+gl
+hr
+hu
+id
+it
+ja
+ko
+ky
+ms
+nb
+nl
+no
+pl
+pt
+pt_BR
+ro
+ru
+rw
+sk
+sl
+sv
+tr
+uk
+vi
+zh_CN
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644
index 0000000..82c71eb
--- /dev/null
+++ b/po/Makefile.in.in
@@ -0,0 +1,405 @@
+# -*- buffer-read-only: t -*- vi: set ro:
+# DO NOT EDIT! GENERATED AUTOMATICALLY!
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2006 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.16
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+
+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@
+
+# 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 -o $${lang}.gmo $${lang}.po"; \
+ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+ sed -e '/^#/d' $< > t-$@
+ mv t-$@ $@
+
+
+all: all-@USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# $(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
+ 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.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+ 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; \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --msgid-bugs-address="$$msgid_bugs_address"
+ 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): $(srcdir)/$(DOMAIN).pot
+ @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+ if test -f "$(srcdir)/$${lang}.po"; then \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \
+ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \
+ 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
+ $(mkdir_p) $(DESTDIR)$(datadir)
+ @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:
+ $(mkdir_p) $(DESTDIR)$(datadir)
+ @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:
+ $(MAKE) update-po
+ @$(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) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+ cd $(srcdir); \
+ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$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 "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)
+ @:
+
+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..3a3491f
--- /dev/null
+++ b/po/Makevars
@@ -0,0 +1,59 @@
+# -*- buffer-read-only: t -*- vi: set ro:
+# DO NOT EDIT! GENERATED AUTOMATICALLY!
+# 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\
+\
+ --flag=_:1:pass-c-format\
+ --flag=N_:1:pass-c-format\
+ --flag=error:3:c-format --flag=error_at_line:5:c-format\
+ --flag=asnprintf:3:c-format --flag=vasnprintf:3:c-format\
+ --flag=argp_error:2:c-format\
+ --flag=__argp_error:2:c-format\
+ --flag=argp_failure:4:c-format\
+ --flag=__argp_failure:4:c-format\
+ --flag=argp_fmtstream_printf:2:c-format\
+ --flag=__argp_fmtstream_printf:2: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 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-tar@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 =
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 0000000..a667089
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,56 @@
+# List of files which contain translatable strings.
+
+# Copyright (C) 1996, 1999, 2000, 2003, 2004, 2005 Free Software
+# Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Library files
+lib/argmatch.c
+lib/argp-help.c
+lib/argp-parse.c
+lib/error.c
+lib/getopt.c
+lib/human.c
+lib/obstack.c
+lib/paxerror.c
+lib/paxexit.c
+lib/paxnames.c
+lib/quotearg.c
+lib/rpmatch.c
+lib/rtapelib.c
+lib/xalloc-die.c
+lib/xmalloc.c
+
+rmt/rmt.c
+
+# Package source files
+src/buffer.c
+src/common.h
+src/compare.c
+src/create.c
+src/delete.c
+src/extract.c
+src/incremen.c
+src/list.c
+src/misc.c
+src/names.c
+src/tar.c
+src/update.c
+src/xheader.c
+
+# Testsuite
+tests/genfile.c
diff --git a/po/Rules-quot b/po/Rules-quot
new file mode 100644
index 0000000..9c2a995
--- /dev/null
+++ b/po/Rules-quot
@@ -0,0 +1,47 @@
+# 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"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+ tmpdir=`pwd`; \
+ echo "$$lang:"; \
+ ll=`echo $$lang | sed -e 's/@.*//'`; \
+ LC_ALL=C; export LC_ALL; \
+ cd $(srcdir); \
+ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \
+ if 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/bg.gmo b/po/bg.gmo
new file mode 100644
index 0000000..547f71a
--- /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..0463871
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,2560 @@
+# Bulgarian translation of GNU tar
+# Message catalog for coreutils
+# Copyright (C) 2006 Free Software Foundation, Inc.
+# This file is distributed under the same license as GNU tar.
+# Anton Zinoviev <zinoviev@debian.org>, 2000,2006.
+#
+# WARNING: Everywhere NUMBER is translated as N rather than as БРОЙ or ЧИСЛО
+#
+# This file should be sent to translation@iro.umontreal.ca with the
+# following subject line: TP-Robot tar-1.16.bg.po
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.16\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-11-23 22:40+0200\n"
+"Last-Translator: Anton Zinoviev <zinoviev@debian.org>\n"
+"Language-Team: Bulgarian <dict@fsa-bg.org>\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"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "неправилен аргумент %s за %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "двуÑмиÑлен аргумент %s за %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "ДопуÑтими аргументи Ñа:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: ÑтойноÑтта %s е по-малка или равна на %s"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: параметърът ARGP_HELP_FMT изиÑква ÑтойноÑÑ‚"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: параметърът ARGP_HELP_FMT Ñ‚Ñ€Ñбва да бъде положителен"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: непознат параметър ARGP_HELP_FMT"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Боклук в ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Ðргументите, задължителните или незадължителни за дългите опции, Ñа "
+"Ñъответно задължителни или незадължителни и за кратките опции."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Използване:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " или: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [ОПЦИЯ...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Използвайте „%s --help“ or „%s --usage“ за повече информациÑ.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"Съобщавайте за програмни грешки на %s.\n"
+"За грешки в българÑÐºÐ¸Ñ Ð¿Ñ€ÐµÐ²Ð¾Ð´ на <dict@fsa-bg.org>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Ðепозната ÑиÑтемна грешка"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "показва тази Ñправка"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "показва кратко Ñъобщение за използването"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "ИМЕ"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "поÑочва името на програмата"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "СЕК"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "Ñпира за СЕК Ñекунди (подразбира Ñе 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "показва верÑиÑта на програмата"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(ДЕФЕКТ Ð’ ПРОГРÐÐœÐТÐ) Ðе е извеÑтна верÑиÑта!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Твърде много аргументи\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(ДЕФЕКТ Ð’ ПРОГРÐÐœÐТÐ) ОпциÑта би Ñ‚Ñ€Ñбвало да е била разпозната!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: опциÑта „%s“ е двуÑмиÑлена\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: опциÑта „--%s“ не допуÑка аргумент\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: опциÑта „%c%s“ не допуÑка аргумент\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: опциÑта „%s“ изиÑква аргумент\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: непозната Ð¾Ð¿Ñ†Ð¸Ñ â€ž--%s“\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: непозната Ð¾Ð¿Ñ†Ð¸Ñ â€ž%c%s“\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: неправилна Ð¾Ð¿Ñ†Ð¸Ñ -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: неправилна Ð¾Ð¿Ñ†Ð¸Ñ -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: опциÑта изиÑква аргумент -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: опциÑта „-W %s“ е двуÑмиÑлена\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: опциÑта „-W %s“ не допуÑка аргумент\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "блоковиÑÑ‚ размер"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "паметта е изчерпана"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: ФункциÑта %s не уÑпÑ"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Внимание: ФункциÑта %s не уÑпÑ"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Режимът за доÑтъп не може да Ñе Ñмени на %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: СобÑтвеноÑтта не може да Ñе Ñмени на потребител %lu, група %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Ðе може да Ñе направи твърда връзка Ñ %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Грешка при четене при байт %s, при четенето на %lu байт"
+msgstr[1] "%s: Грешка при четене при байт %s, при четенето на %lu байта"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] ""
+"%s: Внимание: Грешка при четене при байт %s, при четенето на %lu байт"
+msgstr[1] ""
+"%s: Внимание: Грешка при четене при байт %s, при четенето на %lu байта"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Ðе може да Ñе отиде на отмеÑтване %s във файла"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Внимание: Ðе може да Ñе отиде на отмеÑтване %s във файла"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Ðе може да Ñе направи Ñимволна връзка към %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: ЗапиÑани Ñа Ñамо %lu от %lu байт"
+msgstr[1] "%s: ЗапиÑани Ñа Ñамо %lu от %lu байта"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Премахва Ñе началното „%s“ от имената на членове"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Премахва Ñе началното „%s“ от целите на твърдите връзки"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Полага Ñе „.“ вмеÑто празно име на член"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "„"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "“"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[дДoOyY]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[нÐkKnN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: УÑлугата не е доÑтъпна"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "Ñтандартен вход"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "Ñтандартен изход"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Ðе може да Ñе Ñтартира отдалечена командна обвивка"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "ВходниÑÑ‚ низ е твърде дълъг"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Синтактична грешка в чиÑло"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Ðе може да Ñе задели мÑÑто за буфер\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Ðе може да Ñе задели мÑÑто за буфер"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Използвайте „%s --help“ за повече информациÑ.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Използване: %s [ОПЦИЯ]\n"
+"УправлÑва лентово уÑтройÑтво, приемайки команди от отделен процеÑ.\n"
+"\n"
+" --version Извежда Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° верÑиÑта.\n"
+" --help Извежда тази Ñправка.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Съобщавайте за програмни грешки на <%s>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Грешка при позициониране"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "ÐœÑÑтото за позициониране е извън допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "ПоÑоката за отмеÑтване е недопуÑтима"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Преждевременен край (eof)\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Преждевременен край на файла"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Ðепозната команда"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Общо запиÑани байтове"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Общо прочетени байтове"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Общо изтрити байтове: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(канал)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Ðеправилна ÑтойноÑÑ‚ на record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Ðе е поÑочено име на архив"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ðе може да Ñе проверÑват архиви на Ñтандартните вход/изход"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Ðрхивът е компреÑиран. Използвайте опциÑта %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Ðе може да Ñе актуализират компреÑирани архиви"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Контролна точка при Ð·Ð°Ð¿Ð¸Ñ %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Контролна точка при четене %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "В началото на лентата, край на изпълнението"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Твърде много грешки, край на изпълнението"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Ðеподравнен блок (%lu байт) в архива"
+msgstr[1] "Ðеподравнен блок (%lu байта) в архива"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Размер на запиÑа = %lu блок"
+msgstr[1] "Размер на запиÑа = %lu блока"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Ðевъзможно е връщане назад в Ð°Ñ€Ñ…Ð¸Ð²Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»; той може да е нечитаем без Ð¾Ð¿Ñ†Ð¸Ñ "
+"-i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek не завърши при граница на запиÑ"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: Ñъдържа неправилен номер на том"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Препълване на номера на том"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Подгответе том â„–%d за %s и натиÑнете return: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF, когато Ñе очакваше отговор от потребителÑ"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "Ð’ÐИМÐÐИЕ: Ðрхивът е незавършен"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n име ПоÑочва ново файлово име за ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ñ‚Ð¾Ð¼ и томовете Ñлед "
+"него\n"
+" q ПрекратÑва tar\n"
+" y или return Продължава изпълнението\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Поражда вторична командна обвивка\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Извежда този ÑпиÑък\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "ÐÑма повече томове; изход.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Ðе е поÑочено име на файл. Опитайте отново.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Ðеправилна команда. Използвайте ? за Ñправка.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "командата %s не уÑпÑ"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Това не прилича на tar-архив"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"%s вероÑтно продължава в този том: заглавниÑÑ‚ Ð·Ð°Ð¿Ð¸Ñ Ñъдържа отрÑзано име"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s не продължава Ñ Ñ‚Ð¾Ð·Ð¸ том"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s е грешен размер (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Този том е извън поредицата"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Ðрхивът не е етикетиран да Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Томът %s не ÑъответÑтва на %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: името на файла е твърде дълго, за да Ñе побере в заглавен Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° "
+"многотомен ГÐУ-архив и бе Ñъкратено"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Само %lu от %lu байт можаха да Ñе прочетат"
+msgstr[1] "Само %lu от %lu байта можаха да Ñе прочетат"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Съдържанието Ñе различава"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Ðеочакван знак за край (EOF) в архива"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Файловите типове Ñе различават"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Режимите за доÑтъп Ñе различават"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "СобÑтвениците Ñе различават"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Групите Ñе различават"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Времената на промÑна Ñе различават"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Размерите Ñе различават"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ðе е Ñвързан Ñ %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Символните връзки Ñе различават"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Ðомерата на уÑтройÑтво Ñе различават"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Проверка"
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Ðепознат файлов тип „%c“, ÑравнÑва Ñе като обикновен файл"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Ðрхивът Ñъдържа файлови имена, Ñ Ð¾Ñ‚Ñтранени префикÑи."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Проверката може и да не открие оригиналните файлове."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "ÐЕУСПЕШÐРПРОВЕРКÐ: открита е %d неправилен заглавен запиÑ"
+msgstr[1] "ÐЕУСПЕШÐРПРОВЕРКÐ: открити Ñа %d неправилни заглавни запиÑа"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: каталогът е обозначен като кеш; не Ñе архивира"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr ""
+"ÑтойноÑтта на %s е извън границите %s на диапазона %s..%s; замеÑтва Ñе Ñ %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "ÑтойноÑтта %s е извън границите %s на диапазона %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Генерират Ñе отрицателни оÑмични заглавни запиÑи"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: файловото име е твърде дълго (макÑимум %d); не е архивирано"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+"%s: файловото име е твърде дълго (не може да Ñе раздели); не е архивирано"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: името на Ñимволната връзка е твърде дълго; не е архивирано"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Файлът Ð½Ð°Ð¼Ð°Ð»Ñ Ñ %s байт; допълва Ñе Ñ Ð½ÑƒÐ»Ð°"
+msgstr[1] "%s: Файлът Ð½Ð°Ð¼Ð°Ð»Ñ Ñ %s байта; допълва Ñе Ñ Ð½ÑƒÐ»Ð¸"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: файлът е в друга файлова ÑиÑтема; не Ñе архивира"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Ðепознат файлов тип; файлът Ñе пренебрегва"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "Ðеархивирани връзки Ñ %s.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: файлът не е променен; не Ñе архивира"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: файлът е архив; не Ñе архивира"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Файлът бе изтрит преди да бъде прочетен"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: каталогът е обозначен като кеш; не Ñе архивира"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: файлът бе изменен по време на четене"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: гнездото Ñе пренебрегва"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: пренебрегва Ñе ÑпециалниÑÑ‚ файл тип door"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "ПропуÑка Ñе до ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ð·Ð°Ð³Ð»Ð°Ð²ÐµÐ½ запиÑ"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Изтрива Ñе незаглавен Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ архива"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: запиÑано е невероÑтно Ñтаро време %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: запиÑано е време %s, което е %s Ñек. в бъдещето"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Ðеочаквана неÑъглаÑуваноÑÑ‚ при Ñъздаване на каталог"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+"%s: каталогът бе преименуван преди да може да Ñе извлече ÑÑŠÑтоÑнието му"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Продължаващи файлове Ñе извличат като обикновени файлове"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Опитва Ñе извличането на Ñимволни връзки като твърди"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Чете Ñе %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Ðе може да Ñе извлича -- файлът продължава Ñ Ð´Ñ€ÑƒÐ³ том"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Ðеочаквано дълъг заглавен запиÑ"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Ðепознат файлов тип „%c“, извлича Ñе като обикновен файл"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "ТекущиÑÑ‚ %s е по-нов или ÑÑŠÑ Ñъщата възраÑÑ‚"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Ðе можа да Ñе направи резервно копие на този файл"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Бе невъзможно %s да Ñе преименува на %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Грешката е непоправима: край на изпълнението"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Каталогът бе преименуват от %s"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Каталогът бе преименуван"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Каталогът е нов"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "ЗапиÑано е неправилно време"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Ðеправилно време на промÑна (Ñекунди)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Ðеправилно време на промÑна (наноÑекунди)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Ðеправилен номер на уÑтройÑтво"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Ðеправилен номер на i-възел"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Твърде дълго поле при четене на snapshot-файл"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Грешка при четене в snapshot-файл"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Ðеочакван край на snapshot-файл"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Ðеочаквана ÑтойноÑÑ‚ на поле в snapshot-файл"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "ЛипÑва завършител на запиÑа"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Грешен инкрементален файлов формат"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "Ðеподдържана верÑÐ¸Ñ Ð½Ð° инкрементален формат: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "Лошо формиран dumpdir: очаква Ñе „%c“, а вмеÑто това има %#3o"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Лошо формиран dumpdir: „X“ е дублиран"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Лошо формиран dumpdir: празно име в „R“"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Лошо формиран dumpdir: „T“ не Ñе предхожда от „R“"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Лошо формиран dumpdir: празно име в „T“"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr "Лошо формиран dumpdir: очаква Ñе „%c“, вмеÑто това данните Ñвършват"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "Лошо формиран dumpdir: „X“ никога не Ñе използва"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Ðе може да Ñе Ñъздаде временен каталог, използвайки шаблона %s"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Каталогът не Ñе изчиÑтва: не може да Ñе доÑтъпи"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: каталогът е на друго уÑтройÑтво: не Ñе изчиÑтва"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Изтрива Ñе %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Ðе може да Ñе изтрие"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: ПропуÑка Ñе"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "блок %s: ** Блок от знаци NUL **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Изолиран блок от нули при %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "блок %s: ** Край на файла **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "блок %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Интервали в заглавен Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¼ÐµÑто чиÑлова ÑтойноÑÑ‚ на %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"ОÑмичната ÑтойноÑÑ‚ %.*s в архива е извън диапазона за %s; предполага Ñе, че "
+"е допълнение до две"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "ОÑмичната ÑтойноÑÑ‚ %.*s в архива е извън диапазона за %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Ðрхивът Ñъдържа архаични заглавни запиÑи по модул 64 (6 битови)"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+"Ðрхивът е подпиÑан Ñ Ð½Ð¸Ð· по модул 64 %s, който е е извън диапазона за %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "СтойноÑтта по модул 256 в архива е извън диапазона %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Ðрхивът Ñъдържа %.*s, вмеÑто това Ñе очаква чиÑлова ÑтойноÑÑ‚ на %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "СтойноÑтта %s в архива е извън допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ за %s (%s..%s)"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " връзка към %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " непознат файлов тип %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Дълга връзка--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Дълго име--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Заглавен Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° тома--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Продължава при байт %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Създава Ñе каталог:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Преименува Ñе %s на %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Ðе може да Ñе преименува на %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Преименува Ñе %s обратно на %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Ðе може да Ñе запази работниÑÑ‚ каталог"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Ðе може да Ñе Ñмени работниÑÑ‚ каталог"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "породен процеÑ"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "междупроцеÑен канал"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Във файловите имена Ñа използвани „*“ и „?“. МолÑ,"
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr "използвайте --wildcards, за да позволите ÑъпоÑтавÑне Ñ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð¸,"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "или --no-wildcards, за да не Ñе извежда това предупреждение."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Ðе е открит в архива"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Ðеобходимо Ñрещане не е открито в архива"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "И двете опции „-%s“ и „-%s“ изиÑкват Ñтандартен вход"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Ðеправилен архивен формат"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "ПоиÑкани Ñа ГÐУ-възможноÑти при неÑъвмеÑтим архивен формат"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Ðепознат начин за извеждане на Ñпец. знаци „%s“. Използвайте „%s --quoting-"
+"style=help“, за да получите ÑпиÑък."
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"„Tar“ на ГÐУ запазва поÑледователно много файлове в един лентов или диÑков "
+"архив и може да възÑтановÑва в поÑледÑтвие отделни файлове от архива.\n"
+"\n"
+"Примери:\n"
+" tar -cf архив.tar дрън брън # Създава архив.tar от файловете дрън и брън\n"
+" tar -tvf архив.tar # Изрежда подробно вÑички файлове в архив."
+"tar\n"
+" tar -xf архив.tar # Извлича от архив.tar вÑички файлове\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"СуфикÑÑŠÑ‚ за резервни ÐºÐ¾Ð¿Ð¸Ñ Ðµ „~“, оÑвен при промÑна Ñ --suffix или Ñ\n"
+"променлива от обкръжението SIMPLE_BACKUP_SUFFIX. Методът за управление на\n"
+"верÑиите може да Ñе поÑочва Ñ --backup или Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð»Ð¸Ð²Ð°Ñ‚Ð° VERSION_CONTROL.\n"
+"ДопуÑтими ÑтойноÑти Ñа:\n"
+"\n"
+" none, off никога да не Ñе правÑÑ‚ резервни копиÑ\n"
+" t, numbered да Ñе правÑÑ‚ номерирани резервни копиÑ\n"
+" nil, existing номерирани, ако вече Ñа правени номерирани, а проÑти "
+"иначе\n"
+" never, simple винаги да Ñе правÑÑ‚ проÑти резервни копиÑ\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Вид оÑновно дейÑтвие:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "изрежда Ñъдържанието на архив"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "извлича файлове от архива"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "Ñъздава нов архив"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "намира разликите между архива и файловата ÑиÑтема"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "Ð´Ð¾Ð±Ð°Ð²Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ðµ в ÐºÑ€Ð°Ñ Ð½Ð° архив"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "Ð´Ð¾Ð±Ð°Ð²Ñ Ñамо файлове, по-нови от копието в архива"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "Ð¿Ñ€Ð¸Ð±Ð°Ð²Ñ tar-файлове към архива"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "трие файлове от архива (не при магнитни ленти!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "проверÑва етикета на тома и завършва"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Модификатори на дейÑтвието:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "работи ефективно Ñ Ñ€Ð°Ð·Ñ€ÐµÐ´ÐµÐ½Ð¸ файлове"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "ГОЛЯМ[.ÐœÐЛЪК]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr "Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð²ÐµÑ€ÑиÑта на формата разредени файлове (влече --sparse)"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "ÑÑŠÑ Ñтар формат ГÐУ за инкрементално архивиране"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "ФÐЙЛ"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "Ñ Ð½Ð¾Ð²Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ на ГÐУ за инкрем. архивиране"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "при нечитаеми файлове не завършва Ñ Ð³Ñ€ÐµÑˆÐºÐ°"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "N"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"обработва Ñамо N-тото Ñрещане на вÑеки файл в архива; тази Ð¾Ð¿Ñ†Ð¸Ñ Ðµ правилна "
+"Ñамо в Ñъчетание Ñ ÐµÐ´Ð½Ð° от подкомандите --delete, --diff, --extract или --"
+"list и когато ÑпиÑъкът от файлове е зададен или на ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´, или Ñ "
+"Ð¾Ð¿Ñ†Ð¸Ñ -T. Ðко не е поÑочен N, Ñе подразбира 1."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "архивът е Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÐµÐ½ доÑтъп"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "Регулиране замеÑтването на файлове:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "Ñлед запиÑа опитва да провери архива"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "изтрива файловете Ñлед като ги добави в архива"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "при извличане не замеÑтва ÑъщеÑтвуващи файлове"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"не замеÑтва ÑъщеÑтвуващи файлове, ако Ñа по-нови от копиÑта им в архива"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "при извличане замеÑтва ÑъщеÑтвуващи файлове"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "изтрива вÑеки файл преди да извлича върху него"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "изпразва йерархиÑта преди извличане на каталог"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "запазва метаданните на ÑъщеÑтвуващи каталози"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"при извличане замеÑтва метаданните на ÑъщеÑтвуващи каталози (подразбира Ñе)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Избор на изходен поток:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "извлича файловете на ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "КОМÐÐДÐ"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "подава Ñ ÐºÐ°Ð½Ð°Ð» вÑеки извлечен файл към КОМÐÐДÐ"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "игнорира кода на завършване на породени процеÑи"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "Ñчита за грешка вÑеки ненулев код на завършване на породен процеÑ"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Подход ÑпрÑмо файловите атрибути:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "прави ИМЕ да е ÑобÑтвеник на добавените файлове"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "прави ИМЕ да бъде групата на добавените файлове"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "ДÐТÐ-ИЛИ-ФÐЙЛ"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "прави времето на промÑна на добавÑни файлове като ДÐТÐ-ИЛИ-ФÐЙЛ"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "ПРОМЕÐИ"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "модифицира режима за доÑтъп на добавени файлове"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "МЕТОД"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"запазва времената на доÑтъп на архивираните файлове като или възÑтановÑва "
+"времената Ñлед четене (при МЕТОД=„replace“, подразбира Ñе), или не Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ "
+"имената изобщо (МЕТОД=„system“)"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "не извлича времето на промÑна на файловете"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "опитва да възÑтановÑва ÑобÑтвеноÑтта на файловете"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "извлича файловете от ваше име"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "използва чиÑла вмеÑто имена за потребител и група"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+"възÑтановÑва точно (без umask) режима на доÑтъп (подразбира Ñе при "
+"привилегирован потребител)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"прилага umask на Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¸ извличане на файлове (подразбира Ñе при "
+"обикновен потребител)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "файловете за извличане Ñа Ñортирани Ñпоред архива"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "Ñъщото като едновременно -p и -s"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"Ð·Ð°Ð±Ð°Ð²Ñ Ð½Ð°Ñтройката на времето на промÑна и режима за доÑтъп на извличаните "
+"каталози докато извличането завърши"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "Ð¾Ñ‚Ð¼ÐµÐ½Ñ ÐµÑ„ÐµÐºÑ‚Ð° на --delay-directory-restore"
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Избор на уÑтройÑтво и ÑмÑна:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ÐРХИВ"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "използва Ð°Ñ€Ñ…Ð¸Ð²Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» или уÑтройÑтво ÐРХИВ"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "архивниÑÑ‚ файл е локален дори при двуеточие"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "използва поÑочената КОМÐÐДРвмеÑто rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "използва поÑочената КОМÐÐДРвмеÑто rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "поÑочва уÑтройÑтво и гъÑтота"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "Ñъздава/извежда/извлича многотомен архив"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "ÑмÑна на лентата Ñлед Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° 1024 x N байта"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "изпълнÑва Ñкрипт в ÐºÑ€Ð°Ñ Ð½Ð° вÑÑка лента (влече -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "ползва от и обновÑва във ФÐЙЛ номера на тома"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Блокуване на уÑтройÑтвото:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "БЛОКОВЕ"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "БЛОКОВЕ x 512 байта в Ñекунда"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "прави N-байтови запиÑи, кратно на 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "пренебрегва блоковете от нули и продължава"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "преформира при четене блоковете (канали 4.2BSD)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Избор на архивен формат:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "ФОРМÐТ"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "Ñъздава архив Ñ Ð¿Ð¾ÑÐ¾Ñ‡ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "ФОРМÐТ е нÑкой от Ñледните:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "Ñтар формат tar, V7"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "формат на ГÐУ при tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "формат на верÑÐ¸Ñ 1.13.x на tar на ГÐУ"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "формат POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "формат POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "Ñъщото като pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "Ñъщото като --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "Ñъщото като --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "ключдума[[:]=ÑтойноÑÑ‚][,ключдума[[:]=ÑтойноÑÑ‚]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "управлÑващи ключови думи за pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "ТЕКСТ"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"Ñъздава архив Ñ Ð¸Ð¼Ðµ на том ТЕКСТ; при извеждане или извличане ÑравнÑва името "
+"на тома Ñ Ð¢Ð•ÐšÐ¡Ð¢"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "прекарва архива през bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "прекарва архива през gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "прекарва архива през compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "ПРОГ"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "прекарва архива през ПРОГ (Ñ‚Ñ€Ñбва да приема -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Избор на локален файл:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"Ð´Ð¾Ð±Ð°Ð²Ñ Ð¿Ð¾ÑÐ¾Ñ‡ÐµÐ½Ð¸Ñ Ð¤ÐЙЛ към архива (полезно е, ако името му започва Ñ Ð¼Ð¸Ð½ÑƒÑ)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "КÐТ"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "работи в каталога КÐТ"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "взема имената за извличане или Ñъздаване от ФÐЙЛ"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T чете имена, завършващи Ñ Ð½ÑƒÐ»ÐµÐ² байт"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr "декодира „\\“ във файловите имена на -T (подразб.)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "не декодира „\\“ във файловите имена на -T"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "ОБРÐЗЕЦ"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "без файловете, отговарÑщи на ОБРÐЗЕЦ"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "пропуÑка файловете, отговарÑщи на образци в ФÐЙЛ"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "без каталози, обозначени като кеширащи"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "без каталози, обозначени като кеширащи"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "без каталози, обозначени като кеширащи"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "без каталози, обозначени като кеширащи"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "без каталози, обозначени като кеширащи"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "без каталози, обозначени като кеширащи"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "без автоматично влизане в подкаталозите"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "работи в рамките на локалната файлова ÑиÑтема"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "влиза рекурÑивно в подкаталозите (подразбира Ñе)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "не маха „/“ в началото на файлови имена"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr "Ñледва Ñимв. връзки; архивира Ñочените файлове"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "ЧЛЕÐ-ИМЕ"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "започва от файл Ñ Ð¸Ð¼Ðµ ЧЛЕÐ-ИМЕ в архива"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "ÑъхранÑва Ñамо файлове, по-нови от ДÐТÐ-ИЛИ-ФÐЙЛ"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "ДÐТÐ"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "ÑравнÑва времето Ñамо ако данните Ñа променени"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "МЕТОД"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "резервно копира ÑъщеÑтвуващи файлове Ñ ÐœÐ•Ð¢ÐžÐ”"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "ÐИЗ"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"резервно копира преди да трие, използвайки ÐИЗ вмеÑто Ð¾Ð±Ð¸Ñ‡Ð°Ð¹Ð½Ð¸Ñ ÑÑƒÑ„Ð¸ÐºÑ („~“, "
+"оÑвен ако не е бил Ñменен Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð»Ð¸Ð²Ð°Ñ‚Ð° от обкръжението "
+"SIMPLE_BACKUP_SUFFIX)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Промени на файловите имена:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "при извличане маха N начални каталози от файловите пътеки"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "ИЗРÐЗ"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+"преобразува файловите имена, използвайки поÑÐ¾Ñ‡ÐµÐ½Ð¸Ñ Ð˜Ð—Ð ÐЗ за замÑна на sed"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+"СъпоÑтавÑне Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¸ имена (влиÑе и на включващи, и на изключващи образци):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "пренебрегва разликата между големи/малки букви"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "ÑъпоÑтавÑнето Ñ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð¸Ñ‚Ðµ започва от началото на файловото име"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "ÑъпоÑтавÑнето започва Ñлед кой да е „/“ (подразбира Ñе при изключване)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "отчита Ñе разликата между малки и големи букви (подразбира Ñе)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "ползва „*“ и „?“ (подразбира Ñе за изключване)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "доÑловно низово Ñравнение"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "„/“ не паÑва Ñ â€ž*“ и „?“"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "„/“ паÑва Ñ â€ž*“ и „?“ (подразб. за изключване)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Извеждане на информациÑ:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "подробно изрежда обработените файлове"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]N"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "извежда напредъка Ñлед вÑеки N-ти Ð·Ð°Ð¿Ð¸Ñ (подразбира Ñе 10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "Ñъобщава, ако не вÑички твърди връзки Ñа включени"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "СИГÐÐЛ"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"извежда Ð¾Ð±Ñ‰Ð¸Ñ Ð±Ñ€Ð¾Ð¹ байтове Ñлед обработването на архива; Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚ - "
+"извежда текущите байтове при получаване на СИГÐÐЛ. ДопуÑтими СИГÐÐЛи Ñа "
+"SIGHUP, SIGQUIT, SIGINT, SIGUSR1 и SIGUSR2; имената без SIG Ñъщо Ñа позволени"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "извежда времената по Гринуич"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "изпраща Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´ във ФÐЙЛ"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "показва номера на блок в архива Ñ Ð²ÑÑко Ñъобщение"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "изиÑква потвърждение за вÑÑко дейÑтвие"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "показва подразбираното от tar"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"при извеждане или извличане изрежда вÑеки каталог, който Ñе пропуÑка по "
+"нÑкаква причина"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "показва преобразуваните файлови имена в архива"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "ÐÐЧИÐ"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+"начин за цитиране на Ñпециални знаци; вж. по-долу за ÑтойноÑтите на ÐÐЧИÐ"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "работи и ÑÑŠÑ Ð·Ð½Ð°Ñ†Ð¸Ñ‚Ðµ от ÐИЗ като ÑÑŠÑ Ñпециални"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "не работи ÑÑŠÑ Ð·Ð½Ð°Ñ†Ð¸Ñ‚Ðµ от ÐИЗ като ÑÑŠÑ Ñпециални"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Опции за ÑъвмеÑтимоÑÑ‚:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"при Ñъздаване е Ñъщото като --old-archive; при извличане е Ñъщото като --no-"
+"same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Други опции:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "забранÑва нÑкои потенциално опаÑни опции"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Ðе може да Ñе използва повече от една Ð¾Ð¿Ñ†Ð¸Ñ â€ž-Acdtrux“"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Противоречащи Ñи опции за компреÑиране"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Ðепознато име на Ñигнал: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Ðе е открит еталлонниÑÑ‚ файл за дата"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Използва Ñе %s вмеÑто Ð½ÐµÐ¿Ð¾Ð·Ð½Ð°Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² формат за дата %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "ÐžÐ¿Ñ†Ð¸Ñ %s: Датата „%s“ Ñе разглежда като %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: файловиÑÑ‚ ÑпиÑък вече е прочетен"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: файловото име Ñъдържа нулев байт"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "Правилни аргументи за опциите --quoting-style Ñа:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Този* tar подразбира Ñледното:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Ðеправилен фактор за блокуване"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Внимание: опциÑта -I не Ñе поддържа. Може би имате предвид -j или -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Ðеправилна дължина на лента"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Повече от една ограничителна дата"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "Ðеправилна верÑÐ¸Ñ Ð½Ð° формат разредени файлове"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' не Ñе поддържа на тази платформа"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "ÑтойноÑтта на --checkpoint не е цÑло чиÑло"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Ðеправилна група"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Ðа Ð¾Ð¿Ñ†Ð¸Ñ Ðµ подаден неправилен режим"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Ðеправилно чиÑло"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Ðеправилен ÑобÑтвеник"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Ðеправилен размер на запиÑ"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Размерът на Ð·Ð°Ð¿Ð¸Ñ Ñ‚Ñ€Ñбва да е кратен на %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Ðеправилен брой елементи"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "ПозволÑва Ñе Ñамо една Ð¾Ð¿Ñ†Ð¸Ñ --to-command"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Лошо образуван аргумент за гъÑтота: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Ðепозната гъÑтота: „%c“"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Опциите „-[0-7][lmh]“ не Ñе поддържат от *този* tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[ФÐЙЛ]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Старата Ð¾Ð¿Ñ†Ð¸Ñ â€ž%c“ изиÑква аргумент."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "без ÑпиÑък файлове опциÑта --occurrence е безÑмиÑлена"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "не може да Ñе използва --occurrence при Ð¿Ð¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð½Ð°Ñ‡Ð¸Ð½ на работа"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Използването на много архивни файлове изиÑква Ð¾Ð¿Ñ†Ð¸Ñ â€ž-M“"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Ðе може да Ñе Ñъчетават --listed-incremental Ñ --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Етикетът на тома е твърде дълъг (не повече от %lu байт)"
+msgstr[1] "%s: Етикетът на тома е твърде дълъг (не повече от %lu байта)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Ðе може да Ñе проверÑват многотомни архиви"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Ðе може да Ñе проверÑват компреÑирани архиви"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Ðе може да Ñе използват многотомни компреÑирани архиви"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Ðе може да Ñе ÑъединÑват компреÑирани архиви"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+"опциÑта --pax-option може да Ñе използва Ñамо при архиви във формат POSIX"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Страхлив отказ да Ñе Ñъздава празен архив"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Опциите „-Aru“ Ñа неÑъвмеÑтими Ñ â€ž-f -“"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "ТрÑбва да поÑочите поне една от опциите „-Acdtrux“"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Изходът Ñ Ð³Ñ€ÐµÑˆÐºÐ° бе забавен поради предхождащи грешки"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Файлът Ð½Ð°Ð¼Ð°Ð»Ñ Ñ %s байт"
+msgstr[1] "%s: Файлът Ð½Ð°Ð¼Ð°Ð»Ñ Ñ %s байта"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Ключовата дума %s е непозната или вÑе още не е реализирана"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Образецът %s не може да Ñе използва"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Ключовата дума %s не може да Ñе отмени"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Лошо формиран разширен заглавен запиÑ: не е поÑочена дължина"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "Дължината на разширен заглавен Ð·Ð°Ð¿Ð¸Ñ Ðµ извън допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Дължината %*s на разширен заглавен Ð·Ð°Ð¿Ð¸Ñ Ðµ извън допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "Лошо формиран разширен заглавен запиÑ: липÑва интервал Ñлед дължината"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Лошо формиран разширен заглавен запиÑ: липÑва знак за равенÑтво"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Лошо формиран разширен заглавен запиÑ: липÑва знак за нов ред"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+"Пренебрегва Ñе непознатата ключова дума „%s“ за разширен заглавен запиÑ"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+"Генерираната двойка <ключова дума, ÑтойноÑÑ‚> е твърде дълга (ключова дума=%"
+"s, дължина=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "РазширениÑÑ‚ заглавен Ð·Ð°Ð¿Ð¸Ñ %s=%s е извън диапазона %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Ðеправилно формиран разширен заглавен запиÑ: неправилен %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Ðеправилно формиран разширен заглавен запиÑ: прекомерен %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+"Лошо формиран разширен заглавен запиÑ: неправилен %s; очаква Ñе разделител %c"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+"Лошо формиран разширен заглавен запиÑ: неправилен %s; нечетен брой ÑтойноÑти"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile борави Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²ÐµÑ‚Ðµ Ñ Ð´Ð°Ð½Ð½Ð¸ за теÑÑ‚Ð¾Ð²Ð¸Ñ Ð¿Ð°ÐºÐµÑ‚ GNU paxutils.\n"
+"ОПЦИИТЕ Ñа:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Опции за Ñъздаването на файл:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "РÐЗМЕР"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Създава файл Ñ Ð¿Ð¾ÑÐ¾Ñ‡ÐµÐ½Ð¸Ñ Ð ÐЗМЕР"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð²ÑŠÐ² файл ИМЕ вмеÑто на ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Чете файловите имена от ФÐЙЛ"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T чете имена, завършващи Ñ Ð½ÑƒÐ»ÐµÐ² байт"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+"Попълва файла Ñ Ð¿Ð¾ÑÐ¾Ñ‡ÐµÐ½Ð¸Ñ ÐžÐ‘Ð ÐЗЕЦ. ОБРÐЗЕЦ може да бъде „default“ или „zeros“"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Размер на блок за разреден файл"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+"Генерира разреден файл. ОÑтаналата чаÑÑ‚ от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´ дава карта на файла."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "Ñлед запиÑа опитва да провери архива"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Опции за файлови ÑтатиÑтики:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"Извежда Ñъдържанието на Ñтруктурата stat за вÑеки файл. По подразбиране "
+"ФОРМÐТ е: "
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Опции за Ñинхронизирано изпълнение:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"ИзпълнÑва поÑочената КОМÐÐДÐ. Полезно Ñ --checkpoint и нÑÐºÐ¾Ñ Ð¾Ñ‚ --cut, --"
+"append, --touch"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+"ИзпълнÑва поÑоченото дейÑтвие (вж. по-долу) до доÑтигането на контролна "
+"точка N"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "ПоÑочва дата за Ñледващата Ð¾Ð¿Ñ†Ð¸Ñ --touch"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "Извежда изпълнените контролни точки и кода на завършване на КОМÐÐДÐ"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Синхронизирано изпълнение на дейÑтвиÑта. Те Ñе изпълнÑват когато Ñе доÑтигне "
+"контролната точка Ñ Ð½Ð¾Ð¼ÐµÑ€, поÑочен Ñ --checkpoint."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"ОтÑича ФÐЙЛ до размера, определен Ñ Ð¿Ñ€ÐµÐ´Ñ…Ð¾Ð¶Ð´Ð°Ñ‰Ð° Ð¾Ð¿Ñ†Ð¸Ñ --length (подразбира "
+"Ñе 0)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+"Ð”Ð¾Ð±Ð°Ð²Ñ Ð ÐЗМЕР байтове към ФÐЙЛ. РÐЗМЕРът Ñе Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð¾Ñ‚ предхождаща Ð¾Ð¿Ñ†Ð¸Ñ --"
+"length."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "ОбновÑва времето на доÑтъп и промÑна на FILE"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "ИзпълнÑва КОМÐÐДÐ"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Ðеправилен размер: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Ðомер извън допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Отрицателен размер: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "не уÑÐ¿Ñ stat(%s)"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Грешка при анализа на чиÑло до „%s“"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Ðепознат формат за дата"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ÐРГУМ...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "Ðе може да Ñе отвори „%s“"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "Ðе може да Ñе изпълни %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "името на файла Ñъдържа нулев байт"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"не може да Ñе Ñъздават разредени файлове на ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´, използвайте "
+"опциÑта --file"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "неправилна маÑка (до „%s“)"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "Ðепознато поле „%s“"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "не може да Ñе Ñмени времето на „%s“"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Командата завърши уÑпешно\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Командата завърши Ñ ÐºÐ¾Ð´ %d\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Командата бе прекратена ÑÑŠÑ Ñигнал %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Командата бе ÑпрÑна ÑÑŠÑ Ñигнал %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Командата генерира core\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Командата бе прекратена\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "--stat изиÑква файлови имена"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "твърде много аргументи"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Грешка при четене при байт %s, чете Ñе %lu байт"
+#~ msgstr[1] "%s: Грешка при четене при байт %s, четат Ñе %lu байта"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Съкратени имена на файлове--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Ðеочакван край EOF в Ñъкратени имена"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Преиманувано %s на %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Ðевъзможна Ñимволна връзка към %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Символна връзка %s към %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Ðепозната команда за оправÑне на Ñъкратени имена %s"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "ЗапиÑано е време извън допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
+
+#~ msgid "Modification time (seconds) out of range"
+#~ msgstr "Времето на промÑна (Ñекунди) е извън допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
+
+#~ msgid "Modification time (nanoseconds) out of range"
+#~ msgstr "Времето на промÑна (наноÑекунди) е извън допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Ðомерът на уÑтройÑтво е извън допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
+
+#~ msgid "Error reading time stamp"
+#~ msgstr "Грешка при четене на запиÑаното време"
+
+#~ msgid "Unexpected EOF"
+#~ msgstr "Ðеочакван EOF"
+
+#~ msgid "same as -N"
+#~ msgstr "Ñъщото като -N"
+
+#~ msgid ""
+#~ "creating multi-volume archives in posix format requires using --tape-"
+#~ "length (-L) option"
+#~ msgstr ""
+#~ "Ñъздаването на многотомен архив във формат POSIX изиÑква Ð¾Ð¿Ñ†Ð¸Ñ --tape-"
+#~ "length (-L)"
+
+#~ msgid "Cannot close file #%d"
+#~ msgstr "Ðе може да Ñе затвори файл #%d"
+
+#~ msgid "Cannot close descriptor %d"
+#~ msgstr "Ðе може да Ñе затвори деÑкриптор %d"
+
+#~ msgid "Cannot properly duplicate %s"
+#~ msgstr "Ðе може да Ñе клонира правилно %s"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Ðе може да Ñе използват компреÑирани или отдалечени архиви"
+
+#~ msgid "Cannot open pipe"
+#~ msgstr "Ðе може да Ñе отвори именован канал"
+
+#~ msgid "Cannot fork"
+#~ msgstr "Ðе може да Ñе породи процеÑ"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (потомък)"
+
+#~ msgid "(child) Pipe to stdin"
+#~ msgstr "(потомък) Именован канал към Ñтандартен изход"
+
+#~ msgid "Cannot open archive %s"
+#~ msgstr "Ðе може да Ñе отвори архив %s"
+
+#~ msgid "Archive to stdout"
+#~ msgstr "Ðрхив на ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´"
+
+#~ msgid "Child cannot fork"
+#~ msgstr "Потомъкът не може да породи процеÑ"
+
+#~ msgid "((child)) Pipe to stdout"
+#~ msgstr "((потомък)) Именован канал към ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (подпотомък)"
+
+#~ msgid "(grandchild) Pipe to stdin"
+#~ msgstr "(подпотомък) Именован канал към ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´"
+
+#~ msgid "Cannot read from compression program"
+#~ msgstr "Ðе може да Ñе чете от компреÑиращата програма"
+
+#~ msgid "(child) Pipe to stdout"
+#~ msgstr "(потомък) Именован канал към ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´"
+
+#~ msgid "((child)) Pipe to stdin"
+#~ msgstr "((потомък)) Именован канал към ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´"
+
+#~ msgid "(grandchild) Pipe to stdout"
+#~ msgstr "(подпотомък) Именован канал към ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´"
+
+#~ msgid "Cannot write to compression program"
+#~ msgstr "Ðе може да Ñе пише към компреÑиращата програма"
+
+#~ msgid "Write to compression program short %d bytes"
+#~ msgstr "ЗапиÑÑŠÑ‚ към компреÑиращата програма е по-ÐºÑŠÑ Ñ %d байта"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "Ð’ÐИМÐÐИЕ: Томът е без заглавна чаÑÑ‚"
+
+#~ msgid "Archive %s EOF not on block boundary"
+#~ msgstr "EOF на архив %s не е на границата на блок"
+
+#~ msgid "Only read %d bytes from archive %s"
+#~ msgstr "Прочетени Ñа Ñамо %d байта от архив %s"
+
+#~ msgid "WARNING: Cannot close %s (%d, %d)"
+#~ msgstr "Ð’ÐИМÐÐИЕ: Ðе може да Ñе затвори %s (%d, %d)"
+
+#~ msgid "Child died with signal %d%s"
+#~ msgstr "Потомъкът е прекратен чрез Ñигнал %d%s"
+
+#~ msgid "Cannot fork!"
+#~ msgstr "Ðе може да Ñе породи процеÑ!"
+
+#~ msgid "Cannot exec a shell %s"
+#~ msgstr "Ðе може да Ñе изпълни командната обвивка %s"
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/cs.gmo b/po/cs.gmo
new file mode 100644
index 0000000..63c5126
--- /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..c80648d
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,2865 @@
+# Czech translations for GNU tar
+# Copyright (C) 1997 Free Software Foundation, Inc.
+# Vladimir Michl <Vladimir.Michl@seznam.cz>, 1997.
+#
+# For gettext >= 0.10.36
+# Note: Indexes for plurals (on file example):
+# 0 - 1,21,31,101,... soubor
+# 1 - 2-4,22-24,...,102-104,122-124,... soubory
+# 2 - 0,5-10,11-19,20,25-30,35-40,...,100,105-110,... souboru
+#
+# "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);
+# "
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.13.21\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2001-09-01 10:55+0200\n"
+"Last-Translator: Vladimir Michl <Vladimir.Michl@seznam.cz>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argument %s je pro %s neplatný"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argument %s není pro %s jednoznaèný"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Platné argumenty jsou:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Pou¾ití: %s [PØEPÍNAÈ]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Více informací získáte pøíkazem `%s --help'.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+" Chyby v programu oznamujte na adrese <bug-tar@gnu.org> (pouze anglicky),\n"
+"pøipomínky k pøekladu zasílejte na adresu <cs@li.org> (èesky).\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Neznámá systémová chyba"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: pøepínaè `%s' vy¾aduje argument\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: pøepínaè `%s' není jednoznaèný\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, 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"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%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:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: pøepínaè `%s' vy¾aduje argument\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: neznámý pøepínaè `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: neznámý pøepínaè `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: neznámý pøepínaè -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: neznámý pøepínaè -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: pøepínaè vy¾aduje argument -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: pøepínaè `-W %s' není jednoznaèný\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, 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"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "velikost bloku"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "pamì» vyèerpána"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Nelze %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Varování: Nelze %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Práva nelze zmìnit na %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Vlastnictví nelze zmìnit na uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Pevný odkaz na %s nelze vytvoøit"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Chyba pøi ètení na bajtu %s, ètení %lu bajtù"
+msgstr[1] "%s: Chyba pøi ètení na bajtu %s, ètení %lu bajtù"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Varování: Chyba pøi ètení na bajtu %s, ètení %lu bajtù"
+msgstr[1] "%s: Varování: Chyba pøi ètení na bajtu %s, ètení %lu bajtù"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Nelze zmìnit pozici v souboru na %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Varování: Ukazatel v souboru nelze pøemístit na %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Symbolický odkaz na `%s' nelze vytvoøit"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Zapsáno pouze %lu z %lu bajtù"
+msgstr[1] "%s: Zapsáno pouze %lu z %lu bajtù"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Odstraòuji úvodní `%.*s' z názvù souborù"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Odstraòuji úvodní `%.*s' z názvù souborù"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "Odstraòuji úvodní `%.*s' z názvù souborù"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Slu¾ba není k dispozici"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Vzdálený shell není mo¾né spustit"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Místo pro buffer není mo¾né alokovat\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Místo pro buffer není mo¾né alokovat"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Více informací získáte pøíkazem `%s --help'.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Pou¾ití: %s [PØEPÍNAÈ]\n"
+"Manipuluje s archivem pøijímaje pøíkazy vzdáleného procesu.\n"
+"\n"
+" --version Vypí¹e oznaèení verze\n"
+" --help Vypí¹e tuto nápovìdu\n"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+" Chyby v programu oznamujte na adrese <bug-tar@gnu.org> (pouze anglicky),\n"
+"pøipomínky k pøekladu zasílejte na adresu <cs@li.org> (èesky).\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Velikost pozice v souboru je mimo rozsah"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Velikost pozice v souboru je mimo rozsah"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Smìr posunu v souboru je mimo rozsah"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Pøedèasný konec souboru\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Pøedèasný konec souboru"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Neznámý pøíkaz"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Celkem zapsáno bajtù: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Celkem zapsáno bajtù: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(roura)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Chybná hodnota pro velikost záznamu"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Název archivu nebyl zadán"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Stdin/Stdout archiv nelze ovìøit"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Komprimovaný archiv nelze aktualizovat"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Zapisuji testovací bod %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Ètení testovacího bodu %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Páska na zaèátku, konèím"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Pøíli¹ mnoho chyb, konèím"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Nezarovnaný blok (%lu bajtù) v archivu"
+msgstr[1] "Nezarovnaný blok (%lu bajtù) v archivu"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Velikost záznamu = %lu blokù"
+msgstr[1] "Velikost záznamu = %lu blokù"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "V archivu se nelze vrátit, bez -i mù¾e být neèitelný"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: obsahuje neplatné èíslo svazku"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "U èísla svazku nastalo pøeteèení"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Pøipravte svazek #%d pro archiv %s a stisknìte return:"
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Místo u¾ivatelské odpovìdi byl zadán konec souboru"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "VAROVÁNÍ: Archiv je nekompletní"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [name] Zadání nového názvu pro dal¹í (a následující) svazek(ky)\n"
+" q Ukonèení programu tar\n"
+" ! Vytvoøení podshell\n"
+" ? Vypísání této nápovìdy\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Není nový svazek; konèím.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "pøíkaz `%s' selhal"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Toto pravdìpodobnì není tar archiv"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s nepokraèuje na tomto svazku"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s nepokraèuje na tomto svazku"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s je ¹patné délky (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Tento svazek není následníkem pøedchozího"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Pro vyhodnocení vzorku `%s' musí být archiv pojmenován"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Svazek %s neodpovídá vzorku %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Lze èíst pouze %lu z %lu bajtù"
+msgstr[1] "Lze èíst pouze %lu z %lu bajtù"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Obsah se li¹í"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Neoèekávaný konec archivu"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Typ souboru se li¹í"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Práva se li¹í"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid se li¹í"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid se li¹í"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Èas poslední modifikace se li¹í"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Velikost se li¹í"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Není odkazem na %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symbolický odkaz se li¹í"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Èíslo zaøízení se li¹í"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Ovìøuji "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Neznámý typ souboru '%c', porovnáván jako normální soubor"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "CHYBNÉ OVÌØENÍ: chybných hlavièek detekováno: %d"
+msgstr[1] "CHYBNÉ OVÌØENÍ: chybných hlavièek detekováno: %d"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: soubor je archiv; nearchivován"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "hodnota %s typu %s je mimo rozsah %s..%s; nahrazuji za %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "hodnota %s typu %s je mimo rozsah %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Generuji záporné osmièkové hlavièky"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: soubor není zmìnìn; neaktualizován"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: soubor není zmìnìn; neaktualizován"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: soubor není zmìnìn; neaktualizován"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Soubor je krat¹í o bajtù: %s; Doplòuji nulami."
+msgstr[1] "%s: Soubor je krat¹í o bajtù: %s; Doplòuji nulami."
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: soubor je na jiném souborovém systému; nearchivován"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Neznámý typ souboru; soubor ignorován"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " odkaz na %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: soubor není zmìnìn; neaktualizován"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: soubor je archiv; nearchivován"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Soubor smazán døíve ne¾ mohl být èten"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: soubor je archiv; nearchivován"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: soubor byl bìhem ètení zmìnìn"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: soket ignorován"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: dveøe ignorovány"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Pøeskakuji na dal¹í hlavièku"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Z archivu je mazáno to, co není hlavièka"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: èasová znaèka %s je %lu s v budoucnosti"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Neoèekávaná inkonzistence, pøi vytváøení adresáøe"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Souvisle ulo¾ené soubory rozbaluji jako obyèejné soubory"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Zkou¹ím rozbalit symbolické odkazy jako pevné odkazy"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Ètení z %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Nelze rozbalit -- soubor je pokraèováním jiného svazku"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Neoèekávaný konec v rozsekaném názvu"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Neznámý typ souboru `%c', rozbalen jako normální soubor"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Tento soubor nebylo mo¾né zálohovat"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: nelze pøejmenovat na %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Z chyby se nelze zotavit: ukonèuji se"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Adresáø byl pøejmenován"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Adresáø byl pøejmenován"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Adresáø je nový"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Neplatný èas souboru"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Zadána chybná práva"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Neplatné èíslo zaøízení"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Neplatné èíslo i-uzlu"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Neoèekávaný konec archivu"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Pro blokový faktor (blokù na záznam) %d není mo¾né alokovat pamì»"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: soubor je na jiném souborovém systému; nearchivován"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Ma¾u %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Nelze smazat"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Vynechávám"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** Blok NUL **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok %s: ** Konec souboru **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Mezery v hlavièce na místì, kde je oèekávána èíselná hodnota typu %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Osmièková hodnota %.*s typu %s je mimo rozsah; pøiøazuji dvojkový complement"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Osmièková hodnota %.*s typu %s je mimo rozsah"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Archiv obsahuje zastaralé base-64 hlavièky"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Base-64 øetìzec %s je mimo rozsah typu %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Hodnota base-256 je mimo rozsah typu %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Archiv obsahuje %.*s tam, kde je oèekávána èíselná hodnota typu %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Hodnota %s typu %s je mimo rozsah %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " odkaz na %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " neznámý souborový typ %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Hlavièka svazku--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Pokraèováno od %s bajtu--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Vytváøím adresáø:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Pøejmenovávám %s na %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: nelze pøejmenovat na %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Pøejmenovávám %s zpìt na %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Pracovní adresáø nelze uchovat"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Pracovní adresáø nelze zmìnit"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "potomek"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "meziprocesový kanál"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: V archivu nenalezen"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: V archivu nenalezen"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Pøepínaèe `-%s' a `-%s' oba dva chtìjí standardní vstup"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Neplatná skupina"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU roz¹íøení po¾adovány na nekompatibilním formátu archivu"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Pou¾ití: %s [PØEPÍNAÈ]... [SOUBOR]...\n"
+"\n"
+"Pøíklady:\n"
+" %s -cf archiv.tar foo bar # Vytvoøí archiv.tar ze souborù foo a bar.\n"
+" %s -tvf archiv.tar # Podrobnì vypí¹e v¹echny soubory v archiv."
+"tar.\n"
+" %s -xf archiv.tar # Rozbalí v¹echny soubory z archive.tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+" Pøípona zálo¾ních souborù bude `~', pokud není nastavena pomocí --suffix\n"
+"nebo promìnné SIMPLE_BACKUP_SUFFIX. Jak se mají tvoøit zálo¾ní kopie, mù¾e "
+"být\n"
+"nastaveno pomocí pøepínaèe --backup nebo promìnné VERSION_CONTROL. Hodnoty\n"
+"mohou být:\n"
+"\n"
+" t, numbered tvoøí èíslované zálo¾ní kopie\n"
+" nil, existing èíslované, jestli¾e ji¾ èíslované zálo¾ní kopie\n"
+" existují, jinak tvoøí jednoduché\n"
+" never, simple tvoøí v¾dy jednoduché zálo¾ní kopie souborù\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Neoèekávaný konec archivu"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+#, fuzzy
+msgid "append files to the end of an archive"
+msgstr "%d bajtù smetí ma konci archivu ignorováno"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Chyba pøi zápise na standardní výstup"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Vícesvazkový archiv není mo¾né ovìøit"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Odporující si archivní formáty"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s: soubor je archiv; nearchivován"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s: soubor je archiv; nearchivován"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Pracovní adresáø nelze zmìnit"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Odstraòuji úvodní `%.*s' z názvù souborù"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Svazek %s neodpovídá vzorku %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Více jak jeden pøepínaè z `-Acdtrux' nemù¾e být zadán"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Odporující si kompresní pøepínaèe"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " neznámý souborový typ %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Soubor ze kterého se má vzít datum a èas nebyl nalezen"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Datum neznámého formátu %2$s nahrazuji %1$s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: soubor je archiv; nearchivován"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Neplatný poèet bajtù na záznam"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Upozornìní: pøepínaè -I není podporován; nemysleli jste -j nebo -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Neplatná délka pásky"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Více ne¾ jedeno poèáteèní datum"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Neplatná skupina"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Zadána chybná práva"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "Neplatné èíslo i-uzlu"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Neplatný vlastník"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Chybná velikost záznamu"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Velikost záznamu musí být násobek %d."
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "Neplatná délka pásky"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Neznámý vzorek `%s'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Pøepínaè `-[0-7][lmh]' není podporován tímto tarem"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Pøepínaè `%c' vy¾aduje argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Více archivaèních souborù vy¾aduje pøepínaè `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "--listed-incremental a --newer nelze kombinovat"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Název svazku je pøíli¹ dlouhý (limit je %lu bajtù)"
+msgstr[1] "%s: Název svazku je pøíli¹ dlouhý (limit je %lu bajtù)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Vícesvazkový archiv není mo¾né ovìøit"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Komprimovaný archiv nelze ovìøit"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Vícesvazkový komprimovaný archiv nelze vytvoøit"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Komprimovaný archiv nelze aktualizovat"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Vytvoøení prázdného archivu odmítnuto."
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Pøepínaèe `-Aru' jsou nesluèitelné s pøepínaèem `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Musíte zadat jeden z pøepínaèù `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Za bìhu programu nastala chyba"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Soubor zkrácen o bajtù: %s"
+msgstr[1] "%s: Soubor zkrácen o bajtù: %s"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Base-64 øetìzec %s je mimo rozsah typu %s"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Hodnota %s typu %s je mimo rozsah %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Generuji datové soubory pro testování GNU taru.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Odporující si kompresní pøepínaèe"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Chyba pøi zápise na standardní výstup"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Neplatný èas souboru"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Èíslo i-uzlu mimo rozsah"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Neznámá systémová chyba"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "Neznámý vzorek `%s'"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Nelze zmìnit pozici v souboru na %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr "Neznámý vzorek `%s'"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Nelze zmìnit pozici v souboru na %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Potomek byl ukonèen signálem %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Rozdìlený název souboru--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close"
+#~ msgstr "Nelze zavøít"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Popisovaè souboru nelze duplikovat"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Komprimované nebo vzdálené archivy nelze pou¾ít"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (potomek)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (prapotomek)"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "VAROVÁNÍ: Chybí hlavièka svazku"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Potomek vrátil status %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Názvy souborù obsahují `..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: Název souboru obsahuje `..'"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Viditelná chyba dlouhého názvu"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Èas souboru mimo rozsah"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Èíslo zaøízení je mimo rozsah"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Viditelná chyba dlouhého názvu"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Soubor %s pøejmenován na %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Symbolický odkaz na %s nelze vytvoøit"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s odkazuje na %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Neznámý pøíkaz %s pro spojování rozsekaných jmen"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Za -C chybí název souboru"
+
+#~ msgid "Copyright %d Free Software Foundation, Inc."
+#~ msgstr "Copyright %d Free Software Foundation, Inc."
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ " Toto je volnì ¹iøitelné programové vybavení, které je zcela BEZ "
+#~ "ZÁRUKY.\n"
+#~ "Podmínky pro kopírování a roz¹iøování naleznete v Obecné veøejné licenci "
+#~ "GNU\n"
+#~ "(GNU General Public Licence). Více informací získáte ve zdrojových "
+#~ "textech\n"
+#~ "v souboru COPYING."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Neznámý pøíkaz %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ " GNU `tar' je archivaèní program. Ukládá soubory do archivu na pásku "
+#~ "nebo \n"
+#~ "disk. Z archivu doká¾e rozbalit jak celé hierarchie souborù, tak i "
+#~ "jednotlivé\n"
+#~ "soubory.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ " Jestli¾e dlouhé pøepínaèe mají povinný argument, pak tento argument je\n"
+#~ "povinný i u jejich krátkých forem. Obdobnì je tomu v pøípadì, kdy je "
+#~ "argument\n"
+#~ "nepovinný.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Hlavní funkce:\n"
+#~ " -t, --list vypí¹e obsah archivu\n"
+#~ " -x, --extract, --get vyzvede soubor(y) z archivu\n"
+#~ " -c, --create vytvoøí nový archiv\n"
+#~ " -d, --diff, --compare nalezne rozdíly mezi archivem a souborovým "
+#~ "systémem\n"
+#~ " -r, --append pøidá soubory na konec archivu\n"
+#~ " -u, --update pøidá pouze soubory novìj¹í, ne¾ jsou v "
+#~ "archivu\n"
+#~ " -A, --catenate pøidá soubory z tar archivu do archivu\n"
+#~ " --concatenate stejné jako -A\n"
+#~ " --delete ma¾e z archivu (nefunguje na magnetických "
+#~ "páskách)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modifikátory operací:\n"
+#~ " -W, --verify ovìøí archiv po zápisu na médium\n"
+#~ " --remove-files sma¾e originální soubory po jejich "
+#~ "archivaci\n"
+#~ " -k, --keep-old-files nepøepisuje existující soubory pøi "
+#~ "rozbalování\n"
+#~ " archivu\n"
+#~ " --overwrite pøepisuje existující soubory pøi "
+#~ "rozbalování\n"
+#~ " -U, --unlink-first sma¾e soubory pøed jejich pøepsáním\n"
+#~ " --recursive-unlink sma¾e prázdné hierarchie pøed \n"
+#~ " rozbalováním adresáøù\n"
+#~ " -S, --sparse soubory s dírami zpracuje efektivnìji\n"
+#~ " -O, --to-stdout rozbalí archiv na standardní výstup\n"
+#~ " -G, --incremental zpracuje starý GNU-formát inkrementální "
+#~ "zálohy\n"
+#~ " -g, --listed-incremental=SOUBOR\n"
+#~ " zpracuje nový GNU-formát inkrementální "
+#~ "zálohy\n"
+#~ " --ignore-failed-read ignoruje chyby pøi ètení souborù\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Zpracování atributù souborù:\n"
+#~ " --owner=JMÉNO pou¾ije JMÉNO jako vlastníka pøidávaných "
+#~ "souborù\n"
+#~ " --group=JMÉNO pou¾ije JMÉNO jako skupinu pøidávaných "
+#~ "souborù\n"
+#~ " --mode=ZMÌNY pou¾ije jako práva (symbolická) "
+#~ "pøidávaných\n"
+#~ " souborù\n"
+#~ " --atime-preserve nemìní pøístupový èas na zpracovávaných\n"
+#~ " souborech\n"
+#~ " -m, --modification-time u rozbalovávaných souborù nenastaví èas\n"
+#~ " poslední modifikace souboru z archivu\n"
+#~ " --same-owner u rozbalovávaných souborù zkou¹í nastavit\n"
+#~ " stejného vlastníka jako je v archivu\n"
+#~ " --no-same-owner rozbalí soubory a v¹echny budou vlastnìné "
+#~ "Vámi\n"
+#~ " --numeric-owner v¾dy pou¾ívá èísla pro jména vlastníka/"
+#~ "skupiny\n"
+#~ " -p, --same-permissions u rozbalovávaných souborù nastaví stejná\n"
+#~ " práva, jaká mají v archivu\n"
+#~ " --no-same-permissions pøi rozbalování nenastavuje práva\n"
+#~ " --preserve-permissions stejné jako -p\n"
+#~ " -s, --same-order seøazení jmen souborù pro rozbalení je\n"
+#~ " stejné s archivem\n"
+#~ " --preserve-order stejné jako -s\n"
+#~ " --preserve stejné jako zadání -p a -s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Výbìr zaøízení:\n"
+#~ " -f, --file=ARCHIV pracuje s archivem nebo zaøízením "
+#~ "ARCHIV\n"
+#~ " --force-local archivní soubor je lokální, dokonce i "
+#~ "kdy¾\n"
+#~ " obsahuje v názvu dvojteèku\n"
+#~ " --rsh-command=PØÍKAZ pou¾ije PØÍKAZ pro pøihlá¹ení místo rsh\n"
+#~ " -[0-7][lmh] zadání zaøízení a hustoty\n"
+#~ " -M, --multi-volume práce s vícesvazkovým archivem\n"
+#~ " -L, --tape-length=ÈÍSLO vymìní pásku po zapsání ÈÍSLO x 1024 "
+#~ "bajtù\n"
+#~ " -F, --info-script=SOUBOR spustí script na konci ka¾dé pásky\n"
+#~ " (zahrnuje i -M)\n"
+#~ " --new-volume-script=SOUBOR stejné jako -F SOUBOR\n"
+#~ " --volno-file=SOUBOR pou¾ije/aktualizuje èíslo svazku v "
+#~ "SOUBORu\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Bloky u zaøízení:\n"
+#~ " -b, --blocking-factor=BLOKÙ BLOKÙ x 512 bajtù na záznam\n"
+#~ " --record-size=VELIKOST VELIKOST bajtù na záznam, násobek 512\n"
+#~ " -i, --ignore-zeros ignoruje nulové bloky v archivu,\n"
+#~ " které normálnì znamenají EOF.\n"
+#~ " -B, --read-full-records kdy¾ není pøeèteno tolik bajtù,\n"
+#~ " kolik je po¾adováno, zkou¹í doèíst "
+#~ "zbytek\n"
+#~ " (vhodné pro roury)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Výbìr formátu archivu:\n"
+#~ " -V, --label=NÁZEV vytvoøí archiv s názvem svazku "
+#~ "NÁZEV\n"
+#~ " VZOREK u obsahu/rozbalování globální "
+#~ "vzorek\n"
+#~ " pro názvy souborù\n"
+#~ " -o, --old-archive, --portability zapí¹e archiv ve formátu V7\n"
+#~ " --posix zapí¹e archiv ve formátu POSIX\n"
+#~ " -j, --bzip2 komprimuje archiv pomocí bzip2\n"
+#~ " -z, --gzip, --ungzip komprimuje archiv pomocí gzip\n"
+#~ " -Z, --compress, --uncompress komprimuje archiv pomocí compress\n"
+#~ " --use-compress-program=PROG komprimuje archiv pomocí PROG\n"
+#~ " (který musí akceptovat -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Výbìr souborù:\n"
+#~ " -C, --directory=ADRESÁØ operace vykonává v ADRESÁØi\n"
+#~ " -T, --files-from=NÁZEV pøi rozbalování nebo vytváøení bere názvy\n"
+#~ " souborù ze souboru NÁZEV\n"
+#~ " --null -T ète nulou ukonèené názvy, zakázáno -C\n"
+#~ " --exclude=VZOREK nepracuje se soubory odpovídající VZORKu\n"
+#~ " -X, --exclude-from=SOUBOR nepracuje se soubory, které odpovídají\n"
+#~ " nìkterému vzorku v SOUBORu\n"
+#~ " --anchored vyluèovací (exclude) vzorky se porovnávají "
+#~ "od\n"
+#~ " zaèátku názvu souboru (implicitní)\n"
+#~ " --no-anchored vyluèovací vzorky se porovnávají od "
+#~ "ka¾dého /\n"
+#~ " --ignore-case vyluèovací vzorky ignorují velikost znakù\n"
+#~ " --no-ignore-case vyluèovací vzorky dají na velikost znakù\n"
+#~ " (implicitní)\n"
+#~ " --wildcards vyluèovací (exclude) vzorky pou¾ívají ?* a "
+#~ "pod.\n"
+#~ " (implicitní)\n"
+#~ " --no-wildcards vyluèovací vzorky jsou prosté øetìzce\n"
+#~ " --wildcards-match-slash *? nahrazují v názvu / (implicitní)\n"
+#~ " --no-wildcards-match-slash *? nenahrazují v názvu /\n"
+#~ " -P, --absolute-names neodstraòuje úvodní `/' ze jmen souborù\n"
+#~ " -h, --dereference místo symbolických odkazù pou¾ije "
+#~ "soubory,\n"
+#~ " na které odkazy ukazují\n"
+#~ " --no-recursion neprochází adresáøe\n"
+#~ " -l, --one-file-system pøi vytváøení archivu zùstane v jednom\n"
+#~ " souborovém systému\n"
+#~ " -K, --starting-file=NÁZEV zaène od souboru NÁZEV z archivu\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATUM archivuje pouze soubory novìj¹í ne¾ DATUM\n"
+#~ " --newer-mtime=DATUM porovnává datum a èas pouze pokud byla "
+#~ "zmìnìna\n"
+#~ " data\n"
+#~ " --after-date=DATUM stejné jako -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=TYP] zpùsob zálohování souborù, pøed jejich "
+#~ "pøepsáním\n"
+#~ " --suffix=PØÍPONA zálohuje pøed pøepsáním (smazáním), jako "
+#~ "pøíponu\n"
+#~ " u zálo¾ních souborù pou¾ije PØÍPONU\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Informativní výstup:\n"
+#~ " --help vypí¹e tuto nápovìdu a skonèí\n"
+#~ " --version vypí¹e oznaèení verze programu tar a skonèí\n"
+#~ " -v, --verbose vypisuje zpracovávané soubory\n"
+#~ " --checkpoint vypisuje názvy adresáøù pøi ètení archivu\n"
+#~ " --totals vypí¹e celkem zapsaných bajtù pøi tvorbì archivu\n"
+#~ " -R, --block-number s ka¾dou zprávou vypí¹e èíslo bloku v archivu\n"
+#~ " -w, --interactive ¾ádá potvrzení ka¾dé akce\n"
+#~ " --confirmation stejné jako -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ " GNU tar neumí èíst nebo produkovat `--posix' archivy. Jestli¾e je\n"
+#~ "v prostøedí nastaveno POSIXLY_CORRECT, GNU roz¹íøení je zablokováno "
+#~ "pøepínaèem\n"
+#~ "`--posix'. Podpora POSIX formátu je èásteènì implementována, proto s ní "
+#~ "pøíli¹\n"
+#~ "nepoèítejte.\n"
+#~ " ARCHIV mù¾e být SOUBOR, HOSTITEL:SOUBOR nebo U®IVATEL@HOSTITEL:SOUBOR,\n"
+#~ "SOUBOR mù¾e být soubor nebo zaøízení. DATUM mù¾e být datum nebo název "
+#~ "souboru zaèínající `/' nebo `.', pokud chcete pou¾ít datum souboru.\n"
+#~ " Implicitní pøepínaèe jsou `-f%s -b%d'.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Zastaralý pøepínaè, nyní zahrnut v pøepínaèi --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Zastaralý pøepínaè, nahrazen pøepínaèem --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Zastaralý pøepínaè, nahrazen pøepínaèem --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Zastaralý pøepínaè, nahrazen pøepínaèem --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Zastaralý pøepínaè, nahrazen pøepínaèem --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Zastaralý pøepínaè, nahrazen pøepínaèem --block-number"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Upozornìní: pøepínaè -y není podporován; nemysleli jste -j?"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Zastaralý pøepínaè, nahrazen pøepínaèem --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Autoøi: John Gilmore a Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ " Povinné argumenty u dlouhých pøepínaèù, jsou povinné také u "
+#~ "odpovídajících \n"
+#~ "krátkých pøepínaèù.\n"
+#~ "\n"
+#~ " -l, --file-length délka generovaného souboru\n"
+#~ " --help vypí¹e tuto nápovìdu a skonèí\n"
+#~ " --version vypí¹e oznaèení verze a skonèí\n"
+
+#~ msgid "Ambiguous pattern `%s'"
+#~ msgstr "Nejednoznaèný vzorek `%s'"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Napsal François Pinard."
diff --git a/po/da.gmo b/po/da.gmo
new file mode 100644
index 0000000..ce0971f
--- /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..1c1be60
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,2879 @@
+# Danish messages for GNU tar.
+# Copyright (C) 1996 Free Software Foundation, Inc.
+# Keld Jørn Simonsen <keld@dkuug.dk>, 2000-2001.
+# Claus Hindsgaul <claus_h@image.dk>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU tar 1.13.25\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2002-03-27 13:57+0100\n"
+"Last-Translator: Keld Jørn Simonsen <keld@dkuug.dk>\n"
+"Language-Team: Danish <dansk@klid.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "ugyldigt argument %s for %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "flertydigt argument '%s' for %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Gyldige argumenter er:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Brug: %s [FLAG]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Prøv '%s --help' for mere information.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+"Rapportér fejl til <bugs-tar@gnu.org>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Ukendt systemfejl"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: flag '%s' kræver et argument\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: flag '%s' er flertydigt\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: flag '%s' tillader ikke et argument\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: flag '%c%s' tillader ikke et argument\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: flag '%s' kræver et argument\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: ukendt flag '--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: ukendt flag '%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ulovligt flag -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ugyldigt flag -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: flag kræver et argument -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: flag '-W %s' er flertydigt\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: flag '-W %s' tillader ikke et argument\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "blokstørrelse"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "hovedlager opbrugt"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Kan ikke %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Advarsel: Kan ikke %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Kan ikke ændre modus til %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Kan ikke ændre ejerskab til bruger-ID %lu, gruppe-ID %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Kan ikke oprette lænke til %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Læsefejl ved byte %s, ved læsning af %lu byte"
+msgstr[1] "%s: Læsefejl ved byte %s, ved læsning af %lu byte"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Advarsel: Læsefejl ved byte %s, ved læsning af %lu byte"
+msgstr[1] "%s: Advarsel: Læsefejl ved byte %s, ved læsning af %lu byte"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Kan ikke søge til %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Advarsel: Kan ikke søge til %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Kan ikke oprette symbolsk lænke til '%s'"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Kunne kun skrive %lu af %lu byte"
+msgstr[1] "%s: Kunne kun skrive %lu af %lu byte"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Fjerner indledende '%.*s' fra medlemsnavne"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Fjerner indledende '/' fra absolutte lænker"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "Fjerner indledende '%.*s' fra medlemsnavne"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "'"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[jJyY]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Tjeneste ikke tilgængelig"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "standard-ind"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "standard-ud"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Kan ikke eksekvere fjern skal"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Kan ikke allokere plads til buffer\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Kan ikke allokere plads til buffer"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Prøv '%s --help' for mere information.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Brug: %s [FLAG]\n"
+"Behandl en båndstation, med kommandoer fra en anden proces.\n"
+"\n"
+" --help vis denne hjælpetekst\n"
+" --version vis programversion\n"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportér fejl til <bugs-tar@gnu.org>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Søgeposition uden for område"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Søgeposition uden for område"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Søgeretning uden for område"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: For tidlig filafslutning\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "For tidlig filafslutning"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Ugyldig kommando"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Totalt antal byte skrevet: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Totalt antal byte skrevet: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(datakanal)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Ugyldig værdi for record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Arkivnavn er ikke opgivet"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Kan ikke verificere standard-ind/standard-ud arkiver"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Kan ikke opdatere komprimerede arkiver"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Skriver kontrolpunkt %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Læser kontrolpunkt %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Ved begyndelsen af båndet, afslutter nu"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "For mange fejl, afslutter"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Ikke-justeret blok (%lu byte) i arkiv"
+msgstr[1] "Ikke-justeret blok (%lu byte) i arkiv"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Poststørrelse = %lu blokke"
+msgstr[1] "Poststørrelse = %lu blokke"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Kunne ikke gå tilbage i arkivfilen. Den kan være ulæselig uden -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: indeholder ugyldigt delarkivs-nummer"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Overløb på delarkiv-nummer"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Klargør delarkiv nummer %d for %s og tryk retur: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Filafslutning hvor svar fra bruger var forventet"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ADVARSEL: Arkivet er ufuldstændigt"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [navn] Giv et filnavn for næste (og efterfølgende) delarkiv(er)\n"
+" q Afbryd tar\n"
+" ! Start en skal\n"
+" ? Skriv denne list\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Intet nyt delarkiv; afslutter.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "'%s'-kommando mislykkedes"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Dette ligner ikke et tar-arkiv"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s fortsætter ikke i dette delarkiv"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s fortsætter ikke i dette delarkiv"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s har forkert størrelse (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Dette delarkiv kommer ude af rækkefølge"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arkivet er ikke navngivet til at passe med %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Volumenet '%s' stemmer ikke overens med %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Kunne kun læse %lu af %lu byte"
+msgstr[1] "Kunne kun læse %lu af %lu byte"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Indhold er forskelligt"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Uventet filslutning i arkivet"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Filtype er forskellig"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Modus er forskellig"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Bruger-ID er forskellig"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gruppe-ID er forskellig"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Modificeringstid er forskellig"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Størrelse er forskellig"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ikke lænket til %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symbolsk lænke er forskellig"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Enhedsnummer er forskellig"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verificering "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Ukendt filtype '%c', diff-et som en almindelig fil"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "VERIFIKASIONSFEJL: %d ukendte hoveder fundet"
+msgstr[1] "VERIFIKASIONSFEJL: %d ukendte hoveder fundet"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: fil er det samme som arkivet; ikke lagret"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "værdi %s ud af %s område %s..%s; erstatter %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "værdi %s ud af %s område %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Genererer negative oktale hoveder"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: file er uændret; ikke lagret"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: file er uændret; ikke lagret"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: file er uændret; ikke lagret"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Filen formindsket med %s byte, fylder ud med nuller"
+msgstr[1] "%s: Filen formindsket med %s byte, fylder ud med nuller"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: fil er på et andet filesystem. Ikke lagret"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Ukendt filtype; filen blev ignoreret"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " lænke til %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: file er uændret; ikke lagret"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: fil er det samme som arkivet; ikke lagret"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Fil fjernet før vi læste den"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: fil er det samme som arkivet; ikke lagret"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: Fil ændredes mens vi læste den"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: sokkel ignoreret"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: dør ignoreret"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Hopper til næste hoved"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Sletter ikke-hoved fra arkivet"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: tidsstempel %s er %lu s i fremtiden"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Uventet uoverensstemmelse ved oprettelse af katalog"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Katalog omdøbt før dets status kunne blive udtrukket"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Udtrækker sammenhængende filer som almindelige filer"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Forsøger at udtrække symbolske lænker som hårde lænker"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Læser %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Kan ikke udtrække -- filen er fortsat fra et tidligere delarkiv"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Uventet filafslutning i ødelagte navne"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Ukendt filtype '%c', udtrukket som en almindelig fil"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Kunne ikke sikkerhedskopiere denne fil"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Kan ikke omdøbe til %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Fejl kan ikke reddes; afslutter nu"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Kataloget er blevet omdøbt"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Kataloget er blevet omdøbt"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Kataloget er nyt"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Ugyldigt tidsstempel"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Ugyldig modus angivet i flag"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Ugyldigt enhedsnummer"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Ugyldigt inode-nummer"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Uventet filslutning i arkivet"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "kan ikke oprette kataloget '%s'"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: fil er på et andet filesystem. Ikke lagret"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Sletter %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "Kan ikke slette %s"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "Udelader %s"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** Blok med NUL-er **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok %s: ** Slut på fil **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Blank-tegn i hovedet hvor numerisk %s værdi var forventet"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr "Arkiv oktal værdi %.*s er udenfor %s område; antager to-komplement"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Arkiv oktal værdi %.*s er udenfor %s område"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Arkiv indeholder forældede base-64 hoveder"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Arkiv base-64 streng med fortegn %s er uden for %s område"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Arkiv base-256 værdi er uden for %s område"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arkiv indeholder %.*s hvor numerisk %s værdi var forventet"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Arkiv værdi %s er udenfor %s område %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " lænke til %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " ukendt filtype %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Volumenhoved--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Fortsætter ved byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Opretter katalog:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Omdøber %s til %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Kan ikke omdøbe til %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Omdøber %s tilbage til %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Kan ikke gemme arbejdskatalog"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Kan ikke ændre arbejdskatalog"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "underproces"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "mellemproces-kanal"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Blev ikke fundet i arkivet"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Blev ikke fundet i arkivet"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Flagene '-%s' and '-%s' vil begge have standard inddata"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: ugyldig gruppe"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU-funktioner forsøgt på inkompatibelt arkiv-format"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Brug: %s [OPTION]... [FILE]...\n"
+"\n"
+"Eksempler:\n"
+" %s -cf arkiv.tar foo bar # Skab arkiv.tar fra filerne foo og bar.\n"
+" %s -tvf arkiv.tar # List alle filer i arkiv.tar udførligt.\n"
+" %s -xf arkiv.tar # Udtræk alle filer fra arkiv.tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+"Suffikset for sikkerhedskopiering er '~', med mindre det er sat med --"
+"suffix\n"
+"eller SIMPLE_BACKUP_SUFFIX. Versionskontrol kan sættes med --backup eller\n"
+"VERSION_CONTROL. Gyldige værdier er:\n"
+"\n"
+" t, numbered lav nummererede sikkerhedskopier\n"
+" nil, existing nummererede, dersom nummererede sikkerhedskopier "
+"eksisterer,\n"
+" ellers simple\n"
+" never, simple lav simple sikkerhedskopier\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Uventet filslutning i arkivet"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+#, fuzzy
+msgid "append files to the end of an archive"
+msgstr "%d overflødige byte ignoreret ved slutningen på arkiv"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Fejl ved skrivning til standard uddata"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Kan ikke verificere arkiv som går over flere delarkiver"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Konflikt i flagene for arkiv-format"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s: fil er det samme som arkivet; ikke lagret"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s: fil er det samme som arkivet; ikke lagret"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Kan ikke ændre arbejdskatalog"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Fjerner indledende '/' fra absolutte lænker"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Volumenet '%s' stemmer ikke overens med %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Du kan ikke angive mere end et af '-Acdtrux'-flagene"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Konflikt i komprimeringsflag"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " ukendt filtype %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Datofil ikke fundet"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Erstatter %s for ukendt dato-format %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: fil er det samme som arkivet; ikke lagret"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Ugyldig blokfaktor"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Advarsel: -I flaget er ikke understøttet; måske mente du -j eller -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Ugyldig båndlængde"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Mere end én grænse-dato"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: ugyldig gruppe"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Ugyldig modus angivet i flag"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "Ugyldigt inode-nummer"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Ugyldig ejer"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Ugyldig poststørrelse"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Poststørrelse skal være deleligt med %d."
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "Ugyldig båndlængde"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Ukendt mønster '%s'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr ""
+"Flagene '-[0-7][lmh]' understøttes ikke af *denne* implementering af tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Gammelt flag '%c' behøver et argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Ved flere arkivfiler kræves '-M'-flaget"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Kan ikke kombinere --listed-incremental med --newer"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: etikette på delarkiv er for lang (grænse er %lu byte)"
+msgstr[1] "%s: etikette på delarkiv er for lang (grænse er %lu byte)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Kan ikke verificere arkiv som går over flere delarkiver"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Kan ikke verificere komprimerede arkiver"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Kan ikke bruge komprimerede arkiver som går over flere delarkiver"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Kan ikke opdatere komprimerede arkiver"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Nægter stædigt at oprette et tomt arkiv"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Flagene '-Aru' er inkompatible med '-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Du skal angive et af '-Acdtrux'-flagene"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Udsat fejl-afslutning som resultat af tidligere fejl"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Filen formindskedes med %s byte"
+msgstr[1] "%s: Filen formindskedes med %s byte"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Arkiv base-64 streng med fortegn %s er uden for %s område"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Arkiv værdi %s er udenfor %s område %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Generér datafiler for GNU tar testpakke.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Konflikt i komprimeringsflag"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Fejl ved skrivning til standard uddata"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Ugyldigt tidsstempel"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Inode-nummer uden for område"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Ukendt systemfejl"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "kan ikke ændre ejer (chown) '%s'"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Kan ikke søge til %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr "Ukendt mønster '%s'"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "kan ikke oprette kataloget '%s'"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Underproces døde med signal %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Ødelagte filnavne--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close"
+#~ msgstr "Kan ikke lukke"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Kan ikke starte ny proces med 'dup'"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr ""
+#~ "Kan ikke bruge komprimerede arkiver eller arkiver på en anden maskine"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (underproces)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (under-underproces)"
+
+#~ msgid "Cannot allocate memory for blocking factor %d"
+#~ msgstr "Kunne ikke allokere hovedlager for blok-faktor %d"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ADVARSEL: Manglende delarkivhoved"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Underproces afsluttede med status %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Medlemsnavne indeholder '..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: Medlemsnavne indeholder '..'"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Fejl på et langt navn"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Tidsstempel uden for område"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Enhedsnummer er uden for område"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Fejl på et langt navn"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Omdøbt %s til %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Kan ikke oprette symbolsk lænke til %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Lænkede %s symbolsk til %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Ukendt kommando %s ved rekonstruering af navn"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Mangler filnavn efter -C"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Dette program kommer UDEN GARANTI, i den grad som dette er tilladt ved "
+#~ "lov.\n"
+#~ "Du må redistribuere det under betingelsene i GNU General Public License;\n"
+#~ "se filen kaldet COPYING for detaljer."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Ugyldig kommando %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU 'tar' gemmer mange filer i et arkiv, og kan hente enkeltstående\n"
+#~ "filer ud af arkivet.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Dersom et langt flag har et obligatorisk argument, er argumentet også\n"
+#~ "obligatorisk for det korte flag. Tilsvarende gælder dersom argumentet\n"
+#~ "kan sløjfes.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Hovedoperationsmodi:\n"
+#~ " -t, --list list indholdet af arkivet\n"
+#~ " -x, --extract, --get udtræk filer fra arkivet\n"
+#~ " -c, --create oprette et nyt arkiv\n"
+#~ " -d, --diff, --compare vis forskelle mellem arkivet og filsystemet\n"
+#~ " -r, --append tilføj filer ved slutningen af arkivet\n"
+#~ " -u, --update tilføj kun filer som er nyere end dem i "
+#~ "arkivet\n"
+#~ " -A, --catenate føj en arkivfil til arkivet\n"
+#~ " --concatenate samme som -A\n"
+#~ " --delete slet fra arkivet (ikke for arkiv på bånd!)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Flag for operationsmodi:\n"
+#~ " -W, --verify forsøg at verificere arkivet efter at have "
+#~ "skrevet det\n"
+#~ " --remove-files slet filer efter at have tilføjet dem til "
+#~ "arkivet\n"
+#~ " -k, --keep-old-files overskriv ikke eksisterende filer ved "
+#~ "udtræk\n"
+#~ " --overwrite overskriv eksisterende filer ved udtræk\n"
+#~ " --overwrite-dir overskriv metadata for kataloger ved udtræk\n"
+#~ " -U, --unlink-first slet alle filer før udtrækning til dem\n"
+#~ " --recursive-unlink tøm kataloger før udtrækning\n"
+#~ " -S, --sparse håndtér filer med huller mere effektivt\n"
+#~ " -O, --to-stdout udtræk filer til standard-ud\n"
+#~ " -G, --incremental brug det gamle GNU format for inkrementel\n"
+#~ " sikkerhedskopiering\n"
+#~ " -g, --listed-incremental brug det nye GNU-format for inkrementel\n"
+#~ " sikkerhedskopiering\n"
+#~ " --ignore-failed-read ignorér fejl under læsning af filer\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Håndtering af filattributter:\n"
+#~ " --owner=NAVN brug NAVN som ejer for nye filer\n"
+#~ " --gruppe=NAVN brug NAVN som gruppe for nye filer\n"
+#~ " --mode=OKTAL brug OKTAL som modus for nye filer\n"
+#~ " --atime-preserve ændre ikke accesstider på tilføjede filer\n"
+#~ " -m, --modification-time udtræk ikke modificeringstiden\n"
+#~ " --same-owner forsøg at udtrække filer med samme ejer\n"
+#~ " --numeric-owner brug nummer for bruger/gruppe-navn\n"
+#~ " -p, --same-permissions forsøg at udtrække filer med samme\n"
+#~ " filbeskyttelse\n"
+#~ " --preserve-permissions samme som -p\n"
+#~ " -s, --same-order sorter navn som skal udtrækkes sådan at\n"
+#~ " de passer med arkivet\n"
+#~ " --preserve-order samme som -s\n"
+#~ " --preserve samme som både -p og -s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Enhedsvalg og enhedsskifte:\n"
+#~ " -f, --file=ARKIV brug arkivfil eller enhed ARKIV\n"
+#~ " --force-local arkivfil er lokal selv om den har et "
+#~ "kolon\n"
+#~ " --rsh-command=KOMMANDO brug KOMMANDO i stedet for rsh\n"
+#~ " -[0-7][lmh] angiv enhed og tæthed\n"
+#~ " -M, --multi-volume behandl arkivet som et arkiv af flere "
+#~ "delarkiver\n"
+#~ " -L, --tape-length=NUMMER skift bånd efter at NUMMER x 1024 byte "
+#~ "er\n"
+#~ " skrevet\n"
+#~ " -F, --info-script=FIL kør kommandofil FIL ved slutningen af "
+#~ "hvert\n"
+#~ " bånd (sætter -M automatisk)\n"
+#~ " --new-volume-script=FIL samme som -F FIL\n"
+#~ " --volno-file=FIL brug/opdatér delarkivnummeret i FIL\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "blokhåndtering:\n"
+#~ " -b, --blocking-factor=ENHEDER sæt blokstørrelse ENHEDER x 512 byte\n"
+#~ " --record-size=STØRRELSE STØRRELSE byte per enhed (deleligt mad "
+#~ "512)\n"
+#~ " -i, --ignore-zeros ignorér blokke som indeholder nuller\n"
+#~ " (betyder filafslutning)\n"
+#~ " -B, --read-full-records omblok ved læsning (for 4.2BSD "
+#~ "datakanaler)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Valg af arkivformat:\n"
+#~ " -V, --label=NAVN lav et arkiv med delarkivnavn NAVN\n"
+#~ " MØNSTER filer som skal medtages ved listning "
+#~ "eller\n"
+#~ " udtrækning (tilladt med jokertegn)\n"
+#~ " -o, --old-archive, --portability lav et arkiv i V7 format\n"
+#~ " --posix lav et arkiv i POSIX format\n"
+#~ " -j, --bzip2 send arkivet gennem bzip2\n"
+#~ " -z, --gzip, --ungzip send arkivet gennem gzip\n"
+#~ " -Z, --compress, --uncompress send arkivet gennem compress\n"
+#~ " --use-compress-program=PROG send arkivet gennem PROG (skal "
+#~ "forstå -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Valg af lokale filer:\n"
+#~ " -C, --directory=KATALOG ændr katalog til KATALOG\n"
+#~ " -T, --files-from=FIL hent navn for udtrækning eller arkivering\n"
+#~ " fra filen FIL\n"
+#~ " --null -T læser nul-terminerede navne, tillader "
+#~ "ikke -C\n"
+#~ " --exclude=MØNSTER medtag ikke filer (tilladt med jokertegn)\n"
+#~ " -X, --exclude-from=FIL medtag ikke filer navngivne i filen FIL\n"
+#~ " (tilladt med jokertegn)\n"
+#~ " --anchored udeladelsesmønstre passer med "
+#~ "filnavnsstart (standard)\n"
+#~ " --no-anchored udeladelsesmønstre passer på navne efter "
+#~ "ethvert /\n"
+#~ " --ignore-case udeladelse behandler store og små "
+#~ "bogstaver ens\n"
+#~ " --no-ignore-case udeladelse behandler store og små "
+#~ "bogstaver forskelligt (standard)\n"
+#~ " --wildcards udeladelsesmønstre bruger jokertegn "
+#~ "(standard)\n"
+#~ " --no-wildcards udeladelsesmønstre er rene strenge\n"
+#~ " --wildcards-match-slash udeladelsesmønstre med jokertegn passer "
+#~ "med '/' (default)\n"
+#~ " --no-wildcards-match-slash udeladelsesmønstre med jokertegn passer "
+#~ "ikke med '/'\n"
+#~ " -P, --absolute-names fjern ikke indledende '/' fra filnavn\n"
+#~ " -h, --dereference arkivér istedet det som symbolske lænker "
+#~ "peger på\n"
+#~ " --no-recursion medtag ikke filer i underkataloger\n"
+#~ " -l, --one-file-system medtag ikke filer fra andre filsystemer\n"
+#~ " -K, --starting-file=NAVN begynd med filen NAVN i arkivet\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATO arkivér kun filer som er nyere end DATO\n"
+#~ " --newer-mtime=DATO sammenlign tidsstempel kun når data er "
+#~ "ændret\n"
+#~ " --after-date=DATO samme som -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=KONTROL] lav sikkerhedskopi før sletning, med\n"
+#~ " versionskontrol\n"
+#~ " --suffix=SUFFIKS lav sikkerhedskopi før sletning, med\n"
+#~ " overstyring af det almindelige suffiks\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Udskrift af information:\n"
+#~ " --help vis denne hjælpetekst og afslut\n"
+#~ " --version vis programversion og afslut\n"
+#~ " -v, --verbose vis hver fil som behandles\n"
+#~ " --checkpoint vis katalognavn når arkivet læses\n"
+#~ " --totals vis totalt antal byte skrevet\n"
+#~ " -R, --block-number vis enhedsnummer i arkivet sammen med alle "
+#~ "beskeder\n"
+#~ " -w, --interactive spørg efter bekræftelse for hver operation\n"
+#~ " --confirmation samme som -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar kan hverken læse eller skrive '--posix'-arkiver. Dersom\n"
+#~ "miljøvariablen POSIXLY_CORRECT er sat, er GNU-funktioner ikke tilladt\n"
+#~ "sammen med '--posix'. POSIX-understøttelse er kun delvis implementeret, "
+#~ "så\n"
+#~ "stol ikke på det endnu.\n"
+#~ "ARKIV kan være FIL, MASKINE:FIL eller BRUGER@MASKINE:FIL; DATO kan være "
+#~ "en\n"
+#~ "tekst-dato, eller et filnavn begyndende med '/' eller '.' og da vil "
+#~ "filens dato\n"
+#~ "blive brugt. *Denne* version af tar har '-f%s -b%d' som forvalg.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Forældet flag, nu underforstået af --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Forældet flag udskiftet med --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Forældet flag skiftet ud med --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Forældet flag skiftet ud med --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Forældet flag skiftet ud med --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Forældet flag skiftet ud med --block-number"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Advarsel: -y flaget er ikke understøttet; måske mente du -j?"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Forældet flag skiftet ud med --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Skrevet af John Gilmore and Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Obligatoriske argumenter for lange flag er obligatoriske også for korte "
+#~ "flag.\n"
+#~ "\n"
+#~ " -l, --file-length=LÆNGDE længde af genereret fil\n"
+#~ " -p, --pattern=MØNSTER gyldige mønstre er 'default' eller 'zeros'\n"
+#~ " --help vis denne hjælpetekst og afslut\n"
+#~ " --version vis programversion og afslut\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Skrevet af François Pinard <pinard@iro.umontreal.ca>"
+
+#~ msgid "Ambiguous pattern `%s'"
+#~ msgstr "Flertydigt mønster '%s'"
+
+#~ msgid "Copyright %d Free Software Foundation, Inc."
+#~ msgstr "Copyright © %d Free Software Foundation, Inc."
+
+#~ msgid ""
+#~ "This is free software; see the source for copying conditions. There is "
+#~ "NO\n"
+#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR "
+#~ "PURPOSE.\n"
+#~ msgstr ""
+#~ "Dette er frit programmel. Se kildekoden for kopieringsbetingelser.\n"
+#~ "Programmellet har ingen garanti, ikke en gang for SALGBARHED eller "
+#~ "EGNETHED\n"
+#~ "TIL NOGEN SPECIEL OPGAVE.\n"
+
+#~ msgid "write error"
+#~ msgstr "skrivefejl"
+
+#~ msgid "`%s' exists but is not a directory"
+#~ msgstr "'%s' eksisterer, men er ikke et katalog"
+
+#~ msgid "cannot chdir to directory, %s"
+#~ msgstr "kan ikke gå til kataloget, %s"
+
+#~ msgid "cannot chmod %s"
+#~ msgstr "kan ikke ændre filrettigheder for '%s'"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "virtuelt hovedlager opbrugt"
+
+#~ msgid "Write to compression program short %lu bytes"
+#~ msgstr "Skrev %lu byte for lidt til komprimeringsprogrammet"
+
+#~ msgid "Removing `%.*s' prefix from member names"
+#~ msgstr "Fjerner '%.*s' præfiks fra medlemsnavne"
+
+#~ msgid "Archive contains future timestamp %s"
+#~ msgstr "Arkiv indeholder fremtidigt tidsstempel %s"
+
+#~ msgid "%s: Cannot symlink %s %s"
+#~ msgstr "%s: Kan ikke lænke %s symbolsk til %s"
+
+#~ msgid "Invalid group given on option"
+#~ msgstr "Ugyldig gruppe angivet i flag"
+
+#~ msgid "Invalid owner given on option"
+#~ msgstr "Ugyldig ejer angivet i flag"
diff --git a/po/de.gmo b/po/de.gmo
new file mode 100644
index 0000000..cd67d13
--- /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..e5db4c2
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,2454 @@
+# German messages for GNU tar.
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995?
+# Karl Eichwalder <ke@ke.central.de>, 1996
+# Christian Kirsch <ck@held.mind.de>, 1996, 2001
+# Michael Piefel <piefel@informatik.hu-berlin.de>, 2003, 2006
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.16.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-12-12 09:41+0100\n"
+"Last-Translator: Michael Piefel <piefel@informatik.hu-berlin.de>\n"
+"Language-Team: German <translation-team-de@lists.sourceforge.net>\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"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "ungültiges Argument %s für %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "mehrdeutiges Argument %s für %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Zulässige Argumente sind:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: %s-Wert ist kleiner oder gleich %s"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: ARGP_HELP_FMT-Parameter benötigt einen Wert"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: ARGP_HELP_FMT-Parameter muss positiv sein"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: unbekannter ARGP_HELP_FMT-Parameter"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Müll in ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Erforderlich oder optionale Argumente für lange Optionen sind ebenso "
+"erforderlich bzw. optional für die entsprechenden Kurzoptionen."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Aufruf:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " oder: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [OPTION...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "„%s --help“ oder „%s --usage“ gibt weitere Informationen.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Melden Sie Fehler (auf Englisch, mit LC_ALL=C) an %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Unbekannter Systemfehler."
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "diese Hilfe ausgeben"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "eine kurze Benutzungsübersicht ausgeben"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NAME"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "den Programmnamen setzen"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SEK"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "für SEK Sekunden hängenbleiben (Voreinst.: 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "Programmversion ausgeben"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(PROGRAMMFEHLER) Keine Version bekannt!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Zu viele Argumente\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(PROGRAMMFEHLER) Option hätte erkannt werden müssen!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: Option „%s“ ist mehrdeutig\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: Option „--%s“ erlaubt keinen Parameter\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: Option „%c%s“ erlaubt keinen Parameter.\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: Option „%s“ benötigt einen Parameter.\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: Unbekannte Option „--%s“\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: Unbekannte Option „%c%s“\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: Unzulässige Option -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: Ungültige Option -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: Option benötigt einen Parameter -- %c.\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: Option „-W %s“ ist mehrdeutig.\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: Option „-W %s“ erlaubt keinen Parameter.\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "Blockgröße"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "Kein Speicher mehr"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Kann %s nicht ausführen"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Warnung. Kann %s nicht ausführen"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Kann Zugriffsrechte nicht zu %s ändern"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Kann Datei-Eigentümer nicht zu uid %lu, gid %lu ändern"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Kann nicht zu „%s“ linken"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Lesefehler bei Byte %s beim Lesen von einem Byte"
+msgstr[1] "%s: Lesefehler bei Byte %s beim Lesen von %lu Bytes"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Warnung: Lesefehler bei Byte %s beim Lesen von einem Byte"
+msgstr[1] "%s: Warnung: Lesefehler bei Byte %s beim Lesen von %lu Bytes"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Kann nicht auf %s positionieren"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Warnung. Kann nicht auf %s positionieren"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Kann keinen symbolischen Link auf „%s“ anlegen"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Nur %lu von %lu Byte geschrieben"
+msgstr[1] "%s: Nur %lu von %lu Bytes geschrieben"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Entferne führende „%s“ von Elementnamen"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Entferne führende „%s“ von Zielen harter Verknüpfungen"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Ersetze „.“ für leeren Elementnamen"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Ersetze „.“ für leeres Ziel einer harten Verknüpfung"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "„"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "“"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[yYjJ]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Service nicht verfügbar."
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "Standardeingabe"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "Standardausgabe"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Kann Remote-Shell nicht ausführen."
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Eingabezeichenkette zu lang"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Syntaxfehler in der Zahl"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Kann Speicherplatz für Puffer nicht reservieren.\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Kann keinen Speicher für Puffer reservieren."
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "„%s --help“ zeigt weitere Informationen.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Aufruf: %s [OPTION]\n"
+"Arbeiten mit einem Bandlaufwerk, Kommandos können von einem anderen Prozess "
+"stammen.\n"
+"\n"
+" --version Versionsinformation ausgeben\n"
+" --help diesen Hilfetext ausgeben\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Melden Sie Fehler (auf Englisch, mit LC_ALL=C) an <%s>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Fehler bei der Positionierungsangabe."
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Positionierungsangabe außerhalb des zulässigen Bereichs."
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Richtung für Positionierung nicht zulässig."
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Vorzeitiges Dateiende.\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Vorzeitiges Dateiende."
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Ungültiges Kommando."
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Gesamtzahl geschriebener Bytes"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Gesamtzahl gelesener Bytes"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Gesamtzahl gelöschter Bytes: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(pipe)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Ungültiger Wert für „record_size“."
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Kein Archivname angegeben"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Kann Archive auf Standard-Ein-/Ausgabe nicht prüfen."
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Archiv ist komprimiert. Benutzen Sie die Option %s."
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Kann komprimierte Archive nicht aktualisieren"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Schreib-Kontrollpunkt %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Lese-Kontrollpunkt %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Am Anfang des Mediums, beende jetzt."
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Zu viele Fehler, beende."
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Falsch ausgerichteter Block (ein Byte) im Archiv."
+msgstr[1] "Falsch ausgerichteter Block (%lu Bytes) im Archiv."
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Recordgröße = %lu Block"
+msgstr[1] "Recordgröße = %lu Blöcke"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Kann Archiv-Datei nicht zurücksetzen; könnte ohne „-i“ unlesbar sein."
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "„rmtlseek“ nicht an Recordgrenze angehalten"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: enthält ungültige Teil-Nummer."
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Teil-Nummer zu groß."
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Medium #%d für %s einlegen und Eingabetaste drücken: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Dateiende gefunden, Benutzereingabe erwartet"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "WARNUNG: Archiv unvollständig"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n Name für die nächsten (und folgenden) Medien neuen Dateinamen "
+"angeben\n"
+" q „tar“ abbrechen\n"
+" j oder Enter fortfahren\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Shell in einem Unterprozess starten\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? diese Liste ausgeben\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Kein neues Medium; halte an.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Dateiname nicht angegeben. Versuchen Sie es noch einmal.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Ungültige Eingabe. Geben Sie „?“ für Hilfe ein.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "„%s“-Kommando gescheitert."
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Das sieht nicht wie ein „tar“-Archiv aus."
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"%s wird möglicherweise auf diesem Teil fortgesetzt: Kopf enthält "
+"abgeschnittenen Namen."
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "Dieser Teil ist keine Fortsetzung von %s."
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s hat die falsche Größe (%s != %s + %s)."
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Dieser Teil ist nicht an der Reihe."
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Kennzeichnung des Archivs passt nicht zu „%s“."
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Teil „%s“ passt nicht zu „%s“."
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: Dateiname zu lang, um in einem GNU-Mehrteil-Kopf abgelegt werden zu "
+"können, abgeschnitten"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Konnte nur %lu von %lu Byte lesen"
+msgstr[1] "Konnte nur %lu von %lu Bytes lesen"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Unterschiedliche Inhalte"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Unerwartetes Dateiende im Archiv."
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Unterschiedliche Dateitypen "
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Modus ist unterschiedlich"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Benutzerkennung ist unterschiedlich"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gruppenkennung ist unterschiedlich"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Änderungszeit ist unterschiedlich"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Größe ist unterschiedlich"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Nicht auf „%s“ gelinkt."
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symbolischer Link ist unterschiedlich."
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Unterschiedliche Gerätenummern"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Prüfe "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Unbekannter Dateityp „%c“, Differenz wie für eine normale Datei."
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Archiv enthält Dateinamen, deren Präfixe entfernt wurden."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Die Überprüfung findet möglicherweise die Originaldateien nicht."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "FEHLER BEI PRÜFUNG: %d ungültiger Kopfteil erkannt."
+msgstr[1] "FEHLER BEI PRÜFUNG: %d ungültige Kopfteile erkannt."
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: enthält eine „Cache-Verzeichnis“-Markierung %s; nicht gesichert."
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "Wert %s außerhalb des %s-Bereich %s..%s; ersetze durch %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "Wert %s außerhalb des %s-Bereichs %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Erzeuge negative oktale Kopfteile"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: Dateiname ist zu lang (max. %d); nicht gesichert."
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+"%s: Dateiname ist zu lang (kann nicht aufgeteilt werden); nicht gesichert."
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: Verknüpfungsname ist zu lang; nicht gesichert."
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "Datei %s ist um ein Byte geschrumpft, fülle mit Null auf."
+msgstr[1] "Datei %s ist um %s Bytes geschrumpft, fülle mit Nullen auf."
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "Datei %s liegt auf einem anderen Dateisystem; nicht gesichert."
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Unbekannter Dateityp; Datei ignoriert."
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "Fehlende Verküpfungen zu %s.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "Datei %s ist unverändert; nicht gesichert."
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s ist das Archiv; nicht gesichert."
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Datei gelöscht, bevor sie gelesen wurde."
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: enthält eine Markierung „Cache-Verzeichnis“; nicht gesichert."
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: Datei hat sich beim Lesen geändert."
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: Socket ignoriert"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: Klappe ignoriert"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Springe zum nächsten Kopfteil."
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Lösche nicht-Kopfteil aus dem Archiv"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: unplausibel alter Zeitstempel %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: Zeitstempel %s liegt %s Sekunden in der Zukunft."
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Unerwarteter Inkonsitenz beim Erstellen des Verzeichnisses."
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Verzeichnis umbenannt bevor sein Status ermittelt werden konnte"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Extrahiere zusammenhängende Dateien („contiguous files“) als reguläre."
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Versuche symbolische Links als harte Links herauszuholen."
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Lese %s.\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr ""
+"Kann „%s“ nicht herausholen -- Datei ist Fortsetzung eines anderen Teils."
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Unerwarteter Kopfteil mit langem Namen"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Unbekannter Dateityp „%c“, wie normale Datei extrahiert."
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Aktuelles %s ist neuer oder hat dasselbe Alter."
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Konnte keine Sicherheitskopie von dieser Datei erstellen"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Kann %s nicht in %s umbenennen."
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Nicht behebbarer Fehler: Programmabbruch. "
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Verzeichnis wurde von „%s“ umbenannt."
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Verzeichnis wurde umbenannt."
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "Verzeichnis „%s“ ist neu."
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Ungültiges Datum"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Ungültige Änderungszeit (Sekunden)."
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Ungültige Änderungszeit (Nanosekunden)."
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Ungültige Gerätenummer"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Ungültige Inode-Nummer"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Feld zu lang beim Lesen der Schnappschussdatei"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Lesefehler in Schnappschussdatei"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Unerwartetes Dateiende im Schnappschussdatei."
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Unerwarteter Feldwert in Schnappschussdatei"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Fehlender Record-Abschluss"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "unzulässiges inkrementelles Dateiformat"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "Nicht unterstützte Version des inkrementellen Formats: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "Fehlgeformtes Verzeichnis für Dump: „%c“ erwartet, aber %#3o gefunden"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Fehlgeformtes Verzeichnis für Dump: „X“ dupliziert"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Fehlgeformtes Verzeichnis für Dump: leerer Name in „R“"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Fehlgeformtes Verzeichnis für Dump: „T“ folgt nicht „R“"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Fehlgeformtes Verzeichnis für Dump: leerer Name in „T“"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+"Fehlgeformtes Verzeichnis für Dump: „%c“ erwartet, aber Ende der Daten "
+"gefunden"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "Fehlgeformtes Verzeichnis für Dump: „X“ nie benutzt"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Kann kein temporäres Verzeichnis mit der Schablone %s anlegen"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Entferne Verzeichnis nicht: kann nicht zugreifen"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: Verzeichnis liegt auf einem anderen Dateisystem: entferne nicht."
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Lösche %s.\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Kann nicht entfernen."
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Ausgelassen"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "Block %s: ** Block aus NULlen **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Ein einzelner Nullblock bei %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "Block %s: ** Ende der Datei **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "Block %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Leerzeichen im Kopfteil, wo nummerische %s-Werte stehen sollten."
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr "Oktalzahl %.*s außerhalb des %s-Bereichs, nehme Zweierkomplement an?"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Oktalzahl %.*s außerhalb des %s-Bereichs"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Archiv enthält veraltete Base64-Kopfteile"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Base64-Text %s außerhalb des %s-Bereichs."
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Base-256-Wert ist außerhalb des %s-Bereichs."
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Archiv enthält „%.*s“ wo numerische %s-Werte stehen sollten."
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Wert %s außerhalb des %s-Bereichs %s..%s."
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " Verküpfung zu %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " unbekannter Dateityp %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "––Lange Verknüpfung––\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "––Langer Name––\n"
+
+# Alte Ãœs: Band Kopfteil. Kann diese Meldung auch bei Disketten
+# ausgegeben werden? Dann kann man ja nicht "Band" sagen; am besten
+# einfach "Volume" lassen. ke.
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "––Vorspann des Teils––\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "––Fortgesetzt bei Byte %s––\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Erzeuge Verzeichnis:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Benenne „%s“ in „%s“ um.\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Kann nicht in %s umbenennen"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Benenne „%s“ zurück in „%s“.\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Kann aktuelles Verzeichnis nicht sichern."
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Kann Arbeitsverzeichnis nicht wechseln."
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "Kindprozess"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "interprocess channel"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Zeichen für Musterüberdeckung im Dateinamen benutzt. Benutzen"
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr "Sie bitte --wildcards, um Musterüberdeckung zu ermöglichen oder"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "--no-wildcards, um diese Warnung zu unterdrücken."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Nicht im Archiv gefunden."
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Erforderliches Auftreten nicht im Archiv gefunden."
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Die beiden Optionen „-%s“ und „-%s“ verlangen Standard-Eingabe."
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Ungültiges Archivformat"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU-Erweiterungen bei einem inkompatiblen Archiv-Format verlangt."
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Unbekannter Zitatstil „%s“. Versuchen Sie „%s --quoting-style=help“ für eine "
+"Liste."
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU „tar“ fasst viele Dateien in einem einzigen Archiv auf Platte oder Band "
+"zusammen und kann einzelne Dateien aus dem Archiv wieder herstellen.\n"
+"\n"
+"Beispiele:\n"
+" %s -cf archiv.tar foo bar # archiv.tar mit den Dateien foo und bar "
+"erzeugen\n"
+" %s -tvf archiv.tar # Inhalt von archiv.tar ausführlich anzeigen\n"
+" %s -xf archiv.tar # alle Dateien aus archiv.tar extrahieren\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Die Namenserweiterung für Sicherheitskopien ist „~“, wenn nicht mit --"
+"suffix\n"
+"oder der Umgebungsvariablen SIMPLE_BACKUP_SUFFIX etwas anderes eingestellt "
+"ist.\n"
+"Die Versionskontrolle kann mit --backup oder der Umgebungsvariablen\n"
+"VERSION_CONTROL gesetzt werden. Mögliche Werte sind:\n"
+"\n"
+" none, off niemals Sicherheitskopien anlegen\n"
+" t, numbered nummerierte Sicherheitskopien\n"
+" nil, existing nummerierte Sicherheitskopien, wenn schon nummerierte\n"
+" vorhanden sind, sonst einfache\n"
+" never, simple immer einfache Sicherheitskopien\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Hauptsächlicher Arbeitsmodus:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "den Inhalt eines Archivs auflisten"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "Dateien aus einem Archiv extrahieren"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "ein neues Archiv anlegen"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "Unterschiede zwischen Archiv und Dateisystem suchen"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "Dateien hinten an das Archiv anfügen"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "nur Dateien anfügen, die neuer als die Kopie im Archiv sind"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "tar-Dateien an ein Archiv anfügen"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "aus dem Archiv löschen (nicht auf Magnetband!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "den Archiv-Teil-Namen überprüfen und beenden"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Feineinstellungen:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "löchrige Dateien („sparse files“) effizient behandeln"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "MAJOR[.MINOR]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr "zu benutzende Version des Sparse-Formats setzen (impliziert --sparse)"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "inkrementelle Sicherung im alten GNU-Format"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "DATEI"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "inkrementelle Sicherung im neuen GNU-Format"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "kein Abbruch mit Existatus!=0 bei unlesbaren Dateien"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "ZAHL"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"nur das ZAHLte Auftreten jeder Datei im Archiv bearbeiten; diese Option kann "
+"nur zusammen mit einem der Arbeitsmodi --delete, --diff, --extract oder --"
+"list und wenn eine Dateiliste entweder auf der Kommandozeile oder mittels "
+"der Option -T angegeben wurde benutzt werden; Zahl ist standardmäßig 1"
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "im Archiv kann positioniert werden"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "Steuerung des Ãœberschreibens:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "Archiv nach dem Schreiben prüfen"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "Dateien nach dem Hinzufügen zum Archiv löschen"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "vorhandene Dateien beim Extrahieren nicht überschreiben"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"vorhandene Dateien, die neuer als die Archivkopie sind, nicht überschreiben"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "vorhandene Dateien beim Extrahieren überschreiben"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "zu überschreibende Dateien vor dem Extrahieren löschen"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+"Verzeichnishierarchien rekursiv vor dem Extrahieren eines Verzeichnisses "
+"löschen"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "Metadaten existierender Verzeichnisse erhalten"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"Metadaten existierender Verzeichnisse beim Extrahieren überschreiben "
+"(Voreinstellung)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Wahl des Ausgabestroms:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "Dateien auf die Standardausgabe extrahieren"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "BEFEHL"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "extrahierte Dateien an ein anderes Programm weiterreichen"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "Exitstatus der Kinder ignorieren"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "Exitstatus!=0 von Kindern als Fehler ansehen"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Behandlung der Datei-Attribute:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "Eigentümer für hinzugefügte Dateien auf NAME setzen"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "Gruppe für hinzugefügte Dateien auf NAME setzen"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATUM-ODER-DATEI"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "Änderungszeit für hinzugefügte Datei aus DATUM-ODER-DATEI beziehen"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "ÄNDERUNGEN"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "den (symbolischen) Modus ÄNDERUNGEN für hinzugefügte Dateien erzwingen"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "METHODE"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"Zugriffszeit für abgespeicherte Dateien erhalten, entweder durch "
+"Zurücksetzen der Zeiten nach dem Lesen (METHODE=„replace“, Voreinstellung) "
+"oder dadurch, dass die Zeiten gar nicht erst neu gesetzt werden (METHODE="
+"„system“)"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "die geänderte Zeit nicht extrahieren"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+"versuchen, die Dateien mit denselben Eigentumsverhältnisse zu extrahieren"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "Dateien als aktueller Nutzer extrahieren"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "immer Zahlen für Nutzer-/Gruppennamen verwenden"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+"Informationen über Dateizugriffsrechte mit extrahieren (Voreinstellung für "
+"Root)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"die Umask des Nutzers anwenden beim Extrahieren von Dateizugriffsrechte aus "
+"dem Archiv (Voreinstellung für normale Nutzer)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "zu entpackende Dateinamen wie im Archiv sortieren"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "wie -p und -s zusammen"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"das Setzen von Zugriffszeiten und Rechten von extrahierten Verzeichnissen "
+"verschieben bis zum Ende des Entpackens"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "den Effekt von --delay-directory-restore aufheben"
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Geräteauswahl und -umschaltung:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARCHIV"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "Archivdatei oder Gerät ARCHIV benutzen"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "Archivdatei ist lokal, auch wenn der Name einen Doppelpunkt enthält"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "statt „rmt“ den gegebenen BEFEHL benutzen"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "statt „rsh“ den entfernten BEFEHL benutzen"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "Laufwerk und Schreibdichte angeben"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "mehrteiliges Archiv anlegen/listen/extrahieren"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "Medium wechseln, wenn ZAHL × 1024 Bytes geschrieben wurden"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "am Ende jedes Mediums das Skript ausführen (impliziert -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "Teil-Nummer in DATEI benutzen/aktualisieren"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Blockung des Gerätes:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLÖCKE"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLÖCKE × 512 Bytes pro Record"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "ZAHL Bytes pro Record, Vielfaches von 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "Blöcke mit Nullen im Archiv ignorieren (heißt EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "erneut Blocken beim Lesen (für 4.2BSDâ€Pipes)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Auswahl des Archiv-Formats:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMAT"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "Archiv mit dem gegebenen Format anlegen"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "FORMAT ist eines der folgenden:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "altes V7-tar-Format"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "GNU-Format wie mit tar <=1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU-tar-1.13.x-Format"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "Format von POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "Format von POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "wie pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "wie --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "wie --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "Schlüsselwort[[:]=Wert][,Schlüsselwort[[:]=Wert]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "Pax-Schlüsselwörter steuern"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TEXT"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"Archiv mit dem Teilnamen TEXT anlegen; beim Listen/Extrahieren, TEXT als "
+"Muster für den Teilnamen benutzen"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "Archiv durch bzip2 filtern"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "Archiv durch gzip filtern"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "Archiv durch COMPRESS filtern"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "durch PROG filten (muss -d akzeptieren)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Auswahl der lokalen Dateien:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"angegebene Datei zum Archiv hinzufügen (nützlich, wenn Datei mit einem "
+"Strich beginnt)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "VERZEICHNIS"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "zu VERZEICHNIS wechseln"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "Namen der zu bearbeitenden Dateien aus DATEI lesen"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T liest null-terminierte Namen, verbiete -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+"Dateinamen, die mit -T gelesen werden, von Zitat befreien (Voreinstellung)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "Dateinamen, die mit -T gelesen werden, nicht von Zitat befreien"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "MUSTER"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "Dateien auslassen, auf die MUSTER passt"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "Dateien auslassen, auf die in DATEI angegebene Muster passen"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "Verzeichnisse auslassen, die die Markierung „Cache-Verzeichnis“ tragen"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "Verzeichnisse auslassen, die die DATEI enthalten"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "Verzeichnisse auslassen, die die DATEI enthalten"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "Verzeichnisse auslassen, die die DATEI enthalten"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "Verzeichnisse auslassen, die die DATEI enthalten"
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr "Verzeichnisse auslassen, die die DATEI enthalten"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "automatischen Abstieg in Vezeichnisse vermeiden"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "beim Anlegen eines Archivs im lokalen Dateisystem bleiben"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "in Verzeichnisse absteigen (Voreinstellung)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "führende „/“-Zeichen in den Dateinamen erhalten"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+"symbolischen Verknüpfungen folgen; die verwiesenen Dateien archivieren und "
+"abspeichern"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "ELEMENT-NAME"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "mit ELEMENT-NAME im Archiv beginnen"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "nur Dateien ablegen, die neuer als DATUM-ODER-DATEI sind"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATUM"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "Datum und Zeit nur überprüfen, wenn Daten geändert wurden"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "KONTROLLE"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "Sicherung vor dem Entfernen, wähle Versions-KONTROLLE"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "ZEICHENKETTE"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"Sicherung vor dem Entfernen, übliches Suffix ersetzen („~“, wenn nicht durch "
+"Umgebungsvariable SIMPLE_BACKUP_SUFFIX anders gesetzt)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Dateinamentransformationen:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "ZAHL führende Komponenten beim Extrahieren von Dateinamen entfernen"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "AUSDRUCK"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr "den sed-AUSDRUCK zur Dateinamentransformation benutzen"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+"Dateinamenauswahloptionen (sowohl für ein- als auch ausschließende Muster):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "Groß-/Kleinschreibung ignorieren"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "Muster am Dateinamensanfang ausrichten"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "Muster passen nach jedem „/“ (Voreinstellung beim Ausschluss)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "Groß-/Kleinschreibung beachten (Voreinstellung)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "Muster benutzen (Voreinstellung für Ausschluss)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "Zeichenketten sind buchstabengetreu"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "Jokerzeichen passen nicht auf „/“"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "Jokerzeichen passen auf „/“ (Voreinstellung für Ausschluss)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Informationen:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "bearbeitete Dateien ausführlich listen"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]ZAHL"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+"Fortschrittsnachrichten bei jedem ZAHLten Record (Voreinstellung 10) anzeigen"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+"eine Nachricht ausgeben, wenn nicht alle Verknüpfungen abgespeichert werden"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "SIGNAL"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"Gesamtzahl der Bytes nach dem Bearbeiten des Archivs anzeigen; mit einem "
+"Argument – Gesamtzahl der Bytes anzeigen, wenn dieses SIGNAL ausgeliefert "
+"wird; erlaubte Signale sind: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 und SIGUSR2; "
+"die Namen ohne das Präfix SIG sind auch erlaubt"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "Dateiänderungszeiten in UTC anzeigen"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "ausführliche Ausgabe in DATEI schreiben"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "bei jeder Nachricht die Blocknummer innerhalb des Archivs mit anzeigen"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "für jede Aktion um Bestätigung bitten"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "Voreinstellungen von tar anzeigen"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"beim Listen oder Extrahieren jedes Verzeichnis auflisten, dass nicht den "
+"Suchkriterien entspricht"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "Datei- oder Archivnamen nach der Transformation anzeigen"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "STIL"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr "Zitatstil setzen; siehe unten für gültige STIL-Werte"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "zusätzliche Zeichen aus ZEICHENKETTE zitieren"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "Zeichen aus ZEICHENKETTE nicht zitieren"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Kompatibilitätsoptionen:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr "beim Anlegen wie --old-archive; beim Extrahieren wie --no-same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Weitere Optionen:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "möglicherweise schädliche Optionen deaktivieren"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Von den Optionen „-Acdtrux“ ist nur _eine_ erlaubt."
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Kompressionsoptionen schließen sich gegenseitig aus."
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Unbekannter Signalname: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Datumsdatei nicht gefunden"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Ersetze %s für unbekanntes Datumsformat %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Option %s: Behandle Datum „%s“ als %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: Dateiliste schon gelesen"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: gelesener Dateiname enthält ein NULL-Zeichen"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "Gültige Argumente für die Option --quoting-style sind:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Dieses* „tar“ hat als Voreinstellung:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Ungültige Blockgröße"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Warnung: Die Option -I ist nicht unterstützt, meinen Sie -j oder -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Ungültige Bandlänge"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Mehr als ein Datum angegeben."
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "Ungültiger Wert für Sparse-Version"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' wird auf dieser Plattform nicht unterstützt"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "Wert für --checkpoint ist keine ganze Zahl"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Ungültige Gruppe"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Ungültige Zugriffsrechte angegeben."
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Ungültige Zahl"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Ungültiger Benutzer"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Ungültiger Wert für Recordgröße."
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Die Recordgröße muss ein Vielfaches von %d sein."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Ungültige Elementanzahl"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "Nur eine Option --to-command erlaubt"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Fehlgeformtes Dichteargument: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Unbekannte Dicht: „%c“"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Die Optionen „-[0-7][lmh]“ unterstützt *dieses* „tar“ nicht."
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[DATEI]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Die alte Option „%c“ benötigt einen Parameter."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence ist ohne Dateiliste bedeutungslos"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+"--occurrence kann im angeforderten Operationsmodus nicht benutzt werden"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Mehrere Archivdateien verlangen die Option „-M“."
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "--listed-incremental kann nicht mit --newer benutzt werden"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Band-Nummer ist zu lang (Maximum ist ein Byte)."
+msgstr[1] "%s: Band-Nummer ist zu lang (Maximum ist %lu Bytes)."
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Kann mehrteilige Archive nicht prüfen."
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Kann komprimierte Archive nicht prüfen"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Kann keine mehrteiligen komprimierten Archive verwenden."
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Kann komprimierte Archive nicht aneinanderhängen"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option kann nur mit POSIX-Archiven benutzt werden"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Anlegen eines leeren Archivs wird feige verweigert."
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Die Optionen „-Aru“ sind nicht kompatibel mit „-f -“."
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Eine der Optionen „-Acdtrux“ ist notwendig."
+
+# Was ist hier genau gemeint? ke
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Fehler beim Beenden, verursacht durch vorhergehende Fehler."
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Datei ist um ein Byte geschrumpft."
+msgstr[1] "%s: Datei ist um %s Bytes geschrumpft."
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Schlüsselwort %s ist unbekannt oder noch nicht implementiert"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Muster %s kann nicht benutzt werden"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Schlüsselwort %s kann nicht überschrieben werden"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Fehlgeformter erweiterter Kopfteil: fehlende Länge"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "Länge des erweiterten Kopfteils ist außerhalb des erlaubten Bereichs"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Länge %*s des erweiterten Kopfteils ist außerhalb des Bereichs"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "Fehlgeformter erweiterter Kopfteil: fehlender Leerraum nach der Länge"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Fehlgeformter erweiterter Kopfteil: fehlendes Gleichheitszeichen"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Fehlgeformter erweiterter Kopfteil: fehlender Zeilenvorschub"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "Ignoriere unbekanntes Schlüsselwort „%s“ für erweiterten Kopfteil"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+"Generiertes Schlüsselwort/Wert-Paar ist zu lang (Schlüsselwort=%s, Länge =%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Erweiterter Kopfteil %s=%s ist außerhalb des Bereichs %s..%s."
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Fehlgeformter erweiterter Kopfteil: ungültiges %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Fehlgeformter erweiterter Kopfteil: überzähliges %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+"Fehlgeformter erweiterter Kopfteil: ungültiges %s: unerwarteter Trenner %c"
+
+# Ist „odd“ hier ungerade oder merkwürdig?
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+"Fehlgeformter erweiterter Kopfteil: ungültiges %s: ungewönliche Anzahl von "
+"Werten"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile manipuliert Datendateien für die Testsuit der GNU paxutils.\n"
+"OPTIONEN sind:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Optionen beim Anlegen von Dateien:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "GRÖßE"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Datei der gegebenen GRÖßE anlegen"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "in Datei NAME anstelle der Standardausgabe schreiben"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Dateinamenlist aus DATEI lesen"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T liest null-terminierte Namen"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+"Die Datei mit dem gegebenen MUSTER füllen. MUSTER ist „default“ oder „zeros“."
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Größe eines Blocks für löchrige Dateien"
+
+# „map“: Karte, Abbildung?
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+"Löchrige („sparse“) Datei erzeugen. Der Rest der Kommandozeile gibt die die "
+"Dateibildungsvorschrift an."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr "POSITION"
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr "vor dem Schreiben zur gegebenen Position springen"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Dateistatistikoptionen:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"Inhalt des „struct stat“ für jede gegebene Datei ausgeben. Standard-FORMAT "
+"ist:"
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Optionen für synchrone Ausführung:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"jeden gegebenen BEFEHL ausführen; nützlich mit --checkpoint und einem aus --"
+"cut, --append, --touch"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+"gegebene Aktion (siehe unten) beim Erreichen des Kontrollpunkts ZAHL "
+"ausführen"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Datum für nächste „--touch“-Operation setzen"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "ausgeführte Kontrollpunkte und Beendigungsstatus von BEFEHL anzeigen"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Aktioen für synchrone Ausführung. Diese werden beim Erreichen des "
+"Kontrollpunkt, der mit der Option --checkpoint gesetzt wurde, ausgeführt."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"DATEI kürzen auf die Länge, die mit einer vorhergehenden Option --length "
+"(oder 0 bei Abwesenheit) gesetzt wurde"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+"GRÖßE Bytes an DATEI anfügen. GRÖßE wird mit einer vorhergehenden Option --"
+"length gesetzt."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "Zugriffs- und Änderungszeiten der DATEI neu setzen"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "BEFEHL ausführen"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Ungültige Größe: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Zahl außerhalb des zulässigen Bereichs: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Negative Größe: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "stat(%s) fehlgeschlagen"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Fehler beim Parser der Zahl in der Nähe von „%s“"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Unbekanntes Datumsformat"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARGUMENTE...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "kann „%s“ nicht öffnen"
+
+#: tests/genfile.c:426
+#, c-format
+msgid "cannot seek: %s"
+msgstr "kann nicht positionieren: %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "Dateiname enthält Null-Zeichen"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"kann auf der Standardausgabe keine löchrige Datei erstellen, benutzen Sie "
+"die Option --file"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "inkorrekte Maske (nahe „%s“)"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "unbekannte Feld „%s“"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "kann an „%s“ keine Zeit setzen"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Befehl erfolgreich ausgeführt\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Befehl schlug mit Beendigungsstatus %d fehl.\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Befehl beendete sich bei Signal %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Befehl hieltb bei Signal %d an\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Befehl erzeugte einen Core-Dump\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Befehl beendet\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "--stat erfordert Dateinamen"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "zu viele Argumente"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Lesefehler bei Byte %s, lese ein Byte"
+#~ msgstr[1] "%s: Lesefehler bei Byte %s, lese %lu Bytes"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "––Verstümmelte Dateinamen––\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Unerwartetes Dateiende in verstümmelten Namen."
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "%s in %s umbenannt"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Kann nicht zu „%s“ linken."
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Symbolischer Verküpfung von %s auf %s."
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Unbekanntes Kommando „%s“ beim Zusammensetzen von Namen."
diff --git a/po/el.gmo b/po/el.gmo
new file mode 100644
index 0000000..ce4d5e9
--- /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..64e61be
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,2879 @@
+# Greek translation of tar
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+# Μπαλάσκας Ευάγγελος (Balaskas Euaggelos) <ebalaskas@cs.teiath.gr>, 2004.
+# Simos Xenitellis <simos74@gmx.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.13.25 \n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2004-03-08 14:44+0200\n"
+"Last-Translator: Μπαλάσκας Ευάγγελος (Balaskas Euaggelos) <ebalaskas@cs."
+"teiath.gr>\n"
+"Language-Team: Greek <nls@tux.hellug.gr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0.2\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "άκυÏο ÏŒÏισμα %s για %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "αμφιλεγόμενο ÏŒÏισμα %s για %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "ΈγκυÏα οÏίσματα είναι:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"ΧÏήση: %s [ΕΠΙΛΟΓΉ]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "ΠÏοσπαθήστε `%s --help' για πεÏισσότεÏες πληÏοφοÏίες.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+"ΑναφοÏά σφαλμάτων στο <bug-tar@gnu.org>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Άγνωστο σφάλμα συστήματος"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: η επιλογή `%s' απαιτεί ÏŒÏισμα\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: η επιλογή`%s' είναι αμφιλεγόμενη\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: η επιλογή `--%s' δεν επιτÏέπει ÏŒÏισμα\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: η επιλογή `%c%s' δεν επιτÏέπει ÏŒÏισμα\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: η επιλογή `%s' απαιτεί ÏŒÏισμα\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: μη αναγνωÏίσιμη επιλογή `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: μη αναγνωÏίσιμη επιλογή `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: παÏάνομη επιλογή -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: άκυÏη επιλογή -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: η επιλογή απαιτεί ÏŒÏισμα -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: η επιλογή `-W %s' είναι αμφιλεγόμενη\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: η επιλογή `-W %s' δεν επιτÏέπει ÏŒÏισμα\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "μέγεθος μπλοκ"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "η μνήμη εξαντλήθηκε"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Δεν είναι δυνατή %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: ΠÏοειδοποίηση: Δεν είναι δυνατή %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Δεν είναι δυνατή η αλλαγή κατάστασης σε %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Δεν είναι δυνατή η αλλαγή ιδιοκτησίας σε uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Δεν είναι δυνατή η σÏνδεση Ï…Î»Î¹ÎºÎ¿Ï ÏƒÎµ %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Σφάλμα ανάγνωσης στο byte %s, διαβάζοντας %lu byte"
+msgstr[1] "%s: Σφάλμα ανάγνωσης στο byte %s, διαβάζοντας %lu byte"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] ""
+"%s: ΠÏοειδοποίηση: Σφάλμα ανάγνωσης στο byte %s, διαβάζοντας %lu byte"
+msgstr[1] ""
+"%s: ΠÏοειδοποίηση: Σφάλμα ανάγνωσης στο byte %s, διαβάζοντας %lu byte"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Δεν είναι δυνατή η αναζήτηση σε %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: ΠÏοειδοποίηση: Δεν είναι δυνατή η αναζήτηση σε %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Δεν είναι δυνατή η δημιουÏγία ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï ÏƒÏ„Î¿ %s"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: ΓÏάφτηκαν μόνο %lu από %lu byte"
+msgstr[1] "%s: ΓÏάφτηκαν μόνο %lu από %lu byte"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "ΑπομακÏÏνονται τα αÏχικά `%.*s' από τα ονόματα των μελών"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "ΑπομακÏÏνονται τα αÏχικά `%.*s' από τα ονόματα των μελών"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "ΑπομακÏÏνονται τα αÏχικά `%.*s' από τα ονόματα των μελών"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Μη διαθέσιμη υπηÏεσία"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "κανονική είσοδος"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "κανονική έξοδος"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Δεν είναι δυνατή η εκτέλεση απομακÏυσμένου κελÏφους (φλοιοÏ)"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Δεν είναι δυνατή η δέσμευση Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ï€Î¿Î¸Î·ÎºÎµÏ…Ï„Î¹ÎºÎ¿Ï Ï‡ÏŽÏου \n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Δεν είναι δυνατή η δέσμευση Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ï€Î¿Î¸Î·ÎºÎµÏ…Ï„Î¹ÎºÎ¿Ï Ï‡ÏŽÏου"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "ΠÏοσπαθήστε `%s --help' για πεÏισσότεÏες πληÏοφοÏίες.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"ΧÏήση: %s [ΕΠΙΛΟΓΉ]\n"
+"ΔιαχείÏιση συσκευής αποθήκευσης ταινίας, αποδοχή εντολών από απομακÏυσμένη "
+"διεÏγασία.\n"
+"\n"
+" --version Εμφάνιση πληÏοφοÏιών έκδοσης.\n"
+" --help Εμφάνιση αυτής της βοήθειας.\n"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ΑναφοÏά σφαλμάτων στο <bug-tar@gnu.org>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Η μετατόπιση αναζήτησης είναι εκτός εÏÏους"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Η μετατόπιση αναζήτησης είναι εκτός εÏÏους"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Η κατεÏθυνση αναζήτησης είναι εκτός εÏÏους"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: ΠÏόωÏο eof (τέλος αÏχείου)\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "ΠÏόωÏο τέλος αÏχείου"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Εντολή αποÏÏιμμάτων"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Συνολικά byte που γÏάφτηκαν: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Συνολικά byte που γÏάφτηκαν: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(σωλήνωση)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "ΆκυÏη τιμή για record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Δεν δόθηκε όνομα αÏχειοθήκης"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr ""
+"Δεν είναι δυνατή η επαλήθευση των κανονικών εισόδων/εξόδων της αÏχειοθήκης"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Δεν είναι δυνατή η ανανέωση των συμπιεσμένων αÏχειοθηκών"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "ΕγγÏαφή σημείου ελέγχου %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Ανάγνωση σημείου ελέγχου %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Στην αÏχή της ταινίας, τεÏματισμός Ï„ÏŽÏα"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "ΠάÏα πολλά σφάλματα, τεÏματισμός"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Μη ευθυγÏαμμισμένο μπλοκ (%lu byte) στην αÏχειοθήκη"
+msgstr[1] "Μη ευθυγÏαμμισμένο μπλοκ (%lu byte) στην αÏχειοθήκη"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Μέγεθος εγγÏαφής = %lu block"
+msgstr[1] "Μέγεθος εγγÏαφής = %lu block"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: πεÏιέχει άκυÏο αÏιθμό τόμου"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "ΥπεÏχήλιση αÏÎ¹Î¸Î¼Î¿Ï Ï„ÏŒÎ¼Î¿Ï…"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "ΠÏοετοίμασε τον τόμο #%d για %s και πάτα το πλήκτÏο επιστÏοφής γÏαμμής"
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF (Τέλος ΑÏχείου) ενώ η απάντηση του χÏήστη αναμενότανε"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ΠΡΟΕΙΔΟΠΟΊΗΣΗ: Η αÏχειοθήκη είναι ημιτελής"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [όνομα] Δώσε ένα νέο όνομα για τον επόμενο (και τον επακόλουθο) τόμο\n"
+" q Εγκατάλειψη tar\n"
+" ! ΠαÏαγωγή νέου υπό-φλοιοÏ\n"
+" ? ΕκτÏπωση αυτής της λίστας\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Κανένας νέος τόμος; έξοδος\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "`%s' η εντολή απέτυχε"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Αυτό δεν φαίνεται ως αÏχειοθήκη tar"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s δεν συνεχίζεται σε αυτόν τον τόμο"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s δεν συνεχίζεται σε αυτόν τον τόμο"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s είναι το εσφαλμένο μέγεθος (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Αυτός ο τόμος είναι εκτός συνέχειας"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Η αÏχειοθήκη δεν έχει ετικέτα για ταίÏιασμα %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Ο τόμος %s δεν ταιÏιάζει %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Δυνατή μόνο η ανάγνωση %lu από %lu byte"
+msgstr[1] "Δυνατή μόνο η ανάγνωση %lu από %lu byte"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Τα πεÏιεχόμενα διαφέÏουν"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Μη αναμενόμενο EOF (Τέλος ΑÏχείου) στην αÏχειοθήκη"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Οι Ï„Ïποι αÏχείων διαφέÏουν"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Οι καταστάσεις διαφέÏουν"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Ταυτότητες χÏήστη διαφέÏουν"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Ταυτότητες ομάδας διαφέÏουν"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "ÎÏες Ï„Ïοποποίησης διαφέÏουν"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Τα μεγέθη διαφέÏουν"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Δεν είναι συνδεδεμένο με %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Οι σÏνδεσμοι διαφέÏουν"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Οι αÏιθμοί των συσκευών διαφέÏουν"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Επαλήθευση "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Άγνωστος Ï„Ïπος αÏχείου '%c', εκτέλεση της diff ως κανονικό αÏχείο"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "Η ΕΠΑΛΎΘΕΥΣΗ ΑΠΈΤΥΧΕ: ανιχνεÏτηκαν %d άκυÏη(ες) επικεφαλίδα(δες)"
+msgstr[1] "Η ΕΠΑΛΎΘΕΥΣΗ ΑΠΈΤΥΧΕ: ανιχνεÏτηκαν %d άκυÏη(ες) επικεφαλίδα(δες)"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: το αÏχείο είναι η αÏχειοθήκη; δεν αποθηκεÏτηκε"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "η τιμή %s είναι εκτός του %s εÏÏος %s..%s; αντικαταστήθηκε από %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "η τιμή %s είναι εκτός του %s εÏÏους %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "ΠαÏάχθηκαν αÏνητικές οκταδικές επικεφαλίδες"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: δεν μποÏεί να Ï„Ïοποποιηθεί το αÏχείο; δεν αποθηκεÏτηκε"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: δεν μποÏεί να Ï„Ïοποποιηθεί το αÏχείο; δεν αποθηκεÏτηκε"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: δεν μποÏεί να Ï„Ïοποποιηθεί το αÏχείο; δεν αποθηκεÏτηκε"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Το αÏχείο συÏÏικνώθηκε σε %s bytes; συμπλήÏωση με μηδενικά"
+msgstr[1] "%s: Το αÏχείο συÏÏικνώθηκε σε %s bytes; συμπλήÏωση με μηδενικά"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: το αÏχείο είναι σε διαφοÏετικό σÏστημα αÏχείων; δεν αποθηκεÏτηκε"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Άγνωστος Ï„Ïπος αÏχείου; το αÏχείο αγνοήθηκε"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " σÏνδεσμος σε %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: δεν μποÏεί να Ï„Ïοποποιηθεί το αÏχείο; δεν αποθηκεÏτηκε"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: το αÏχείο είναι η αÏχειοθήκη; δεν αποθηκεÏτηκε"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Το αÏχείο απομακÏÏνθηκε Ï€Ïιν το διαβάσουμε"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: το αÏχείο είναι η αÏχειοθήκη; δεν αποθηκεÏτηκε"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: αÏχείο Ï„Ïοποποιήθηκε κατά την ανάγνωση"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: η υποδοχή αγνοήθηκε"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: η πόÏτα αγνοήθηκε"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "ΠαÏαλείποντας στην επόμενη επικεφαλίδα"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "ΔιαγÏαφή μη-επικεφαλίδων από την αÏχειοθήκη"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: η ένδειξη χÏόνου %s είναι %lu s στο μέλλον"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Μη αναμενόμενη ανακολουθία κατά την δημιουÏγία του καταλόγου"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Ο κατάλογος μετονομάστηκε Ï€Ïιν η κατάστασή του γίνει μη εξαγώγιμη"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Εξαγωγή συνεχόμενων αÏχείων ως κανονικών αÏχείων"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "ΠÏοσπάθεια εξαγωγής των συμβολικών συνδέσμων ως σθεναÏών συνδέσμων"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Ανάγνωση %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Δεν είναι δυνατή η εξαγωγή -- το αÏχείο συνεχίζεται σε άλλο τόμο"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Μη αναμενόμενο EOF (Τέλος ΑÏχείου) στα κατακεÏματισμένα ονόματα"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Άγνωστος Ï„Ïπος αÏχείου '%c', εξαγωγή ως κανονικό αÏχείο"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Δεν είναι δυνατή η αποθήκευση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… αÏχείου"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Δεν είναι δυνατή η μετονομασία σε %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Το σφάλμα δεν είναι επανοÏθώσιμο: τεÏματισμός Ï„ÏŽÏα"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Ο κατάλογος έχει μετονομαστεί"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Ο κατάλογος έχει μετονομαστεί"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Ο κατάλογος είναι καινοÏÏιος"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "ΆκυÏη ένδειξη χÏόνου"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "ΆκυÏη κατάσταση δόθηκε σε επιλογή"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "ΆκυÏος αÏιθμός συσκευής"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "ΆκυÏος αÏιθμός i-κόμβου"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Μη αναμενόμενο EOF (Τέλος ΑÏχείου) στην αÏχειοθήκη"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Δεν είναι δυνατή η δέσμευση μνήμης για τον συντελεστή ομαδοποίησης %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: το αÏχείο είναι σε διαφοÏετικό σÏστημα αÏχείων; δεν αποθηκεÏτηκε"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: ΔιαγÏαφή %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Δεν είναι δυνατή η απομάκÏυνση"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: ΠαÏάλειψη"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "μπλοκ %s: ** Μπλοκ με χαÏακτήÏες NUL **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "μπλοκ %s: ** Τέλος ΑÏχείου **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "μπλοκ %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Κενά στην επικεφαλίδα ενώ αναμενόταν αÏιθμητική τιμή %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"ΑÏχειοθήκη οκταδικής τιμής %.*s είναι εκτός του %s εÏÏους; Υποθέτω δυαδικά "
+"συμπληÏώματα"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "ΑÏχειοθήκη οκταδικής τιμής %.*s είναι εκτός του %s εÏÏους"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Η αÏχειοθήκη πεÏιέχει απαÏχαιωμένες επικεφαλίδες κωδικοποίησης base64"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+"Η αÏχειοθήκη είναι υπογεγÏαμμένη με αλφαÏιθμητικά base-64 %s είναι εκτός του "
+"%s εÏÏους"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Η αÏχειοθήκη με base-256 τιμές είναι εκτός του %s εÏÏους"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Η αÏχειοθήκη πεÏιέχει %.*s όπου αÏιθμητικές %s τιμές αναμένονται"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Η τιμή της αÏχειοθήκης %s είναι εκτός του %s εÏÏους %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " σÏνδεσμος σε %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " άγνωστος Ï„Ïπος αÏχείου %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Επικεφαλίδα Τόμου--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Συνέχιση στο byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "ΔημιουÏγία καταλόγου:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Μετονομασία %s σε %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Δεν είναι δυνατή η μετονομασία σε %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Μετονομασία %s πίσω στο %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Δεν είναι δυνατή η αποθήκευση του Ï„Ïέχοντος καταλόγου"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Δεν είναι δυνατή η Ï„Ïοποποίηση του Ï„Ïέχοντος καταλόγου"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "θυγατÏική διεÏγασία"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "κανάλι Î¼ÎµÏ„Î±Î¾Ï Î´Î¹ÎµÏγασιών"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Δεν βÏέθηκε στην αÏχειοθήκη"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Δεν βÏέθηκε στην αÏχειοθήκη"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Οι επιλογές `-%s' και `-%s' απαιτοÏν κανονική είσοδο"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: ΆκυÏη ομάδα"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Τα χαÏακτηÏιστικά GNU απαιτοÏν μη συμβατή διαμόÏφωση αÏχειοθήκης"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"ΧÏήση: %s [ΕΠΙΛΟΓΈΣ]... [ΑΡΧΕΊΟ]...\n"
+"\n"
+"ΠαÏαδείγματα:\n"
+" %s -cf archive.tar foo bar # ΔημιουÏγεί το archive.tar από τα αÏχεία foo "
+"και bar.\n"
+" %s -tvf archive.tar # Εμφανίζει σε λίστα όλα τα αÏχεία από το "
+"archive.tar με λεπτομέÏειες.\n"
+" %s -xf archive.tar # Εξάγει όλα τα αÏχεία από το archive.tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+"Η κατάληξη αντιγÏάφου είναι `~', εκτός εάν τεθεί --suffix ή με "
+"SIMPLE_BACKUP_SUFFIX.\n"
+"Ο έλεγχος της έκδοσης μποÏεί να τεθεί με --backup ή με VERSION_CONTROL, οι "
+"τιμές είναι:\n"
+"\n"
+" t, numbered κάνε αÏιθμημένα αντίγÏαφα\n"
+" nil, existing αÏίθμησε-τα ακόμα και εάν είναι αÏιθμημένα, απλά "
+"διαφοÏετικά\n"
+" never, simple πάντα κάνε απλά αντίγÏαφα\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Μη αναμενόμενο EOF (Τέλος ΑÏχείου) στην αÏχειοθήκη"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Σφάλμα κατά την εγγÏαφή στην κανονική έξοδο"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Δεν είναι δυνατή η επαλήθευση πολλαπλών αÏχειοθηκών"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "ΣυγκÏουόμενες επιλογές διαμόÏφωσης αÏχειοθήκης"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s: το αÏχείο είναι η αÏχειοθήκη; δεν αποθηκεÏτηκε"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s: το αÏχείο είναι η αÏχειοθήκη; δεν αποθηκεÏτηκε"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Δεν είναι δυνατή η Ï„Ïοποποίηση του Ï„Ïέχοντος καταλόγου"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "ΑπομακÏÏνονται τα αÏχικά `%.*s' από τα ονόματα των μελών"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Ο τόμος %s δεν ταιÏιάζει %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Ίσως δεν καθοÏίσατε παÏαπάνω από μία επιλογή `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "ΣυγκÏουόμενες επιλογές συμπίεσης"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " άγνωστος Ï„Ïπος αÏχείου %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Το αÏχείο ημεÏομηνίας δεν βÏέθηκε"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Αντικατάσταση %s για άγνωστη διαμόÏφωση ημεÏομηνίας %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: το αÏχείο είναι η αÏχειοθήκη; δεν αποθηκεÏτηκε"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "ΆκυÏος συντελεστής ομαδοποίησης"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+"ΠÏοειδοποίηση: η -I επιλογή δεν υποστηÏίζεται; ίσως εννοοÏσατε την -j ή την -"
+"T;"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "ΆκυÏο μέγεθος ταινίας"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "ΠαÏαπάνω από ένα ÏŒÏιο ημεÏομηνίας"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: ΆκυÏη ομάδα"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "ΆκυÏη κατάσταση δόθηκε σε επιλογή"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "ΆκυÏος αÏιθμός i-κόμβου"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "ΆκυÏος ιδιοκτήτης"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "ΆκυÏο μέγεθος εγγÏαφής"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Το μέγεθος της εγγÏαφής Ï€Ïέπει να είναι πολλαπλάσιο του %d."
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "ΆκυÏο μέγεθος ταινίας"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr ""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr ""
+"Οι επιλογές `-[0-7][lmh]' δεν υποστηÏίζονται από *αυτήν* την εντολή tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Παλιά επιλογή `%c' απαιτεί ÏŒÏισμα."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Πολλαπλά αÏχεία αÏχειοθηκών απαιτοÏν την επιλογή `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Δεν είναι δυνατός ο συνδυασμός --listed-incremental με --newer"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Η ετικέτα του τόμου είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î· (το ÏŒÏιο είναι %lu byte)"
+msgstr[1] "%s: Η ετικέτα του τόμου είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î· (το ÏŒÏιο είναι %lu byte)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Δεν είναι δυνατή η επαλήθευση πολλαπλών αÏχειοθηκών"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Δεν είναι δυνατή η επαλήθευση των συμπιεσμένων αÏχειοθηκών"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Δεν είναι δυνατή η χÏήση πολλαπλών συμπιεσμένων αÏχειοθηκών"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Δεν είναι δυνατή η ανανέωση των συμπιεσμένων αÏχειοθηκών"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "ΑÏνοÏμαι δειλά στη δημιουÏγία μίας κενής αÏχειοθήκης"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Οι επιλογές `-Aru' δεν είναι συμβατές με `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "ΠÏέπει να καθοÏίσεις μία από τις επιλογές `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "ΚαθυστέÏησε το σφάλμα εξόδου από Ï€ÏοηγοÏμενα σφάλματα"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Το αÏχείο συÏÏικνώθηκε κάτα %s byte"
+msgstr[1] "%s: Το αÏχείο συÏÏικνώθηκε κάτα %s byte"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr ""
+"Η αÏχειοθήκη είναι υπογεγÏαμμένη με αλφαÏιθμητικά base-64 %s είναι εκτός του "
+"%s εÏÏους"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Η τιμή της αÏχειοθήκης %s είναι εκτός του %s εÏÏους %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "ΠαÏάγει αÏχεία δεδομένων για δοκιμαστική πλατφόÏμα GNU tar.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "ΣυγκÏουόμενες επιλογές συμπίεσης"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Σφάλμα κατά την εγγÏαφή στην κανονική έξοδο"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "ΆκυÏη ένδειξη χÏόνου"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Ο αÏιθμός του i-κόμβου είναι εκτός εÏÏους"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Άγνωστο σφάλμα συστήματος"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Δεν είναι δυνατή η αναζήτηση σε %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " άγνωστος Ï„Ïπος αÏχείου %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Δεν είναι δυνατή η αναζήτηση σε %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Η θυγατÏική διεÏγασία τεÏματίστηκε με το σήμα %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--ΚατακεÏματισμένα ονόματα αÏχείων--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close"
+#~ msgstr "Δεν είναι δυνατό το κλείσιμο"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Δεν είναι δυνατή η εκτέλεση της dup"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Δεν είναι δυνατή η χÏήση συμπιεσμένων ή απομακÏυσμένων αÏχειοθηκών"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (θυγατÏική)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (εγγόνι)"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ΠΡΟΕΙΔΟΠΟΊΗΣΗ: Καμία κεφαλίδα του πλήθους"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Η θυγατÏική διεÏγασία επέστÏεψε την κατάσταση %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Τα ονόματα των μελών πεÏιέχουν `..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: Τα ονόματα των μελών πεÏιέχουν `..'"
+
+#~ msgid "Visible long name error"
+#~ msgstr "ΟÏατό σφάλμα μεγάλων ονομάτων"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Η ένδειξη χÏόνου είναι εκτός εÏÏους"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Ο αÏιθμός της συσκευής είναι εκτός εÏÏους"
+
+#~ msgid "Visible longname error"
+#~ msgstr "ΟÏατό σφάλμα μεγάλων ονομάτων"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Μετονομάστηκε %s σε %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Δεν είναι δυνατή η συμβολική σÏνδεση στο %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Συμβολικός δεσμός %s στο %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Άγνωστη εντολή ανασÏνταξης %s"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Λείπει όνομα αÏχείου μετά -C"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Αυτό το Ï€ÏόγÏαμμα παÏέχεται χωÏίς ΚΑΜΜΙΑ ΕΓΓΎΗΣΗ, στον βαθμό που "
+#~ "επιτÏέπεται από τον νόμο.\n"
+#~ "ΜποÏείτε να το αναδιανέμεται υπό τους ÏŒÏους της GNU General Public "
+#~ "License;\n"
+#~ "δείτε το αÏχείο με όνομα COPYING για λεπτομέÏειες."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Εντολή αποÏÏιμμάτων %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "Η εντολή GNU `tar' αποθηκεÏει πολλά αÏχεία μαζί σε μία μόνο ταινία (tape) "
+#~ "ή σε μία αÏχειοθήκη δίσκου (disk archive),\n"
+#~ " και μποÏεί να επαναφέÏει ξεχωÏιστά αÏχεία από την αÏχειοθήκη.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Εάν μία μεγάλη επιλογή παÏουσιάζει ένα ÏŒÏισμα ως υποχÏεωτικό,\n"
+#~ "τότε αυτό είναι υποχÏεωτικό και για την αντίστοιχη σÏντομη επιλογή "
+#~ "επίσης.\n"
+#~ "ΠαÏομοίως για Ï€ÏοαιÏετικά οÏίσματα.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ΚÏÏια κατάσταση λειτουÏγίας:\n"
+#~ " -t, --list εμφανίζει λίστα τα πεÏιεχόμενα μίας "
+#~ "αÏχειοθήκης\n"
+#~ " -x, --extract, --get εξάγει τα αÏχεία από μία αÏχειοθήκη\n"
+#~ " -c, --create δημιουÏγεί μία νέα αÏχειοθήκη\n"
+#~ " -d, --diff, --compare βÏίσκει διαφοÏές Î¼ÎµÏ„Î±Î¾Ï Î¼Î¯Î±Ï‚ αÏχειοθήκης και "
+#~ "ενός συστήματος αÏχείων\n"
+#~ " -r, --append Ï€Ïοσθέτει αÏχεία στο τέλος μίας αÏχειοθήκης\n"
+#~ " -u, --update μόνο Ï€Ïοσθέτει αÏχεία νεότεÏα από ότι αυτά στο "
+#~ "αντίγÏαφο της αÏχειοθήκης\n"
+#~ " -A, --catenate Ï€Ïοσθέτει αÏχεία tar σε μία αÏχειοθήκη\n"
+#~ " --concatenate ίδιο όπως -A\n"
+#~ " --delete διαγÏάφει από μία αÏχειοθήκη (όχι γιαμαγνητικές "
+#~ "ταινίες)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ΤÏοποποιητές λειτουÏγίας:\n"
+#~ " -W, --verify Ï€Ïοσπάθεια για επιβεβαίωση της αÏχειοθήκης "
+#~ "μετά από την εγγÏαφή της\n"
+#~ " --remove-files απομακÏÏνει τα αÏχεία μετά την Ï€Ïοσθήκη τους "
+#~ "στην αÏχειοθήκη\n"
+#~ " -k, --keep-old-files δεν αντικαθιστά τα υπάÏχοντα αÏχεία κατά την "
+#~ "εξαγωγή τους\n"
+#~ " --overwrite αντικαθιστά τα υπάÏχοντα αÏχεία κατά την "
+#~ "εξαγωγή τους\n"
+#~ " --overwrite-dir αντικαθιστά καταλόγους με τα δεδομένα κατά "
+#~ "την εξαγωγή τους\n"
+#~ " -U, --unlink-first απομακÏÏνει κάθε σÏνδεσμο αÏχείου για να τα "
+#~ "εξάγει\n"
+#~ " --recursive-unlink καθοÏίζει τις ιεÏαÏχικότητες των συνδέσμων "
+#~ "των αÏχείων για να τα εξάγει\n"
+#~ " -S, --sparse χειÏίζεται τα αÏαιά αÏχεία αποτελεσματικά\n"
+#~ " -O, --to-stdout εξάγει τα αÏχεία στην κανονική έξοδο\n"
+#~ " -G, --incremental χειÏίζεται τα παλιά GNU-format αυξανόμενα "
+#~ "αντίγÏαφα\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " χειÏίζεται τα νέα GNU-format αυξανόμενα "
+#~ "αντίγÏαφα\n"
+#~ " --ignore-failed-read αποφυγή τεÏÎ¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÎºÎ±Ï„Î¬ μη-μηδενικά ή μη-"
+#~ "αναγνώσιμα αÏχεία\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ΧειÏισμός αÏχείων ιδιοτήτων:\n"
+#~ " --owner=ÎŒÎΟΜΑ ÏÏθμιση ÎŒÎΟΜΑ ως ιδιοκτήτης για τα "
+#~ "Ï€Ïόσθετα αÏχεία\n"
+#~ " --group=ÎŒÎΟΜΑ εξαναγκασμός ÎŒÎΟΜΑ ως ομάδα για τα "
+#~ "Ï€Ïόσθετα αÏχεία\n"
+#~ " --mode=ΑΛΛΑΓΈΣ εξαναγκασμός (συμβολικών) κατάστασης "
+#~ "ΑΛΛΑΓΈΣ για τα Ï€Ïόσθετα αÏχεία\n"
+#~ " --atime-preserve να μην αλλάξει η ÏŽÏα Ï€Ïοσπέλασης στα "
+#~ "αποθηκευμένα αÏχεία\n"
+#~ " -m, --modification-time να μην γίνει εξαγωγή της ÏŽÏας Ï„Ïοποποίησης "
+#~ "αÏχείου\n"
+#~ " --same-owner Ï€Ïοσπάθεια εξαγωγής αÏχείων με την ίδια "
+#~ "ιδιοκτησία\n"
+#~ " --no-same-owner εξαγωγή αÏχείων ως ο εαυτός σου\n"
+#~ " --numeric-owner πάντα να χÏησιμοποιείται αÏιθμοÏÏ‚ για τα "
+#~ "ονόματα χÏήστη/ομάδα\n"
+#~ " -p, --same-permissions εξαγωγή πληÏοφοÏιών δικαιωμάτων\n"
+#~ " --no-same-permissions να μην γίνει εξαγωγή πληÏοφοÏιών "
+#~ "δικαιωμάτων\n"
+#~ " --preserve-permissions ίδιο όπως -p\n"
+#~ " -s, --same-order ταξινόμηση ονομάτων για εξαγωγή για "
+#~ "ταίÏιασμα με αÏχειοθήκη\n"
+#~ " --preserve-order ίδιο όπως -s\n"
+#~ " --preserve ίδιο όπως -p και -s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Επιλογή συσκευής και εναλλαγή:\n"
+#~ " -f, --file=ΑΡΧΕΙΟΘΉΚΗ χÏησιμοποίησε αÏχείο αÏχειοθήκης ή "
+#~ "συσκευή ΑΡΧΕΙΟΘΉΚΗς\n"
+#~ " --force-local το αÏχείο αÏχειοθήκης είναι τοπικό ακόμα "
+#~ "και εάν είχε άνω στιγμή\n"
+#~ " --rsh-command=ΕÎΤΟΛΉ χÏησιμοποίησε απομακÏυσμένη ΕÎΤΟΛΉ αντί "
+#~ "για rsh\n"
+#~ " -[0-7][lmh] καθόÏισε συσκευή και πυκνότητα\n"
+#~ " -M, --multi-volume δημιουÏγία/λίστα/εξαγωγή πολλαπλών "
+#~ "αÏχειοθηκών\n"
+#~ " -L, --tape-length=ΑΡΙΘΜ αλλαγή ταινίας Î±Ï†Î¿Ï Î³ÏαφτοÏν ΑΡΙΘΜ x "
+#~ "1024 byte\n"
+#~ " -F, --info-script=ΑΡΧΕΊΟ εκτέλεσε ΑΡΧΕΊΟ στο τέλος κάθε ταινίας "
+#~ "(υπονοείται -M)\n"
+#~ " --new-volume-script=ΑΡΧΕΊΟ ίδιο όπως -F ΑΡΧΕΙΟ\n"
+#~ " --volno-file=ΑΡΧΕΊΟ χÏησιμοποιεί/ανανεώνει τον αÏιθμό του "
+#~ "τόμου στο ΑΡΧΕΊΟ\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Διάταξη ομαδοποίησης:\n"
+#~ " -b, --blocking-factor=ΜΠΛΟΚ ΜΠΛΟΚ x 512 byte ανά εγγÏαφή\n"
+#~ " --record-size=ΜΈΓΕΘΟΣ ΜΈΓΕΘΟΣ byte ανά εγγÏαφή, πολλαπλάσιο του "
+#~ "512\n"
+#~ " -i, --ignore-zeros παÏάβλεψη μηδενικών μπλοκ στην αÏχειοθήκη "
+#~ "(δηλαδή EOF)\n"
+#~ " -B, --read-full-records δημιουÏγία ξανά μπλοκ κατά την ανάγνωση "
+#~ "(για σωληνώσεις σε 4.2BSD)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Επιλογή μοÏφής αÏχείοθήκης:\n"
+#~ " -V, --label=ÎŒÎΟΜΑ δημιουÏγία αÏχειοθήκης με όνομα "
+#~ "τόμου ÎŒÎΟΜΑ\n"
+#~ " ΣΧΈΔΙΟ κατά την ÏŽÏα λίστας/εξαγωγής,ένα "
+#~ "ΣΧΈΔΙΟ ταιÏιάσματος\n"
+#~ " -o, --old-archive, --portability γÏάφω μία αÏχειοθήκη μοÏφής V7\n"
+#~ " --posix γÏάφω μία αÏχειοθήκη μοÏφής POSIX\n"
+#~ " -j, --bzip2 φιλτÏάÏισμα αÏχειοθήκης μέσα από "
+#~ "bzip2\n"
+#~ " -z, --gzip, --ungzip φιλτÏάÏισμα αÏχειοθήκης μέσα από "
+#~ "gzip\n"
+#~ " -Z, --compress, --uncompress φιλτÏάÏισμα αÏχειοθήκης μέσα από "
+#~ "compress\n"
+#~ " --use-compress-program=ΠΡΟΓΡ φιλτÏάÏισμα μέσα από ΠΡΟΓΡ (Ï€Ïέπει "
+#~ "να δεχτεί -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Επιλογές τοπικών αÏχείων:\n"
+#~ " -C, --directory=ΚΑΤΑΛ άλλαξε στον κατάλογο ΚΑΤΑΛ\n"
+#~ " -T, --files-from=ÎŒÎΟΜΑ πάÏε ονόματα από το αÏχείο ÎŒÎΟΜΑ για "
+#~ "εξαγωγή/δημιουÏγία\n"
+#~ " --null -T διαβάζει κενά-τελικά ονόματα, "
+#~ "απενεÏγοποιεί με -C\n"
+#~ " --exclude=ΣΧΈΔΙΟ αποκλείει αÏχεία, δοσμένα ως ΣΧΈΔΙΟ\n"
+#~ " -X, --exclude-from=ΑΡΧΕΊΟ αποκλείει σχέδια που εμφανίζονται στο FILE\n"
+#~ " --anchored αποκλείει σχέδια που ταιÏιάζουν τα ονόματα "
+#~ "των αÏχικών αÏχείων (Ï€Ïοεπιλογή)\n"
+#~ " --no-anchored αποκλείει σχέδια που ταιÏιάζουν με "
+#~ "καθένα /\n"
+#~ " --ignore-case παÏάληψη αγνοώντας τα πεζά\n"
+#~ " --no-ignore-case παÏάληψη σε διάκÏιση πεζών-κεφαλαίων "
+#~ "(Ï€Ïοεπιλογή)\n"
+#~ " --wildcards αποκλείει σχέδια χÏησιμοποιώντας σÏμβολα "
+#~ "(Ï€Ïοεπιλογή)\n"
+#~ " --no-wildcards αποκλείει σχέδια που είναι απλά κείμενα\n"
+#~ " --wildcards-match-slash αποκλείει σχέδια που ταιÏιάζουν σε σÏμβολα "
+#~ "'/' (Ï€Ïοεπιλογή)\n"
+#~ " --no-wildcards-match-slash αποκλείει σχέδια που δεν ταιÏιάζουν σε "
+#~ "σÏμβολα '/'\n"
+#~ " -P, --absolute-names δεν αφαιÏεί αÏχικό `/'s από τα ονόματα των "
+#~ "αÏχείων\n"
+#~ " -h, --dereference αποθηκεÏει αντί για τα αÏχεία συμβολικοÏÏ‚ "
+#~ "δεσμοÏÏ‚ που δείχνουν σε αυτά\n"
+#~ " --no-recursion αποφεÏγει αυτόματη κάθοδος στους "
+#~ "καταλόγους\n"
+#~ " -l, --one-file-system μένει στο τοπικό σÏστημα αÏχείων κατά την "
+#~ "δημιουÏγία αÏχειοθήκης\n"
+#~ " -K, --starting-file=ÎŒÎΟΜΑ αÏχίζει στο αÏχείο ÎŒÎΟΜΑ μέσα στην "
+#~ "αÏχειοθήκη\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=ΗΜΕΡΟΜΗÎΊΑ αποθήκευσε μόνο αÏχεία νεώτεÏα από την "
+#~ "ΗΜΕΡΟΜΉÎΙΑ\n"
+#~ " --newer-mtime=ΗΜΕΡΟΜΗÎΊΑ σÏγκÏινε ημεÏομηνία και ÏŽÏα μόνο όταν τα "
+#~ "δεδομένα Ï„ÏοποποιοÏνται\n"
+#~ " --after-date=ΗΜΕΡΟΜΗÎΊΑ ίδιο όπως -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=CONTROL] αποθήκευση Ï€Ïιν τη διαγÏαφή, επέλεξε τον "
+#~ "έλεγχο έκδοσης\n"
+#~ " --suffix=ΚΑΤΆΛΗΞΗ αποθήκευση Ï€Ïιν τη διαγÏαφή, παÏάκαμψη "
+#~ "συνηθισμένης κατάληξης\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Εμφάνιση πληÏοφοÏιών:\n"
+#~ " --help Ï„Ïπωμα αυτής της βοήθειας, έπειτα έξοδος\n"
+#~ " --version Ï„Ïπωμα αÏÎ¹Î¸Î¼Î¿Ï Î­ÎºÎ´Î¿ÏƒÎ·Ï‚ του Ï€ÏογÏάμματος tar, "
+#~ "έπειτα έξοδος\n"
+#~ " -v, --verbose εμφάνιση ονομάτων αÏχείων κατά την επεξεÏγασία "
+#~ "τους\n"
+#~ " --checkpoint Ï„Ïπωσε τα ονόματα των καταλόγων κατά την ανάγνωση "
+#~ "της αÏχειοθήκης\n"
+#~ " --totals Ï„Ïπωσε συνολικά byte γÏαμμένα κατά την δημιουÏγία "
+#~ "της αÏχειοθήκης\n"
+#~ " -R, --block-number εμφάνισε αÏιθμό μπλοκ μέσα στην αÏχειοθήκη σε "
+#~ "κάθε μήνυμα\n"
+#~ " -w, --interactive Ïώτησε για επιβεβαίωση για κάθε ενέÏγεια\n"
+#~ " --confirmation ίδιο όπως -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Το GNU tar δεν μποÏεί να αναγνώσει είτε να παÏάγει αÏχειοθήκες `--"
+#~ "posix'.\n"
+#~ "Εάν στο πεÏιβάλλον έχει τεθεί POSIXLY_CORRECT, οι επεκτάσεις GNU δεν "
+#~ "επιτÏέπονται με `--posix'.\n"
+#~ "Η υποστήÏιξη για POSIX είναι μόνο μεÏικών υλοποιημένη, μην βασίζεστε πάνω "
+#~ "σε αυτήν ακόμα.\n"
+#~ "Η ΑΡΧΕΙΟΘΉΚΗ μποÏεί να είναι ΑΡΧΕΊΟ, ΔΙΑΚΟΜΙΣΤΉΣ:ΑΡΧΕΊΟ ή "
+#~ "ΧΡΉΣΤΗΣ@ΔΙΑΚΟΜΙΣΤΉΣ:ΑΡΧΕΊΟ; \n"
+#~ "Η ΗΜΕΡΟΜΉÎΙΑ μποÏεί να είναι σε μοÏφή κειμένου ή ένα όνομα αÏχείου\n"
+#~ "όπου αÏχίζει με `/' ή `.', στην οποία πεÏίπτωση η ημεÏομηνία του αÏχείου "
+#~ "χÏησιμοποιείτε.\n"
+#~ "*ΤοÏτη* η εντολή `tar' χÏησιμοποιεί εξ οÏÎ¹ÏƒÎ¼Î¿Ï `-f%s -b%d'.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Εκτός χÏήσης επιλογή, Ï„ÏŽÏα συνεπάγεται από το --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr ""
+#~ "Εκτός χÏήσης όνομα επιλογής αντικαταστάθηκε από το --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr ""
+#~ "Εκτός χÏήσης όνομα επιλογής αντικαταστάθηκε από το --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Εκτός χÏήσης όνομα επιλογής αντικαταστάθηκε από το --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Εκτός χÏήσης όνομα επιλογής αντικαταστάθηκε από το --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Εκτός χÏήσης όνομα επιλογής αντικαταστάθηκε από το --block-number"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "ΠÏοειδοποίηση: η επιλογή -y δεν υποστηÏίζεται; ίσως εννοοÏσατε -j;"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Εκτός χÏήσης όνομα επιλογής αντικαταστάθηκε από το --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "ΓÏάφτηκε από τους John Gilmore και Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Εάν μία μεγάλη επιλογή εμφανίζει ένα ÏŒÏισμα ως υποχÏεωτικό, τότε αυτό\n"
+#~ "είναι υποχÏεωτικό και για την αντίστοιχη μικÏή επιλογή επίσης.\n"
+#~ "\n"
+#~ " -l, --file-length=ΜΉΚΟΣ Το ΜΉΚΟΣ του παÏαγομένου αÏχείου\n"
+#~ " -p, --pattern=ΜΟΤΊΒΟ Το ΜΟΤΊΒΟ είναι το `default' ή `zeros'\n"
+#~ " --help εμφάνισης αυτής της βοήθειας και "
+#~ "τεÏματισμός\n"
+#~ " --version εμφάνιση πληÏοφοÏιών έκδοσης και "
+#~ "τεÏματισμός\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr ""
+#~ "ΓÏάφτηκε από τον F. Pinard.\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/es.gmo b/po/es.gmo
new file mode 100644
index 0000000..9dfe10a
--- /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..65d01e9
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,3650 @@
+# Mensajes en español para GNU tar.
+# Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+# Federico Rivas <frivas@arrakis.es>, 1997.
+# Enrique Melero <melero@iprolink.ch>, 1997.
+# Santiago Vila Doncel <sanvila@unex.es>, 1998, 1999, 2000, 2001, 2002, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU tar 1.15.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2004-12-27 20:45+0100\n"
+"Last-Translator: Santiago Vila Doncel <sanvila@unex.es>\n"
+"Language-Team: Spanish <es@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argumento %s inválido para %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argumento %s ambiguo para %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Los argumentos válidos son:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: El parámetro ARGP_HELP_FMT necesita un valor"
+
+#: lib/argp-help.c:227
+#, fuzzy, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: El parámetro ARGP_HELP_FMT necesita un valor"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Parámetro ARGP_HELP_FMT desconocido"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Incongruencia en ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+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 son "
+"también\n"
+"obligatorios u opcionales para las opciones cortas correspondientes."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Modo de empleo:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " o bien: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [OPCIÓN...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Pruebe `%s --help' o `%s --usage' para más información.\n"
+
+# Por favor, no me digáis cómo se traduce bug.
+# Gerardo lo ha visto traducido en un libro como "pulgas", y yo
+# lo he visto como "chinche" en la "Investigación y Ciencia".
+# Está claro que así no vamos a ninguna parte.
+# Yo diría simplemente `fallos [ocultos]'. Es lo que significa, en realidad,
+# en el contexto informático, razones históricas aparte de bichos anidando
+# al calorcito de los tubos de vacío de los primeros computadores. gerardo
+# De "ocultos" nada... Este vamos a dejarlo, ¿vale? sv
+# Tú mandas, pero ¿cómo que de ocultos nada? Si no fueran ocultos, el progra-
+# ma no vería la luz aún, ¿no? Pero observa que he puesto el `ocultos' entre
+# corchetes. Yo pondría "bug -> fallo" simplemente. Comunicar fallos a... gerardo
+# ¿Que no vería la luz si no fueran ocultos? Ja, ja, ja, ja...
+# Mira por ejemplo en http://nl.debian.org/Bugs.
+# ¿No tendría sentido catalogarlos entonces?
+#
+# Véase "A Bug's life".
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Comunicar bichos a %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Error del sistema desconocido"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+#, fuzzy
+msgid "give this help list"
+msgstr "Da esta lista de ayuda"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+#, fuzzy
+msgid "give a short usage message"
+msgstr "Da un mensaje de uso corto"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NOMBRE"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+#, fuzzy
+msgid "print program version"
+msgstr "Muestra la versión del programa"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: la opción `%s' requiere un argumento\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: la opción `%s' es ambigua\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: la opción `--%s' no admite ningún argumento\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, 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"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: la opción `%s' requiere un argumento\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opción no reconocida `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opción no reconocida `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opción ilegal -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opción inválida -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: la opción requiere un argumento -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: la opción `-W %s' es ambigua\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, 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"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "tamaño del bloque"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "memoria agotada"
+
+# FIXME: Intraducible.
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: No se puede %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Atención: No se puede %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: No se puede cambiar el modo a %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: No se puede cambiar el propietario a uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: No se puede crear un enlace duro a %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Error de lectura en el byte %s, leyendo %lu byte"
+msgstr[1] "%s: Error de lectura en el byte %s, leyendo %lu bytes"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Atención: Error de lectura en el byte %s, leyendo %lu byte"
+msgstr[1] "%s: Atención: Error de lectura en el byte %s, leyendo %lu bytes"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: No se puede desplazar a %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Atención: No se puede desplazar a %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: No se puede crear el enlace simbólico a %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Sólo se escribieron %lu de %lu byte"
+msgstr[1] "%s: Sólo se escribieron %lu de %lu bytes"
+
+# FIXME. This might not always work. Is `%.*s' male or female? sv
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Eliminando la `%s' inicial de los nombres"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Eliminando la `%s' inicial de los objetivos de los enlaces"
+
+# FIXME. This might not always work. Is `%.*s' male or female? sv
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Se sustituye `.' por el nombre vacío"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Se sustituye `.' por un objetivo vacío de enlace duro"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Servicio no disponible"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "entrada estándar (stdin)"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "salida estándar (stdout)"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "No se puede ejecutar un shell remoto"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: No se puede asignar espacio para el búfer\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "No se puede asignar espacio para el búfer"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Pruebe `%s --help' para más información.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Modo de empleo: %s [OPCIÓN]\n"
+"Manipula una unidad de cinta, aceptando órdenes de un proceso remoto.\n"
+"\n"
+" --version Muestra la versión.\n"
+" --help Muestra esta ayuda.\n"
+
+# Por favor, no me digáis cómo se traduce bug.
+# Gerardo lo ha visto traducido en un libro como "pulgas", y yo
+# lo he visto como "chinche" en la "Investigación y Ciencia".
+# Está claro que así no vamos a ninguna parte.
+# Yo diría simplemente `fallos [ocultos]'. Es lo que significa, en realidad,
+# en el contexto informático, razones históricas aparte de bichos anidando
+# al calorcito de los tubos de vacío de los primeros computadores. gerardo
+# De "ocultos" nada... Este vamos a dejarlo, ¿vale? sv
+# Tú mandas, pero ¿cómo que de ocultos nada? Si no fueran ocultos, el progra-
+# ma no vería la luz aún, ¿no? Pero observa que he puesto el `ocultos' entre
+# corchetes. Yo pondría "bug -> fallo" simplemente. Comunicar fallos a... gerardo
+# ¿Que no vería la luz si no fueran ocultos? Ja, ja, ja, ja...
+# Mira por ejemplo en http://nl.debian.org/Bugs.
+# ¿No tendría sentido catalogarlos entonces?
+#
+# Véase "A Bug's life".
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Comunicar bichos a <%s>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Desplazamiento fuera de rango"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Desplazamiento fuera de rango"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Dirección de desplazamiento fuera de rango"
+
+# FIXME. Este es el único eof en minúsculas.
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Fin de fichero prematuro\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Fin de fichero prematuro"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Orden ininteligible"
+
+# ¿No es mejor "Total de bytes escritos: "?
+# Suena más directo y más similar al original,
+# "bytes escritos en total" suena demasiado complejo... Nicolás Lichtmaier.
+# Suena algo extraño eso de "total de bytes". "en total" me suena
+# mucho más natural. sv
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Bytes escritos en total: %s (%s, %s/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+# ¿No es mejor "Total de bytes escritos: "?
+# Suena más directo y más similar al original,
+# "bytes escritos en total" suena demasiado complejo... Nicolás Lichtmaier.
+# Suena algo extraño eso de "total de bytes". "en total" me suena
+# mucho más natural. sv
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Bytes escritos en total: %s (%s, %s/s)\n"
+
+# Antes de que nadie diga nada:
+#
+# Si a alguien no le gusta la palabra tubería (que aparece en algunos
+# libros sobre MS-DOS y es la que venimos usando desde el principio) que
+# haga una propuesta seria de cambio, pero que sepa que abriríamos la caja
+# de Pandora, pues hay muchas palabras posibles para pipe: tubería,
+# conducto, cañería, canal, etc.
+#
+# En cuanto a poner (pipe) entre paréntesis, es una mala costumbre que
+# deberíamos desterrar ya. Eso se hace en los libros la primera vez, pero
+# aquí no sólo no hay primera vez, sino que el mismo mensaje puede
+# aparecer *varias* veces, y entonces sí que es una paliza.
+# Ejemplo de paliza: "tubería rota" en libc. Sale muchísimo y no es
+# cuestión de ver (pipe) cuarenta veces al día...
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(tubería)"
+
+# ¿No queda más bonita la 1ª comilla abierta así: `record_size'?
+# Sí. FIXME. Comunicar al autor. sv
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "El valor de `record_size' no es válido"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "No se ha especificado ningún nombre de archivo"
+
+# FIXME: Si la entrada/salida estándar no es un archivo, ¿por qué el
+# original se refiere a ella como tal?
+#
+# En cierto sentido, sí es un archivo, o se puede emplear como tal.
+# Tar al menos la trata así, en `tar -f -' (o sin la opción -f en este
+# GNU tar)'; luego la E/S std. puede ser un archivo "real" de disco:
+# tar ... -f - > arch.tar gerardo
+#
+# Esto corresponde a la opción --verify.
+# Ejemplos: "tar cWf - ." y "tar xWf -"
+# o sea que una traducción correcta se vería más como:
+# "No se puede verificar un archivo desde/hacia la entrada/salida estándar"
+# o algo así. Quizá "No se puede verificar un archivo tomado de la entrada
+# estándar o escrito hacia la salida estándar", pero es un poco largo.. =)
+#
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "No se puede verificar la entrada/salida estándar"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "El archivo está comprimido. Utilice la opción %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "No se pueden actualizar archivos comprimidos"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Punto de comprobación de escritura %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Punto de comprobación de lectura %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Al principio de la cinta, se terminará ahora"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Demasiados errores, abandono"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Bloque no alineado (%lu byte) dentro del archivo"
+msgstr[1] "Bloque no alineado (%lu bytes) dentro del archivo"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Tamaño del registro = %lu bloque"
+msgstr[1] "Tamaño del registro = %lu bloques"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "No se puede ir hacia atrás en el archivo; puede ser ilegible sin -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek no paró en los límites de un registro"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: contiene un número de volumen inválido"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Desbordamiento en el número de volumen"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Prepare el volumen #%d para %s y pulse intro: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr ""
+"Se encontró un final de fichero mientras se esperaba respuesta del usuario"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ATENCIÓN: El archivo está incompleto"
+
+# Antes de que nadie diga nada:
+# shell admite muchas traducciones, caparazón, concha, envoltorio, coraza,
+# etc. pero ninguna ha prosperado. Además, algunos nombres son innombrables
+# en ciertos países, así que mejor dejarlo como está.
+# Y si no se traduce, se queda en *el* shell, es decir, *neutro*.
+#
+# Ya que volúmenes se acentúa, ¿habría que poner "volumen/volúmenes"
+# en lugar de "volumen(es)"?
+# No me gusta, ya que sólo es plural con la parte entre paréntesis "(y consecutivos)". fr
+# Creo que esta bien así Gerardo. em+
+# # Cuidadín. ¿El nombre de archivo se le da *al* volumen? Literalmente
+# # dice que da un nuevo nombre *para* el sgute. volumen, pero ¿ese
+# # nombre es el del volumen? No entiendo bien el contexto; quizá
+# # habría que mirar el código fuente o ver cuándo sale este
+# # mensaje.
+# # Otra cosa es eso de "abortar". No sé si se habrá tratado en
+# # spanglish o en es@li.org, pero suena muy feo, ¿no? Quizá "Sale
+# # inmediatamente de tar".
+#
+# "Print this list" es exactamente "Imprime esta lista" o a lo sumo "Muestra
+# esta lista". No veo que diga ayuda en ninguna parte, no creo que un
+# traductor deba ser más inteligente que el escritor original.. =) nl
+# Yo creo que a veces sí :-) sv
+# Sí, un programador no tiene por qué ser buen escritor :-) En un fortune me
+# salió una vez: "Los que no saben escribir, escriben manuales". :-)
+# A mí aquí me da igual lista que ayuda, de las dos formas se entiende. Manda
+# el traductor original. gerardo
+# ¿A alguien más le parece mal que ponga ayuda en vez de lista? sv
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [nombre] Da un nuevo nombre de archivo al siguiente\n"
+" (y consecutivos) volumen(es)\n"
+" q Aborta tar\n"
+" ! Lanza un subshell\n"
+" ? Muestra esta ayuda\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+# "saliendo"->"finalizando". jmg
+# Je, je, ¿no has leído, Santiago, el `dardo' de Fdo. Lázaro Carreter sobre
+# finalizar? No sé por qué quitar lo de salir, to exit es salir, no acabar.
+# Uno se sale del programa, y éste acaba. En realidad, también da igual, de
+# cualquier forma se entiende, pero mejor acabar o terminar que finalizar,
+# total, son sinónimos. gerardo
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "No hay volumen nuevo; finalizando.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "La orden `%s' falló"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Esto no parece un archivo tar"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s no continúa en este volumen"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s no continúa en este volumen"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s tiene un tamaño erróneo (%s != %s + %s)"
+
+# Sugerencia: está fuera de secuencia -> no está en orden. sv
+# Creo recordar que en el CPBackup de Central Point ponía lo de "fuera de
+# secuencia". fr
+# Buena referencia :-).
+# El comentario habrá que conservarlo en la versión final. sv
+# Bueno, la verdad es que ahora que lo pienso, me parece una mala
+# traducción... ¿opiniones? sv
+# Me parece correcta la traducción "literal", pero me gusta
+# más tu sugerencia - gerardo
+# El problema es que un volumen individual no puede estar desordenado.
+# Lo que está ordenado o no es la sucesión entera.
+# Un volumen individual puede estar fuera de lugar, pero no desordenado
+# él solito.
+# Todavía espero una solución mágica que sea mejor que las dos
+# que tenemos hasta ahora.
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Este volumen está fuera de secuencia"
+
+# Ojo que esto podría referirse a "is not being labelled NOW" en vez de
+# "isn't labelled". Pero no tengo los fuentes para ver la intención
+# original. nl
+# Si no se sabe eso, se podría dejar de forma más neutra como
+# "Archivo no etiquetado para concordancia con `%s'" - gerardo (gag)
+# FIXME: Preguntar.
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "El archivo no está etiquetado para que coincida con %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "El volumen %s no coincide con %s"
+
+#: src/buffer.c:1392
+#, fuzzy, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: el nombre del fichero es demasiado largo para almacenarse en una "
+"cabecera\n"
+"multivolumen de GNU"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Sólo se pudieron leer %lu de %lu byte"
+msgstr[1] "Sólo se pudieron leer %lu de %lu bytes"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "El contenido es distinto"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Fin de fichero inesperado en el archivo"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "El tipo de fichero es distinto"
+
+# El autor quería un mensaje muy conciso, y en la traducción se expande a una
+# oración completa.. ¿Por qué? Debería ser "Distinto modo".
+# Porque el idioma inglés es más corto. Si a cada frase corta le hago
+# corresponder siempre una frase corta española, el resultado sonará a indio
+# completamente (me refiero a los indios esos de las películas del oeste,
+# que solamente hablan con sustantivos, verbos y adjetivos). sv
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "El modo es distinto"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "El uid es distinto"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "El gid es distinto"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "La fecha de modificación es distinta"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "El tamaño es distinto"
+
+# Creo que este enlace se efectúa al descomprimir un archivo tar.
+# No es que nos diga si está enlazado o no lo está, sino si él hace
+# el enlace o no lo hace. sv
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "No se enlaza a %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "El enlace simbólico es distinto"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "El número de dispositivo es distinto"
+
+# "Verifica ". Supongo que depende de si se concatena en algún
+# mensaje. jmg
+# FUZZY. Es verdad, habrá que verlo.
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verificar "
+
+# # ¿Quizá diffed es el participio de diff, siendo esto un verbo tomado
+# # del nombre del programa diff? Entonces querría decir que se ha
+# # efectuado un diff como si el *fichero* hubiera sido normal. Yo sólo
+# # cambiaría "se toma" por "se ha tomado". gag
+# Es norma habitual convertir un pasado en un presente en estos casos.
+# Realmente, dice lo que hace y no lo que ha hecho. sv
+# FIXME. Decirle al autor que estandarice las comillas: ¿'%c' o `%c'?
+# De momento lo estandarizo en la traducción.
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr ""
+"%s: Tipo de fichero `%c' desconocido, se toma la diferencia\n"
+"como fichero normal"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+"El archivo contiene nombres de fichero con los prefijos iniciales eliminados."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Puede que la verificación no encuentre los ficheros originales."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "FALLO DE VERIFICACIÓN: %d cabecera inválida detectada"
+msgstr[1] "FALLO DE VERIFICACIÓN: %d cabeceras inválidas detectadas"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: contiene una marca de directorio caché; no se vuelca"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "valor %s fuera del rango %s %s..%s; se sustituye %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "valor %s fuera del rango %s %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Generando cabeceras octales negativas"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: el nombre del fichero es demasiado largo (máx %d); no se vuelca"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+"%s: el nombre del fichero es demasiado largo (no se puede dividir); no se "
+"vuelca"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: el nombre del enlace es demasiado largo; no se vuelca"
+
+# "se rellena" debería ser "rellenando". "se rellena" puede entenderse como
+# varias cosas, no queda claro que es lo que se esta haciendo, podría indicar
+# lo que se suele hacer.. =) "rellenando con ceros" es perfecto y es
+# exactamente lo que está escrito en el original. sv
+#
+# Que sí, reconozco que la traducción es un poco libre.
+# Pero mi intención es que el programa diga lo que va haciendo, no lo que ya
+# ha hecho. Ni siquiera el original es consistente en los modos verbales. sv
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] ""
+"%s: El tamaño del fichero ha disminuido en %s byte, se rellena con ceros"
+msgstr[1] ""
+"%s: El tamaño del fichero ha disminuido en %s bytes, se rellena con ceros"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: el fichero está en un sistema de ficheros distinto; no se vuelca"
+
+# Se vuelca la *memoria* del proceso en un fichero llamado `core'.
+#: src/create.c:1217 src/create.c:1228
+#, fuzzy
+msgid "contents not dumped"
+msgstr " (memoria volcada)"
+
+# ignore no es ignorar, es "no hacer caso"
+# se puede usar: no tener en cuenta, descartar, no tener efecto,
+# pasar por alto,
+# ignorar es "not to know". sv
+# ¿Y cuando se ignora a una persona ;-)? fr
+# Lo mismo: Está mal dicho, se dice que no le haces caso a esa persona.
+# Si no me crees busca "ignore" en algún buen diccionario.
+# O mira la lista de pifias de Ángel Álvarez directamente.
+# La tengo en ftp.unex.es.
+# Lo siento, Santiago, hemos sido derrotados; "ignorar" ya viene en los
+# diccionarios de español, y creo que hasta en el DRAE, con el significado
+# que tiene en inglés "to ignore"; aunque nosotros podemos ignorarlo ;-)
+# y seguir en la ortodoxia castellana :-) gerardo
+# Seguiremos en la ortodoxia, pero aún así, no puedo creerme que venga
+# en el DRAE. ¿Estás seguro? sv
+# No, no me compré el DRAE. Pregúntalo a spanglish (si te atreves ;-) gerardo
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Tipo de fichero desconocido; no se tendrá en cuenta"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr "Faltan enlaces a '%s'.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: el fichero no ha cambiado; no se vuelca"
+
+# FIXME: Decir al autor que ponga el "itself". sv
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: el fichero es el propio archivo; no se vuelca"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: El fichero fue borrado antes de leerlo"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: contiene una marca de directorio caché; no se vuelca"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: el fichero cambió mientras se estaba leyendo"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: el `socket' no se tendrá en cuenta"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: no se tendrá en cuenta la puerta"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Saltando a la siguiente cabecera"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Borrando no-cabecera del archivo"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: marca de fecha sospechosamente antigua %s"
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: la marca de tiempo %s está %lu s en el futuro"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Inconsistencia inesperada al crear el directorio"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+"%s: El directorio fue renombrado antes de que se pudiera extraer su estado"
+
+# Nota: En Unix, se llama fichero *regular* al que no es ni un directorio,
+# ni un dispositivo (de bloques o de caracteres) ni un fifo, etc.
+# Uno puede pensar que son los ficheros "normales", pero eso depende,
+# pues un directorio es de lo más "normal"...
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Extrayendo ficheros contiguos como ficheros regulares"
+
+# ¿Enlaces fuertes? Aquí los profes. de Sistemas Operativos y otros
+# dicen "enlaces duros", y creo que los libros también lo ponen así. gag
+# Es una cuestión todavía no dirimida.
+# ¿Tienes algún dato más? ¿Qué dicen los libros? sv
+# Enlaces duros. Lo acabo de mirar en un libro. gag
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Intentando la extracción de enlaces simbólicos como enlaces duros"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Leyendo %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: No se puede extraer -- el fichero es continuación de otro volumen"
+
+# ¿No se referirá al autor a "mangled filenames"?... jmg
+# FIXME. Preguntárselo.
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Fin de fichero inesperado en los nombres modificados"
+
+# FIXME. Lo de las comillas '%c'.
+# Como antes, lo estandarizo en la traducción a pesar de todo.
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Tipo de fichero `%c' desconocido, se extrae como fichero normal"
+
+#: src/extract.c:1184
+#, fuzzy, c-format
+msgid "Current %s is newer or same age"
+msgstr "El `%s' actual es más reciente"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: No se pudo hacer copia de seguridad de este fichero"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: No se puede renombrar a %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "El error no es recuperable: salida ahora"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: El directorio ha sido renombrado"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: El directorio ha sido renombrado"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: El directorio es nuevo"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Marca de tiempo inválida"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Se ha especificado un modo no válido en la opción"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Número de dispositivo inválido"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Número de nodo-i inválido"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "Error de lectura en %s"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Fin de fichero inesperado en el archivo"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Argumento de densidad mal formado: '%s'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Argumento de densidad mal formado: '%s'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr ""
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: No se purga el directorio: no se puede efectuar `stat'"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: el directorio está en un dispositivo distinto: no se purga"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Borrando %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: No se puede borrar"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Se omite"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "bloque %s: ** Bloque de NULos **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Un bloque de ceros aislado en %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "bloque %s: ** Fin de Fichero **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "bloque %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Hay blancos en la cabecera cuando se esperaba el valor numérico %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"El valor octal %.*s del archivo está fuera del rango %s;\n"
+"se supone complemento a dos"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "El valor octal %.*s del archivo está fuera del rango %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "El archivo contiene cabeceras base 64 obsoletas"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "La cadena firmada en base 64 %s del archivo está fuera del rango %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "El valor en base 256 del archivo está fuera del rango %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "El archivo contiene %.*s donde se esperaba el valor numérico %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, fuzzy, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "El valor del archivo %s está fuera del rango %s %s.%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " enlace a %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " tipo de fichero desconocido %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Enlace largo--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Nombre largo--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Cabecera de Volumen--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Continúa en el byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Creando el directorio:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Se renombra %s como %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: No se puede renombrar a %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Se vuelve a renombrar %s como %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "No se puede guardar el directorio de trabajo"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "No se puede cambiar el directorio de trabajo"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "proceso hijo"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "canal de interproceso"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: No se encuentra en el archivo"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: El elemento solicitado no se encuentra en el archivo"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Las opciones `-%s' y `-%s' requieren entrada estándar"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Formato de archivo inválido"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Se requieren características de GNU en formato de archivo incompatible"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+# Yo usaría "recuperar", en vez de "restablecer". Lo de repetir "archivo"
+# dos veces en la misma frase no me suena bien, así que pondría "... a
+# partir de aquél". jmg
+# El original también repite. sv
+#
+# ¡CUIDADO! sólo no debe llevar tilde en ".. juntos en un solo archivo..."
+# `Solo' sólo lleva acento cuando equivale al adverbio de modo `solamente',
+# y aun así no es obligatorio ponérselo si no hay ambigüedad (lo siento,
+# muchachos, pero saqué sobresaliente en Lingüística de COU :-D ) gerardo
+# Lo cambio, pero "no es obligatorio" no es lo mismo que "está mal". sv
+#
+# # la versión de control -> el control de versión
+# # nil: numeradas... simples... (en plural)
+# # never, simPle (falta una pe): backup -> copia de seguridad. gag
+# Estoy de acuerdo con lo de gag (más arriba usas eso mismo). jmg
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU `tar' guarda varios ficheros juntos en un solo archivo en cinta o disco, "
+"y\n"
+"puede restablecer ficheros individuales a partir del archivo.\n"
+"\n"
+"Ejemplos:\n"
+" tar -cf archivo.tar fu fa # Crea archivo.tar con los ficheros fu y fa.\n"
+" tar -tvf archivo.tar # Lista los ficheros de archivo.tar con "
+"detalle.\n"
+" tar -xf archivo.tar # Extrae todos los ficheros de archivo.tar.\n"
+"\vEl sufijo de respaldo es `~', a menos que se especifique con --suffix\n"
+"o con SIMPLE_BACKUP_SUFFIX. El control de versiones puede establecerse\n"
+"con --backup o con VERSION_CONTROL, los valores son:\n"
+"\n"
+" t, numbered hace copias de seguridad numeradas\n"
+" nil, existing numerada si existen copias de seguridad numeradas, "
+"simples\n"
+" en otro caso\n"
+" never, simple siempre hace copias de seguridad simples\n"
+
+# Yo usaría "recuperar", en vez de "restablecer". Lo de repetir "archivo"
+# dos veces en la misma frase no me suena bien, así que pondría "... a
+# partir de aquél". jmg
+# El original también repite. sv
+#
+# ¡CUIDADO! sólo no debe llevar tilde en ".. juntos en un solo archivo..."
+# `Solo' sólo lleva acento cuando equivale al adverbio de modo `solamente',
+# y aun así no es obligatorio ponérselo si no hay ambigüedad (lo siento,
+# muchachos, pero saqué sobresaliente en Lingüística de COU :-D ) gerardo
+# Lo cambio, pero "no es obligatorio" no es lo mismo que "está mal". sv
+#
+# # la versión de control -> el control de versión
+# # nil: numeradas... simples... (en plural)
+# # never, simPle (falta una pe): backup -> copia de seguridad. gag
+# Estoy de acuerdo con lo de gag (más arriba usas eso mismo). jmg
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"GNU `tar' guarda varios ficheros juntos en un solo archivo en cinta o disco, "
+"y\n"
+"puede restablecer ficheros individuales a partir del archivo.\n"
+"\n"
+"Ejemplos:\n"
+" tar -cf archivo.tar fu fa # Crea archivo.tar con los ficheros fu y fa.\n"
+" tar -tvf archivo.tar # Lista los ficheros de archivo.tar con "
+"detalle.\n"
+" tar -xf archivo.tar # Extrae todos los ficheros de archivo.tar.\n"
+"\vEl sufijo de respaldo es `~', a menos que se especifique con --suffix\n"
+"o con SIMPLE_BACKUP_SUFFIX. El control de versiones puede establecerse\n"
+"con --backup o con VERSION_CONTROL, los valores son:\n"
+"\n"
+" t, numbered hace copias de seguridad numeradas\n"
+" nil, existing numerada si existen copias de seguridad numeradas, "
+"simples\n"
+" en otro caso\n"
+" never, simple siempre hace copias de seguridad simples\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Modo principal de operación:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "lista el contenido de un archivo"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "extrae ficheros de un archivo"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "crea un nuevo archivo"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "encuentra las diferencias entre un archivo y el sistema de ficheros"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "añade ficheros al final de un archivo"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "solamente añade ficheros más recientes que la copia del archivo"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "añade ficheros tar a un archivo"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "borra del archivo (¡no en cintas magnéticas!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Modificadores de operación:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "maneja ficheros dispersos de forma eficiente"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "maneja el formato GNU antiguo de respaldo incremental"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "FICHERO"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "maneja el nuevo formato GNU de respaldo incremental"
+
+# ¿archivos nonzero? sv
+# Estupendo Gerardo, se me había pasado, como tantas cosas em+
+# # ¡Nooorl! Quiere decir que el programa tar no acaba o sale (exit())
+# # devolviendo al sistema un "status" distinto de cero cuando
+# # encuentre ficheros ilegibles. (¡Uf! Ahora a ver cómo se pone esto en
+# # media línea.) gag
+#
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "no sale con estado distinto de cero cuando hay ficheros ilegibles"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "NÚMERO"
+
+#: src/tar.c:404
+#, fuzzy
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"procesa únicamente la NUM-ésima aparición de cada fichero en el archivo. "
+"Esta opción solamente es válida junto con una de las subórdenes --delete, --"
+"diff, --extract o --list y cuando se da una lista de ficheros en la línea de "
+"órdenes o con la opción -T. El valor predeterminado de NUM es 1."
+
+# Mejor eso que inventarse un palabro, digo yo. sv
+#: src/tar.c:410
+#, fuzzy
+msgid "archive is seekable"
+msgstr "El archivo admite `seek'"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "intenta verificar el archivo después de escribirlo"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "borra los ficheros después de añadirlos al archivo"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "no reemplaza ficheros que existan al extraer"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"no reemplaza los ficheros que existan que sean más recientes que sus copias "
+"en el archivo"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "sobreescribe los ficheros que existan al extraer"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "borra cada fichero antes de extraer sobre él"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "vacía jerarquías antes de extraer directorios"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "conserva los metadatos de los directorios que existan"
+
+#: src/tar.c:434
+#, fuzzy
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "sobreescribe los ficheros que existan al extraer"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "extrae los ficheros a la salida estándar"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "ORDEN"
+
+#: src/tar.c:445
+#, fuzzy
+msgid "pipe extracted files to another program"
+msgstr "extrae los ficheros a la salida estándar"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Manejo de los atributos del fichero:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "fuerza NOMBRE como propietario de los ficheros que se añaden"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "fuerza NOMBRE como grupo para los ficheros que se añaden"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "FECHA-O-FICHERO"
+
+#: src/tar.c:461
+#, fuzzy
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "almacena solamente ficheros más recientes que FECHA-O-FICHERO"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "CAMBIOS"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "fuerza CAMBIOS (simbólicos) de modo para los ficheros que se añaden"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "no extrae la fecha de modificación del fichero"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "intenta extraer los ficheros con el mismo propietario"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "extrae los ficheros como usted mismo"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "utiliza siempre números para los nombres de usuarios/grupos"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "ordena los nombres que se extraen para que coincidan con el archivo"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "lo mismo que -p y -s"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Selección de dispositivo y opciones:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARCHIVO"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "utiliza un archivo o el dispositivo ARCHIVO"
+
+#: src/tar.c:502
+#, fuzzy
+msgid "archive file is local even if it has a colon"
+msgstr "el archivo es local incluso si tiene dos puntos"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "utiliza la ORDEN rmt dada en vez de rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "utiliza la ORDEN remota en vez de rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "especifica la unidad y la densidad"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "crea/lista/extrae un archivo multivolumen"
+
+# Una chorradita, si se me permite; estamos usando ISO-8859-1,
+# ¿verdad? Y en ISO-Latin1 existe un carácter que representa la
+# multiplicación, ¿verdad? Ya saben , el aspa: '×' ('\327'). Pues
+# ¿por qué no usarlo (está bien, "utilizarlo" ;-) en vez de la equis
+# en NUM x 1024 -> NUM × 1024?
+# En otra parte dices que pones (C) en vez de © porque © no se ve bien en
+# la consola. Pues no dirás eso del aspa, que se ve mejor aún que la equis:
+# x × - gerardo
+# Efectivamente, pero no es transportable, el que use tar bajo DJGPP
+# le saldría un churro pues el aspa no existe en la tabla 850. sv
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "cambia la cinta después de escribir NÚMERO x 1024 bytes"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "ejecuta un script al final de cada cinta (implica -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "usa/actualiza el número de volumen en FICHERO"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Bloques en los dispositivos:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOQUES"
+
+# Sigo en mis 13 y en esto no hay quien me baje del burro: BLOQUES x 512 bytes
+# debe ser BLOQUES × 512 bytes. gerardo
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLOQUES x 512 bytes por registro"
+
+#: src/tar.c:541
+#, fuzzy
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "TAMAÑO bytes por registro, múltiplo de 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+"no tiene en cuenta los bloques convertidos en ceros dentro de un archivo "
+"(significa fin de fichero)"
+
+# ¿rebloquea? ¿existe esa palabra? sv
+# Que opine el pueblo, no lo sé. fr
+# # ¿Existe bloquear? Pues si es así, también existe rebloquear =
+# # volver a bloquear. Y requetebloquear, etc. En un artículo de Martin
+# # Gardner se preguntaba cuál era la palabra española más larga, y la
+# # respuesta era que cualquiera que pudiera ir precedida por
+# # requetequetequete... (longitud infinita). Pelín ssagerao, ¿no? gag
+#
+# Bueno, al final he puesto lo que se ve, un poco menos raro que rebloquear. sv
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "rehace los bloques conforme se lee (para tuberías de 4.2BSD)"
+
+# ¿Qué será esto? ¿Quizás un fallo en el mensaje original? Porque "to"
+# no es "desde", sino "hacia", que yo sepa. Pero `archivo hacia la
+# salida estándar' no pega mucho. Está en otros mensajes, como el
+# siguiente; no lo entiendo. - gerardo
+# FIXME. Tienes razón. Es muy raro.
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Selección del formato de archivo:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMATO"
+
+#: src/tar.c:553
+#, fuzzy
+msgid "create archive of the given format"
+msgstr "crea un archivo en el formato dado."
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "FORMATO es uno de los siguientes:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "formato tar V7 antiguo"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "formato GNU de tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "formato GNU tar 1.13.x"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "formato POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "formato POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+#, fuzzy
+msgid "same as pax"
+msgstr "Lo mismo que pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "lo mismo que --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "lo mismo que --format=posix"
+
+#: src/tar.c:573
+#, fuzzy
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "palabra[[:]=valor][,palabra[[:]=valor], ...]"
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "palabras clave de control de pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TEXTO"
+
+#: src/tar.c:576
+#, fuzzy
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"crea un archivo con nombre de volumen NOMBRE. En el momento de listar/"
+"extraer, utiliza TEXTO como patrón expandible"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "filtra el archivo a través de bzip2"
+
+# FIXME: Decir al autor que ponga el "itself". sv
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "filtra el arhivo a través de gzip"
+
+# FIXME: Decir al autor que ponga el "itself". sv
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "filtra el archivo a través de compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "filtra a través de PROG (debe aceptar -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Selección del fichero local:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "DIR"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "cambia al directorio DIR"
+
+#: src/tar.c:599
+#, fuzzy
+msgid "get names to extract or create from FILE"
+msgstr "obtiene los nombres que se van a extraer o crear del fichero NOMBRE"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T lee nombres terminados en nulo, desactiva -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+# Nota: La diferencia entre un PATRÓN y una EXPREG es que
+# el primero se refiere a un "globbing pattern", es decir, patrones
+# de expansión de nombres de ficheros, como * y ?, mientras que
+# el segundo se refiere a expresiones regulares como las de grep,
+# es decir, ^, $, ., *, etc.
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "PATRÓN"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "excluye ficheros, dados como un PATRÓN"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "excluye los patrones listados en FICHERO"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "excluye los directorios que contienen una marca de caché"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "excluye los directorios que contienen una marca de caché"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "excluye los directorios que contienen una marca de caché"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "excluye los directorios que contienen una marca de caché"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "excluye los directorios que contienen una marca de caché"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "excluye los directorios que contienen una marca de caché"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "evita descender automáticamente en los directorios"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "permanece en el sistema de ficheros locales al crear el archivo"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "opera recursivamente sobre los directorios (por omisión)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "no elimina la `/' inicial de los nombres de ficheros"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "NOMBRE-DE-MIEMBRO"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "comienza por el miembro NOMBRE-DE-MIEMBRO dentro del archivo"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "almacena solamente ficheros más recientes que FECHA-O-FICHERO"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "FECHA"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "compara la fecha y hora solamente cuando cambian los datos"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "CONTROL"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "se hace un respaldo antes de borrar, escoja el CONTROL de versión"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "CADENA"
+
+#: src/tar.c:645
+#, fuzzy
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"se hace un respaldo antes de borrar, cambiando el sufijo usual ('~' a menos "
+"que se\n"
+"cambie con la variable de entorno SIMPLE_BACKUP_SUFFIX)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+#, fuzzy
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "elimina NÚMERO componentes iniciales de los nombres de ficheros"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+#, fuzzy
+msgid "ignore case"
+msgstr "la exclusión no distingue mayúsculas de minúsculas"
+
+#: src/tar.c:665
+#, fuzzy
+msgid "patterns match file name start"
+msgstr ""
+"los patrones de exclusión encajan con el comienzo del nombre del fichero"
+
+#: src/tar.c:667
+#, fuzzy
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "los patrones de exclusión encajan después de cualquier / (por omisión)"
+
+#: src/tar.c:669
+#, fuzzy
+msgid "case sensitive matching (default)"
+msgstr "la exclusión distingue mayúsculas de minúsculas (por omisión)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "los comodines de patrones de exclusión no encajan con '/'"
+
+#: src/tar.c:677
+#, fuzzy
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+"los comodines de los patrones de exclusión encajan con '/' (por omisión)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Salida informativa:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "lista los ficheros procesados detalladamente"
+
+#: src/tar.c:686
+#, fuzzy
+msgid "[.]NUMBER"
+msgstr "NÚMERO"
+
+#: src/tar.c:687
+#, fuzzy
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "muestra mensajes de progreso cada 10 registros"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "muestra un mensaje si no se vuelcan todos los enlaces"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "muestra las fechas de modificación de los ficheros en UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "envía la salida detallada a FICHERO"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "muestra el número de bloque dentro del archivo con cada mensaje"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "pide confirmación para cada acción"
+
+#: src/tar.c:706
+#, fuzzy
+msgid "show tar defaults"
+msgstr "Muestra los valores predeterminados de tar"
+
+#: src/tar.c:708
+#, fuzzy
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"Cuando se lista o extrae, lista cada directorio que no coincida con el "
+"criterio de búsqueda"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Opciones de compatibilidad:"
+
+#: src/tar.c:726
+#, fuzzy
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"al crear, lo mismo que --old-archive. Al extraer, lo mismo que --no-same-"
+"owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Otras opciones:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "No se puede especificar más de una opción `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Opciones de compresión en conflicto"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " tipo de fichero desconocido %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "No se encontró la fecha del fichero"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Sustituyendo %s por el formato de fecha desconocido %s"
+
+#: src/tar.c:961
+#, fuzzy, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Se trata la fecha `%s' como %s + %ld nanosegundo"
+
+# FIXME: Decir al autor que ponga el "itself". sv
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: el fichero es el propio archivo; no se vuelca"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"Las opciones predeterminadas de *esta* versión de tar son:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Factor de bloqueo inválido"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Atención: no se admite la opción -I; ¿no será -j o -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Longitud de cinta inválida"
+
+# No sé cómo traducir threshold. fr
+# Yo tampoco (los diccionarios los tengo en casa...). sv
+# Lo buscaré en un diccionario "güeno". fr
+# Es "umbral", pero no sé qué c$%&# es la fecha umbral. :-( gag
+# A ver si te vale así. sv
+# ¿Qué tal os suena "fecha límite"?. jmg
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Se ha especificado más de una fecha tope"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Grupo inválido"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Se ha especificado un modo no válido en la opción"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Número inválido"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Propietario inválido"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "El tamaño del registro es inválido"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "El tamaño del registro debe ser múltiplo de %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Número inválido de elementos"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, fuzzy, c-format
+msgid "Malformed density argument: %s"
+msgstr "Argumento de densidad mal formado: '%s'"
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Densidad desconocida: '%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "*Esta* versión de tar no admite las opciones `-[0-7][lmh]'"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[FICHERO]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "La opción antigua `%c' requiere un argumento"
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence no tiene sentido sin una lista de ficheros"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "no se puede usar --occurrence en el modo de operación solicitado"
+
+# requieren -> necesitan. gerardo
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Los archivos múltiples requieren la opción `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "No se puede combinar --listed-incremental con --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] ""
+"%s: La etiqueta de volumen es demasiado larga (el límite es %lu byte)"
+msgstr[1] ""
+"%s: La etiqueta de volumen es demasiado larga (el límite es %lu bytes)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "No se pueden verificar archivos multivolumen"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "No se pueden verificar archivos comprimidos"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "No se pueden utilizar archivos multivolumen comprimidos"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "No se pueden actualizar archivos comprimidos"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option solamente se puede usar en archivos POSIX"
+
+# Me gusta más al verrés: cobarde rechazo [de la pradera] a... gerardo
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Rechazo cobarde a crear un archivo vacío"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Las opciones `-Aru' son incompatibles con `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Debe especificar una de las opciones `-Acdtrux'"
+
+# Antes decía:
+# "La salida con error se demora por los errores anteriores
+#
+# Quiere decir que hubo errores, pero tar pudo seguir adelante, sin
+# embargo va a salir con un estado de error por esos errores que ya pasaron.
+# Una traducción:
+# "Salida con error demorada desde errores anteriores" (Nicolás L.)
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Salida con error demorada desde errores anteriores"
+
+# Eso de ¡vaya tela! ¿es una interjección que se entiende en todo el mundo
+# hispanoparlante? No vaya a ser específico de Andalucía/Extremadura y...
+# ¡oye, déjalo, así expandimos nuestra lengua! gerardo
+# Inaceptable, alguien fuera de España no tiene idea de que diablos quiere
+# decir ¡vaya tela!. Habrá que buscar alguna interhección de asco/sorpresa
+# que sea más `portable'. nl
+# Tenéis razón. Habrá que preguntar.
+# ¡Ya lo tengo! "¡Carajo!" X-D Eso se utiliza en Colombia, México y otros
+# sitios de por ahí a troche y moche, y creo que ni siquiera se entiende como
+# "miembro viril masculino". Y en España creo que también se emplea, ¿no?
+# (Vaale, vaaale, ¿y qué tal su eufemismo `caramba' o `caray', más neutros
+# y cursis, para que no se enfade nadie? Aunque para cursis: `cáspita',
+# `caracoles', `cónchales'; no diréis que no os doy opciones.) Por cierto,
+# creo que la coma sobra (incluso en el original). gerardo
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: El tamaño del fichero ha disminuido en %s byte"
+msgstr[1] "%s: El tamaño del fichero ha disminuido en %s bytes"
+
+# FIXME: Imlemented
+#: src/xheader.c:158
+#, fuzzy, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "La palabra clave %s es desconocida o no está implementada todavía"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "No se puede usar el patrón %s"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "La palabra clave %s no se puede sustituir"
+
+#: src/xheader.c:498
+#, fuzzy
+msgid "Malformed extended header: missing length"
+msgstr "Cabecera extendida errónea: falta un signo igual"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "La cadena firmada en base 64 %s del archivo está fuera del rango %s"
+
+#: src/xheader.c:525
+#, fuzzy
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+"Cabecera extendida errónea: falta un espacio en blanco después de la longitud"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Cabecera extendida errónea: falta un signo igual"
+
+#: src/xheader.c:539
+#, fuzzy
+msgid "Malformed extended header: missing newline"
+msgstr "Cabecera extendida errónea: falta un signo igual"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "El valor del archivo %s está fuera del rango %s %s.%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Cabecera extendida errónea: falta un signo igual"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, fuzzy, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Cabecera extendida errónea: falta un signo igual"
+
+#: src/xheader.c:1328
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "Cabecera extendida errónea: falta un signo igual"
+
+#: src/xheader.c:1338
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Cabecera extendida errónea: falta un signo igual"
+
+# Acepto sugerencias para el `test suite'. sv
+# "test suite"="paquete/conjunto de pruebas/análisis", en cualquier
+# combinación. jmg
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Genera ficheros de datos para el conjunto de pruebas de GNU tar.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Otras opciones:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+#, fuzzy
+msgid "Create file of the given SIZE"
+msgstr "crea un archivo en el formato dado."
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "extrae los ficheros a la salida estándar"
+
+#: tests/genfile.c:131
+#, fuzzy
+msgid "Read file names from FILE"
+msgstr "Leídos %s bytes como %s"
+
+#: tests/genfile.c:133
+#, fuzzy
+msgid "-T reads null-terminated names"
+msgstr "-T lee nombres terminados en nulo, desactiva -C"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "intenta verificar el archivo después de escribirlo"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+#, fuzzy
+msgid "Update the access and modification times of FILE"
+msgstr "%s: No se pueden cambiar las fechas de acceso y modificación"
+
+#: tests/genfile.c:189
+#, fuzzy
+msgid "Execute COMMAND"
+msgstr "ORDEN"
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Marca de tiempo inválida"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Número de nodo-i fuera de rango"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Error del sistema desconocido"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "No se puede abrir %s"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "No se puede ejecutar %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " tipo de fichero desconocido %s\n"
+
+# Uff, a lo mejor se asusta el usuario si ponemos 'no se pudo leer con stat()
+# el estado del fichero em+
+# stat() es una primitiva Unix que acaba de fallar; también podría
+# ser: "No se puede hacer stat() del fichero %s", o "stat() ha fallado..."
+# Aunque tal como está es más descriptivo para el neófito, desde
+# luego. gag
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "No se puede leer el estado del fichero %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "El proceso hijo terminó con la señal %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Nombres de fichero modificados--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Este programa viene sin NINGUNA GARANTÍA, hasta donde permite la ley.\n"
+#~ "Puede redistribuirse bajo los términos de la Licencia Pública General de "
+#~ "GNU;\n"
+#~ "vea el fichero llamado COPYING para más información."
+
+# "no reconocida" me parecía muy suave para "garbage". sv
+# OJO: Casi el mismo mensaje.
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Orden ininteligible %c\n"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ATENCIÓN: No hay cabecera de volumen"
+
+# Me queda la duda de si lo que es visible es el error o el nombre largo... sv
+#~ msgid "Visible long name error"
+#~ msgstr "Error de nombre largo visible"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Marca de tiempo fuera de rango"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Número de dispositivo fuera de rango"
+
+# FIXME. Hay otro que se parece muchísimo. sv
+#~ msgid "Visible longname error"
+#~ msgstr "Error de nombre largo visible"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Se renombra %s como %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: No se puede crear un enlace simbólico a %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Se enlaza %s simbólicamente a %s"
+
+# ¿desmutilador? sv. (Perdona mi ignorancia: ¿qué significa?)
+# No lo sé, tengo que consultar. Lo encontré en un diccionario raro. fr
+# Bueno, yo tampoco sé lo que es, pero "mangling" me suena a:
+# "proceso mediante el cual se codifican ciertos nombres de cierta manera."
+# Por ejemplo, "name mangling" es lo que hace Linux cuando se instala
+# con umsdos. (¿Lo has visto alguna vez?).
+# También se habla de "mangling" a la forma que tiene el C++ de incluir
+# los nombres de las funciones (o de las clases quizá) en un archivo
+# objeto ( .o ).
+# Bueno, en realidad no lo sé, pero espero haberte dado alguna idea.
+# A ver qué dice Enrique u otro revisor. sv
+# Sigo en blanco. fr
+# La traducción mas acertada creo que es esta :) , el uso que conozco
+# de mangled esta relacionado con codificar o transformar el nombre de una
+# función C++ dentro de una biblioteca, de manera que se pueda deshacer la
+# referencia a la función al compilar o enlazar dinámicamente, obteniendo
+# la función que corresponde al aplicar la sobrecarga de operadores. em+
+# # Todo eso es así, lo malo es encontrar la palabra simple más
+# # adecuada y mantenerla. Por ejemplo, antes hemos dicho "mutilar", en
+# # otros mensajes; y ahora "desenredar".
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Orden desconocida para recuperar el nombre original de %s"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Falta el nombre del fichero después de -C"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "no cambia la fecha de acceso en los ficheros volcados"
+
+#~ msgid "extract permissions information"
+#~ msgstr "extrae la información de los permisos"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "no extrae la información de los permisos"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "FICHERO-DE-NOMBRES"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "los patrones de exclusión son cadenas normales"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr ""
+#~ "vuelca los ficheros a los que apuntan los enlaces simbólicos, en lugar de "
+#~ "los enlaces"
+
+#~ msgid "same as -N"
+#~ msgstr "lo mismo que -N"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "los patrones de exclusión usan comodines (por omisión)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "muestra el total de bytes escritos cuando se crea un archivo"
+
+#~ msgid "Print license and exit"
+#~ msgstr "Muestra la licencia y finaliza"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Basado en el trabajo de John Gilmore y Jay Fenlason. Vea AUTHORS\n"
+#~ "para una lista completa de autores.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " GNU tar es software libre; puede redistribuirse y/o modificarse\n"
+#~ " bajo los términos de la Licencia Pública General de GNU tal y como\n"
+#~ " se publica por la Free Software Foundation; bien en la versión 2\n"
+#~ " de la Licencia, o (a su elección) cualquier versión posterior.\n"
+#~ "\n"
+#~ " GNU tar se distribuye con la esperanza de que sea útil, pero\n"
+#~ " SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de\n"
+#~ " COMERCIABILIDAD o IDONEIDAD PARA UN FIN DETERMINADO. Véase la\n"
+#~ " Licencia Pública General de GNU para más detalles.\n"
+#~ "\n"
+#~ " Usted debería haber recibido una copia de la Licencia Pública General\n"
+#~ " de GNU junto con GNU tar; en caso contrario, escriba a la Free "
+#~ "Software\n"
+#~ " Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 EE."
+#~ "UU.\n"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "El significado de la opción -l cambiará en versiones posteriores."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Por favor utilice la opción --one-file-system en su lugar."
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Atención: no se admite la opción -y; ¿no será -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Error al escribir en la salida estándar"
+
+# Sugerencia: para archivos -> para los archivos. sv
+# Sugerencia: Estandarizar la traducción de "added files". sv
+# En el --mode=CHANGES no sé qué poner... sv
+# En vez de "force"->"establece", yo dejaría el significado
+# original ->"fuerza". jmg
+# force es forzar, ¡no establecer! nl
+# Gerardo, ¿qué opinas de "forzar"? sv
+# Hombre, desde luego to force es forzar u obligar; la verdad es que no sé
+# por qué el autor original dice "force" y no "set". Quizá porque si no se
+# pusieran estas opciones los ficheros tendrían otros atributos que vendrían
+# impuestos por el umask, el UID/GID del usuario, etc., y con esto se "fuerza",
+# se cambia esta situación. No es lo mismo que establecer, que sería poner
+# esos atributos partiendo de cero. Creo que ése es el matiz, y para conservar-
+# lo habría que poner "fuerza NOMBRE como propietario...", etc., o bien
+# "obliga a que sea NOMBRE el propietario...", etc. gerardo
+# # usa -> emplea - gerardo
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Manejo de los atributos de los ficheros:\n"
+#~ " --owner=NOMBRE establece NOMBRE como propietario para "
+#~ "los\n"
+#~ " ficheros que se añaden\n"
+#~ " --group=NOMBRE establece NOMBRE como grupo para los "
+#~ "ficheros que\n"
+#~ " se añaden\n"
+#~ " --mode=CAMBIOS establece CAMBIOS como modo (simbólico) "
+#~ "para los\n"
+#~ " ficheros que se añaden\n"
+#~ " --atime-preserve no cambia la fecha de acceso en los "
+#~ "ficheros\n"
+#~ " volcados\n"
+#~ " -m, --modification-time no extrae la fecha de modificación de "
+#~ "ficheros\n"
+#~ " --same-owner intenta extraer ficheros con el mismo "
+#~ "propietario\n"
+#~ " --no-same-owner extrae los ficheros como uno mismo\n"
+#~ " --numeric-owner siempre utiliza números para nombres de\n"
+#~ " usuario/grupo\n"
+#~ " -p, --same-permissions extrae la información de los permisos\n"
+#~ " --no-same-permissions no extrae la información de los permisos\n"
+#~ " --preserve-permissions igual que -p\n"
+#~ " -s, --same-order ordena los nombres a extraer para "
+#~ "coincidir con\n"
+#~ " el archivo\n"
+#~ " --preserve-order igual que -s\n"
+#~ " --preserve igual que -p y -s a la vez\n"
+
+# ¿globbing = globales? sv
+# Me parece una buena traducción, es algo que engloba a un grupo. fr
+#
+# globbing es, por ejemplo, lo que hace el shell cuando pones asteriscos:
+# Cuando haces "cat *", el shell se encarga de expandir el *
+# en lo que corresponda, y se lo da a cat ya traducido.
+# Esto más que globalizar me suena a expandir, no sé.
+# Si quieres déjalo que lo vea otro. sv
+# Vid. mi comentario del mensaje anterior. gerardo
+# quita -> elimina. sv
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ " --strip-path=NUM strip NUM leading components from file "
+#~ "names\n"
+#~ " before extraction\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selección de fichero local:\n"
+#~ " -C, --directory DIR cambia al directorio DIR\n"
+#~ " -T, --files-from=NOMBRE obtiene los nombres a extraer o crear del\n"
+#~ " archivo NOMBRE\n"
+#~ " --null -T lee nombres terminados en cero, "
+#~ "deshabilita -C\n"
+#~ " --exclude=PATRÓN excluye ficheros, dados como un PATRÓN\n"
+#~ " -X, --exclude-from=FICHERO excluye patrones listados en FICHERO\n"
+#~ " --anchored los patrones de exclusión encajan desde el\n"
+#~ " comienzo del nombre de fichero "
+#~ "(predeterminado)\n"
+#~ " --no-anchored los patrones de exclusión encajan después "
+#~ "de\n"
+#~ " cualquier /\n"
+#~ " --ignore-case la exclusión considera iguales minúsculas "
+#~ "y\n"
+#~ " mayúsculas\n"
+#~ " --no-ignore-case la exclusión distingue minúsculas de "
+#~ "mayúsculas\n"
+#~ " (predeterminado)\n"
+#~ " --wildcards los patrones de exclusión incluyen "
+#~ "comodines\n"
+#~ " (predeterminado)\n"
+#~ " --no-wildcards los patrones de exclusión son cadenas "
+#~ "normales\n"
+#~ " --wildcards-match-slash los comodines de los patrones de exclusión\n"
+#~ " encajan con '/' (predeterminado)\n"
+#~ " --wildcards-match-slash los comodines de los patrones de exclusión\n"
+#~ " no encajan con '/'\n"
+#~ " -P, --absolute-names no elimina las '/'s iniciales de los "
+#~ "nombres de\n"
+#~ " fichero\n"
+#~ " -h, --dereference vuelca en su lugar los ficheros a los que "
+#~ "apuntan\n"
+#~ " los enlaces simbólicos.\n"
+#~ " --no-recurse evita descender automáticamente en "
+#~ "directorios\n"
+#~ " -l, --one-file-system permanece en el sistema de ficheros local\n"
+#~ " cuando se crea el archivo\n"
+#~ " -K, --starting-file=NOMBRE comienza en el fichero NOMBRE del archivo\n"
+#~ " --strip-path=NÚM elimina NÚM componentes iniciales de los "
+#~ "nombres\n"
+#~ " de los ficheros antes de la extracción\n"
+
+# # "más nuevos"->"más recientes". En el info de tar1.11.8 explica un poco más las
+# # opciones --newer-*, sin limitar a "store", sino hablando en general de
+# # cualquier operación. En el --newer-mtime debería ser --newer-mtime=DATE, y
+# # dice que "limita la operación a los ficheros modificados después de la
+# # fecha DATE"... ¿?. jmg
+#~ msgid ""
+#~ " -N, --newer=DATE-OR-FILE only store files newer than DATE-OR-FILE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=FECHA-O-FICHERO sólo almacena los ficheros más recientes "
+#~ "que FECHA-O-FICHERO\n"
+#~ " --newer-mtime=FECHA compara la fecha y hora en que los datos "
+#~ "cambiaron\n"
+#~ " --after-date=FECHA igual que -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=CONTROL] copia de seguridad antes de eliminar, "
+#~ "elige\n"
+#~ " el control de versión\n"
+#~ " --suffix=SUFIJO copia de seguridad antes de eliminar, pasa "
+#~ "por\n"
+#~ " alto el sufijo habitual\n"
+
+# # print -> ¿muestra o imprime? Prefiero muestra, pero manténgase
+# # siempre; ¡al menos en un mismo mensaje! gag
+# Lo de "prolijamente" suena regular. En diffutils hay una laaarga discusión
+# sobre ello. Yo usaría "verbosely"->"detalladamente" o "con detalle". jmg
+# los bytes totales escritos -> el total de bytes escritos. nl
+# O los bytes escritos en total, bien. gerardo
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --check-links print a message if not all links are dumped\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " --index-file=FILE send verbose output to FILE\n"
+#~ " --utc print file modification dates in UTC\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Salida de información:\n"
+#~ " --help muestra esta ayuda, y finaliza\n"
+#~ " --version informa de la versión y finaliza\n"
+#~ " -v, --verbose lista prolijamente los ficheros procesados\n"
+#~ " --checkpoint muestra los nombres de directorio al leer el "
+#~ "archivo\n"
+#~ " --check-links muestra un mensaje si no se vuelcan todos los "
+#~ "enlaces\n"
+#~ " --totals muestra los bytes escritos en total al crear el "
+#~ "archivo\n"
+#~ " --index-file=FICHERO envía una salida detallada a FICHERO\n"
+#~ " --utc muestra las fechas de modificación en UTC\n"
+#~ " -R, --block-number muestra el número de bloque en el archivo con "
+#~ "cada mensaje\n"
+#~ " -w, --interactive pide confirmación para cada acción\n"
+#~ " --confirmation igual que -w\n"
+
+# por defecto -> por omisión, de forma predeterminada
+# HOST -> HUÉSPED, ANFITRIÓN (aquí estoy más perdido que el barco 'el
+# arroz, ya lo sé; como con shell y script). gag
+#~ msgid ""
+#~ "\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `--format=%s -f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar no puede leer ni generar archivos `--posix'. Si POSIXLY_CORRECT "
+#~ "está\n"
+#~ "definido en el entorno, las extensiones GNU se deshabilitan con `--"
+#~ "posix'.\n"
+#~ "El soporte para POSIX está sólo parcialmente implementado, no se debe "
+#~ "contar \n"
+#~ "con él aún.\n"
+#~ "ARCHIVO puede ser FICHERO, HOST:FICHERO o USUARIO@HOST:FICHERO; FECHA "
+#~ "puede ser\n"
+#~ "una fecha textual, o un nombre de fichero que comience con `/' o con `.', "
+#~ "en\n"
+#~ "cuyo caso se utiliza la fecha del fichero.\n"
+#~ "*Este* `tar' utiliza `--format=%s -f%s -b%d' por omisión.\n"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Escrito por John Gilmore y Jay Fenlason."
+
+#~ msgid "Cannot close"
+#~ msgstr "No se puede cerrar"
+
+# FIXME. Comunicar al autor. Con suerte quedará como un mensaje
+# parecido que hay en fileutils: "fork system call failed".
+# La solución de fileutils no me acaba de convencer (era "llamada
+# a fork()" ). Yo pondría: "No se puede crear proceso hijo (fork)"
+# que responde a la idea del fork y el paréntesis aclara. jmg
+# Pero eso sería "Cannot create child process"...
+# Yo creo que la solución de fileutils es la mejor.
+# Tanto es así que lo pongo igual que allí. sv
+# Literalmente es "No puedo bifurcar", pero como sabemos que
+# `bifurcar' se refiere a la primitiva `fork()', está bien como está,
+# salvo que se debería conservar la mayúscula inicial, y para mi gusto,
+# simplificar, respetando el mensaje original: "Fallo en fork()" - gerardo
+# Pongo la mayúscula inicial, pero antes de ser tan respetuoso con el original
+# consultaré con el autor. sv
+#~ msgid "Cannot dup"
+#~ msgstr "Falló la llamada al sistema `dup'"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "No se pueden usar archivos comprimidos ni remotos"
+
+# ¿Por qué en todo lugar donde dice "child" se traduce como "proceso hijo" y
+# no como "hijo" directamente? nl
+# Para que esté más claro. ¿es demasiado libre la traducción? sv
+# ¿Gerardo?
+# Hola. Hay dos posturas a la hora de traducir:
+# a) respetar escrupulosamente el mensaje original y traducir
+# literalmente, o casi.
+# b) buscar la mejor interpretación de forma que un hispanohablante lo
+# entienda lo mejor posible, aunque se "corrija" al autor; siempre
+# sin cambiar el sentido o la idea del mensaje, claro.
+# Yo prefiero (b) generalmente. Está claro que aquí child se refiere a un
+# proceso, un proceso derivado de otro, proceso hijo. Daría igual dejar hijo
+# solamente, pero así está mejor expresado. Me gusta más.
+#~ msgid "tar (child)"
+#~ msgstr "tar (proceso hijo)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (proceso nieto)"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "El proceso hijo devolvió el estado %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Los nombres contienen `..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: El nombre contiene `..'"
+
+# Nota aclaratoria: (Gerardo)
+# Incluida no lleva tilde.
+# Ni ruido ni huida ni güiro (un instrumento musical cubano).
+# Sí se parte en in-clu-i-da, pero sin tilde. No existe el hiato.
+# Mira en un diccionario `ruido' a ver si tiene tilde, y considera si
+# no es el mismo caso (Rui-do no: ru-i-do).
+#
+# Más arriba has usado "implies"->"implica", así que aquí
+# sería "implied by"->"implicada por", o modificar lo otro. jmg
+# Pero es que implica suena bien pero implicada por suena fatal. sv
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Opción obsoleta, ahora incluida en --blocking-factor"
+
+# Pregunta: ¿qué es reemplazado/a el nombre o la opción? sv
+# Creo que es el nombre. fr
+# # El nombre de la opción; lo que pasa es que en el mensaje en español
+# # no se entiende muy bien. Quizá: nombre obsoleto de la opción
+# # remplazado por -- ... gag
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Nombre de opción obsoleta reemplazado por --blocking-factor"
+
+# # Ver msj. anterior
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Nombre de opción obsoleta reemplazado por --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Nombre de opción obsoleta reemplazado por --touch"
+
+#~ msgid "Conflicting archive format options"
+#~ msgstr "Opciones de formato de archivo en conflicto"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Nombre de opción obsoleta reemplazado por --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Nombre de opción obsoleta reemplazado por --block-number"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Nombre de opción obsoleta reemplazado por --backup"
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Los argumentos obligatorios para las opciones largas son también "
+#~ "obligatorios\n"
+#~ "para las opciones cortas.\n"
+#~ "\n"
+#~ " -l, --file-length=LONGITUD LONGITUD del fichero generado\n"
+#~ " -p, --pattern=PATRÓN PATRÓN es `default' o `zeros'\n"
+#~ " --help muestra esta ayuda y sale\n"
+#~ " --version informa de la versión y finaliza\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Escrito por François Pinard."
+
+#~ msgid "Ambiguous pattern `%s'"
+#~ msgstr "El patrón `%s' es ambiguo"
+
+# Me encantaría poder incluir tos propuestas de usar el \372 ( aspa ) y
+# el (C) , veremos si lo hacemos algún día. em+
+# Estaría bien cambiar el '(C)' por '©', que es otro carácter de
+# ISO-Latin1. Como los yanquis usan el ASCII (US ISO-646), que es de
+# 7 bits, no lo pueden usar; nosotros sí. gerardo
+# Pues eso: que si os encanta, ¿por qué no lo hacéis? ¿Cuál es el problema?
+# Bueno, vale, de acuerdo... sv
+#~ msgid "Copyright %d Free Software Foundation, Inc."
+#~ msgstr "© %d Free Software Foundation, Inc."
+
+#~ msgid ""
+#~ "This is free software; see the source for copying conditions. There is "
+#~ "NO\n"
+#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR "
+#~ "PURPOSE.\n"
+#~ msgstr ""
+#~ "Esto es software libre; vea el código fuente para las condiciones de "
+#~ "copia.\n"
+#~ "No hay NINGUNA garantía; ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA "
+#~ "UN\n"
+#~ "FIN DETERMINADO.\n"
+
+#~ msgid "Write to compression program short %lu bytes"
+#~ msgstr "La escritura al programa de compresión acorta %lu bytes"
+
+#~ msgid "Removing `%.*s' prefix from member names"
+#~ msgstr "Eliminando el prefijo `%.*s' de los nombres"
+
+#~ msgid "Archive contains future timestamp %s"
+#~ msgstr "El archivo contiene la marca de tiempo en el futuro %s"
+
+#~ msgid "%s: Cannot symlink %s %s"
+#~ msgstr "%s: No se puede crear el enlace simbólico %s %s"
+
+#~ msgid "Invalid group given on option"
+#~ msgstr "Se ha especificado un grupo no válido en la opción"
+
+#~ msgid "Invalid owner given on option"
+#~ msgstr "Se ha especificado un propietario no válido en la opción"
+
+#~ msgid "Cannot close file descriptor"
+#~ msgstr "No se puede cerrar el descriptor de fichero"
+
+#~ msgid "Cannot properly duplicate %s"
+#~ msgstr "No se puede duplicar %s correctamente"
+
+#~ msgid "(child) Pipe to stdin"
+#~ msgstr "(proceso hijo) Se abre una tubería desde la entrada estándar"
+
+#~ msgid "Archive to stdout"
+#~ msgstr "Archivo hacia la salida estándar"
+
+#~ msgid "((child)) Pipe to stdout"
+#~ msgstr "((proceso hijo)) Se abre una tubería hacia la salida estándar"
+
+#~ msgid "(grandchild) Pipe to stdin"
+#~ msgstr "(proceso nieto) Se abre una tubería desde la entrada estándar"
+
+#~ msgid "(child) Pipe to stdout"
+#~ msgstr "(proceso hijo) Se vuelca el resultado por la salida estándar"
+
+#~ msgid "((child)) Pipe to stdin"
+#~ msgstr "((proceso hijo)) Se abre una tubería desde la entrada estándar"
+
+#~ msgid "(grandchild) Pipe to stdout"
+#~ msgstr "(proceso nieto) Se abre una tubería hacia la salida estándar"
+
+#~ msgid "Only wrote %lu of %lu bytes to %s"
+#~ msgstr "Sólo se escribieron %lu de %lu bytes en %s"
+
+# FIXME: No queda claro si es al cerrar, cerrando, cierre, o qué. sv
+#~ msgid "WARNING: %s: close (%d, %d)"
+#~ msgstr "ATENCIÓN: %s: se cierra (%d, %d)"
+
+#~ msgid "Cannot allocate memory for diff buffer of %lu bytes"
+#~ msgstr ""
+#~ "No se puede asignar memoria para el búfer de diferencias de %lu bytes"
+
+# Lo mismo que con stat() em+
+# seek() es otra función. seek = "hacer seek()" ¡Estos
+# angloparlantes!
+#~ msgid "Cannot seek to %s in file %s"
+#~ msgstr "No se puede acceder a la posición %s en el fichero %s"
+
+#~ msgid "Wrote %s of %s bytes to file %s"
+#~ msgstr "Se escribieron %s de %s bytes en el fichero %s"
+
+#~ msgid "lseek error at byte %s in file %s"
+#~ msgstr "Error de lectura en el byte %s en el fichero %s"
+
+# "se rellena" debería ser "rellenando". "se rellena" puede entenderse como
+# varias cosas, no queda claro que es lo que se esta haciendo, podría indicar
+# lo que se suele hacer.. =) "rellenando con ceros" es perfecto y es
+# exactamente lo que está escrito en el original. sv
+#
+# Que sí, reconozco que la traducción es un poco libre.
+# Pero mi intención es que el programa diga lo que va haciendo, no lo que ya
+# ha hecho. Ni siquiera el original es consistente en los modos verbales. sv
+#~ msgid "File %s shrunk, padding with zeros"
+#~ msgstr "El tamaño del fichero %s ha disminuido, se rellena con ceros"
+
+# OK em+
+# Can't = no se puede; couldn't: no se ha podido. gag
+# O no se pudo. sv
+# Esa forma verbal se debería usar para cosas ocurridas hace mucho más tiempo.
+# No pude hacer la Primera Comunión vestido de hombre-rana, no he podido
+# escribir esta frase en caracteres jeroglíficos. gag
+#
+#~ msgid "Cannot reposition archive file"
+#~ msgstr "No se puede reposicionar el archivo"
+
+#~ msgid "%s: Cannot lchown to uid %lu gid %lu"
+#~ msgstr ""
+#~ "%s: No se puede cambiar el propietario y grupo con `lchown' a uid %lu gid "
+#~ "%lu"
+
+#~ msgid "%s: Cannot chown to uid %lu gid %lu"
+#~ msgstr ""
+#~ "%s: No se puede cambiar el propietario y grupo con `chown' a uid %lu gid %"
+#~ "lu"
+
+#~ msgid "%s: lseek error at byte %s"
+#~ msgstr "%s: error de desplazamiento en el byte %s"
+
+#~ msgid "%s: Could only write %s of %s bytes"
+#~ msgstr "%s: Sólo se pudieron escribir %s de %s bytes"
+
+#~ msgid "Error while deleting %s"
+#~ msgstr "Error al borrar %s"
+
+#~ msgid "Only wrote %lu of %lu bytes to file %s"
+#~ msgstr "Sólo se escribieron %lu de %lu bytes al archivo %s"
+
+#~ msgid "Renaming previous %s to %s\n"
+#~ msgstr "Se renombra el anterior %s como %s\n"
+
+#~ msgid "%s: Cannot rename for backup"
+#~ msgstr "%s: No se puede renombrar para hacer una copia de seguridad"
+
+#~ msgid "%s: Cannot rename from backup"
+#~ msgstr "%s: No se puede renombrar de la copia de seguridad"
+
+# FIXME. No es traducible.
+#~ msgid "Cannot %s %s"
+#~ msgstr "No se puede %s %s"
+
+#~ msgid "Read error at byte %s reading %lu bytes in file %s"
+#~ msgstr "Error de lectura en el byte %s leyendo %lu bytes en el fichero %s"
+
+#~ msgid "Cannot open pipe"
+#~ msgstr "No se puede abrir la tubería"
+
+#~ msgid "Cannot open archive %s"
+#~ msgstr "No se puede abrir el archivo %s"
+
+# lo mismo de antes. sv
+#~ msgid "Child cannot fork"
+#~ msgstr "El proceso hijo no puede bifurcarse"
+
+#~ msgid "Cannot read from compression program"
+#~ msgstr "No se puede leer del programa de compresión"
+
+#~ msgid "Cannot write to compression program"
+#~ msgstr "No se puede escribir al programa de compresión"
+
+#~ msgid "Cannot write to %s"
+#~ msgstr "No se puede escribir en %s"
+
+#~ msgid "WARNING: Cannot truncate %s"
+#~ msgstr "ATENCIÓN: No se puede truncar %s"
+
+#~ msgid "While waiting for child"
+#~ msgstr "Mientras se esperaba al hijo"
+
+# Estos errores son para el debug del programa. A quien le pueda
+# interesar sabe lo que quiere decir em+
+# ¡Otras veces se ha puesto bifurcar sin el (fork)! Esto es difícil,
+# porque también podría ponerse: "No se puede hacer fork()", ya que
+# fork() es un punto de entrada a una primitiva Unix; vaya, una
+# función. gag
+# FIXME. Hablar con el autor.
+# en fileutils-3.16.es.po, el autor cambió el "Cannot fork" por "fork
+# system call failed", con lo que podría pasar lo mismo ahora. Si no
+# hay cambios, yo preferiría: "¡No se puede crear proceso hijo (fork)!"
+# jmg
+#~ msgid "Cannot fork!"
+#~ msgstr "¡No se puede bifurcar!"
+
+#~ msgid "Cannot exec a shell %s"
+#~ msgstr "No se puede ejecutar un shell %s"
+
+#~ msgid "Cannot read %s"
+#~ msgstr "No se puede leer %s"
+
+#~ msgid "Error while closing %s"
+#~ msgstr "Error al cerrar %s"
+
+#~ msgid "Cannot read link %s"
+#~ msgstr "No se puede leer el enlace %s"
+
+#~ msgid "Could not rewind archive file for verify"
+#~ msgstr "No se pudo rebobinar el archivo para verificar"
+
+#~ msgid "Cannot add file %s"
+#~ msgstr "No se puede añadir el fichero %s"
+
+#~ msgid "Cannot add directory %s"
+#~ msgstr "No se puede añadir el directorio %s"
+
+#~ msgid "Cannot open directory %s"
+#~ msgstr "No se puede abrir el directorio %s"
+
+#~ msgid "%s: Could not write to file"
+#~ msgstr "%s: No se pudo escribir en el fichero"
+
+#~ msgid "%s: Could not create file"
+#~ msgstr "%s: No se pudo crear el fichero"
+
+#~ msgid "%s: Error while closing"
+#~ msgstr "%s: Error al cerrar"
+
+#~ msgid "%s: Could not make node"
+#~ msgstr "%s: No se pudo crear el nodo"
+
+# Pongo comitas porque no es una palabra española.
+# A quien no le guste que abra el debate sobre cuándo sí y cuándo no
+# deben ponerse comitas en es@li.org.
+#~ msgid "%s: Could not make fifo"
+#~ msgstr "%s: No se pudo crear el `fifo'"
+
+#~ msgid "%s: Could not create directory"
+#~ msgstr "%s: No se pudo crear el directorio"
+
+#~ msgid "Added write and execute permission to directory %s"
+#~ msgstr "Añadidos permisos de escritura y ejecución al directorio %s"
+
+#~ msgid "Cannot open file %s"
+#~ msgstr "No se puede abrir el fichero %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [OPTION]... [FILE]...\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modo de empleo: %s [OPCIÓN]... [FICHERO]...\n"
+
+# Me encantaría poder incluir tos propuestas de usar el \372 ( aspa ) y
+# el (C) , veremos si lo hacemos algún día. em+
+# Estaría bien cambiar el '(C)' por '©', que es otro carácter de
+# ISO-Latin1. Como los yanquis usan el ASCII (US ISO-646), que es de
+# 7 bits, no lo pueden usar; nosotros sí. Incluso "Copyright" por
+# "Derechos de copia". Ya lo de FSF por Fundación del Logical Libre
+# es demasiado, ¿verdad? :-) gag
+# < ¿Puede alguien explicarme por qué no se hace ya, o no se ha hecho
+# antes? ¿Qué diferencia hay, bajo el punto de vista de ser caracteres
+# válidos, entre 'ó' y 'ß' o entre 'ñ' y '¤' o entre 'º' y '©' o entre
+# '¿' y '¼'? Lo único que se me ocurre es que es algo difícil introducir
+# esos caracteres porque no están en el teclado del PC. No hay más que
+# irse a una terminal o teclado con tecla de Componer o usar el Emacs con
+# C-q ooo (ooo = número octal) con la tabla (man iso_8859_1) al lado.
+# ¿Alguien tiene otra explicación?
+#
+# Se ven peor. Estas cosas deben ser bien legibles desde consola, y el
+# Copyright ese © no se ve demasiado bien. sv
+# Nostoy dacuerdo. Protesto enérgicamente. gerardo
+# No tendría ningún inconveniente en usar ese carácter si el objetivo final
+# fuera que apareciese por una láser de 300ppp, pero el objetivo es que se
+# vea por consola, y con la poca resolución que tiene no es un Copyright
+# hecho y derecho sino una C dentro de algo que parece más bien un cuadrado
+# con los bordes redondeados. Incluso el (C) Sinclair Research...
+# se veía mejor que el de los PCs. sv
+# Bueno, eso es un problema del tipo de letra, no del traductor. Además (C)
+# es el sucedáneo legal del ©, como TeX cuando no se puede poner como \TeX{}.
+# Pero es un sucedáneo, no el original. Es un copyright light. A más a más,
+# como dicen los catalanes, que ya aparece delante la palabra Copyright, por
+# lo que no debe haber ambigüedad. gerardo
+#
+# Hombre, el objetivo del traductor es que se entienda, y por ser (C)
+# el "sucedáneo legal", como tú le dices, es razonable usarlo.
+# En cambio la "ñ" no tiene sucedáneo legal, por lo que poner
+# "espagna" o "espa~na" sería completamente inaceptable.
+# Y si lo miras bien, todos son sucedáneos, pues las letras no "son"
+# pixelizadas. Lo que yo digo es que © no es un sucedáneo más bonito que (C)
+# para el símbolo de copyright. sv
+#~ msgid ""
+#~ "\n"
+#~ "Copyright 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, "
+#~ "Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Copyright 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, "
+#~ "Inc.\n"
+
+# Según gag y jmg, hay que decir: "no está en un límite de bloque", pues
+# no estamos hablando de un bloque concreto (el bloque) sino de uno cualquiera.
+# FIXME: Entonces tal vez el original debería decir "on a block boundary". sv
+#~ msgid "Archive %s EOF not on block boundary"
+#~ msgstr "El fin del archivo %s no está en un límite de bloque"
+
+# ¿por qué convertir las oraciones unimembres en bimembres? Ya vi
+# otro caso en donde se hace y no veo por qué. Bien podría quedar como:
+# "Nombre de fichero %s%s demasiado largo". nl
+# Algunas de esas frases suenan a "indio" sv
+# Hombre, esto no es una novela (del Oeste :-), la forma "india" es
+# más literal y más corta, lo que quizá sea más apropiado para mensajes
+# concisos como éstos; pero en realidad es más agradable de leer así.
+# El traductor manda. gerardo
+#~ msgid "File name %s%s too long"
+#~ msgstr "El nombre de fichero %s%s es demasiado largo"
+
+#~ msgid "Skipping to next file header"
+#~ msgstr "Saltando a la siguiente cabecera de fichero"
+
+#~ msgid "Cannot determine initial working directory"
+#~ msgstr "No se puede determinar el directorio de trabajo inicial"
+
+#~ msgid "Could not get current directory"
+#~ msgstr "No se pudo obtener el directorio actual"
+
+#~ msgid "Could not get current directory: %s"
+#~ msgstr "No se pudo obtener el directorio actual: %s"
+
+#~ msgid "File name %s/%s too long"
+#~ msgstr "El nombre del fichero %s/%s es demasiado largo"
+
+#~ msgid "%s: out-of-range timestamp `%s' ignored"
+#~ msgstr "%s: no se tendrá en cuenta la marca de fecha `%s' fuera de rango"
+
+#~ msgid "Cannot chdir to %s"
+#~ msgstr "No se puede cambiar al directorio %s"
+
+#~ msgid "Arithmetic overflow"
+#~ msgstr "Sobrepasamiento aritmético"
+
+#~ msgid "Data differs"
+#~ msgstr "Los datos son distintos"
+
+#~ msgid "File does not exist"
+#~ msgstr "El fichero no existe"
+
+#~ msgid "Not a regular file"
+#~ msgstr "No es un fichero regular"
+
+#~ msgid "Does not exist"
+#~ msgstr "No existe"
+
+#~ msgid "No such file or directory"
+#~ msgstr "No existe el fichero o el directorio"
+
+#~ msgid "Mode or device-type changed"
+#~ msgstr "El modo o el tipo de dispositivo ha cambiado"
+
+#~ msgid "No longer a directory"
+#~ msgstr "Ya no es un directorio"
+
+# Lo mismo. sv
+# Sugerencia: Sendero -> Ruta, camino. sv
+# Lo siento, no me salía la palabra. Esperaba correción. fr
+# Siempre he estado usando ruta en otras traducciones em+
+# # Esta vez sugiero "camino", por seguir la terminología de
+# # Microsoft, ya que da lo mismo, ¿no? gag
+# Quedaría igualmente claro si no se hace referencia a ruta:
+# "... de los nombres absolutos en el archivo". jmg
+#~ msgid "Removing leading `/' from absolute path names in the archive"
+#~ msgstr ""
+#~ "Borrando la `/' inicial de los nombres absolutos de ruta en el archivo"
+
+#~ msgid "Amount actually written is (I hope) %d.\n"
+#~ msgstr "La cantidad realmente escrita (esperemos) es %d.\n"
diff --git a/po/et.gmo b/po/et.gmo
new file mode 100644
index 0000000..315707b
--- /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..01a611a
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,2401 @@
+# Estonian translations for GNU tar.
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Toomas Soome <Toomas.Soome@microlink.ee>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU tar 1.15.92\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-10-26 14:45+0300\n"
+"Last-Translator: Toomas Soome <Toomas.Soome@microlink.ee>\n"
+"Language-Team: Estonian <et@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-15\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "vigane argument %s (`%s')"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "segane argument %s (`%s')"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Lubatud argumendid on:"
+
+#: lib/argp-help.c:148
+#, 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"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: ARGP_HELP_FMT parameeter nõuab väärtust"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: ARGP_HELP_FMT parameeter peab olema positiivne"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Tundmatu ARGP_HELP_FMT parameeter"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Prügi ARGP_HELP_FMT parameetrites: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Kohustuslikud või mittekohustuslikud argumendid pikkadele võtmetele on ka "
+"kohustuslikud või mittekohustuslikud vastavatele lühikestele võtmetele."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Kasutamine:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " või: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [VÕTI...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "`%s --help' või `%s --usage' annab rohkem infot.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Teated vigadest saatke palun aadressil %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Tundmatu süsteemi viga"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "näita seda abiinfot"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "näita lühikest kasutamise õpetust"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NIMI"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "sea programmi nimi"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SEK"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "oota SEK sekundeid (vaikimisi 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "esita programmi versioon"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(PROGRAMMI VIGA) Versioon pole teada!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Liiga palju argumente\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(PROGRAMMI VIGA) Võti peaks olema ära tuntud!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: võti `%s' on segane\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: võtmel `--%s' pole argumente\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: võtmel `%c%s' pole argumente\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: võti `%s' nõuab argumenti\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: tundmatu võti `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: tundmatu võti `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: vigane võti -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: vigane võti -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: võti nõuab argumenti -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: võti `-W %s' on segane\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: võti `-W %s' ei luba argumenti\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "bloki suurus"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "mälu on otsas"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: %s ei õnnestu"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Hoiatus: %s ei õnnestu"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Ei õnnestu seada uueks moodiks %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Ei õnnestu seada omanikuks uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Viidet %s ei saa luua"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Lugemisviga baidil %s, loen %lu baiti"
+msgstr[1] "%s: Lugemisviga baidil %s, loen %lu baiti"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Hoiatus: Lugemisviga baidil %s, loen %lu baiti"
+msgstr[1] "%s: Hoiatus: Lugemisviga baidil %s, loen %lu baiti"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Ei õnnestu liikuda positsioonile %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Hoiatus: Ei saa positsioneerida %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Ei saa luua %s nimeviidet"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Sain kirjutada ainult %lu baiti (soovisin %lu)"
+msgstr[1] "%s: Sain kirjutada ainult %lu baiti (soovisin %lu)"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Eemaldan liikmete nimedelt prefiksi `%s'"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Eemaldan viidatavate nimedelt prefiksi `%s'"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Kasutan tühjade nimede asemel `.'"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Kasutan tühja viidatava nime asemel `.'"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[jJ]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[eE]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Teenus pole kasutatav"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "standard sisend"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "standard väljund"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Ei saa käivitada kaug käsuinterpretaatorit"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Sisendi sõne on liiga pikk"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Numbri süntaksi viga"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Ei saa võtta buhvritele mälu\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Buhvritele ei jätku mälu"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "`%s --help' annab rohkem infot.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Kasuta: %s [võti]\n"
+"Manipuleeri lindiseadmega, lubades käske teistest protsessidest.\n"
+"\n"
+" --version Väljasta versiooniinfo.\n"
+" --help Väljasta abiinfo.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Teated vigadest saatke palun aadressil <%s>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Otsimise indeksi viga"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Otsimise indeks on piiridest väljas"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Otsimise suund on piiridest väljas"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Ootamatu faili lõpp\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Ootamatu faili lõpp"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Rämpskäsk"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Baite kirjutatud kokku"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Baite loetud kokku"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Baite kirjutatud kokku: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(toru)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Kirje suuruse väärtus on vigane"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Arhiivi nime pole"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ei saa kontrollida sisend/väljund arhiive"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Arhiiv on tihendatud. Kasutage võtit %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Ei saa uuendada pakitud arhiive"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Kirjutamise kontrollpunkt %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Lugemise kontrollpunkt %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Lindi alguses, lõpetan töö"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Liig palju vigu, jätan töö pooleli"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Joondamata blokk (%lu baiti) arhiivis"
+msgstr[1] "Joondamata blokk (%lu baiti) arhiivis"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Kirje suurus = %lu blokki"
+msgstr[1] "Kirje suurus = %lu blokki"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Arhiivi ei õnnestu tagasi kerida; lugemiseks võib olla vajalik kasutada "
+"võtit -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek ei peatunud kirje piiril"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: sisaldab vigast volüümi numbrit"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Volüümi number on liiga suur"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Otsi volüüm #%d %s'le ja vajuta return klahvi: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF kasutaja vastuse asemel"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "HOIATUS: Arhiiv pole täielik"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n nimi Anna järgmistele volüümidele uus nimi\n"
+" q Katkesta tar\n"
+" y või reavahetus Jätka\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Loo alamshell\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Väljasta see info\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Pole uus volüüm; lõpetan töö.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Puudub faili nimi. Proovige uuesti.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Vigane sisend. ? annab abiinfot.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "%s käsklus sai vea"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Hmm.... see ei tundu olema tar arhiiv"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "võimalik et %s jätkub sellel volüümil: päises on lühendatud nimi"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s ei jätku sellel volüümil"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s on vale suurusega (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "See volüüm on väljaspoolt järjekorda"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arhiivi märgend ei sobi `%s'"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Volüüm `%s' ei sobi volüümiga `%s'"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: faili nimi on GNU mitmevolüümi päisesse salvestamiseks liiga pikk, "
+"lühendan"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Sain lugeda ainult %lu baiti (sooviti %lu)"
+msgstr[1] "Sain lugeda ainult %lu baiti (sooviti %lu)"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Sisu on erinev"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Ootamatu arhiivi lõpp"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Failitüübid on erinevad"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Moodid erinevad"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "UID on erinevad"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "GID on erinevad"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Muutmise ajad erinevad"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Suurused erinevad"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "ei viita %s-le"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Nimeviited erinevad"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Seadme numbrid on erinevad"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Kontroll "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Tundmatu failitüüp '%c', võrdlen tavalise failina"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Arhiiv sisaldab eemaldatud prefiksitega failinimesid."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Kontrollimine ei pruugi leida algseid faile."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "VIGA KONTROLLIMISEL: leiti %d vigast päist"
+msgstr[1] "VIGA KONTROLLIMISEL: leiti %d vigast päist"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: sisaldab vahemälu kataloogi lipikut; ei salvesta"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "väärtus %s on %s piiridest %s..%s väljas; asendan %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "väärtus %s on %s piiridest %s..%s väljas"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Genereerin negatiivsed kaheksand päised"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: faili nimi on liiga pikk (maks. %d); ei salvesta"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: faili nimi on liiga pikk (ei saa poolitada); ei salvesta"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: viite nimi on liiga pikk; ei salvesta"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Fail lühenes %s baiti; täidan nullidega"
+msgstr[1] "%s: Fail lühenes %s baiti; täidan nullidega"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: fail on teises failisüsteemis; ei salvesta"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Tundmatu failitüüp; ignoreerin seda faili"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "%s-le puudub viiteid.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: pole muutunud; ei salvesta"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s on arhiiv; ei salvesta"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Fail kustutati enne lugemist"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: sisaldab vahemälu kataloogi lipikut; ei salvesta"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: fail muutus lugemisel"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: ignoreerin pesa"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: ignoreerin ust"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Hüppan järgmise päiseni"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Kustutan arhiivist mitte-päise"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: ebatõenäoliselt vana ajatempel %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: ajatempel %s on %s sekundit tulevikus"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Ootamatu kooskõlalisuse probleem kataloogi loomisel"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Kataloog nimetati ümber, enne kui sai loetud tema olek"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Taastan jätkuvad failid kui tavalised"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Üritan taastada nimeviiteid viidetena"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Loen %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Ei saa taastada -- fail jätkub teisel volüümil"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Ootamatu pika nime päis"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Tundmatu failitüüp `%c', taastan tavalise failina"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Olemasolev %s on uuem või sama kuupäevaga"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Selle faili varundamine ebaõnnestus"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s ei õnnestu ümber nimetada %s-ks"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Ületamatu tõrge: lõpetan töö"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Kataloog %s on ümber nimetatud"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Kataloog on ümber nimetatud"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Kataloog on uus"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Vigane ajatempel"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Vigane muutmise aeg (sekundid)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Vigane muutmise aeg (nanosekundid)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Vigane seadmenumber"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Vigane i-kirje number"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Snapshoti faili lugemisel leiti liiga pikk väli"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Snapshoti failist lugemise viga"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Ootamatu snapshoti faili lõpp"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Snapshoti failis on väljal ootamatu väärtus"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Puudub kirje lõpetaja"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Inkrementaalse faili vorming on vigane"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "Mittetoetatud inkrementaalse vormingu versioon: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "Vigane taastamise kataloog: eeldasin '%c', sain %#3o"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Vigane taastamise kataloog: dubleeritud 'X'"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Vigane taastamise kataloog: tühi nimi 'R' väljal"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Vigane taastamise kataloog: 'R' ei ole 'T' ees"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Vigane taastamise kataloog: tühi nimi 'T' väljal"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr "Vigane taastamise kataloog: ootasin '%c', aga andmed said otsa"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "Vigane taastamise kataloog: 'X' ei kasutata"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Vormiga %s ei saa ajutist kataloogi luua"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Ei puhasta kataloogi: stat ebaõnnestus"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: kataloog on teisel seadmel; ei puhasta"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Kustutan %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Ei saa eemaldada"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Jätan vahele"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blokk %s: ** NULlide blokk **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Üksik null blokk kohal %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blokk %s: ** Faili lõpp **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blokk %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Tühjad väljad päises kohtadel, kus eeldati numbrit %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Arhiivi kaheksandväärtus %.*s on %s piiridest väljas; eeldan kahe täiendit"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Arhiivi kaheksandväärtus %.*s on %s piiridest väljas"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Arhiiv sisaldab aegunuid base-64 päiseid"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Arhiivi märgiga base-64 sõne %s on %s piiridest väljas"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Arhiivi base-256 väärtus on %s piiridest väljas"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arhiiv sisaldab %.*s, eeldati numbrit %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Arhiivi väärtus %s on %s piiridest %s..%s väljas"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " viide %s-le\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " tundmatu failitüüp %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Pikk viide--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Pikk nimi--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Volüümi päis--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Jätkub baidilt %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Loon kataloogi:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Annan %s uueks nimeks %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: ei õnnestu ümber nimetada %s-ks"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Nimetan `%s' tagasi `%s'\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Töökataloogi ei õnnestu salvestada"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Ei õnnestu vahetada töökataloogi"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "alamprotsess"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "protsessidevaheline kanal"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Failide nimedes on jokkersümbolid. Nende kasutamiseks"
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr "kasutage --wildcars, selle teate saab blokeerida võtmega"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "--no-wildcards."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Puudub arhiivis"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Nõutud eksemplar puudub arhiivis"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Mõlemad võtmed - `-%s' ja `-%s' eeldavad standard sisendit"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Vigane arhiivi vorming"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Arhiivi formaat ei toeta GNU laiendusi"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Tundmatu kvootimise stiil `%s'. Loendi saate käsuga `%s --quoting-style=help'"
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU `tar' salvestab failid ühte lindi või ketta faili arhiivi ja taastab\n"
+"arhiivist üksikuid faile.\n"
+"\n"
+"Näiteid:\n"
+" tar -cf arhiiv.tar foo bar # Loo arhiiv.tar failidest foo ja bar.\n"
+" tar -tvf arhiiv.tar # Anna arhiiv.tar sisust täielik ülevaade.\n"
+" tar -xf arhiiv.tar # Taasta kõik failid arhiivist arhiiv.tar.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Varukoopia lõpp on `~', kui pole antud --suffix või SIMPLE_BACKUP_SUFFIX.\n"
+"Versiooni kontrolli võib määrata --backup või VERSION_CONTROL, väärtused "
+"on:\n"
+"\n"
+" none, off varukoopiat ei loo\n"
+" t, numbered tee nummerdatud koopiaid\n"
+" nil, existing nummerdatud kui koopiad on nummerdatud, muidu lihtne\n"
+" never, simple tee ainult lihtne koopia\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Põhiline töö:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "näita arhiivi sisukorda"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "taasta failid arhiivist"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "loo uus arhiiv"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "otsi arhiivi ja failisüsteemi erinevusi"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "lisa failid arhiivi lõppu"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "lisa arhiivi ainult failid uuemad kui arhiivis"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "lisa tar failid arhiivi"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "kustuta arhiivist (mitte magnetlindilt!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "testi arhiivi volüümi märgendit ja lõpeta töö"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Töö täpsustamine:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "tööta aukudega failidega efektiivsemalt"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "PÕHI[.ALAM]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr "määra aukudega faili vormingu versioon (eeldab võtit --sparse)"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "käsitle vana GNU vormingus inkrementaalset koopiat"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "FAIL"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "käsitle uue GNU vormingu inkrementaalset koopiat"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "ära lõpeta loetamatute failide korral veakoodiga"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "N"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"töötle ainult N-dat esinemist arhiivi igast failist. See võti on lubatud "
+"ainult\n"
+"käskudega --delete, --diff, --extract või --list ja kui failide loend on "
+"antud\n"
+"käsureal või võtmega -T. Vaikimisi N on 1."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "arhiiv on positsioneeritav"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "Ülekirjutamise juhtimine:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "kontrolli arhiivi peale arhiivi kirjutamist"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "kustuta failid peale arhiveerimist"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "olemasolevaid faile taastamisel üle ei kirjuta"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "ära kirjuta üle olemasolevaid faile, mis on uuemad kui arhiveeritud"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "kirjuta olemasolevad failid üle"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "kustuta fail enne taastamist"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "kustuta hierarhia enne kataloogi taastamist"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "säilita olemasolevate kataloogide metainfo"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "taastamisel kirjuta olemasolevate kataloogide metainfo üle (vaikimisi)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Vali väljundvoog:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "taasta failid standardväljundisse"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "KÄSK"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "taasta failid läbi toru teise programmi"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "ignoreeri alamprotsesside lõpetamise koode"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "käsitle alamprotsesside nullist erinevaid lõpetamise koode veana"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Faili atribuutide käsitlemine:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "kasuta NIMEe kui lisatud failide omanikku"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "kasuta NIMEe kui lisatud failide gruppi"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "KUUP-VÕI-FAIL"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "sea lisatud failide muutmise ajaks KUUP-VÕI-FAIL"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "MUUTUSED"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "kasuta lisatud failidel sümbol moodi MUUTUSED"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "MEETOD"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"säilita salvestatud failide kasutamise aeg, kas taastades selle peale "
+"lugemist (METHOD='replace'; vaikimisi) või ei muuda kasutamise aega üldse "
+"(METHOD='system')"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "ära taasta faili muutmise aega"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "säilita taastamisel failide omanikud"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "taasta failid enda õigustes"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "kasuta kasutaja/grupp numbreid"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr "taasta ka info failide õigustest (vaikimisi superkasutaja korral)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"õiguste taastamisel kasuta kasutaja umask väärtust (vaikimisi "
+"tavakasutajatel)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "taasta failid arhiveerimis järjekorras"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "sama, kui -p ja -s"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr "oota muutmise aegade ja õiguste taastamisega taastamise lõpuni"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "katkesta --delay-directory-restore võtme mõju"
+
+#: src/tar.c:497
+#, fuzzy
+msgid "Device selection and switching:"
+msgstr "Seadme valik ja vahetamine:\n"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARHIIV"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "kasuta arhiivi faili või seadet ARHIIV"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "arhiivi fail on lokaalne isegi kui sisaldab koolonit"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "kasuta rmt asemel antud käsku"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "kasuta rsh asemel antud käsku"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "määra seade ja tihedus"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "loo/näita/taasta mitme volüümilisi arhiive"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "vaheta peale NUMBER x 1024 baidi kirjutamist linti"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "käivita iga lindi lõpus skript (eeldab võtit -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "kasuta/uuenda volüümi numbrit failis FAIL"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Seadme blokkimine:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOKKE"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLOKKE x 512 baiti kirjele"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "NUMBER baiti kirjele, 512 kordne"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "ignoreeri null blokke arhiivis (tähistab EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "bloki lugemisel uuesti (4.2BSD torude jaoks)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Arhiivi vormingu valikud:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "VORMING"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "loo arhiiv antud vormingus"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "VORMING on üks järgnevaist:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "vana V7 tar vorming"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "GNU vorming tar <= 1.12 korral"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU tar 1.13.x vorming"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "POSIX 1003.1-1988 (ustar) vorming"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "POSIX 1003.1-2001 (pax) vorming"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "sama, kui pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "sama, kui --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "sama, kui --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "võtmesõna[[:]=väärtus][,võtmesõna[[:]=väärtus]...]"
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "pax võtmesõnade kasutamine"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TEKST"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"loo arhiivi volüümi nimega NIMI. Listingu/taastamise ajal kasuta TEKSTi "
+"otsingumustrina"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "filtreeri arhiiv läbi bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "filtreeri arhiiv läbi gzipi"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "filtreeri arhiiv läbi compressi"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "filtreeri läbi programmi (peab lubama võtit -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Lokaalse faili valik:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr "lisa antud FAIL arhiivi (kasulik, kui faili nimi algab kriipsuga)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "KAT"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "mine kataloogi KAT"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "loe taastatavate või varundatavate failide nimed failist NIMI"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T loeb nullidega lõpetatud nimesid, blokeeri -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr "eemalda -T võtmega loetud failinimedest kvootimissümbolid (vaikimisi)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "ära eemalda -T võtmega loetud failinimedest kvootimissümboleid"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "MUSTER"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "MUSTRI järgi välistatud failid"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "välistavad mustrid on FAILIS"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "välista kataloogid, mis on märgitud vahemälu jaoks"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "välista kataloogid, mis on märgitud vahemälu jaoks"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "välista kataloogid, mis on märgitud vahemälu jaoks"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "välista kataloogid, mis on märgitud vahemälu jaoks"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "välista kataloogid, mis on märgitud vahemälu jaoks"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "välista kataloogid, mis on märgitud vahemälu jaoks"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "ära sisene kataloogidesse"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "püsi arhiivi loomise ajal kohalikus failisüsteemis"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "sisene kataloogidesse (vaikimisi)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "ära eemalda faili nimedelt prefiksit `/'"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr "järgi nimeviiteid; arhiveeri ja taasta viidatavad failid"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "KOMPONENT"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "alusta arhiivi liikmest KOMPONENT"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "salvesta ainult failid mis on uuemad kui KUUP-VÕI-FAIL"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "KUUPÄEV"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "võrdle kuupäevi ainult kui andmed on muutunud"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "KONTROLL"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "loo enne eemaldamist varukoopia, vali versioonikontroll"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "SÕNE"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"varunda enne kustutamist, kasuta uut lõppu (vaikimisi '~', kui pole üle "
+"määratud keskkonnamuutujaga SIMPLE_BACKUP_SUFFIX)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Failide nimede muutmine:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "eemalda taastamisel failide nimede algusest NUMBER komponenti"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "AVALDIS"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr "kasuta failide nimede muutmiseks sed asendus avaldist"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr "Failinimede otsimine (mõjutab nii kaasamist, kui välistamist):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "tõstutundetu"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "mustrid alustavad faili nime algusest"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "mustrid toimivad iga / järel (välistamise korral vaikimisi)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "tõstutundlik otsimine (vaikimisi)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "kasuta jokkersümboleid (välistamise korral vaikimisi)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "täht-täheline sõne otsimine"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "jokkerid ei leia '/'"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "jokkersümbolid leiavad '/' (välistamise korral vaikimisi)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Informatsioon:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "väljasta töödeldavate failide kohta infot"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]NUMBER"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "anna töö kohta infot iga NUMBER kirje järel (vaikimisi 10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "väljasta teade, kui kõike viiteid pole salvestatud"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "SIGNAAL"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"väljasta peale arhiivi töötlemist baitide koguarv, argumendi korral - "
+"väljasta see info, kui saadetakse antud signaal. Lubatud signaalid on: "
+"SIGHUP, SIGQUIT, SIGINT, SIGUSR1 ja SIGUSR2; SIG prefiksi võib ära jätta"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "väljasta failide muutmise ajad UTC esituses"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "salvesta täiendav info FAILi"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "näita iga teatega ka arhiivi bloki numbrit"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "küsi iga tegevuse kohta kinnitust"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "näita tar vaikeseadeid"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"listingu või taastamise ajal, näita igat kataloogi mis ei vasta "
+"otsingutingimustele"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "peale teisendamist näita faili või arhiivi nime"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "STIIL"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr "määra nimede kvootimise stiil; lubatud väärtused on toodud allpool"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "lisaks kvoodi sõnes näidatud sümbolid"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "keela sõnes toodud sümbolite kvootimine"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Ühilduvuse võtmed:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr "loomisel sama kui --old-archive. Taastamisel sama kui --no-same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Muud võtmed:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "blokeeri potentsiaalselt ohtlikud võtmed"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Korraga ainult üks võtmetest `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Konfliktsed pakkimisvõtmed"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Tundmatu signaali nimi: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Kuupäeva fail puudub"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Kasutan %s tundmatu ajaformaadi %s asemel"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Võti %s: Käsitlen aega `%s' kui %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: failide nimekiri on juba loetud"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: loetud faili nimi sisaldab sümbolit nul"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "Võtmega --quoting-style on lubatud järgnevad argumendid:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*See* tar kasutab vaikimisi:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Vigane blokkimisfaktor"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Hoiatus: võtit -I ei toetata; võibolla te pidasite silmas -j või -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Vigane lindi pikkus"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Rohkem kui üks etteantud aeg"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "Vigane aukudega faili versiooni väärtus"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' ei ole sellel platvormil toetatud"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "--checkpoint väärtus ei ole täisarv"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Vigane grupp"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Võtmega anti vigane mood"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Vigane number"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Vigane omanik"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Vigane kirje suurus"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Kirje suurus peab olema %d kordne."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Vigane elementide arv"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "Lubatud on ainult üks --to-command võti"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Vigane tiheduse argument: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Tundmatu tihedus: `%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "*See* tar ei toeta võtmeid `-[0-7][lmh]'"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[FAIL]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Vana võti `%c' nõuab argumenti."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence ei oma failide nimekirjata mõtet"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence ei saa valitud tööre¸iimil kasutada"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Mitme arhiivifaili kasutamine nõuab võtit `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "--listed-incremental ja --newer ei saa koos kasutada"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Volüümi märgend on liiga pikk (piirang on %lu baiti)"
+msgstr[1] "%s: Volüümi märgend on liiga pikk (piirang on %lu baiti)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Ei suuda kontrollida mitme volüümilisi arhiive"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Ei saa kontrollida pakitud arhiive"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Ei saa kasutada mitme volüümilisi pakitud arhiive"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Tihendatud arhiive ei saa ühendada"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option saab kasutada ainult POSIX arhiividega"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Ega ikka ei tee küll tühja arhiivi"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Võtmeid `-Aru' ei saa kasutada võtmega `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Peab kasutama vähemalt üht võtmetest `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Eelnevad vead ei lõpetanud veel programmi tööd, lõpetan veaga"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Fail on %s baiti lühem"
+msgstr[1] "%s: Fail on %s baiti lühem"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Võtmesõna %s on tundmatu või pole veel realiseeritud"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Mustrit %s ei saa kasutada"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Võtmesõna %s ei saa ümber määrata"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Vigane laiendatud päis: puudub pikkus"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "Laiendatud päise pikkus on piiridest väljas"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Laiendatud päise pikkus %*s on piiridest väljas"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "Vigane laiendatud päis: pikkuse järel puudub tühik"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Vigane laiendatud päis: puudub võrdusmärk"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Vigane laiendatud päis: puudub reavahetus"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "Ignoreerin tundmatud laiendatud päise võtmesõna `%s'"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr "Genereeritud võti/väärtus paar on liiga pikk (võti=%s, pikkus=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Laiendatud päis %s=%s on piiridest %s..%s väljas"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Vigane laiendatud päis: %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Vigane laiendatud päis: liigne %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "Vigane laiendatud päis: vigane %s: ootamatu eraldaja %c"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Vigane laiendatud päis: vigane %s: veider arv väärtuseid"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile manipuleerib GNU paxutils testipaketi andmefailidega.\n"
+"VÕTMED on:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Faili loomise võtmed:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "SUURUS"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Loo määratud suurusega fail"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "Kirjuta standardväljundi asemel faili NIMI"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Loe failide nimed failist FAIL"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T loeb nullidega lõpetatud nimesid"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr "Täida fail antud mustriga. Muster on 'default' või 'zeros'"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Bloki suurus aukudega faili korral"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr "Loo aukudega fail. Järgnev käsurida kirjeldab faili."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "kontrolli arhiivi peale arhiivi kirjutamist"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Statistika faili kohta:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr "Väljasta iga faili kohta stat struktuuri sisu. Vaikimisi VORMING on: "
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Sünkroonse täitmise võtmed:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"Täida antud KÄSKLUS. Kasulik võtmetega --checkpoint ja --cut, --append, --"
+"touch"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr "Jõudes kontrollpunkti NUMBER, täida antud tegevus (vt. allpool)"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Määra järgmise --touch võtme ajatempel"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "Esita täidetud kontrollpunktid ja käsu lõpetamise olek"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Sünkroonse täitmise tegevused. Neid täidetakse, kui saabub --checkpoint "
+"võtmega määratud kontrollpunkt."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"Sea faili suuruseks --length võtmega näidatu (või 0, kui suurust ei antud)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr "Lisa faili lõppu --length parameetriga näidatud arv baite."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "Uuenda faili kasutamise ja muutmise ajatempleid"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "Käivita KÄSK"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Vigane suurus: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Number on piiridest väljas: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Negatiivne suurus: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "stat(%s) ebaõnnestus"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Viga `%s' juures numbri parsimisel"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Tundmatu kuupäeva vorming"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARGUMENDID...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "`%s' ei saa avada"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Ei õnnestu liikuda positsioonile %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "faili nimi sisaldab null sümbolit"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr "standard väljundis ei saa aukudega faili luua, kasutage võtit --file"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "vigane mask (`%s' lähedal)"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "Tundmatu väli `%s'"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "ei õnnestu seada `%s' aega"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Käsk lõpetas töö edukalt\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Käsk lõpetas veakoodiga %d\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Käsk katkestati signaaliga %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Käsk peatati signaaliga %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Käsk salvestas mälupildi\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Käsk katkestas\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "--stat nõuab failinimesid"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "liiga palju argumente"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Lugemisviga baidil %s, loen %lu baiti"
+#~ msgstr[1] "%s: Lugemisviga baidil %s, loen %lu baiti"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Tükeldatud failinimed--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Tükeldatud nimedel ootamatu faililõpp"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "%s nimetatud %s-ks"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Ei saa luua %s nimeviidet"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Loodud %s nimeviide %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Tundmatu kokkusobitamise käsk %s"
diff --git a/po/eu.gmo b/po/eu.gmo
new file mode 100644
index 0000000..60906f2
--- /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..14cb124
--- /dev/null
+++ b/po/eu.po
@@ -0,0 +1,2448 @@
+# Translation of tar messages to Basque.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+# Mikel Olasagasti <hey_neken@mundurat.net>, 2006.
+# Piarres Beobide <pi@beobide.net>, 2006.
+# This file is distributed under the same license as the tar package.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar-1.15.91-eu\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-12-13 19:52+0100\n"
+"Last-Translator: Mikel Olasagasti <hey_neken@mundurat.net>\n"
+"Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "%s argumentu baliogabea %s-rentzat"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "%s argumentu anbiguoa %s-rentzat"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Argumentu erabilgarriak:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: %s balioa %s-ren berdina edo txikiagoa da"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: ARGP_HELP_FMT parametroak balio bat behar du"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: ARGP_HELP_FMT parametroa positibo izan behar da"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: ARGP_HELP_FMT parametro ezezaguna"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Zaborra ARGP_HELP_FMT-en: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Aukera luzeentzat beharrezko edo aukerako argumentuak modu berdinean "
+"beharrezko edo aukerakoak izango dira aukera luzeentzat ere."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Erabilera:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " edo: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [AUKERA...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "`%s --help' edo `%s --usage' saiatu argibide gehiagorako.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Arazoen berri %s-en eman.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Sistema errore ezezaguna"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "laguntza zerrenda hau eman"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "erabilera mezu labur bat eman"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "IZENA"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "programa izen ezarri"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SEG"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "SEG segundu gelditu (lehenetsia 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "programa bertsioa bistarazi"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(PROGRAMA ERROREA) Ez da bertsioa ezagutzen!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Argumentu gehiegi\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(PROGRAMA ERROREA) Aukera ezaguna izan beharko zen!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: `%s' aukera anbiguoa da\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: `--%s' aukerak ez du argumenturik onartzen\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: `%c%s' aukerak ez du argumenturik onartzen\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: `%s' aukerak argumentu bat behar du\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: `--%s' aukera ezezaguna\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: `%c%s' aukera ezezaguna\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: -- %c legezkanpoko aukera\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: -- %c ekintza baliogabea\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: aukerak -- %c argumentu bat behar du.\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: `-W %s' aukera anbiguoa da\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: `-W %s' aukerak ez du argumenturik onartzen\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "bloke tamaina"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "memoria askieza"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Ezin da %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Oharra: Ezin da %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Ezin da modua %s-ra aldatu"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Ezin da jabetza uid %lu, gid %lu -ra aldatu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Ezin da %s-ra gogorki lotu"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Irakurketa errorea %s byte-an, byte %lu irakurtzerakoan"
+msgstr[1] "%s: Irakurketa errorea %s byte-an, %lu byte irakurtzerakoan"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Oharra: Irakurketa errorea %s byte-an, byte %lu irakurtzerakoan"
+msgstr[1] "%s: Oharra: Irakurketa errorea %s byte-an, %lu byte irakurtzerakoan"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Ezin da %s-ra seek egin"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Oharra: Ezin da %s-ra seek egin"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Ezin da %s-ra lotura sinbolkoa sortu"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr ""
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr ""
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "`.' partaide izen hutsagatik aldatzen"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "`.' lotura gogor helburu hutsegatik aldatzen"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[bB]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[eE]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Zerbitzua ez da erabilgarria"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "sarrera estandarra"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "irteera estandarra"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Ezin da urruneko shell-a abiarazi"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Sarrera kate luzeegia"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Zenbaki sintaxi errorea"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Ezin da buffer lekua esleitu\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Ezin da buffer lekua esleitu"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "`%s --help' saiatu argibide gehiagorako.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Erabilea: %s [AUKERA]\n"
+"Zinta gailu bat manipulatu, urruneko prozesu baten komandoak onartzen.\n"
+"\n"
+" --version Bertsio argibideak eman.\n"
+" --help Laguntza hau eman.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Erroreen berri <%s>-ra eman.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Seek offset errorea"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Seek offset-a eremuz kanpo"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Seek norabidea eremuz kanpo"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Fitxategi amaiera azkarregia\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Fitxategi amaiera azkarregia"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Zabor komandoa"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Idatziriko byte-ak guztira"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Irakurritako byte-ak guztira"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Ezabaturiko byte-ak guztira: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(tutua)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "balio baliogabea record_size-rentzat"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Ez da fitxategi izenik eman"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ezin da sarrera/irteera estandar fitxategia egiaztatu"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Fitxategia konprimiturik dago. %s aukera erabili"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Ezin dira konprimituriko fitxategiak eguneratu"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Idazketa %u egiaztapen puntua"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Irakurketa %u egiaztapen puntua"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Zintaren hasieran, uzten"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Errore gehiegi, uzten"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Alineatu gabeko blokea (byte %lu) paketean"
+msgstr[1] "Alineatu gabeko blokea (%lu byte) paketean"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Grabazio tamaina = bloke %lu"
+msgstr[1] "Grabazio tamaina = %lu bloke"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: bolumen zenbaki baliogabea du"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Bolumen zenbaki gainezkatzea"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "#%d bolumena %s -rako prestatu eta enter sakatu: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Fitxategi amaiera erabiltzaile erantzuna espero zenean"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "Oharra: Paketea ez dago osaturik"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n name Eman izen berri bat hurrengo (eta hurrengo) bolumenentzat\n"
+" q tar utzi\n"
+" y edo intro Ekintza jarraitu\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Azpishell bat sortu\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Zerrenda hau inprimatu\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Ez dago bolumen berririk; uzten.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Ez da fitxategi izenik ezarri. Berriz saiatu.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "SArrera baliogabea. ? idatzi laguntzarako.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "%s komandoak huts egin du"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Honek ez dirudi tar pakete bat"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s posibleki bolumen honen jarraipena da: buruak mozturiko izena du"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s ez da bolumen honen jarraipena"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s okerreko tamaina da (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Bolumen hau sekuentziatik kanpo dago"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr ""
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "%s bolumena ez da %s-ren pareko"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: fitxategi izen luzeegia GNU bolumen anitzeko buruan gordetzeko, mozturik"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "%lu byte bakarrik irakurri daiteke %lu byte-tatik"
+msgstr[1] "%lu byte bakarrik irakurri daiteke %lu byte-tatik"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Eduki ezberdintasunak"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Esperogabeko Fitxategi amaiaera paketean"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Fixtategi mota ezberdinak"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Modu ezberdinak"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid ezberdinak"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid ezberdinak"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Eraldaketa data ezberdinak"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Tamaina ezberdinak"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ez dago %s-ra loturik"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Lotura sinboliko ezberdinak"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Gailu zenbaki ezberdinak"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Egiaztatu "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: `%c' fitxategi mota ezezaguna, fitxategi arrunt batez ezberdina"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Egiaztapenak huts egin dezake jatorrizko fitxategiak kokatzerakoan."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "EGIAZTAPEN AKATSA: buru baliogabe %d aurkitu da"
+msgstr[1] "EGIAZTAPEN AKATSA: %d buru baliogabe aurkitu dira"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: katxe direktorioa marka bat du; ez da irauliko"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "%s eremua %s eremutik %s..%s kanpo: %s aldatzen"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "%s balioa %s eremutik %s..%s kanpo dago"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Zortzitar buru negatiboak sortzen"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: fitxategi izena luzeegia da (gehi. %d); ez da irauliko"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: fitxategi izena luzeegia da (ezin da moztu); ez da irauliko"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: lotura izena luzeegia da; ez da irauliko"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: fitxategia fitxategi sistema ezberdin batetan dago, ez da irauliko"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Fitxategi mota ezezaguna; fitxategia alde batetara utziko da"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "%s-ra lotura falta da.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: fitxategia ez da aldatu, ez da irauliko"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: fitxategia paketea da, ez da irauliko"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Fitxategia irakurri baino lehen ezabaturik"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: katxe direktorioa marka bat du; ez da irauliko"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: fitxategia aldatu egin da irakurtzen ari zenean"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: socket-a alde batetara utzi da"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: atea alde batetara utzia"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Hurrengoa burura salto egiten"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "paketetik burugabea ezabatzen"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: Sinesgarri izateko zaharregia den denbora marka %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: %s denbora marka %s etorkizunean da"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Esperogabeko inkonsistentziak direktorioa sortzerakoan"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Direktorioa bere egoera atera aurretik berrizendatua izan da"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Alboko fitxategiak fitxategi erregularrak bezala ateratzen"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Lotura sinbolikoak lotura gogor bezala ateratzen saiatzen"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "%s irakurtzen\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Ezin da atera -- paketea beste bolumen baten jarraipena da"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Buru izen luzera esperogabea"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr ""
+"%s: `%c' fitxategi mota ezezaguna, fitxategi arrunt bat bezala ateratzen"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Unekoa %s berriagoa edo data berdinekoa da"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Ez da gai fitxategi honen babeskopia egiteko"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Ezin da %s %s-ra berrizendatu"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Errorea berreskura ezina da: irteten"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Direktorioa %s-tik berrizendatua izan da"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Direktorioa berrizendatua izan da"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Direktorioa berria da"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "denbora marka baliogabea"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Eraldaketa denbora (segundu) baliogabea"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Eraldaketa denbora (nanosegundu) baliogabea"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "gailu zenbaki baliogabea"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Inodo zenbaki baliogabea"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Eremu luzeegia snapshot fitxategia irakurtzerakoan"
+
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "Eremu balio esperogabea snapshot fitxategian"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Eremu balio esperogabea snapshot fitxategian"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Eremu balio esperogabea snapshot fitxategian"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Gordetze amaiera falta da"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Fitxategi inkremental formatu okerra"
+
+#: src/incremen.c:1080
+#, fuzzy, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "Onartugabeko inkremental formatu bertsioa: %d"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+"Gaizki eratutako iraulketa direktorioa: '%c'espero zen baina %#3o aurkitu da"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Gaizki eratutako iraulketa direktorioa: 'X' bikoizturik"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Gaizki eratutako iraulketa direktorioa: izen hutsa 'R'-en"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Gaizki eratutako iraulketa direktorioa: 'T' ez doa 'R' atzean"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Gaizki eratutako iraulketa direktorioa: izen hutsa 'T'-en"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+"Gaizki eratutako iraulketa direktorioa: '%c' espero zen baina data amaiera "
+"aurkitu da"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "Gaizki eratutako iraulketa direktorioa: 'X' ez da inoiz erabili"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Ezin da aldiroko direktorioa sortu %s txantiloia erabiliaz"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Ez da direktorioa garbituko: ezin da egoera eskuratu"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: direktorioa gailu ezberdin batetan dago: ez da garbituko"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: %s ezabatzen\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Ezin da ezabatu"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Alde batetara uzten"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr ""
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "%s blokea: ** Fitxategi Amaiera **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "%s blokea: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Zuriunea buruan zenbakizko %s balioa espero zenean"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Paketearen zortzitar %.*s balioa %s eremutik kanpo dago, biak bateragarriak "
+"direla pentsatuko da"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Paketearen zortzitar %.*s balioa %s eremutik kanpo dago"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Paketeak zaharkituriko base-64 buruak ditu"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Paketeak %.*s du zenbakizko %s balioa espero zenean "
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Pakete %s balioa %s eremutik kanpo dago %s.. %s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " %s-ra lotu\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " %s fitxategi mota ezezaguna\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Lotura Luzea--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Izen Luzea--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Bolumen Burua--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--%s byte-an jarraitzen du--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Direktorioa sortzen:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "%s %s-ra berrizendatzen\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Ezin da %s-ra berrizendatu"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "%s %s-ra atzera berrizendatzen\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Ezin da lan direktorioa gorde"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Ezin da lan direktorioa aldatu"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "ume prozesua"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "prozesu arteko kanala"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "ohar hau kendu."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Ez da paketean aurkitu"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr ""
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "`-%s' eta `-%s' aukerek sarrera estandarra behar dute"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Pakete formatu baliogabea"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU ezaugarriak behar dira pakete formatu bateraezinean"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"`%s' markatze estilo ezezaguna. Saiatu `%s --quoting-style=help' zerrenda "
+"eskuratzeko."
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU `tar'-ek fitxategi anitz zinta edo disko pakete batetan gordetzen ditu, "
+"eta paketetetik banakako fitxategiak berreskuratu ditzake.\n"
+"\n"
+"Adibideak:\n"
+" tar -cf archive.tar foo bar # paketea.tar paketea sortu foo eta bar "
+"fitxategiekin.\n"
+" tar -tvf archive.tar # paketea.tar-eko fitxategi guztiak modu "
+"luzean zerrendatu.\n"
+" tar -xf archive.tar # paketea.tar-eko fitxategi guztiak atera.\n"
+"\vBabeskopia aurrizkia `~', da --suffix edo SIMPLE_BACKUP_SUFFIX bidez "
+"ezarri ezean.\n"
+"Bertsio kontrola --backup edo VERSION_CONTROL bidez ezarri daiteke, balioak "
+"hauek dira:\n"
+"\n"
+" none, off inoiz ez egin babeskopiarik\n"
+" t, numbered zenbakitutako babeskopiak egin\n"
+" nil, existing zenbakitutako zenbakitutakoak baleude bestela sinplea "
+"erabili\n"
+" never, simple beti babeskopia sinpleak egin\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"GNU `tar'-ek fitxategi anitz zinta edo disko pakete batetan gordetzen ditu, "
+"eta paketetetik banakako fitxategiak berreskuratu ditzake.\n"
+"\n"
+"Adibideak:\n"
+" tar -cf archive.tar foo bar # paketea.tar paketea sortu foo eta bar "
+"fitxategiekin.\n"
+" tar -tvf archive.tar # paketea.tar-eko fitxategi guztiak modu "
+"luzean zerrendatu.\n"
+" tar -xf archive.tar # paketea.tar-eko fitxategi guztiak atera.\n"
+"\vBabeskopia aurrizkia `~', da --suffix edo SIMPLE_BACKUP_SUFFIX bidez "
+"ezarri ezean.\n"
+"Bertsio kontrola --backup edo VERSION_CONTROL bidez ezarri daiteke, balioak "
+"hauek dira:\n"
+"\n"
+" none, off inoiz ez egin babeskopiarik\n"
+" t, numbered zenbakitutako babeskopiak egin\n"
+" nil, existing zenbakitutako zenbakitutakoak baleude bestela sinplea "
+"erabili\n"
+" never, simple beti babeskopia sinpleak egin\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Ekintza nagusi modua:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "pakete baten edukiak zerrendatu"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "pakete batetako fitxategiak atera"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "pakete berri bat sortu"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "paketea eta fitxategi sistema arteko ezberdintasunak bilatu"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "fitxategiak paketearen amaieran gehitu"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+"paketean dauden kopiak baino berriagoak diren fitxategiak bakarrik gehitu"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "gehitu tar fitxategiak pakete batetara"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "paketetik ezabatu (ez mag zintetan!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "pakete bolumen etiketa egiaztatu eta irten"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Ekintza aldagaiak:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "sakabanatutako fitxategiak egoki kudeatu"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "GNU basbeskopia inkremenetal formatu zaharra kudeatu"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "FITXATEGIA"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "GNU basbeskopia inkremenetal formatu berria kudeatu"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "ZENBAKIA"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "paketeak `seek' onartzen du"
+
+#: src/tar.c:415
+#, fuzzy
+msgid "Overwrite control:"
+msgstr "Gainidazketa kontrola:\n"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "fitxategia egiaztatzen saiatu idatzi aurretik"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "ezabatu fitxategiak paketera gehitu aurretik"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "ez ordezkatu dauden fitxategiak ateratzerakoan"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"ez ordezkatu ateratzerakoan dauden fitxategiak paketeko kopiak baino "
+"berriagoak badira"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "gainidatzi dauden fitxategiak ateratzerakoan"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "dauden direktorioen metadata mantendu"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "dauden direktorioen metadata gainidatzi ateratzerakoan (lehenetsia)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Irteera korrontea hautatu:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "fitxategiak irteera estandarrera atera"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "KOMANDOA"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "bideratu ateratako fitxategiak beste programa batetara"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "alde batetara utzi semeen irteera kodeak"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "zero ez diren semeen irteera kodeekin errore bat bezala jokatu"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Fitxategi atributu kudeaketa:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "indartu IZENA jabe bezala gehituriko fitxategientzat"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "indartu IZENA talde bezala gehituriko fitxategientzat"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATA-EDO-FITXATEGIA"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "ALDAKETAK"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "indartu (sinbolikoa) modu ALDAKETAK gehituriko lerroentzat"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "METODOA"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "ez atera fitxategi eraldaketa data"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "jabe berdinaren fitxategiak ateratzen saiatu"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "atera fitxategiak zure kabuz"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "beti erabili zenbakiak erabiltzaile/talde izenen ordez"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+"fitxategi baimenei buruzko argibideak atera (lehenetsia root "
+"erabiltzailearentzat)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"erabiltzailearen umask-a erabili paketetik baimenak ateratzerakoan "
+"(lehenetsia erabiltzaile arruntentzat)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "-p eta -s bikotearen berdina"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "--delay-directory-restore aukeraren eragina ezeztatu"
+
+#: src/tar.c:497
+#, fuzzy
+msgid "Device selection and switching:"
+msgstr "Gailu hautapen eta aldaketa:\n"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "PAKETEA"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "pakete fitxategia edo gailu PAKETEA erabili"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "pakete fitxategi lokala da nahiz bi puntu izan"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "Emandako rmt KOMANDOA erabili rmt ordez"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "Urruneko KOMANDOA erabili rsh ordez"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "Gailu eta dentsitatea ezarri"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "sortu/zerrendatu/atera bolumen-anitzeko paketea"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "zinta aldatu ZENBAKIA x 1024 byte idatzi ondoren"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "scipt-a abiarazi zinta bakoitzaren amaieran (-M behar du)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "erabili/eguneratu FITXATEGI bolumen zenbakia"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Gailu blokeak:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOKE"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLOKE x 512 byte grabazio bakoitzeko"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "grabazio bakoitzeko byte ZENBAKIA, 512-ren multiploa"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "paketean zeroz betetako blokeak alde batetara utzi"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "irakurri ahala berriz bloke egin (4.2BSD tutuentzat)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Pakete formatu hautapena:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMATUA"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "emandako formatuko pakete bat sortu"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "FORMATUA hauetako bat da:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "V7 tar formatu zaharra"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "GNU formatua tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU tar 1.13.x formatua"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "POSIX 1003.1-1988 (ustar) formatua"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "POSIX 1003.1-2001 (pax) formatua"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "pax-en berdina"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "--format=v7-ren berdina"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "--format=posix-ren berdina"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "gakoa[[:]=balioavalue][,gakoa[[:]=balioa]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TESTUA"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "fitxategia bzip2 bidez iragazi"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "fitxategia gzip bidez iragazi"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "fitxategia konpresorearen bidez iragazi"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "PROG bidez iragazi (-d onartu behar du)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Fixtategi lokal hautapena:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"Emandako FITXATEGIA paketera gehitu /Erabilgarri izena asaterisko batez "
+"asten bada)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "DIR"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "DIR direktoriora aldatu"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "ateratzeko edo sortzeko izenak FITXATEGIA-tik eskuratu"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "PATROIA"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "fixtategiak utzi, PATROIA bezala emandakoak"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "FITXATEGIAN zerrendaturiko patroiak alde batetara utzi"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "katxe marka duten direktorioak alde batetara utzi"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "katxe marka duten direktorioak alde batetara utzi"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "katxe marka duten direktorioak alde batetara utzi"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "katxe marka duten direktorioak alde batetara utzi"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "katxe marka duten direktorioak alde batetara utzi"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "katxe marka duten direktorioak alde batetara utzi"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "sahiestu automatikoki direktorioetan zehar jeistea"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "fitxategi sistema lokalean egon paketea sortzerakoan"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "direktorioetan barrena (lehenetsia)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "Ez kendu hasierako `/' fitxategi izenetatik"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+"lotura sinbolikoak jarraitu; lotzen dituzten fitxategiak irauli eta paketean "
+"sartu"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "PARTAIDE IZEN"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATA"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "data eta ordua parekatu data bakarrik aldatzen denean"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "KONTROL"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "babeskopia egin ezabatu aurretik, KONTROL bertsioa hautatu"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "KATEA"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Fitxategi izen eraldaketak:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "ESPRESIOA"
+
+#: src/tar.c:655
+#, fuzzy
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr "Sed-en ordezko EXPRESIOA erabili fitxategi izenak eraldatzeko"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "kasua alde batetara utzi"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "verbatim kate parekatzea"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr ""
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "irteera informatiboa:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]ZENBAKIA"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+"Aurrerapen mezuak bistarazi grabaketa ZENBAKI bakiotzagatik (lehenetsia 10 "
+"da)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "mezu bat inprimatu lotura guztiak ez badira iraultzen"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "SEINALEA"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "eraldaketa datak UTC orduan bistarazi"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "irteera luzea FITXATEGIRA bidali"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "Bloke zenbakia bistarazu pakete bakoitzeko mezu bakoitzagatik"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "berrespena eskatu ekintza bakoitzean"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "tar lehenespenak bistarazi"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "fixtategi edo pakete izenak bistarazi eraldaketaren aurretik"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "ESTILOA"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "Gako karaktere gehigarriak KATE-tik"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "gakoak kendu karaktereentzat KATE-tik"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Bateragarritasun aukerak:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Beste aukerak:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "ezgaitu arriskutsu izan daitezken zenbait aukera"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Ezin duzu `-Acdtrux' aukera bat baino gehiago ezarri"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Elkarjotzen duten konpresio aukerak"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Seinale izen ezezaguna: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Data adibide fitxategia ez da aurkitu"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "%s %s data formatu ezezagunagatik aldatzen"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: fitxategi zerrenda irakurria dagoeneko"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "--quoting-style-entzat balio erabilgarriak:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Blokeo faktore baliogabea"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Oharra: -l aukera ez da onartzen; agian -j edo -T egin nahi zenuen?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Zinta luzera baliogabea"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Atari data bat baino gehiago"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' ez da onartzen plataforma honetan"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "--checkpoint balioa ez da zenbaki oso bat"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Talde baliogabea"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Modu baliogabea eman da aukeran"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Zenbaki baliogabea"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Jabe baliogabea"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Grabazio tamaina baliogabea"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Grabaszio tamaina %d-ren multiplo bat izan behar da."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Elementu kopuru baliogabea"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "--to-command aukera bat bakarrik onartzen da"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Gaizki eratutako dentsitate argumentua: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Dentsitate Ezezaguna: `%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr " `-[0-7][lmh]' aukerak ez dira onartzen tar *honetan*"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[FITXATEGIA]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "`%c' zaharkituriko aukerak argumentu bat behar du"
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Pakete fitxategi anitzentzat `-M' aukera erabili behar da"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Ezin dira --listed-incremental eta --newer batera erabili"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Bolumen etiketa luzeegia da (muga %lu byte da)"
+msgstr[1] "%s: Bolumen etiketa luzeegia da (muga %lu byte da)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Ezin dira bolumen-anitzeko paketeak egiaztatu"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Ezin dira konprimituriko fitxategiak egiaztatu"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Ezin dira bolumen anitzeko konprimituriko paketeak erabaili"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Ezin dira konprimituriko paketeak kateatu"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option POSIX paketeekin bakarrik erabili daiteke"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr ""
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr " `-Aru' aukerak bateraezinak dira `-f -' rekin"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Behintzat `-Acdtrux' aukeretako bat ezarri behar duzu"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Errore irteera aurreko erroreak direla eta"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "%s gakoa ezezaguna da edo ez dago inplementaturik oraindik"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "%s patroia ezin da erabili"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "%s gakoa ezin da gainidatzi"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Gaizki eratutako buru luzapena: luzera falta da"
+
+#: src/xheader.c:506
+#, fuzzy
+msgid "Extended header length is out of allowed range"
+msgstr " %*s buru luzapen luzera eremuz kanpo dago"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr " %*s buru luzapen luzera eremuz kanpo dago"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "Gaizki eratutako buru luzapena: luzera ondoren hutsunea falta da"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Gaizki eratutako buru luzapena: berdin ikurra falta da"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Gaizki eratutako buru luzapena: lerro berria falta da"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "alde batetara utzi gako buru luzapen ezezaguna `%s'"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "buru luzapena %s=%s eremuz kanpo dago %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Gaizki eratutako buru luzapena: baliogabea %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Gaizki eratutako buru luzapena: gehiegizkoa %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+"Gaizki eratutako buru luzapena: %s baliogabea: %c mugatzaile esperodageba"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Gaizki eratutako buru luzapena: %s baliogabea: balio kopuru bitxia"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Pakete sortze aukerak:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "TAMAINA"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Emandako TAMAINAko paketea sortu"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "Fitxategi IZENEAN idatzi irteera estandarren ordez"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Fitxategi izenak PAKETEtik irakurri"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Bloke tamaina fitxategi sakabanatuentzat"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+"Fitxategi sakabanatuak sortu. Komanod lerroaren besteak fitxategi mapa dakar."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "fitxategia egiaztatzen saiatu idatzi aurretik"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Fixtategi estatistika aukerak:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"Eduki eta egitura estatusa inprimatu emandako fitxategi bakoiztarentzat. "
+"Lehenetsiriko FORMATUA: "
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Sinkronizatutako exekuzio aukerak:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"Emandako KOMANDOA exekutatu. Erabilgarri --checkpoint eta hauetako batekin; "
+"--cut, --append, --touch"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Ezarri data hurrengo --touch aukerarentzat"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "FITXATEGIAREN irakurketa eta eraldaketa denborak aldatu"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "KOMANDOA exekutatu"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Tamaina baliogabea: %s"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Inodo zenbakia eremuz kanpo dago"
+
+#: tests/genfile.c:247
+#, fuzzy, c-format
+msgid "Negative size: %s"
+msgstr "Tamaina baliogabea: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "stat(%s) -ek huts egin du"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Errorea zenbakia analizatzean hemendi gertu: `%s'"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Data formatu ezezaguna"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARG...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "Ezin da `%s' ireki"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Ezin da %s-ra seek egin"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "fitxategia izenak karaktere baliogabea du"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"ezin dira sakabanaturiko fitxategiaksortu irteera estandarrean. --file "
+"erabili"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "maskara baliogabea (`%s'-etik gertu)"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "`%s' eremu ezezaguna"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "ezin da `%s'-ren denbora ezarri"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Komandoa behar bezala irten da\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Komandoa %d egoerarekin huts egin du\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Komandoa %d seinalearekin amaitu da\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Komandoa %d seinalearekin geratu da\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Komando iraulketa nagusia\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Komandoa amaitua\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "--stat -ek fitxategi izenak behar ditu"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "argumentu gehiegi"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Irakurketa errorea %s byte-an, byte %lu irakurtzerakoan"
+#~ msgstr[1] "%s: Irakurketa errorea %s byte-an, %lu byte irakurtzerakoan"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Denbora marka eremuz kanpo dago"
+
+#~ msgid "Modification time (seconds) out of range"
+#~ msgstr "Eraldaketa denbora (segundu) eremuz kanpo dago"
+
+#~ msgid "Modification time (nanoseconds) out of range"
+#~ msgstr "Eraldaketa denbora (nanosegundu) eremuz kanpo dago"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Gailu zenbakia eremuz kanpo dago"
+
+#~ msgid "Error reading time stamp"
+#~ msgstr "Errorea denbora marka irakurtzerakoan"
+
+#~ msgid "Unexpected EOF"
+#~ msgstr "Fitxategi Amaiera Esperogabea"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Kudeatutako fitxategi izenak--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Fitxategi amaiera esperogabea kudeatutako izenetan"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "%s %s-ra berrizendaturik"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Ezin da %s-ra lotura sinbolikoa egin"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s %s-ra sibolikoki lotua"
+
+#~ msgid "same as -N"
+#~ msgstr "-N -ren berdina"
diff --git a/po/fi.gmo b/po/fi.gmo
new file mode 100644
index 0000000..eb8da72
--- /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..e32bb6a
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,3086 @@
+# Finnish messages for GNU tar.
+# Copyright © 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
+# Lauri Nurmi <lanurmi@iki.fi>, 2002-2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.16.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-12-09 18:58+0200\n"
+"Last-Translator: Lauri Nurmi <lanurmi@iki.fi>\n"
+"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\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"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argumentti %s on virheellinen %s:lle"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argumentti %s on moniselitteinen %s:lle"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Kelvolliset argumentit ovat:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: ARGP_HELP_FMT-parametri vaatii arvon"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: ARGP_HELP_FMT-parametrin on oltava positiivinen"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Tuntematon ARGP_HELP_FMT-parametri"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Roskaa ARGP_HELP_FMT:ssä: %s"
+
+#: lib/argp-help.c:1247
+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."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Käyttö:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " tai: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [VALITSIN...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Komennot â€%s --help†ja â€%s --usage†antavat lisää tietoa.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Ilmoita ohjelmistovioista (englanniksi) osoitteeseen %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Tuntematon järjestelmävirhe"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "näytä tämä ohje"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "näytä lyhyt käyttöohje"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NIMI"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "näytä ohjelman versio"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Liian monta argumenttia\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: valitsin â€%s†on moniselitteinen\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: valitsin â€--%s†ei salli argumenttia\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: valitsin â€%c%s†ei salli argumenttia\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: valitsin â€%s†vaatii argumentin\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: tunnistamaton valitsin â€--%sâ€\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: tunnistamaton valitsin â€%c%sâ€\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: virheellinen valitsin -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: virheellinen valitsin -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: valitsin vaatii argumentin -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: valitsin â€-W %s†on moniselitteinen\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: valitsin â€-W %s†ei salli argumenttia\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "lohkokoko"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "muisti lopussa"
+
+# Onpa taas NIIN hyvin lokalisoitavissa tämä.
+# Käytännössä saattaa esiintyä esim. muodossa
+# "tar: Cannot mkfifo: File exists"
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Toimintoa %s ei voi suorittaa"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Varoitus: Toimintoa %s ei voi suorittaa"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Oikeuksien muuttaminen tilaan %s ei onnistu"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Tiedoston omistusta ei voi muuttaa arvoon uid=%lu, gid=%lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Kovaa linkkiä tiedostoon %s ei voi luoda"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Lukuvirhe tavun %s kohdalla luettaessa %lu tavua"
+msgstr[1] "%s: Lukuvirhe tavun %s kohdalla luettaessa %lu tavua"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Varoitus: Lukuvirhe tavun %s kohdalla luettaessa %lu tavua"
+msgstr[1] "%s: Varoitus: Lukuvirhe tavun %s kohdalla luettaessa %lu tavua"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Siirtyminen kohtaan %s ei onnistu"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Varoitus: Siirtyminen kohtaan %s ei onnistu"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Tiedostoon %s ei voida luoda symlinkkiä"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Kirjoitettiin vain %lu tavua %lu tavusta"
+msgstr[1] "%s: Kirjoitettiin vain %lu tavua %lu tavusta"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Poistetaan â€%s†tiedostonimien alusta"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Poistetaan â€%s†kovien linkkien kohdenimien alusta"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Korvataan â€.†tyhjällä tiedostonimellä"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Korvataan â€.†tyhjällä kovan linkin kohteella"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "â€"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "â€"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[kKyY]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[eEnN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Palvelu ei ole käytettävissä"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "vakiosyöte"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "vakiotuloste"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Etäkuorta ei voi käynnistää"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Puskuritilaa ei voi varata\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Puskuritilaa ei voi varata"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Komento â€%s --help†antaa lisää tietoa.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Käyttö: %s [VALITSIN]\n"
+"Käsittele nauha-asemaa, hyväksyen komentoja etäprosessilta.\n"
+"\n"
+" --version Näytä versiotiedot.\n"
+" --help Näytä tämä ohje.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Ohjelmistovioista voi ilmoittaa (englanniksi) osoitteeseen\n"
+"<%s>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Siirtymä sallitun välin ulkopuolella"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Siirtymä sallitun välin ulkopuolella"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Siirtymän suunta sallitun välin ulkopuolella"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Ennenaikainen tiedoston loppu\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Ennenaikainen tiedoston loppu"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Roskakomento"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Kirjoitettuja tavuja yhteensä"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Poistettuja tavuja yhteensä: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(putki)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Virheellinen arvo kentälle record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Arkiston nimeä ei ole annettu"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Vakiosyötteessä/tulosteessa olevaa arkistoa ei voi varmistaa"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Arkisto on tiivistetty. Käytä valitsinta %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Pakattuja arkistoja ei voi päivittää"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Kirjoituksen tarkistuspiste %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Lukemisen tarkistuspiste %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Nauhan alussa, lopetetaan"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Liian monta virhettä, lopetetaan"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Kohdistamaton lohko (%lu tavu) arkistossa"
+msgstr[1] "Kohdistamaton lohko (%lu tavua) arkistossa"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Tietueen koko = %lu lohko"
+msgstr[1] "Tietueen koko = %lu lohkoa"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Arkistossa ei voi siirtyä taaksepäin; sitä ei ehkä voi lukea ilman "
+"valitsinta -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek ei pysähtynyt tietueen rajalle"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: sisältää virheellisen arkiston osan järjestysnumeron"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Arkisto-osan järjestysnumeron ylivuoto"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Valmistele osa #%d arkistolle %s ja paina return: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Tiedoston loppu odotetun käyttäjän syötteen sijaan"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "VAROITUS: Arkisto on epätäydellinen"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n nimi Anna uusi tiedostonimi seuraavalle (ja tuleville) arkiston\n"
+" osalle/osille\n"
+" q Keskeytä tar\n"
+" y tai rivinv. Jatka suoritusta\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Käynnistä alikuori\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Näytä tämä lista\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Ei uutta arkiston osaa, poistutaan.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Tiedostonimeä ei annettu. Yritä uudelleen.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "Komento %s epäonnistui"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Tämä ei näytä tar-arkistolta"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"%s jatkuu mahdollisesti tällä arkiston osalla: otsake sisältää typistetyn "
+"nimen"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s ei jatku tällä arkiston osalla"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s on väärän kokoinen (%s ≠ %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Tämä arkiston osa ei ole järjestyksessä"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arkistoa ei ole nimetty täsmää nimiöön %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Arkiston osa %s ei täsmää nimiöön %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: tiedostonimi on liian pitkä tallennettavaksi moniosaisen GNU-arkiston "
+"otsakkeeseen; nimi typistetty"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Voitiin lukea vain %lu tavua %lu tavusta"
+msgstr[1] "Voitiin lukea vain %lu tavua %lu tavusta"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Sisällöt eroavat"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Odottamaton tiedoston loppu arkistossa"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Tiedoston tyyppi eroaa"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Tila eroaa"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "UID eroaa"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "GID eroaa"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Muutosaika eroaa"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Koko eroaa"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ei ole linkitetty tiedostoon %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symlinkki eroaa"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Laitenumero eroaa"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Tarkasta "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Tuntematon tiedostotyyppi â€%câ€, vertailtu normaalina tiedostona"
+
+# Mitäh?
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Arkisto sisältää tiedostonimiä, joiden etuliitteet on poistettu."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Tarkastus ei ehkä löydä alkuperäisiä tiedostoja."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "TARKASTUSVIRHE: havaittu %d virheellinen otsake"
+msgstr[1] "TARKASTUSVIRHE: havaittu %d virheellistä otsaketta"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: näyttää välimuistihakemistolta, ei lisätä"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "arvo %s on sallitun %s-välin %s..%s ulkopuolella, korvataan arvolla %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "arvo %s on sallitun %s-välin %s..%s ulkopuolella"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Luodaan otsakkeet negatiivisilla oktaaleilla"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: tiedostonimi on liian pitkä (maksimi %d), ei lisätä"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: tiedostonimi on liian pitkä (ei voida jakaa), ei lisätä"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: linkin nimi on liian pitkä, ei lisätä"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Tiedosto kutistui %s tavun verran, tasataan nollilla"
+msgstr[1] "%s: Tiedosto kutistui %s tavun verran, tasataan nollilla"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: tiedosto ei ole samalla tiedostojärjestelmällä, ei lisätä"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Tuntematon tiedostotyyppi, tiedostoa ei huomioida"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "Puuttuvat linkit tiedostoon %s.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: tiedosto on muuttumaton, ei lisätä"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: tiedosto on arkistossa, ei lisätä"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Tiedosto oli poistettu ennen sen lukemista"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: näyttää välimuistihakemistolta, ei lisätä"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: tiedosto muuttui lukemisen aikana"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: pistoketta ei huomioida"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: ovea ei huomioida"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Siirrytään seuraavaan otsakkeeseen"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Poistetaan epäotsake arkistosta"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: epätodennäköisen vanha aikaleima %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: aikaleima %s on %s sekuntia tulevaisuudessa"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Odottamaton ristiriita luotaessa hakemistoa"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Hakemisto nimettiin uudelleen ennen kuin sen tilaa voitiin purkaa"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Puretaan jatkuvat tiedostot normaaleiksi tiedostoiksi"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Yritetään purkaa symboliset linkit koviksi linkeiksi"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Luetaan %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Ei voi purkaa -- tiedosto on jatkoa toisesta arkiston osasta"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Odottamaton tiedoston loppu sovitetuissa nimissä"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Tuntematon tiedostotyyppi â€%câ€, purettiin normaaliksi tiedostoksi"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Nykyinen %s on uudempi tai yhtä vanha"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Tätä tiedostoa ei voitu varmuuskopioida"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Uudelleennimeäminen nimelle %s ei onnistu"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Virhe ei ole korjattavissa, poistutaan nyt"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Hakemisto %s on nimetty uudelleen"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Hakemisto on nimetty uudelleen"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Hakemisto on uusi"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Virheellinen aikaleima"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Virheellinen muutosaika (sekunnit)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Virheellinen muutosaika (nanosekunnit)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Virheellinen laitenumero"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Virheellinen i-solmun numero"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Odottamaton tiedoston loppu arkistossa"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Kelvoton tiheysargumentti: â€%sâ€"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Kelvoton tiheysargumentti: â€%sâ€"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Väliaikaishakemiston luominen %s-mallia käyttäen ei onnistu"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Ei poisteta hakemistoa: stat ei onnistu"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: hakemisto on eri laitteella, ei poisteta"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Poistetaan %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Ei voi poistaa"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Jätetään pois"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "lohko %s: ** NUL-lohko **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Yksinäinen nollalohko kohdassa %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "lohko %s: ** Tiedoston loppu **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "lohko %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Tyhjiä merkkejä otsakkeessa, odotettiin numeerista %s-arvoa"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Arkiston oktaaliarvo %.*s on sallitun %s-välin ulkopuolella, oletetaan "
+"kahden komplementiksi"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Arkiston oktaaliarvo %.*s on sallitun %s-välin ulkopuolella"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Arkisto sisältää käytöstä poistuvia base-64-otsakkeita"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+"Arkiston etumerkillinen base-64-merkkijono %s on sallitun %s-välin "
+"ulkopuolella"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Arkiston base-256-arvo on sallitun %s-välin ulkopuolella"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arkisto sisältää merkkijonon %.*s, odotettiin numeerista %s-arvoa"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Arkiston arvo %s on sallitun %s-välin %s..%s ulkopuolella"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " linkki tiedostoon %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " tuntematon tiedostotyyppi %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Pitkä linkki--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Pitkä nimi--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Arkiston osan otsake--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Jatkuu tavusta %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Luodaan hakemisto:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Nimetään uudelleen %s -> %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Uudelleennimeäminen nimelle %s ei onnistu"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Nimetään %s takaisin nimelle %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Työhakemistoa ei voi tallentaa"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Työhakemistoa ei voi vaihtaa"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "lapsiprosessi"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "prosessienvälinen kanava"
+
+# ... ja sen pitää päätyä kääntäjien ongelmaksi?
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Tiedostonimissä on käytetty jokerimerkkejä. Käytä"
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr "valitsinta --wildcards täsmäyksen käyttöön ottamiseksi, tai"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "--no-wildcards tämän varoituksen vaientamiseksi."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Ei löytynyt arkistosta"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Vaadittua esiintymää ei löytynyt arkistosta"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Kumpikin valitsimista â€-%s†ja â€-%s†käyttää vakiosyötettä"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Virheellinen arkistomuoto"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr ""
+"Haluttiin käyttää GNU-ominaisuuksia yhteensopimattoman arkistomuodon kanssa"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU â€tar†tallentaa useita tiedostoja yhteen nauha- tai levyarkistoon, ja\n"
+"pystyy palauttamaan yksittäisiä tiedostoja arkistosta.\n"
+"\n"
+"Esimerkkejä:\n"
+" %s -cf arkisto.tar foo bar # Luo arkisto.tar tiedostoista foo ja bar.\n"
+" %s -tvf arkisto.tar # Listaa kaikki arkisto.tar:in tiedostot.\n"
+" %s -xf arkisto.tar # Pura kaikki tiedostot arkisto.tar:ista.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Varmuuskopion jälkiliite on â€~â€, ellei sitä ole asetettu valitsimella\n"
+"--suffix tai muuttujalla SIMPLE_BACKUP_SUFFIX. Versionhallintaa voidaan\n"
+"säätää valitsimella --backup tai muuttujalla VERSION_CONTROL; arvot ovat:\n"
+"\n"
+" none, off älä tee varmuuskopioita koskaan\n"
+" t, numbered tee numeroituja varmuuskopioita\n"
+" nil, existing numeroituja, jos numeroituja varmuuskopioita on olemassa,\n"
+" muuten yksinkertaisia\n"
+" never, simple tee aina yksinkertaisia varmuuskopioita\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Päätoimintatila:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "listaa arkiston sisältö"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "pura tiedostoja arkistosta"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "luo uusi arkisto"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "etsi arkiston ja tiedostojärjestelmän väliset erot"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "lisää tiedostoja arkiston loppuun"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "lisää vain arkistokopiota uudemmat tiedostot"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "lisää tar-tiedostoja arkistoon"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "poista tiedostoja arkistosta (ei toimi magneettinauhoilla!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Toimintovalinnat:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "käsittele harvat tiedostot tehokkaasti"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "käsittele vanha GNU-muotoinen lisääntyvä varmuuskopio"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "TIED"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "käsittele uusi GNU-muotoinen lisääntyvä varmuuskopio"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "jatka lukukelvottomista tiedostoista huolimatta"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "MÄÄRÄ"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"käsittele vain kunkin tiedoston MÄÄRÄ-järjestyslukuinen esiintymä "
+"arkistossa; tämä valitsin on kelvollinen vain yhdessä alikomentojen --"
+"delete, --diff, --extract tai --list kanssa, ja kun luettelo tiedostoista on "
+"annettu komentirivillä tai -T-valitsimella; oletusMÄÄRÄ on 1"
+
+# Muualla seek on siirtymistä...
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "arkisto on selattava"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "yritä varmistaa arkisto kirjoittamisen jälkeen"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "poista tiedostot arkistoon lisäämisen jälkeen"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "älä korvaa olemassaolevia tiedostoja purettaessa"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"älä korvaa olemassaolevia tiedostoja, jotka ovat arkistokopioitaan uudempia"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "ylikirjoita olemassaolevat tiedostot purettaessa"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "poista jokainen tiedosto ennen sen päälle purkamista"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "tyhjennä rakenne ennen hakemiston purkamista"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "säilytä olemassaolevien hakemistojen metatiedot"
+
+#: src/tar.c:434
+#, fuzzy
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "ylikirjoita olemassaolevat tiedostot purettaessa"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Valitse tulostusvirta:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "pura tiedostot vakiotulosteeseen"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "KOMENTO"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "putkita puretut tiedostot toiselle ohjelmalle"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "jätä lapsiprosessien paluuarvot huomiotta"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "käsittele lapsiprosessien nollasta poikkeavat paluuarvot virheinä"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Tiedostojen ominaisuuksien käsittely:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "pakota NIMI lisättyjen tiedostojen omistajaksi"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "pakota NIMI lisättyjen tiedostojen ryhmäksi"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "PÄIVÄYS-TAI-TIED"
+
+#: src/tar.c:461
+#, fuzzy
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "tallenna vain PÄIVÄYS-TAI-TIEDostoa uudemmat tiedostot"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "MUUTOS"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "pakota (symbolinen) tila MUUTOS lisätyille"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "älä pura tiedoston muutosaikaa"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "yritä purkaa tiedostot samalla omistajuudella"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "pura tiedostot itsenäsi"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "käytä aina numeroita käyttäjän/ryhmän nimissä"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "lajittele purettavat tiedostonimet täsmäämään arkistoon"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "sama kuin -p ja -s yhdessä"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+#, fuzzy
+msgid "Device selection and switching:"
+msgstr "Laitteen valinta ja vaihtaminen:\n"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARKISTO"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "käytä arkistotiedostoa tai -laitetta ARKISTO"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "arkisto on paikallinen vaikka nimessä olisi kaksoispiste"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "käytä rmt-KOMENTOA rmt:n sijaan"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "käytä etäKOMENTOa rsh:n sijaan"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "anna asema ja tiheys"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "luo/listaa/pura moniosainen arkisto"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "vaihda nauhaa MÄÄRÄ × 1024 kirjoitetun tavun jälkeen"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "aja skripti joka nauhan lopussa (valitsin -M tulee käyttöön)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "käytä/päivitä arkiston osan numero TIEDostossa"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Laitteen lohkot:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "LOHKOT"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "LOHKOT × 512 tavua tietuetta kohti"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "MÄÄRÄ tavua tietuetta kohti, 512:n monikerta"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "älä huomioi nollattuja lohkoja arkistossa (merkitsee tiedoston loppua)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "suorita lohkominen uudelleen luettaessa (4.2BSD-putkia varten)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Arkistomuodon valinta:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "MUOTO"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "luo annetun muotoinen arkisto"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "MUOTO on yksi seuraavista:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "vanha V7-tar-muoto"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "GNU-muoto tar-versioilla ≤ 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU tar 1.13.x -muoto"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "POSIX 1003.1-1988 (ustar) -muoto"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "POSIX 1003.1-2001 (pax) -muoto"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "sama kuin pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "sama kuin --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "sama kuin --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "avainsana[[:]=arvo][,avainsana[[:]=arvo]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "määrittele pax-avainsanoja"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TEKSTI"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"luo arkisto nimiöllä TEKSTI. Listattaessa/purettaessa käytä TEKSTIä "
+"nimiönhakulausekkeena"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "ohjaa arkisto bzip2-ohjelman läpi"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "ohjaa arkisto gzip-ohjelman läpi"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "ohjaa arkisto compress-ohjelman läpi"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "OHJ"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "ohjaa OHJelman läpi (on hyväksyttävä -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Paikallisten tiedostojen valinta:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"lisää annettu TIEDosto arkistoon (hyödyllinen, jos nimi alkaa viivalla)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "HAK"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "siirry hakemistoon HAK"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "hae purettavat/luotavat nimet TIEDOSTOsta"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T lukee nollaan päättyviä nimiä, poistaa käytöstä -C:n"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "HAHMO"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "jätä pois HAHMOn mukaiset tiedostot"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "jätä pois TIEDOSTOssa listatut hahmot"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "jätä pois välimuistihakemistot"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "jätä pois TIEDOSTOn sisältävät hakemistot"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "jätä pois TIEDOSTOn sisältävät hakemistot"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "jätä pois TIEDOSTOn sisältävät hakemistot"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "jätä pois TIEDOSTOn sisältävät hakemistot"
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr "jätä pois TIEDOSTOn sisältävät hakemistot"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "estä automaattinen eteneminen alihakemistoihin"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "pysy nykyisessä tiedostojärjestelmässä arkistoa luotaessa"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "etene alihakemistoihin (oletus)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "älä poista â€/â€-merkkiä tiedostonimien alusta"
+
+#: src/tar.c:634
+#, fuzzy
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr "seuraa symlinkkejä; "
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "TIED-NIMI"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "aloita arkiston tiedostosta TIED-NIMI"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "tallenna vain PÄIVÄYS-TAI-TIEDostoa uudemmat tiedostot"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "PÄIVÄYS"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "vertaa vain tiedoston muutosaikaa"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "HALLINTA"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "varmuuskopiointi ennen poistoa, valitse versionHALLINTA"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "MERKKIJONO"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"varmuuskopiointi ennen poistoa, älä käytä tavanomaista jälkiliitettä (joka "
+"on â€~â€, ellei muuttujaa SIMPLE_BACKUP_SUFFIX ole asetettu)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+#, fuzzy
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "poista MÄÄRÄn verran osia tiedostonimien alusta"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+#, fuzzy
+msgid "ignore case"
+msgstr "poisjättäminen ei huomioi kirjainkokoa"
+
+#: src/tar.c:665
+#, fuzzy
+msgid "patterns match file name start"
+msgstr "poisjättöhahmoja verrataan nimen alkuun"
+
+#: src/tar.c:667
+#, fuzzy
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "poisjättöhahmoja verrataan jokaisen â€/â€:n jälkeen"
+
+#: src/tar.c:669
+#, fuzzy
+msgid "case sensitive matching (default)"
+msgstr "poisjättäminen huomioi kirjainkoon (oletus)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "poisjättöhahmon jokerimerkit eivät täsmää â€/â€-merkkiin"
+
+#: src/tar.c:677
+#, fuzzy
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "poisjättöhahmon jokerimerkit vastaavat merkkiä â€/â€"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Tietoja antava tuloste:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "listaa käsiteltävät tiedostot"
+
+#: src/tar.c:686
+#, fuzzy
+msgid "[.]NUMBER"
+msgstr "MÄÄRÄ"
+
+#: src/tar.c:687
+#, fuzzy
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "näytä edistymisviesti 10 sekunnin välein"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "näytä viesti, ellei kaikkia linkkejä lisätty"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "näytä tiedostojen muutosajat UTC-aikoina"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "ohjaa monisanainen tuloste TIEDostoon"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "näytä lohkonumero arkistossa viestien yhteydessä"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "kysy varmistusta jokaiselle toiminnolle"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "näytä tarin oletukset"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"luettele hakuehtoihin täsmäämättömät hakemistot luetellessa tai purettaessa"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Yhteensopivuusvalitsimet:"
+
+#: src/tar.c:726
+#, fuzzy
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"luotaessa sama kuin --old-archive purettaessa sama kuin --no-same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Muut valitsimet:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "poista käytöstä joitakin potentiaalisesti vahingollisia valitsimia"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Vain yhtä valitsimista â€-Acdtrux†voi käyttää kerrallaan"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Ristiriitaiset pakkausvalitsimet"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Tuntematon signaalin nimi: %s"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Päiväystiedostoa ei löytynyt"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Korvataan tuntematon päiväysmuoto %2$s arvolla %1$s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Valitsin %s: Käsittellään päiväys %s arvona %s"
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: tiedosto on arkistossa, ei lisätä"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: tiedostonimi sisältää nul-merkin"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "Kelvolliset argumentit --quoting-style -valitsimille ovat:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Tämä* tar käyttää oletuksena:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Virheellinen lohkomiskerroin"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Varoitus: valitsin -I ei ole tuettu, ehkä tarkoitit -j tai -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Virheellinen nauhan pituus"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Annettu useampi kuin yksi kynnyspäiväys"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' ei ole tuettu tällä alustalla"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Virheellinen ryhmä"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Valitsimelle annettiin virheellinen tila"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Virheellinen määrä"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Virheellinen omistaja"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Virheellinen tietueen koko"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Tietueen koon on oltava %d:n monikerta."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Virheellinen osien määrä"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Kelvoton tiheysargumentti: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Tuntematon tiheys: â€%câ€"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "*Tämä* tar ei tue valitsimia â€-[0-7][lmh]â€"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[TIEDOSTO]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Vanha valitsin â€%c†vaatii argumentin."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "valitsin --occurence on merkityksetön ilman tiedostoluetteloa"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "valitsinta --occurence ei voi käyttää pyydetyssä toimintatilassa"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Usean arkistotiedoston käyttäminen vaatii valitsimen â€-Mâ€"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Valitsimia --listed-incremental ja --newer ei voi käyttää yhdessä"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Arkiston osan nimiö on liian pitkä (raja on %lu tavu)"
+msgstr[1] "%s: Arkiston osan nimiö on liian pitkä (raja on %lu tavua)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Moniosaisia arkistoja ei voi tarkastaa"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Pakattuja arkistoja ei voi varmistaa"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Pakattuja moniosaisia arkistoja ei voi käyttää"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Pakattuja arkistoja ei voi liittää toisiinsa"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "Valitsinta --pax-option voi käyttää vain POSIX-arkistoille"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Kieltäydytään pelkurimaisesti luomasta tyhjää arkistoa"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Valitsimet â€-Aru†eivät ole yhteensopivia valitsinten â€-f -†kanssa"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Vähintään yhtä valitsimista â€-Acdtrux†on käytettävä"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Viivästetty virhepoistuminen johtuu aikaisemmista virheistä"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Tiedosto kutistui %s tavun verran"
+msgstr[1] "%s: Tiedosto kutistui %s tavun verran"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Avainsana %s on tuntematon tai sillä ei vielä ole toteutusta"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Hahmoa %s ei voi käyttää"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Avainsanaa %s ei voi ohittaa"
+
+#: src/xheader.c:498
+#, fuzzy
+msgid "Malformed extended header: missing length"
+msgstr "Väärän muotoinen laajennettu otsake: yhtäsuuruusmerkki puuttuu"
+
+#: src/xheader.c:506
+#, fuzzy
+msgid "Extended header length is out of allowed range"
+msgstr ""
+"Arkiston etumerkillinen base-64-merkkijono %s on sallitun %s-välin "
+"ulkopuolella"
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr ""
+"Arkiston etumerkillinen base-64-merkkijono %s on sallitun %s-välin "
+"ulkopuolella"
+
+#: src/xheader.c:525
+#, fuzzy
+msgid "Malformed extended header: missing blank after length"
+msgstr "Väärän muotoinen laajennettu otsake: tyhje puuttuu pituuden jälkeen"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Väärän muotoinen laajennettu otsake: yhtäsuuruusmerkki puuttuu"
+
+#: src/xheader.c:539
+#, fuzzy
+msgid "Malformed extended header: missing newline"
+msgstr "Väärän muotoinen laajennettu otsake: yhtäsuuruusmerkki puuttuu"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+"Muodostettu avainsana-arvo-pari on liian pitkä (avainsana=%s, pituus=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Laajennettu otsake %s=%s on sallitun välin %s..%s ulkopuolella"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Väärän muotoinen laajennettu otsake: virheellinen %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, fuzzy, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Väärän muotoinen laajennettu otsake: yhtäsuuruusmerkki puuttuu"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+"Väärän muotoinen laajennettu otsake: virheellinen %s: odottamaton rajoitin %c"
+
+#: src/xheader.c:1338
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Väärän muotoinen laajennettu otsake: yhtäsuuruusmerkki puuttuu"
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Luo datatiedostot GNU tar:in testausta varten.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Muut valitsimet:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+#, fuzzy
+msgid "Create file of the given SIZE"
+msgstr "luo annetun muotoinen arkisto."
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "pura tiedostot vakiotulosteeseen"
+
+#: tests/genfile.c:131
+#, fuzzy
+msgid "Read file names from FILE"
+msgstr "Luettiin %s tavua arkistosta %s"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T lukee nollatavuun päättyviä nimiä"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "yritä varmistaa arkisto kirjoittamisen jälkeen"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "Suorita KOMENTO"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Virheellinen koko: %s"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "I-solmun numero ei ole sallitulla välillä"
+
+#: tests/genfile.c:247
+#, fuzzy, c-format
+msgid "Negative size: %s"
+msgstr "Virheellinen koko: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "stat(%s) epäonnistui"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Tuntematon järjestelmävirhe"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARG...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Siirtyminen kohtaan %s ei onnistu"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "tiedostonimi sisältää nollatavun"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " tuntematon tiedostotyyppi %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Siirtyminen kohtaan %s ei onnistu"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Komennon suoritus päättyi onnistuneesti\n"
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Lapsiprosessi kuoli signaalilla %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Komento keskeytyi signaaliin %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Komento pysähtyi signaaliin %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Komento keskeytyi\n"
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Sovitetut tiedostonimet--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "liian monta argumenttia"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Lukuvirhe tavun %s kohdalla, luetaan %lu tavu"
+#~ msgstr[1] "%s: Lukuvirhe tavun %s kohdalla, luetaan %lu tavua"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Sovitetut tiedostonimet--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Odottamaton tiedoston loppu sovitetuissa nimissä"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Nimettiin uudelleen %s -> %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Symlinkittäminen tiedostoksi %s ei onnistu"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Symlinkitettiin %s -> %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Tuntematon takaisinsovituskomento %s"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Aikaleima ei ole sallitulla välillä"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Laitenumero ei ole sallitulla välillä"
+
+#, fuzzy
+#~ msgid "Error reading time stamp"
+#~ msgstr "Virheellinen aikaleima"
+
+#, fuzzy
+#~ msgid "Unexpected EOF"
+#~ msgstr "Odottamaton tiedoston loppu arkistossa"
+
+#~ msgid "same as -N"
+#~ msgstr "sama kuin -N"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Tällä ohjelmalla EI lain sallimissa rajoissa OLE TAKUUTA.\n"
+#~ "Ohjelmaa saa levittää GNU:n General Public Licensen mukaisesti;\n"
+#~ "katso lisätietoja tiedostosta COPYING."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Roskakomento %c\n"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "VAROITUS: Arkisto-osan otsake puuttuu"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Näkyvän pitkän nimen virhe"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Näkyvän pitkän nimen virhe"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Puuttuva tiedostonimi valitsimen -C jälkeen"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "älä muuta lisättyjen tiedostojen käyttöaikoja"
+
+#~ msgid "extract permissions information"
+#~ msgstr "pura tiedostojen oikeudet"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "älä pura tiedostojen oikeuksia"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "TIEDOSTO"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "poisjättöhahmot ovat tavallisia merkkijonoja"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "lisää symlinkin kohdetiedostot, ei linkkejä"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "poisjättöhahmot käyttävät jokerimerkkejä (oletus)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "näytä kirj. tavujen yhteismäärä luotaessa arkistoa"
+
+#~ msgid "Print license and exit"
+#~ msgstr "Näytä lisenssi ja poistu"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Perustuu John Gilmoren ja Jay Fenlasonin tekemään työhön. Tarkka lista\n"
+#~ "tekijöistä on AUTHORS-tiedostossa.\n"
+
+# HUOM: Osoitetiedot suomennoksessa ajan tasalla, alkuperäisessä ei.
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " GNU tar on vapaaohjelmisto; voitte levittää edelleen ja/tai muuttaa\n"
+#~ " sitä Free Software Foundationin julkaiseman GNU General Public\n"
+#~ " License'in ehtojen mukaisesti; joko version 2, tai (valintanne "
+#~ "mukaan)\n"
+#~ " minkä tahansa myöhemmän version.\n"
+#~ "\n"
+#~ " GNU taria levitetään siinä toivossa, että se olisi hyödyllinen,\n"
+#~ " mutta TAKUUTA EI OLE; ei edes KAUPALLISESTI HYVÄKSYTTÄVÄSTÄ LAADUSTA\n"
+#~ " tai SOPIVUUDESTA TIETTYYN TARKOITUKSEEN. Katsokaa lisätietoja GNU\n"
+#~ " General Public License'istä.\n"
+#~ "\n"
+#~ " Olette saaneet kopion GNU General Public License'istä tämän\n"
+#~ " ohjelman mukana. Ellette saaneet, kirjoittakaa Free Software "
+#~ "Foundation,\n"
+#~ " Inc.:ille osoitteeseen 51 Franklin Street, Fifth Floor,\n"
+#~ " Boston, MA 02110-1301, USA.\n"
+#~ "\n"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "Valitsimen -l merkitys muuttuu tulevissa versioissa."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Käytä valitsinta --one-file-system."
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Varoitus: valitsin -y ei ole tuettu, ehkä tarkoitit -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Virhe kirjoitettaessa vakiotulosteeseen"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU â€tar†tallentaa useita tiedostoja yhteen nauha- tai levyarkistoon, "
+#~ "sekä\n"
+#~ "palauttaa yksittäisiä tiedostoja arkistosta.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Jos argumentti on pakollinen pitkän valitsimen kanssa, se on pakollinen\n"
+#~ "myös vastaavan lyhyen valitsimen kanssa. Sama koskee valinnaisia "
+#~ "argumentteja.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Päätoimintatila:\n"
+#~ " -t, --list listaa arkiston sisältö\n"
+#~ " -x, --extract, --get pura tiedostoja arkistosta\n"
+#~ " -c, --create luo uusi arkisto\n"
+#~ " -d, --diff, --compare etsi erot arkiston ja tied.järjestelmän "
+#~ "välillä\n"
+#~ " -r, --append lisää tiedostoja arkiston loppuun\n"
+#~ " -u, --update lisää vain arkistossa olevia uudemmat "
+#~ "tiedostot\n"
+#~ " -A, --catenate lisää tar-tiedostoja arkistoon\n"
+#~ " --concatenate sama kuin -A\n"
+#~ " --delete poista arkistosta (ei toimi nauhoilla!)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --keep-newer-files don't replace existing files that are newer\n"
+#~ " than their archive copies\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --no-overwrite-dir preserve metadata of existing directories\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ " --occurrence[=NUM] process only the NUMth occurrence of each "
+#~ "file in\n"
+#~ " the archive. This option is valid only in\n"
+#~ " conjunction with one of the subcommands --"
+#~ "delete,\n"
+#~ " --diff, --extract or --list and when a list "
+#~ "of\n"
+#~ " files is given either on the command line "
+#~ "or\n"
+#~ " via -T option.\n"
+#~ " NUM defaults to 1.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Toimintovalinnat:\n"
+#~ " -W, --verify yritä varmistaa arkisto kirjoittamisen "
+#~ "jälkeen\n"
+#~ " --remove-files poista tiedostot arkistoon lisäämisen "
+#~ "jälkeen\n"
+#~ " -k, --keep-old-files älä korvaa olemassaolevia tiedostoja "
+#~ "purettaessa\n"
+#~ " --keep-newer-files älä korvaa olemassaolevia tiedostoja, jotka "
+#~ "ovat\n"
+#~ " arkistokopioitaan uudempia\n"
+#~ " --overwrite ylikirjoita olemassaolevat tiedostot "
+#~ "purettaessa\n"
+#~ " --overwrite-dir ylikirjoita hakemiston metadata purettaessa\n"
+#~ " -U, --unlink-first poista jokainen tiedosto ennen sen päälle\n"
+#~ " purkamista\n"
+#~ " --recursive-unlink tyhjennä rakenne ennen hakemiston "
+#~ "purkamista\n"
+#~ " -S, --sparse käsittele harvat tiedostot tehokkaasti\n"
+#~ " -O, --to-stdout pura tiedostot vakiotulosteeseen\n"
+#~ " -G, --incremental käsittele vanha GNU-muotoinen lisääntyvä\n"
+#~ " varmuuskopio\n"
+#~ " -g, --listed-incremental=TIEDOSTO\n"
+#~ " käsittele uusi GNU-muotoinen lisääntyvä\n"
+#~ " varmuuskopio\n"
+#~ " --ignore-failed-read jatka lukukelvottomista tiedostoista "
+#~ "huolimatta\n"
+#~ " --occurrence[=N] käsittele vain kunkin tiedoston N:s "
+#~ "esiintymä\n"
+#~ " arkistossa. Tämä valitsin on kelvollinen "
+#~ "vain\n"
+#~ " yhdessä alikomennon --delete, --diff, --"
+#~ "extract\n"
+#~ " tai --list, kun tiedostoluettelo on annettu\n"
+#~ " komentoriviltä tai valitsimella -T.\n"
+#~ " N on oletuksena 1.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tiedostojen ominaisuuksien käsittely:\n"
+#~ " --owner=NIMI pakota NIMI lisättyjen tiedostojen "
+#~ "omistajaksi\n"
+#~ " --group=NIMI pakota NIMI lisättyjen tiedostojen "
+#~ "ryhmäksi\n"
+#~ " --mode=MUUTOS pakota (symbolinen) tila MUUTOS "
+#~ "lisätyille\n"
+#~ " tiedostoille\n"
+#~ " --atime-preserve älä muuta lisättyjen tiedostojen "
+#~ "käyttöaikoja\n"
+#~ " -m, --modification-time älä pura tiedoston muutosaikaa\n"
+#~ " --same-owner yritä purkaa tiedostot samalla "
+#~ "omistajuudella\n"
+#~ " --no-same-owner pura tiedostot itsenäsi\n"
+#~ " --numeric-owner käytä aina numeroita käyttäjän/ryhmän "
+#~ "nimissä\n"
+#~ " -p, --same-permissions pura tiedostojen oikeudet\n"
+#~ " --no-same-permissions älä pura tiedostojen oikeuksia\n"
+#~ " --preserve-permissions sama kuin -p\n"
+#~ " -s, --same-order lajittele purettavat tiedostonimet "
+#~ "vastaamaan\n"
+#~ " arkistoa\n"
+#~ " --preserve-order sama kuin -s\n"
+#~ " --preserve sama kuin -p ja -s yhdessä\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rmt-command=COMMAND use given rmt COMMAND instead of /etc/"
+#~ "rmt\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Laitteen valinta ja vaihtaminen:\n"
+#~ " -f, --file=ARKISTO käytä arkistotiedostoa tai -laitetta "
+#~ "ARKISTO\n"
+#~ " --force-local arkisto on paikallinen vaikka nimessä "
+#~ "olisi\n"
+#~ " kaksoispiste\n"
+#~ " --rmt-command=KOMENTO käytä KOMENTOA /etc/rmt:n sijaan\n"
+#~ " --rsh-command=KOMENTO käytä KOMENTOa rsh:n sijaan\n"
+#~ " -[0-7][lmh] anna asema ja tiheys\n"
+#~ " -M, --multi-volume luo/listaa/pura moniosainen arkisto\n"
+#~ " -L, --tape-length=MÄÄRÄ vaihda nauhaa MÄÄRÄ × 1024 kirjoitetun "
+#~ "tavun\n"
+#~ " jälkeen\n"
+#~ " -F, --info-script=TIED aja skripti joka nauhan lopussa "
+#~ "(valitsin -M\n"
+#~ " tulee käyttöön)\n"
+#~ " --new-volume-script=TIED sama kuin -F TIED\n"
+#~ " --volno-file=TIED käytä/päivitä arkiston osan numero "
+#~ "TIEDostossa\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Laitteen lohkot:\n"
+#~ " -b, --blocking-factor=LOHKOT LOHKOT × 512 tavua tietuetta kohti\n"
+#~ " --record-size=MÄÄRÄ MÄÄRÄ tavua tietuetta kohti, 512:n "
+#~ "monikerta\n"
+#~ " -i, --ignore-zeros älä huomioi nollattuja lohkoja "
+#~ "arkistossa\n"
+#~ " (merkitsee tiedoston loppua)\n"
+#~ " -B, --read-full-records suorita lohkominen uudelleen luettaessa\n"
+#~ " (4.2BSD-putkia varten)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " --format=FMTNAME create archive of the given format.\n"
+#~ " FMTNAME is one of the following:\n"
+#~ " v7 old V7 tar format\n"
+#~ " oldgnu GNU format as per tar <= "
+#~ "1.12\n"
+#~ " gnu GNU tar 1.13 format\n"
+#~ " ustar POSIX 1003.1-1988 (ustar) "
+#~ "format\n"
+#~ " posix POSIX 1003.1-2001 (pax) "
+#~ "format\n"
+#~ " --old-archive, --portability same as --format=v7\n"
+#~ " --posix same as --format=posix\n"
+#~ " --pax-option keyword[[:]=value][,keyword[[:]=value], ...]\n"
+#~ " control pax keywords\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Arkistomuodon valinta:\n"
+#~ " --format=MUOTO luo annetun muotoinen arkisto.\n"
+#~ " MUOTO on jokin seuraavista:\n"
+#~ " v7 vanha V7-tar-muoto\n"
+#~ " oldgnu GNU-muoto tar-versioilla "
+#~ "<= 1.12\n"
+#~ " gnu GNU tar 1.13 -muoto\n"
+#~ " ustar POSIX 1003.1-1988 (ustar) -"
+#~ "muoto\n"
+#~ " posix POSIX 1003.1-2001 (pax) -"
+#~ "muoto\n"
+#~ " --old-archive, --portability sama kuin --format=v7\n"
+#~ " --posix sama kuin --format=posix\n"
+#~ " -pax-option avainsana[[:]=arvo][,avainsana[[:]=arvo], ...]\n"
+#~ " määrittele pax-avainsanoja\n"
+#~ " -V, --label=NIMI luo arkisto nimiöllä NIMI\n"
+#~ " HAHMO listattaessa/purettaessa jokeri-"
+#~ "HAHMO\n"
+#~ " -j, --bzip2 ohjaa arkisto bzip2-ohjelman läpi\n"
+#~ " -z, --gzip, --ungzip ohjaa arkisto gzip-ohjelman läpi\n"
+#~ " -Z, --compress, --uncompress ohjaa arkisto compress-ohjelman "
+#~ "läpi\n"
+#~ " --use-compress-program=OHJ ohjaa OHJelman läpi (on hyväksyttävä "
+#~ "-d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ " --strip-path=NUM strip NUM leading components from file "
+#~ "names\n"
+#~ " before extraction\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Paikallisten tiedostojen valinta:\n"
+#~ " -C, --directory=HAK siirry hakemistoon HAK\n"
+#~ " -T, --files-from=TIEDOSTO hae purettavat/lisättävät nimet "
+#~ "TIEDOSTOsta\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=HAHMO jätä pois HAHMOn mukaiset tiedostot\n"
+#~ " -X, --exclude-from=TIEDOSTO jätä pois TIEDOSTOssa listatut hahmot\n"
+#~ " --anchored poisjättöhahmoja verrataan nimen alkuun "
+#~ "(oletus)\n"
+#~ " --no-anchored poisjättöhahmoja verrataan jokaisen â€/†"
+#~ "jälkeen\n"
+#~ " --ignore-case poisjättäminen ei huomioi kirjainkokoa\n"
+#~ " --no-ignore-case poisjättäminen huomioi kirjainkoon "
+#~ "(oletus)\n"
+#~ " --wildcards poisjättöhahmot käyttävät jokerimerkkejä "
+#~ "(oletus)\n"
+#~ " --no-wildcards poisjättöhahmot ovat tavallisia "
+#~ "merkkijonoja\n"
+#~ " --wildcards-match-slash poisjättöhahmon jokerimerkit vastaavat "
+#~ "merkkiä â€/â€\n"
+#~ " --no-wildcards-match-slash poisjättöhahmon jokerimerkit eivät "
+#~ "vastaa\n"
+#~ " merkkiä â€/â€\n"
+#~ " -P, --absolute-names älä poista merkkiä â€/†tiedostonimien "
+#~ "alusta\n"
+#~ " -h, --dereference lisää symlinkin kohdetiedostot, ei "
+#~ "linkkejä\n"
+#~ " --no-recursion estä automaattinen eteneminen "
+#~ "alihakemistoihin\n"
+#~ " -l, --one-file-system pysy nykyisessä tied.järjestelmässä "
+#~ "arkistoa\n"
+#~ " luotaessa\n"
+#~ " -K, --starting-file=NIMI aloita arkiston tiedostosta NIMI\n"
+#~ " --strip-path=MÄÄRÄ poista MÄÄRÄn verran osia tiedostonimien "
+#~ "alusta\n"
+#~ " ennen purkamista\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE-OR-FILE only store files newer than DATE-OR-FILE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=PÄIVÄYS-TAI-TIED tallenna vain PÄIVÄYS-TAI-TIEDostoa "
+#~ "uudemmat tiedostot\n"
+#~ " --newer-mtime=PÄIVÄYS vertaa vain tiedoston muutosaikaa\n"
+#~ " --after-date=PÄIVÄYS sama kuin -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=HALLINTA] varmuuskopiointi ennen poistoa, valitse\n"
+#~ " versionhallinta\n"
+#~ " --suffix=JÄLKILIITE varmuuskopiointi ennen poistoa, älä käytä\n"
+#~ " tavanomaista jälkiliitettä\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --check-links print a message if not all links are dumped\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " --index-file=FILE send verbose output to FILE\n"
+#~ " --utc print file modification dates in UTC\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tietoja antava tuloste:\n"
+#~ " --help näytä tämä ohje ja poistu\n"
+#~ " --version näytä tar-ohjelman versionumero ja poistu\n"
+#~ " -v, --verbose listaa käsiteltävät tiedostot\n"
+#~ " --checkpoint näytä hakemistojen nimet luettaessa arkistoa\n"
+#~ " --check-links näytä viesti, ellei kaikkia linkkejä lisätty\n"
+#~ " --totals näytä kirj. tavujen yhteismäärä luotaessa "
+#~ "arkistoa\n"
+#~ " --index-file=TIED ohjaa monisanainen tuloste TIEDostoon\n"
+#~ " --utc näytä tiedostojen muutosajat UTC-aikoina\n"
+#~ " -R, --block-number näytä lohkonumero arkistossa viestien yhteydessä\n"
+#~ " -w, --interactive kysy varmistusta jokaiselle toiminnolle\n"
+#~ " --confirmation sama kuin -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Compatibility options:\n"
+#~ " -o when creating, same as --old-"
+#~ "archive\n"
+#~ " when extracting, same as --no-same-"
+#~ "owner\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Yhteensopivuusvalitsimet:\n"
+#~ " -o luotaessa sama kuin --old-archive\n"
+#~ " purettaessa sama kuin --no-same-"
+#~ "owner\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `--format=%s -f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ARKISTO voi olla TIEDOSTO, ISÄNTÄ:TIEDOSTO tai KÄYTTÄJÄ@ISÄNTÄ:TIEDOSTO;\n"
+#~ "PÄIVÄYS voi olla tekstimuotoinen, tai merkillä â€/†tai â€.†alkava\n"
+#~ "tiedoston nimi, jolloin käytetään tiedoston päiväystä.\n"
+#~ "*Tämä* â€tar†käyttää oletuksena â€--format=%s -f %s -b%dâ€.\n"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Kirjoittaneet John Gilmore ja Jay Fenlason."
+
+#~ msgid "Cannot close"
+#~ msgstr "Ei voi sulkea"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Tiedostokahvaa ei voi kopioida"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Pakattuja tai etäarkistoja ei voi käyttää"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (lapsiprosessi)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (lapsenlapsiprosessi)"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Lapsiprosessi palautti tilan %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Tiedostonimet sisältävät â€..â€"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: Tiedostonimi sisältää â€..â€"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Arkiston muodon valinta:\n"
+#~ " -V, --label=NIMI luo arkisto nimiöllä NIMI\n"
+#~ " HAHMO listattaessa/purettaessa jokeri-"
+#~ "HAHMO\n"
+#~ " -o, --old-archive, --portability kirjoita V7-muodon arkisto\n"
+#~ " --posix kirjoita POSIX-muotoinen arkisto\n"
+#~ " -j, --bzip2 ohjaa arkisto bzip2-ohjelman läpi\n"
+#~ " -z, --gzip, --ungzip ohjaa arkisto gzip-ohjelman läpi\n"
+#~ " -Z, --compress, --uncompress ohjaa arkisto compress-ohjelman "
+#~ "läpi\n"
+#~ " --use-compress-program=OHJ ohjaa OHJelman läpi (on hyväksyttävä "
+#~ "-d)\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Vanhentunut valitsin, seuraa nyt valitsimesta --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Vanhentunut valitsimen nimi, uusi on --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Vanhentunut valitsimen nimi, uusi on --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Vanhentunut valitsimen nimi, uusi on --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Vanhentunut valitsimen nimi, uusi on --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Vanhentunut valitsimen nimi, uusi on --block-number"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Vanhentunut valitsimen nimi, uusi on --backup"
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Jos argumentti on pakollinen pitkän valitsimen kanssa, se on pakollinen\n"
+#~ "myös vastaavan lyhyen valitsimen kanssa.\n"
+#~ "\n"
+#~ " -l, --file-length=PITUUS luotavan tiedoston PITUUS\n"
+#~ " -p, --pattern=HAHMO HAHMO on â€default†tai â€zerosâ€\n"
+#~ " --help näytä tämä ohje ja poistu\n"
+#~ " --version näytä versiotiedot ja poistu\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Kirjoittanut François Pinard."
diff --git a/po/fr.gmo b/po/fr.gmo
new file mode 100644
index 0000000..c327cc9
--- /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..44d65c2
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,3319 @@
+# Messages français pour GNU concernant tar.
+# Copyright © 2004 Free Software Foundation, Inc.
+# Michel Robitaille <robitail@IRO.UMontreal.CA>, traducteur depuis/since 1996.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU tar 1.14.91\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2004-12-15 08:00-0500\n"
+"Last-Translator: Michel Robitaille <robitail@IRO.UMontreal.CA>\n"
+"Language-Team: French <traduc@traduc.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "Argument %s invalide pour %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "Argument %s ambiguë pour %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Les arguments valides sont:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: le paramètre ARGP_HELP_FMT requiert une valeur"
+
+#: lib/argp-help.c:227
+#, fuzzy, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: le paramètre ARGP_HELP_FMT requiert une valeur"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: paramètre ARGP_HELP_FMT est inconnu"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Rebus dans ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+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 sont aussi\n"
+"obligatoires pour les formes courtes qui leur correspondent."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Usage:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " ou: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [OPTION...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Pour en savoir davantage, faites: « %s --help » ou « %s --usage ».\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Rapporter toutes anomalies à %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Erreur système inconnue."
+
+#: lib/argp-parse.c:82 src/tar.c:736
+#, fuzzy
+msgid "give this help list"
+msgstr "Affichier l'aide-mémoire"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+#, fuzzy
+msgid "give a short usage message"
+msgstr "Afficher un court message concernant l'usage"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NOM"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+#, fuzzy
+msgid "print program version"
+msgstr "Afficher la version du logiciel"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: l'option « %s » requiert un argument\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: l'option « %s » est ambiguë\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: l'option « --%s » ne permet pas d'argument\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: l'option « %c%s » ne permet pas d'argument\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: l'option « %s » requiert un argument\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: l'option « --%s » n'est pas reconnue\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: l'option « %c%s » n'est pas reconnue\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: l'option -- %c est illégale\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: l'option -- %c est invalide\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: l'option -- %c requiert un argument\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: l'option « -W %s » est ambiguë\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: l'option « -W %s » ne permet pas d'argument\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "taille des blocs"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "mémoire épuisée"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: ne peut %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: AVERTISSEMENT: ne peut %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: ne peut modifier le mode à %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr ""
+"%s: ne peut modifier l'appartenance du propriétaire au uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: ne peut établir un lien vers %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: erreur de lecture à l'octet %s, lecture de %lu octet"
+msgstr[1] "%s: erreur de lecture à l'octet %s, lecture de %lu octets"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] ""
+"%s: AVERTISSEMENT: erreur de lecture à l'octet %s, lecture de %lu octet"
+msgstr[1] ""
+"%s: AVERTISSEMENT: erreur de lecture à l'octet %s, lecture de %lu octets"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: ne peut se positionner à %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: AVERTISSEMENT: ne peut se positionner à %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: ne peut créer un lien symbolique vers « %s »"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: n'a pu écrire seulement %lu octet sur %lu octets"
+msgstr[1] "%s: n'a pu écrire seulement %lu octets sur %lu octets"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Retrait de « %s » de tête des noms des membres"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Retrait « %s » à la tête des noms des liens absolus"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Substitution par « . » sur les noms vides des membres"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Substitution par « . » sur les liens vides des membres"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: service non disponible."
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Ne peut exécuter un shell télécommandé."
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "« rmtd »: ne peut allouer un tampon de stockage.\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Ne peut allouer un tampon de stockage."
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Pour en savoir davantage, faites: « %s --help ».\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Usage: %s [OPTION]\n"
+"Manipuler l'unité d'archivage, acceptant les commandes d'un processus "
+"éloigné.\n"
+"\n"
+" --help afficher l'aide-mémoire\n"
+" --version afficher le nom et la version du logiciel\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter toutes anomalies à <%s>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Positionnement relatif hors plage"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Positionnement relatif hors plage"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Direction du positionnement hors plage"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "« rmtd »: fin prématurée (EOF).\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Fin de fichier prématurée (EOF)."
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Commande rejetée."
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Nombre total d'octets écrits: %s (%s, %s/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Nombre total d'octets écrits: %s (%s, %s/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(pipe)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Valeur invalide de la taille d'enregistrement."
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Aucun nom d'archive donné."
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ne peut vérifier des archives utilisant l'entrée/sortie standard."
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "L'archive est compressée. Utilisez l'option %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Ne peut mettre à jour des archives compressées."
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Écriture d'un point de contrôle %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Lecture du point de contrôle %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Au début du ruban, fin prématurée."
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Trop d'erreurs, fin d'exécution."
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Bloc non aligné (%lu octet) dans l'archive"
+msgstr[1] "Bloc non aligné (%lu octets) dans l'archive"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Taille de l'enregistrement = %lu bloc"
+msgstr[1] "Taille de l'enregistrement = %lu blocs"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Ne peut reculer dans un fichier d'archive;\n"
+"elle pourrait être illisible sans l'option -i ."
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek ne s'est pas arrêté à la limite de l'enregistrement"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: contient un numéro de volume invalide"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Débordement du numéro de volume"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Charger le volume #%d pour %s et appuyer sur ENTRÉE: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF rencontrée alors qu'une réponse de l'usager était attendue."
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "AVERTISSEMENT: l'archive est incomplète."
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [nom] Donner un nouveau nom de fichier pour le prochain\n"
+" (ainsi que pour les subséquents) volume(s)\n"
+" q Stopper « tar »\n"
+" ! Lancer un shell\n"
+" ? Afficher la liste\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Pas de nouveau volume; fin d'exécution.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "« %s » échec de la commande"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Ceci ne ressemble pas à une archive de type « tar »"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "La suite de %s n'est pas sur ce volume."
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "La suite de %s n'est pas sur ce volume."
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s a une taille incorrecte (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Ce volume est hors séquence."
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "L'archive non étiquettée ne concorde pas avec %s."
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Le volume %s ne concorde pas à %s."
+
+#: src/buffer.c:1392
+#, fuzzy, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: nom de fichier trop long pour être stocké dans une en-tête GNU multi-"
+"volumes"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Ne peut lire que %lu de %lu octet."
+msgstr[1] "Ne peut lire que %lu de %lu octets."
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Les contenus diffèrent"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Fin prématurée (EOF) rencontrée dans l'archive."
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Les types des fichiers diffèrent."
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Les modes d'accès diffèrent."
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Les Uid diffèrent."
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Les Gid diffèrent."
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Les dates de modification diffèrent."
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Les tailles diffèrent."
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ne possède pas de lien vers %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Les liens symboliques diffèrent."
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Les numéros du périphérique diffèrent."
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Vérification en cours."
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: type de fichier inconnu « %c », diffère d'un fichier normal."
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+"L'archive contient des noms de fichiers avec préfixes de tête qui ont été "
+"enlevés."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+"La vérification peut échouer lors de la localisation des fichier originaux."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "ÉCHEC DE VÉRIFICATION: %d en-tête invalide détectée."
+msgstr[1] "ÉCHEC DE VÉRIFICATION: %d en-têtes invalides détectées."
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: contient une étiquette du répertoire cache; n'a pas été vidangé."
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "valeur %s en dehors de %s de la plage %s..%s; substitution de %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "valeur %s en dehors de %s de la plage %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Génération d'en-têtes avec octal négatif"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: le nom de fichier est trop long (max %d); n'a pas été vidangé."
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+"%s: le nom de fichier est trop long (ne peut être scindé); n'a pas été "
+"vidangé."
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: le nom du lien est trop long; n'a pas été vidangé."
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: le fichier a été réduit de %s octet, remplissage par des zéros"
+msgstr[1] "%s: le fichier a été réduit de %s octets, remplissage par des zéros"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr ""
+"%s: le fichier est d'un système de fichiers différent; n'a pas été rejeté."
+
+#: src/create.c:1217 src/create.c:1228
+#, fuzzy
+msgid "contents not dumped"
+msgstr " (vidange de la mémoire)"
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: type de fichier inconnu; fichier ignoré."
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr "Lien manquant vers %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: le fichier est inchangé; n'a pas été rejeté."
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: le fichier est l'archive; n'a pas été rejeté."
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: le fichier a été détruit avant sa lecture"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: contient une étiquette du répertoire cache; n'a pas été vidangé."
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: le fichier a été modifié durant sa lecture"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: porte (socket) ignorée"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: porte (socket) ignorée"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Escamotage jusqu'à la prochaine en-tête."
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Rejet d'une en-tête non conforme de l'archive."
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: vieux estampile de date %s peu plausible"
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: tampon date-heure %s sera %lu s dans le futur"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: inconsistance inattendue durant la création du répertoire"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: répertoire renommé avant l'obtention de son état"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Extraction des fichiers contiguës comme des fichiers de type régulier"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Tentative d'extraction des liens symboliques comme des liens directs."
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Lecture de %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: ne peut extraire -- le fichier est la suite d'un autre volume."
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Fin prématurée (EOF) du fichier d'archive."
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: type de fichier inconnu « %c », extrait comme un fichier normal."
+
+#: src/extract.c:1184
+#, fuzzy, c-format
+msgid "Current %s is newer or same age"
+msgstr "`%s' courant est nouveau"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: incapable d'archiver ce fichier."
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: ne peut être renommé à %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Erreur non récupérable: fin de l'exécution immédiate"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: le répertoire a été renommé."
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: le répertoire a été renommé."
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: le répertoire est nouveau."
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Cachet de date invalide"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Mode invalide donné en option"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Numéro de périphérique invalide"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Numéro d'inode invalide"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "Erreur de lecture sur %s"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Fin prématurée (EOF) du fichier d'archive."
+
+#: src/incremen.c:872 src/incremen.c:912
+#, fuzzy
+msgid "Unexpected field value in snapshot file"
+msgstr "Fin prématurée (EOF) du fichier d'archive."
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Argument de densité mal composé: '%s'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Argument de densité mal composé: '%s'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Ne peut allouer de la mémoire selon le facteur de blocage %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: pas de purge du répertoire: incapable d'évaluer par stat()"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr ""
+"%s: le répertoire est sur un périphérique différent: aucune purge possible."
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: retrait de %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: ne peut l'enlever"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: omis"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "bloc %s: ** Bloc de NULs **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Un bloc zéro solitaire repéré à %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "bloc %s: ** Fin de fichier **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "bloc %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Blancs dans l'en-tête alors qu'une valeur numérique %s était attendue"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Valeur octale de l'archive %.*s est en dehors de la plage %s; complément à 2 "
+"assumé"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Valeur octale de l'archive %.*s est en dehors de la plage %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "L'archive contient des en-têtes désuètes en base-64."
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "La chaîne signée en base-64 de l'archive %s est hors de la plage %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "La valeur en base-256 de l'archive est en dehors de la plage %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr ""
+"L'archive contient « %.*s » alors qu'une valeur numérique %s est attendue."
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, fuzzy, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "La valeur de l'archive %s est hors des limites %s %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " lien vers %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " type de fichier inconnu %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Long Link--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Long Name--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--En-tête de Volume--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Suite à l'octet %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Création du répertoire:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Renommé %s» à « %s »\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: ne peut être renommé à %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Renommé « %s » à nouveau à « %s »\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Ne peut préserver le répertoire de travail"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Ne aller dans le répertoire de travail"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "processus enfant"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "canal inter-processus"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: ne peut être retrouvé dans l'archive."
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: occurence requise n'a pas été repérée dans l'archive."
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr ""
+"Les options « -%s » et« -%s » requièrent toutes les deux l'entrée standard."
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: format d'archive invalide"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Options de GNU demandées pour un format d'archive incompatible."
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Usage: %s [OPTION]... [FICHIER]...\n"
+"\n"
+"Exemples:\n"
+" %s -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" %s -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" %s -xf archive.tar # Extract all files from archive.tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"GNU `tar' sauvegarde plusieurs fichiers ensemble sur un seul ruban ou disque "
+"d'archive\n"
+"et peut restaurer des fichiers individuels à partir de l'archive.\n"
+"\n"
+"Exemples:\n"
+" tar -cf archive.tar foo bar # créer l' archive.tar à partir des fichier "
+"foo et bar.\n"
+" tar -tvf archive.tar # lister tous les fichiers de l' archive.tar "
+"en mode bavard.\n"
+" tar -xf archive.tar # extraire tous les fichiers à partir de l' "
+"archive.tar.\n"
+"\vLe suffixe d'archive est ~, à moins que l'option --suffix ou \n"
+"SIMPLE_BACKUP_SUFFIX en utilise un autre. Le contrôle de version peut être\n"
+"initialisé avec --backup ou VERSION_CONTROL selon les valeurs suivantes:\n"
+"\n"
+" t, numbered faire des archives numérotées\n"
+" nil, existing numéroter si des archives numérotées existent,\n"
+" ne pas numéroter autrement\n"
+" never, simple toujours faire des archives de type simple\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Mode d'opération principal:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "lister le contenu de l'archive"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "extraire les fichiers de l'archive"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "créer une nouvelle archive"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "trouver les différences entre l'archive et le fichier système"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "accoler les fichiers à la fin de l'archive"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+"accoler seulement les nouveaux fichiers plutôt que de les copier dans "
+"l'archive"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "accoler les fichiers tar à l'archive"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "détruire de l'archive (pas du ruban magnétique!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Modificateurs d'opération:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "traiter les fichiers dispersés de manière efficace"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "traiter les vieux formats GNU des archives incrémentielles"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "FICHIER"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "traiter les nouveaux formats GNU des archives incrémentielles"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "ne pas quitter avec des non zéros sur des fichiers non lisibles"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "NUMÉRO"
+
+#: src/tar.c:404
+#, fuzzy
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"traiter seulement la Nième occurence de chaque fichier dans l'archive. Cette "
+"option est valide seulement en conjonction avec un des sous-commandes "
+"suivantes --delete, --diff, --extract ou --list et lorsque la liste des "
+"fichiers est fournie soit sur la ligne de commande ou à l'aide de l'option -"
+"T. N vaut 1 par défaut."
+
+#: src/tar.c:410
+#, fuzzy
+msgid "archive is seekable"
+msgstr "L'archive est atteignable"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "tentative de vérification de l'archive après écriture"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "retirer les fichiers après les avoir ajouter à l'archive."
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "ne pas remplacer les fichiers existants lors de l'extraction"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"ne pas remplacer les fichier existantes qui sont plus récents que leur copie "
+"dans l'archive"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "écraser les fichiers existants lors de l'extraction"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "enlever chaque fichier avant de l'extraire"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "vide les hiérarchies avant d'extraire les répertoires"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "préserver les métadonnées des érpertoires existants"
+
+#: src/tar.c:434
+#, fuzzy
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "écraser les fichiers existants lors de l'extraction"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "extraire les fichiers sur la sortie standard"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "COMMANDE"
+
+#: src/tar.c:445
+#, fuzzy
+msgid "pipe extracted files to another program"
+msgstr "extraire les fichiers sur la sortie standard"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Traitement des attributs de fichiers:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "utiliser le NOM comme propriétaire des fichiers ajoutés"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "utiliser le NOM comme nom de groupe des fichiers ajoutés"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATE-OU-FICHIER"
+
+#: src/tar.c:461
+#, fuzzy
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "stocker seulement les fichiers plus récents que DATE-OU-FICHIER"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "CHANGEMENTS"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+"utiliser les mode de CHANGEMENTS (symboliques) pour les fichiers ajoutés "
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "ne pas extraire le temps de modifier du fichier"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "essayer d'extraire les fichiers du même propriétaire"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "extraire les fichiers comme vous appartenant"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "toujours utiliser les valeurs numérique pour les noms usager/groupe"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "trier les noms à extraire pour concorder avec l'archive"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "identique aux deux options -p et -s"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Sélection de périphérique et aiguillage:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARCHIVE"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "utiliser le fichier d'archive ou le périphérique de l'ARCHIVE"
+
+#: src/tar.c:502
+#, fuzzy
+msgid "archive file is local even if it has a colon"
+msgstr "le fichier d'archive est local même si \":\" a été spécifié"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "utiliser la COMMANDE rmt fournie au lieu de rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "utiliser la COMMANDE à distance au lieu de rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "spécifier le périphérique et la densité"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "créer/lister/extraire l'archive multi-volumes"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "changer de ruban après avoir écrit N * 1024 octets"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "exécuter le script à la fin de chaque ruban (implique -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "utilser/mettre à jour le numéro de volume dans le FICHIER"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Facteur de blocage de périphérique:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOCS"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLOCS * 512 octets par enregistrement"
+
+#: src/tar.c:541
+#, fuzzy
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "TAILLE en octets par enregisterment, multiple de 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "ignoré les blocs de zéros dans l'archive (ie EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+"refaire le blocage au fur et à mesure de la lecture (pour les pipes 4.2BSD)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Sélection de format d'archive:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMAT"
+
+#: src/tar.c:553
+#, fuzzy
+msgid "create archive of the given format"
+msgstr "créer l'archive du format désiré."
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "FORMAT peut prendre une des valeurs suivantes:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "vieux format tar V7"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "format GNU tel que tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "format GNU tar 1.13.x"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "format POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "format POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+#, fuzzy
+msgid "same as pax"
+msgstr "Identique à pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "identique à --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "identique à --format=posix"
+
+#: src/tar.c:573
+#, fuzzy
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "mot_clé[[:]=valeur][,mot_clé[[:]=valeur], ...]"
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "mot clés de contrôle pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TEXTE"
+
+#: src/tar.c:576
+#, fuzzy
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"créer l'archive et attribuer le NOM de volume. Au moment de générer la liste "
+"ou de l'extraction, utiliser le TEXTE comme patron de mutilation"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "filtrer l'archive à travers bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "filter l'archive à travers gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "filtrer l'archive à travers compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "LOGICIEL"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "filtrer à travers le LOGICIEL (doit accepter l'option -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Sélection des fichiers locaux:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "RÉPERTOIRE"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "changer de RÉPERTOIRE"
+
+#: src/tar.c:599
+#, fuzzy
+msgid "get names to extract or create from FILE"
+msgstr ""
+"obtenir les noms à extraire ou les créer à partir du fichier ayant le NOM"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T permet de lire les noms terminés par un NULL, désactive l'option -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "PATRON"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "exclure les fichiers concordant avec le PATRON"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "exclure les patrons listés dans le FICHIER"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "exclure les répertoires contenant une étiquette de cache"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "exclure les répertoires contenant une étiquette de cache"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "exclure les répertoires contenant une étiquette de cache"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "exclure les répertoires contenant une étiquette de cache"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "exclure les répertoires contenant une étiquette de cache"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "exclure les répertoires contenant une étiquette de cache"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "éviter le parcours automatique descendant dans les répertoires"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "demeurer le système de fichier local lors de la création d'archive"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "parcourir récursivement les répertoires (par défaut)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "ne pas élaguer le \"/\" de tête des noms de fichiers"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "NOM-DE-MEMBRE"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "débuter au membre NOM-DE-MEMBRE dans l'archive"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "stocker seulement les fichiers plus récents que DATE-OU-FICHIER"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATE"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "comparer la date et le temps lorsque les données ont seulement changé"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "CONTRÔLE"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "archiver avant le retrait, choisir le CONTRÔLE de version"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "CHAÎNE"
+
+#: src/tar.c:645
+#, fuzzy
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"archiver avant de retirer, écrase le suffixe usuel ('~' à moins qu'il ne "
+"soit écrasé par la variable d'environnement SIMPLE_BACKUP_SUFFIX"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+#, fuzzy
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "éliminer le NOMBRE de composants de tête des noms de fichiers"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+#, fuzzy
+msgid "ignore case"
+msgstr "l'exlcusion ignore la casse"
+
+#: src/tar.c:665
+#, fuzzy
+msgid "patterns match file name start"
+msgstr "exclure les patrons concordant avec le début des noms de fichiers"
+
+#: src/tar.c:667
+#, fuzzy
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "exclurer les patrons concordant avec tout / (par défaut)"
+
+#: src/tar.c:669
+#, fuzzy
+msgid "case sensitive matching (default)"
+msgstr "l'exclusion est sensible à la casse (par défaut)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "exclure les patrons wildcards qui ne concordent pas avec '/'"
+
+#: src/tar.c:677
+#, fuzzy
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+"exclure les patrons qui utilisent des wildcards qui concordent avec '/' (par "
+"défaut)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Sortie informative:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "lister en mode bavard les fichiers traités"
+
+#: src/tar.c:686
+#, fuzzy
+msgid "[.]NUMBER"
+msgstr "NUMÉRO"
+
+#: src/tar.c:687
+#, fuzzy
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "afficher un message de progresssion à chaque 10 enregistrements"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "afficher un message si tous les liens ne sont pas vidangés"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "afficher les dates de modification de fichier en UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "expédier la sortie en mode bavard vers le FICHIER"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "afficher le numéro de bloc interne de l'archive avec chaque message"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "demander confirmation pour chaque action"
+
+#: src/tar.c:706
+#, fuzzy
+msgid "show tar defaults"
+msgstr "Afficher les défauts de tar"
+
+#: src/tar.c:708
+#, fuzzy
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"Lors du listage ou de l'extraction, lister chaque répertoire qui ne concorde "
+"pas avec le critère de recherche"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Options de compatibilité:"
+
+#: src/tar.c:726
+#, fuzzy
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"lors de la création, identique à --old-archive. Lors de l'extraction, "
+"identique à --no-same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Autres options:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Vous ne pouvez pas sélectionner plus d'une option parmi « -Acdtrux » "
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Options conflictuelles de compression"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " type de fichier inconnu %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Fichier de data n'a pas été retrouvé"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Substitution de %s pour un format inconnu de date %s"
+
+#: src/tar.c:961
+#, fuzzy, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Traitement de la date « %s » comme %s + %ld nanoseconde"
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: le fichier est l'archive; n'a pas été rejeté."
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"La valeur par défaut de tar pour *Ceci* est:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Facteur de blocage invalide"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+"AVERTISSEMENT: l'option -I n'est pas supportée; peut-être voulez-vous -j ou -"
+"T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Longueur invalide du ruban"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Plus d'une date de seuil"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: groupe invalide"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Mode invalide donné en option"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Numéro invalide"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "propriétaire invalide"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Taille invalide d'enregistrement."
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "La taille des enregistrements doit être un multiple de %d"
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Nombre invalide d'éléments"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, fuzzy, c-format
+msgid "Malformed density argument: %s"
+msgstr "Argument de densité mal composé: '%s'"
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Densité inconnue: '%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr ""
+"Les options « -[0-7][lmh] » ne sont pas supportées par cette version de « "
+"tar »"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[FICHIER]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Vieille option « %c » requiert un arguement supplémentaire."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurence n'a pas de sens sans liste de fichiers"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurence ne peut être utilise dans le mode d'opération requis"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Des fichiers d'archive multiples requiert l'option « -M »"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Ne peut combiner l'option --listed-incremental avec --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: étiquette du volume est trop longue (limite = %lu octet)"
+msgstr[1] "%s: étiquette du volume est trop longue (limite = %lu octets)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Ne peut vérifier des archives comportant plusieurs volumes."
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Ne peut vérifier des archives compressées."
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr ""
+"Ne peut traiter des archives compressées portant sur plusieurs volumes."
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Ne peut mettre à jour des archives compressées."
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option peut être utilise seulement avec des archives POSIX"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Refus catégorique de créer un fichier d'archive vide."
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Les options « -Aru » sont incompatibles avec l'option « -f - »"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Vous devez sélectionner une des options « -Acdtrux » "
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Statut d'erreur reporté d'erreurs précédentes."
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: fichier réduit de %s octet"
+msgstr[1] "%s: fichier réduit de %s octets"
+
+#: src/xheader.c:158
+#, fuzzy, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Le mot clé %s est inconnu ou n'est pas encore implanté"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Le patron %s ne peut être utilisé"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Le mot clé %s ne peut être écrasé"
+
+#: src/xheader.c:498
+#, fuzzy
+msgid "Malformed extended header: missing length"
+msgstr "En-tête étendue malcomposée: signe d'éaglité manquant"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "La chaîne signée en base-64 de l'archive %s est hors de la plage %s"
+
+#: src/xheader.c:525
+#, fuzzy
+msgid "Malformed extended header: missing blank after length"
+msgstr "En-tête étendue malcomposée: espace blanc manquant après la longueur"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "En-tête étendue malcomposée: signe d'éaglité manquant"
+
+#: src/xheader.c:539
+#, fuzzy
+msgid "Malformed extended header: missing newline"
+msgstr "En-tête étendue malcomposée: signe d'éaglité manquant"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "La valeur de l'archive %s est hors des limites %s %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "En-tête étendue malcomposée: signe d'éaglité manquant"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, fuzzy, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "En-tête étendue malcomposée: signe d'éaglité manquant"
+
+#: src/xheader.c:1328
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "En-tête étendue malcomposée: signe d'éaglité manquant"
+
+#: src/xheader.c:1338
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "En-tête étendue malcomposée: signe d'éaglité manquant"
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Générer les fichiers de données pour la suite des tests de GNU tar.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Autres options:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+#, fuzzy
+msgid "Create file of the given SIZE"
+msgstr "créer l'archive du format désiré."
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "extraire les fichiers sur la sortie standard"
+
+#: tests/genfile.c:131
+#, fuzzy
+msgid "Read file names from FILE"
+msgstr "Lu %s octets à partir de %s"
+
+#: tests/genfile.c:133
+#, fuzzy
+msgid "-T reads null-terminated names"
+msgstr "-T permet de lire les noms terminés par un NULL, désactive l'option -C"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "tentative de vérification de l'archive après écriture"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+#, fuzzy
+msgid "Update the access and modification times of FILE"
+msgstr "%s: ne peut modifier les dates d'accès et de modification."
+
+#: tests/genfile.c:189
+#, fuzzy
+msgid "Execute COMMAND"
+msgstr "COMMANDE"
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Cachet de date invalide"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Numéro d'inode hors plage"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Erreur système inconnue."
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "%s ne peut être ouvert."
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s ne peut être exécuté."
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " type de fichier inconnu %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "Ne peut évaluer le fichier %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Processus enfant a été stoppé par le signal %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Noms de fichiers mutilés--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Ce programme est fourni sans AUCUNE GARANTIE, tel que permis par la loi.\n"
+#~ "Vous pouvez le redistribuer selon les termes de « GNU General Public "
+#~ "License »,\n"
+#~ "lire le texte du fichier COPYING pour plus de détails."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "« rmtd »: commande %c rejetée.\n"
+
+#~ msgid "Quitting now."
+#~ msgstr "Abandon immédiat."
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "AVERTISSEMENT: pas d'en-tête sur le volume."
+
+#~ msgid "Visible long name error"
+#~ msgstr "Erreur visible d'un long nom."
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Cachet de date hors plage"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Les numéros du périphérique sont hors plage."
+
+#~ msgid "Visible longname error"
+#~ msgstr "Erreur visible de nom long."
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Fin prématurée (EOF) des noms mutilés."
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "%s renommé à %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: ne peut établir un lien vers %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s relié par lien symbolique à %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Commande %s de correction inconnue."
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Après -C le nom de fichier est manquant."
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "ne pas modifier les temps d'accès des fichiers vidangés"
+
+#~ msgid "extract permissions information"
+#~ msgstr "extraire les informations concernant les permissions"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "ne pas extraire les informations concernant les permissions"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "NOMS-DES-FICHIERS"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "exclure les patrons qui sont des chaînes ordinaires"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "vidanger les fichiers pointés par les liens symboliques à la place"
+
+#~ msgid "same as -N"
+#~ msgstr "identique à -N"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "exclure les patrons qui utilisent des wildcards (par défaut)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "afficher le total d'octets écrits lors de la création de l'archive"
+
+#~ msgid "Print license and exit"
+#~ msgstr "Afficher la licence et quitter"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Fondé sur le travail de John Gilmore et de Jay Fenlason. Voir la section\n"
+#~ "AUTHORS pour obtenir la liste complète des auteurs.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ "GNU cpio est un logiciel libre; vous pouvez le redistribuer ou le\n"
+#~ "modifier selon les termes de la License Publique Générale de GNU, "
+#~ "publiée\n"
+#~ "par la Free Software Foundation; soit la version 2 de la Licence ou,\n"
+#~ "soit (selon vos préférences) toute version ultérieure.\n"
+#~ "\n"
+#~ "GNU cpio est distribué dans l'espoir qu'il soit utile,\n"
+#~ "mais AUCUNE garantie n'est donnée tant pour des raisons COMMERCIALES que\n"
+#~ "pour RÉPONDRE À UN BESOIN PARTICULIER. Consulter la licence\n"
+#~ "GNU General Public License pour plus de détails.\n"
+#~ "\n"
+#~ "Vous devriez avoir reçu copie de la Licence Publique Générale de GNU\n"
+#~ "avec ce programme; sinon, écrire à la Free Software Foundation, Inc.,\n"
+#~ "59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "La sémantique de l'option -l changera dans les versions futures."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "SVP utilisez l'option --one-file-system à la place."
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr ""
+#~ "AVERTISSEMENT: l'option -y n'est pas supporté; peut-être voulez-vous -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Erreur d'écriture sur la sortie standard"
+
+#~ msgid "Cannot close"
+#~ msgstr "Ne peut fermer"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Ne peut dupliquer"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Ne peut archiver en mode compressé ou à travers le réseau."
+
+#~ msgid "tar (child)"
+#~ msgstr "« tar » (child)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "« tar » (grandchild)"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Le processus enfant a retourné le statut %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Portion des noms contient « .. »"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: portion du nom contient « .. »"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU « tar » saugegarde plusieurs fichiers sur un ruban ou une archive "
+#~ "sur\n"
+#~ "disque et peut restaurer des fichiers individuellement d'une archive.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Si un arguement est obligatoire pour une option de forme longue, il l'est "
+#~ "aussi\n"
+#~ "pour une option de forme courte. La même règle s'applique\n"
+#~ "à un argument optionnel.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Mode principal d'exécution:\n"
+#~ " -t, --list afficher le contenu d'une archive\n"
+#~ " -x, --extract, --get extraire les fichiers d'une archive\n"
+#~ " -c, --create créer une archive\n"
+#~ " -d, --diff, --compare comparer le contenu de l'archive et\n"
+#~ " le système de fichier\n"
+#~ " -r, --append accoller les fichiers à la fin de\n"
+#~ " l'archive\n"
+#~ " -u, --update accoller seulement les nouveaux fichiers\n"
+#~ " et ensuite les copier dans l'archive\n"
+#~ " -A, --catenate accoller les fichiers « tar » à l'archive\n"
+#~ " --concatenate identique à -A\n"
+#~ " --delete éliminer des entrées (mais pas pour les "
+#~ "rubans)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Options modifiant les modes d'opération:\n"
+#~ " -W, --verify tenter de vérifier l'archive après écriture\n"
+#~ " --remove-files détruire les fichiers un fois copiés dans\n"
+#~ " l'archive\n"
+#~ " -k, --keep-old-files ne pas écraser les fichiers existants\n"
+#~ " lors de l'extraction\n"
+#~ " --overwrite écraser les fichiers existants lors de "
+#~ "l'extraction\n"
+#~ " --overwrite-dir écraser les métadonnées des répertoires lors "
+#~ "de l'extraction\n"
+#~ " -U, --unlink-first détruire chaque fichier avant une nouvelle\n"
+#~ " extraction qui pourrait l'écraser\n"
+#~ " --recursive-unlink vider l´arborescence des répertoires avant\n"
+#~ " une nouvelle extraction\n"
+#~ " -S, --sparse traiter efficacement les fichiers dispersés\n"
+#~ " -O, --to-stdout extraire les fichiers vers\n"
+#~ " la sortie standard\n"
+#~ " -G, --incremental traiter les vieux formats GNU d'archive\n"
+#~ " incrémentiel\n"
+#~ " -g, --listed-incremental=FICHIER\n"
+#~ " traiter les nouveaux formats GNU d'archive\n"
+#~ " incrémentiel\n"
+#~ " --ignore-failed-read ignorer les fichiers de taille nulle\n"
+#~ " ou non lisibles\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Traitement des attributs de fichiers:\n"
+#~ " --owner=PROPRIÉTAIRE attribuer au PROPRIÉTAIRE les fichiers\n"
+#~ " ajoutés\n"
+#~ " --group=GROUPE attribuer au GROUPE les fichiers\n"
+#~ " ajoutés\n"
+#~ " --mode=MODE modifier les MODEs d'accès des fichiers\n"
+#~ " à la manière de « chmod »\n"
+#~ " --atime-preserve ne pas modifier les dates d'accès\n"
+#~ " des fichiers traités\n"
+#~ " -m, --modification-time ne pas extraire les fichiers dont\n"
+#~ " les dates ont été modifiées\n"
+#~ " --same-owner essayer d'extraire les fichiers ayant\n"
+#~ " le même propriétaire\n"
+#~ " --numeric-owner utiliser les valeurs numériques\n"
+#~ " d'appartenance pour les noms\n"
+#~ " d'usager/groupe\n"
+#~ " -p, --same-permissions extraire toute l'information de protection\n"
+#~ " --preserve-permissions identique à -p\n"
+#~ " -s, --same-order trier les noms afin d'extraire ceux\n"
+#~ " qui concordent dans l'archive\n"
+#~ " --preserve-order identique à -s\n"
+#~ " --preserve identique à l'utilisation combinée\n"
+#~ " de -p et -s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Sélection de périphérique et aiguillage:\n"
+#~ " -f, --file=ARCHIVE utiliser le fichier ou le périphérique\n"
+#~ " d'ARCHIVE\n"
+#~ " --force-local le fichier d'archive est local malgré\n"
+#~ " la présence de « : »\n"
+#~ " --rsh-command=COMMANDE utiliser la télé-COMMANDE au lieu de « rsh "
+#~ "»\n"
+#~ " -[0-7][lmh] spécifier la densité du périphérique\n"
+#~ " d'archivage\n"
+#~ " -M, --multi-volume créer/afficher/extraire une archive à\n"
+#~ " multiples volumes\n"
+#~ " -L, --tape-length=N utiliser un autre ruban après l'écriture\n"
+#~ " de N x 1024 octets\n"
+#~ " -F, --info-script=SCRIPT exécuter le SCRIPT à la fin de chaque\n"
+#~ " ruban (implique -M)\n"
+#~ " --new-volume-script=FICHIER\n"
+#~ " identique à -F FICHIER\n"
+#~ " --volno-file=FICHIER utiliser/mettre à jour le numéro de volume\n"
+#~ " dans le FICHIER\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Facteur de blocage du périphérique:\n"
+#~ " -b, --blocking-factor=N utiliser un facteur de blocage de\n"
+#~ " 512 octets par enregistrement\n"
+#~ " --record-size=N utiliser un facteur de blocage de\n"
+#~ " N octets par enregistrement\n"
+#~ " (N doit être un multiple de 512)\n"
+#~ " -i, --ignore-zeros ignorer les blocs de zéros de l'archive\n"
+#~ " (c'est-à-dire les EOF)\n"
+#~ " -B, --read-full-records changer le facteur de blocage lors\n"
+#~ " de la lecture (pour les pipes de BSD 4.2)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Sélection du format d'archive:\n"
+#~ " -V, --label=NOM créer l'archive avec le NOM de volume\n"
+#~ " PATRON au moment de lister ou d'extraire,\n"
+#~ " en utlisant le PATRON d'escamotage\n"
+#~ " -o, --old-archive, --portability\n"
+#~ " écrire selon le format d'archive V7\n"
+#~ " --posix écrire l'archive selon un format\n"
+#~ " conforme POSIX\n"
+#~ " -j, --bzip2 post-traiter l'archive avec « bzip2 »\n"
+#~ " -z, --gzip, --ungzip post-traiter l'archive avec « gzip »\n"
+#~ " -Z, --compress, --uncompress\n"
+#~ " post-traiter l'archive avec « compress »\n"
+#~ " --use-compress-program=PROG\n"
+#~ " post-traiter l'archive avec le PROGramme\n"
+#~ " (doit accepter l'option -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Sélection locales des fichiers:\n"
+#~ " -C, --directory=RÉP opérer à partir du RÉPertoire\n"
+#~ " -T, --files-from=NOM repérer les noms à extraire ou à\n"
+#~ " créer à partir du fichier portant le NOM\n"
+#~ " --null lire les noms se terminant par des nuls,\n"
+#~ " désactivation de l'option -C, -T est\n"
+#~ " implicite\n"
+#~ " --exclude=PATRON exclure les fichiers indiqués par le\n"
+#~ " PATRON d'escamotage\n"
+#~ " -X, --exclude-from=FICHIER exclure les patrons d'escamotage\n"
+#~ " apparaissant dans le FICHIER\n"
+#~ " --anchored exclure les patrons concordant avec le nom "
+#~ "de fichier (par défaut)\n"
+#~ " --no-anchored exclure les patrons concordant par la "
+#~ "suite/\n"
+#~ " --ignore-case exclusion des cas ignorés\n"
+#~ " --no-ignore-case exlcusion est sensible aux minuscules-"
+#~ "majuscules (par défaut)\n"
+#~ " --wildcards exclure les patrons utilisés dans wildcards "
+#~ "(par défaut)\n"
+#~ " --no-wildcards exlcure les patrons de chaînes simples\n"
+#~ " --wildcards-match-slash\n"
+#~ " exlcure les patrons wildcards concordant "
+#~ "avec « / » (par défaut)\n"
+#~ " --no-wildcards-match-slash\n"
+#~ " exclure les patrons wildcards ne concordant "
+#~ "pas avec « / »\n"
+#~ " -P, --absolute-names ne pas éliminer le caractères « / » de tête\n"
+#~ " des noms de fichiers\n"
+#~ " -h, --dereference éliminer les liens symboliques de fichiers\n"
+#~ " --no-recursion éviter de parcourir automatiquement\n"
+#~ " l'arborescence des répertoires\n"
+#~ " -l, --one-file-system demeurer dans le système local de fichiers\n"
+#~ " lors de la création d'une archive\n"
+#~ " -K, --starting-file=NOM débuter l'archivage avec le fichier\n"
+#~ " portant le NOM\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATE conserver seulement les fichiers ayant\n"
+#~ " une DATE plus récente\n"
+#~ " --newer-mtime=DATE comparer les dates et les heures\n"
+#~ " lorsque seulement\n"
+#~ " les données ont été modifiées\n"
+#~ " --after-date=DATE identique à -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=CONTRÔLE] archiver avant le retrait, utiliser la \n"
+#~ " version de contrôle\n"
+#~ " --suffix=SUFFIXE archiver avant le retrait, en remplaçant\n"
+#~ " le suffixe usuel par le SUFFIXE\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modes informatifs de sortie:\n"
+#~ " --help afficher l'aide-mémoire\n"
+#~ " --version afficher le nom et la version du logiciel\n"
+#~ " -v, --verbose utiliser le mode bavard lors du traitement\n"
+#~ " des fichiers\n"
+#~ " --checkpoint afficher les noms des répertoires lors\n"
+#~ " de la lecture de l'archive\n"
+#~ " --totals afficher le nombre total d'octets lors\n"
+#~ " de la création de l'archive\n"
+#~ " -R, --block-number afficher le numéro de bloc contenu dans\n"
+#~ " l'archive pour chaque message\n"
+#~ " -w, --interactive demander confirmation de l'usager\n"
+#~ " pour chaque action\n"
+#~ " --confirmation identique à -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "« tar » de GNU ne peut ni lire ni produire des archives de type « --posix "
+#~ "».\n"
+#~ "Si la variable d'environnement POSIXLY_CORRECT est initialisée, les \n"
+#~ "extensions de GNU sont inhibées avec l'option « --posix ».\n"
+#~ "Le support pour POSIX est partiellement implanté, ne comptez pas trop\n"
+#~ "dessus pour l'instant. Une ARCHIVE peut être un FICHIER, ou\n"
+#~ "HÔTE:FICHIER ou USAGER@HÔTE:FICHIER; la DATE doit être une date textuelle "
+#~ "ou\n"
+#~ "un nom de fichier débutant par « / » ou « . » dans lequel cas la date est "
+#~ "utilisée.\n"
+#~ "Les options par défaut de cette version sont « -f%s -b%d ».\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Option désuète, maintenant implicite par --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Option désuète remplacée par --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Option désuète remplacée par --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Option désuète remplacée par --touch"
+
+#~ msgid "Conflicting archive format options"
+#~ msgstr "Options conflictuelles de formatage d'archive."
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Option désuète remplacée par --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Option désuète remplacée par --block-number"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "L'option --backup remplace l'option devenue désuète."
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Conçu par John Gilmore et Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Si une option de forme longue requiert un argument obligatoire,\n"
+#~ "il est alors obligatoire également pour une option de forme courte.\n"
+#~ "\n"
+#~ " -l, --file-length longueur du fichier généré\n"
+#~ " -p, --pattern=PATRON PATRON doit être « default » ou « zeros »\n"
+#~ " --help afficher l'aide-mémoire\n"
+#~ " --version afficher le nom et la version du logiciel\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Écrit par F. Pinard."
+
+#~ msgid "Ambiguous pattern `%s'"
+#~ msgstr "Patron ambigu `%s'"
+
+#~ msgid "Copyright %d Free Software Foundation, Inc."
+#~ msgstr "Copyright %d Free Software Foundation, Inc."
+
+#~ msgid ""
+#~ "This is free software; see the source for copying conditions. There is "
+#~ "NO\n"
+#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR "
+#~ "PURPOSE.\n"
+#~ msgstr ""
+#~ "Ce logiciel est libre; voir les sources pour les conditions de\n"
+#~ "reproduction. AUCUNE garantie n'est donnée; tant pour des raisons\n"
+#~ "COMMERCIALES que pour RÉPONDRE À UN BESOIN PARTICULIER.\n"
+
+#~ msgid "Write to compression program short %lu bytes"
+#~ msgstr "Écriture de %lu octets vers un programme de compression."
+
+#~ msgid "Removing `%.*s' prefix from member names"
+#~ msgstr "Retrait du préfixe `%.*s' sur la portion des nom"
+
+#~ msgid "Archive contains future timestamp %s"
+#~ msgstr "L'archive contient un cachet de date d'une future date %s"
+
+#~ msgid "%s: Cannot symlink %s %s"
+#~ msgstr "%s: ne peut créer un lien symbolique de %s %s"
+
+#~ msgid "Invalid group given on option"
+#~ msgstr "Groupe invalide donné en option"
+
+#~ msgid "Invalid owner given on option"
+#~ msgstr "Propriétaire invalide donné en option"
+
+#~ msgid "Cannot close file descriptor"
+#~ msgstr "Ne peut fermer le descripteur de ficheir"
+
+#~ msgid "Cannot properly duplicate %s"
+#~ msgstr "Ne peut effectuer la duplication de %s."
+
+#~ msgid "(child) Pipe to stdin"
+#~ msgstr "(processus enfant) Relais vers l'entrée standard."
+
+#~ msgid "Archive to stdout"
+#~ msgstr "Archive vers la sortie standard."
+
+#~ msgid "((child)) Pipe to stdout"
+#~ msgstr "Relais vers la sortie standard (child)"
+
+#~ msgid "(grandchild) Pipe to stdin"
+#~ msgstr "Relais vers l'entrée standard (grandchild)."
+
+#~ msgid "(child) Pipe to stdout"
+#~ msgstr "(processus enfant) Relais vers la sortie standard."
+
+#~ msgid "((child)) Pipe to stdin"
+#~ msgstr "Relais vers l'entrée standard (child) "
+
+#~ msgid "(grandchild) Pipe to stdout"
+#~ msgstr "Relais vers la sortie standard (grandchild) "
+
+#~ msgid "Only wrote %lu of %lu bytes to %s"
+#~ msgstr "Seulement %lu de %lu octets ont été écrits vers %s"
+
+#~ msgid "WARNING: %s: close (%d, %d)"
+#~ msgstr "AVERTISSEMENT: %s: fermeture (%d, %d)"
+
+#~ msgid "Cannot allocate memory for diff buffer of %lu bytes"
+#~ msgstr "Ne peut allouer de la mémoire pour un tampon de %lu octets"
+
+#~ msgid "Cannot seek to %s in file %s"
+#~ msgstr "Ne peut se positionner à %s dans le fichier %s"
+
+#~ msgid "Wrote %s of %s bytes to file %s"
+#~ msgstr "Écrits %s de %s octets du fichier %s"
+
+#~ msgid "lseek error at byte %s in file %s"
+#~ msgstr "Erreur de positionnement à l'octet %s du fichier %s"
+
+#~ msgid "File %s shrunk, padding with zeros"
+#~ msgstr "Fichier %s a été réduit, remplissage par des zéros"
+
+#~ msgid "Cannot reposition archive file"
+#~ msgstr "Ne peut se repositionner sur le fichier d'archive."
+
+#~ msgid "%s: Cannot lchown to uid %lu gid %lu"
+#~ msgstr "%s: ne peut exécuter lchown() pour le uid: %lu et gid: %lu"
+
+#~ msgid "%s: Cannot chown to uid %lu gid %lu"
+#~ msgstr "%s: ne peut exécuter chown() pour uid: %lu et gid: %lu"
+
+#~ msgid "%s: lseek error at byte %s"
+#~ msgstr "%s: erreur de positionnement à l'éoctet %s"
+
+#~ msgid "%s: Could only write %s of %s bytes"
+#~ msgstr "%s: n'a pu écrire que %s sur %s octets"
+
+#~ msgid "Error while deleting %s"
+#~ msgstr "Erreur lors du retrait %s"
+
+#~ msgid "EOF in archive file"
+#~ msgstr "Fin de fichier (EOF) dans le fichier d'archive."
+
+#~ msgid "Only wrote %lu of %lu bytes to file %s"
+#~ msgstr "Écriture de %lu sur %lu octets dans le fichier %s"
+
+#~ msgid "Renaming previous %s to %s\n"
+#~ msgstr "Le précédent `%s' a été renommé à `%s'\n"
+
+#~ msgid "%s: Cannot rename for backup"
+#~ msgstr "%s: ne peut renommé sur une archive"
+
+#~ msgid "%s: Cannot rename from backup"
+#~ msgstr "%s: ne peut renommer d'une archive"
+
+#~ msgid "Cannot %s %s"
+#~ msgstr "Ne peut %s %s"
+
+#~ msgid "Read error at byte %s reading %lu bytes in file %s"
+#~ msgstr ""
+#~ "Erreur de lecture à l'octet %s lors de la lecture de %lu octets du "
+#~ "fichier %s"
+
+#~ msgid "Cannot open pipe"
+#~ msgstr "Ne peut établir le relais (pipe)"
+
+#~ msgid "Cannot open archive %s"
+#~ msgstr "L'archive %s ne peut être ouverte."
+
+#~ msgid "Child cannot fork"
+#~ msgstr "Processus enfant ne peut procéder par clonage (fork)"
+
+#~ msgid "Cannot read from compression program"
+#~ msgstr "Ne peut lire à partir du programme de compression."
+
+#~ msgid "Cannot write to compression program"
+#~ msgstr "Ne peut écrire vers un programme de compression."
+
+#~ msgid "Cannot write to %s"
+#~ msgstr "Ne peut écrire vers %s"
+
+#~ msgid "WARNING: Cannot truncate %s"
+#~ msgstr "AVERTISSEMENT: ne peut tronquer %s"
+
+#~ msgid "While waiting for child"
+#~ msgstr "Lors de l'attente du processus enfant"
+
+#~ msgid "Cannot fork!"
+#~ msgstr "Ne peut créer un clone (fork)!"
+
+#~ msgid "Cannot exec a shell %s"
+#~ msgstr "Ne peut lancer un 'shell' %s"
+
+#~ msgid "Cannot read %s"
+#~ msgstr "Ne peut lire %s"
+
+#~ msgid "Error while closing %s"
+#~ msgstr "Erreur lors de la fermeture de %s"
+
+#~ msgid "Cannot read link %s"
+#~ msgstr "Ne peut lire le lien %s"
+
+#~ msgid "Could not rewind archive file for verify"
+#~ msgstr "Ne peut rembobiner le fichier d'archive pour véfication."
+
+#~ msgid "Removing leading `/' from archive names"
+#~ msgstr "Retrait du caractère '/' de tête des noms de l'archive"
+
+#~ msgid "Cannot add file %s"
+#~ msgstr "Ne peut ajouter le fichier %s"
+
+#~ msgid "Cannot add directory %s"
+#~ msgstr "Ne peut ajouter le répertoire %s"
+
+#~ msgid "Cannot open directory %s"
+#~ msgstr "Ne peut ouvrir le répertoire %s"
+
+#~ msgid "%s: close"
+#~ msgstr "%s: fermeture"
+
+#~ msgid "%s: Could not write to file"
+#~ msgstr "%s: ne peut écrire dans le fichier."
+
+#~ msgid "%s: Could not create file"
+#~ msgstr "%s: ne peut créer le fichier."
+
+#~ msgid "%s: Error while closing"
+#~ msgstr "%s: erreur lors de la fermeture."
+
+#~ msgid "%s: Could not make node"
+#~ msgstr "%s: ne peut créer un noeud."
+
+#~ msgid "%s: Could not make fifo"
+#~ msgstr "%s: ne peut créer un relais (fifo)."
+
+#~ msgid "%s: Could not create directory"
+#~ msgstr "%s: ne peut créer le répertoire."
+
+#~ msgid "Added write and execute permission to directory %s"
+#~ msgstr "Ajout des permissions d'écriture et d'exécution au répertoire %s"
+
+#~ msgid "Cannot open file %s"
+#~ msgstr "Ne peut ouvrir le fichier %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [OPTION]... [FILE]...\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Usage: %s [OPTION]... [FICHIER]...\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, "
+#~ "Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Copyright 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, "
+#~ "Inc.\n"
+
+#~ msgid "Archive %s EOF not on block boundary"
+#~ msgstr ""
+#~ "La fin de fichier (EOF) de l'archive %s n'est pas sur une limite de bloc."
+
+#~ msgid "Only read %d bytes from archive %s"
+#~ msgstr "N'a pu lire seulement que %d octets de l'archive %s"
+
+#~ msgid "Removing leading `/' from absolute path names in the archive"
+#~ msgstr ""
+#~ "Retrait du caractère '/' de tête des noms de chemins absolus de l'archive."
+
+#~ msgid "Amount actually written is (I hope) %d.\n"
+#~ msgstr "Total actuellement écrit est (je l'espère) %d\n"
+
+#~ msgid "File name %s%s too long"
+#~ msgstr "Nom de fichier %s%s trop long."
+
+#~ msgid "Data differs"
+#~ msgstr "Les données sont différentes."
+
+#~ msgid "File does not exist"
+#~ msgstr "Le fichier n'existe pas."
+
+#~ msgid "Not a regular file"
+#~ msgstr "N'est pas un fichier de type régulier."
+
+#~ msgid "Does not exist"
+#~ msgstr "N'existe pas."
+
+#~ msgid "No such file or directory"
+#~ msgstr "Fichier ou répertoire inexistant."
+
+#~ msgid "Mode or device-type changed"
+#~ msgstr "Le mode ou le type de périphérique a été modifé."
+
+#~ msgid "No longer a directory"
+#~ msgstr "N'est présentement plus un répertoire."
+
+#~ msgid "%d at %d\n"
+#~ msgstr "%d de %d\n"
+
+#~ msgid "Could not get current directory"
+#~ msgstr "Ne peut repérer le répertoire courant."
+
+#~ msgid "Could not get current directory: %s"
+#~ msgstr "Ne peut repérer le répertoire courant: %s"
+
+#~ msgid "File name %s/%s too long"
+#~ msgstr "Nom de fichier %s/%s trop long."
+
+#~ msgid "Cannot chdir to %s"
+#~ msgstr "Ne peut changer de répertoire pour %s"
+
+#~ msgid "Hmm, this doesn't look like a tar archive"
+#~ msgstr "Cela ne ressemble pas à une archive de type «tar»..."
+
+#~ msgid "Skipping to next file header"
+#~ msgstr "Escamotage jusqu'à la prochaine en-tête de fichier."
diff --git a/po/ga.gmo b/po/ga.gmo
new file mode 100644
index 0000000..726c819
--- /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..1603b31
--- /dev/null
+++ b/po/ga.po
@@ -0,0 +1,2596 @@
+# Irish translations for tar.
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+# Kevin Patrick Scannell <scannell@SLU.EDU>, 2003, 2004, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.16\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-11-13 08:53-0600\n"
+"Last-Translator: Kevin Scannell <kscanne@gmail.com>\n"
+"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\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/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argóint neamhbhailí %s chun %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argóint dhébhríoch %s chun %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Na hargóintí bailí:"
+
+#: lib/argp-help.c:148
+#, 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"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: Ní mór luach a thabhairt ar an pharaiméadar ARGP_HELP_FMT"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+"%.*s: Ní mór luach deimhneach a bheith ar an pharaiméadar ARGP_HELP_FMT"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Paraiméadar anaithnid ARGP_HELP_FMT"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Bruscar i ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+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."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Úsáid:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " nó: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [ROGHA...]"
+
+#: lib/argp-help.c:1683
+#, 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"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Seol tuairiscí fabhtanna chuig %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Earráid anaithnid chórais"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "taispeáin an chabhair seo"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "taispeáin beagán eolais faoin úsáid"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "AINM"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "socraigh ainm an chláir"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SOIC"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "moill de SOIC soicind (réamhshocrú: 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "taispeáin leagan an chláir"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(EARRÁID RÍOMHCHLÁIR) Gan leagan!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: An iomarca argóintí\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+"(EARRÁID RÍOMHCHLÁIR) Ba chóir aitheantas a thabhairt ar an rogha seo!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: Tá an rogha `%s' débhríoch\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, 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"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, 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"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: tá argóint de dhíth i ndiaidh na rogha `%s'\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: rogha anaithnid `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: rogha anaithnid `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: rogha neamhcheadaithe -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: rogha neamhbhailí -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, 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/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: Tá an rogha `-W %s' débhríoch\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, 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"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "méid bloc"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "cuimhne ídithe"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Ní féidir %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Rabhadh: Ní féidir %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Ní féidir an mód a athrú go %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Ní féidir an t-úinéir a athrú go UID %lu, GID %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Ní féidir nasc crua a chruthú le %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Earráid léimh ag beart %s, agus %lu beart á léamh"
+msgstr[1] "%s: Earráid léimh ag beart %s, agus %lu bheart á léamh"
+msgstr[2] "%s: Earráid léimh ag beart %s, agus %lu bheart á léamh"
+msgstr[3] "%s: Earráid léimh ag beart %s, agus %lu mbeart á léamh"
+msgstr[4] "%s: Earráid léimh ag beart %s, agus %lu beart á léamh"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Rabhadh: Earráid léimh ag beart %s, agus %lu beart á léamh"
+msgstr[1] "%s: Rabhadh: Earráid léimh ag beart %s, agus %lu bheart á léamh"
+msgstr[2] "%s: Rabhadh: Earráid léimh ag beart %s, agus %lu bheart á léamh"
+msgstr[3] "%s: Rabhadh: Earráid léimh ag beart %s, agus %lu mbeart á léamh"
+msgstr[4] "%s: Rabhadh: Earráid léimh ag beart %s, agus %lu beart á léamh"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Ní féidir 'seek' a dhéanamh ag %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Rabhadh: Ní féidir 'seek' a dhéanamh ag %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Ní féidir nasc siombalach a chruthú le %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Níor scríobhadh ach %lu as %lu beart"
+msgstr[1] "%s: Níor scríobhadh ach %lu as %lu bheart"
+msgstr[2] "%s: Níor scríobhadh ach %lu as %lu bheart"
+msgstr[3] "%s: Níor scríobhadh ach %lu as %lu mbeart"
+msgstr[4] "%s: Níor scríobhadh ach %lu as %lu beart"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Gach `%s' tosaigh á bhaint amach as ainmneacha baill"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Gach `%s' tosaigh á bhaint amach as spriocanna na nasc crua"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Ag cur `.' in ionad ainm baill folamh"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Ag cur `.' in ionad sprioc fholamh an naisc crua"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[yYiIsS]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Níl an tseirbhís ar fáil"
+
+# cf French -KPS
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+# cf French -KPS
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Ní féidir cianbhlaosc a rith"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Teaghrán ionchurtha rófhada"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Earráid chomhréire in uimhir"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Ní féidir maolán a dháileadh\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Ní féidir maolán a dháileadh"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Bain triail as `%s --help' chun tuilleadh eolais a fháil.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Úsáid: %s [ROGHA]\n"
+"Láimhseáil tiomántán téipe, agus glac le horduithe ó chianphróiseas.\n"
+"\n"
+" --version Taispeáin eolas faoin leagan.\n"
+" --help Taispeáin an chabhair seo.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Seol tuairiscí fabhtanna chuig <%s>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Earráid i bhfritháireamh 'seek'"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Fritháireamh 'seek' as raon"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Treo 'seek' as raon"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Comhadchríoch gan choinne\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Comhadchríoch gan choinne"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Ordú dramhaíola"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Bearta scríofa go hiomlán"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Bearta léite go hiomlán"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Bearta scriosta go hiomlán: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(píopa)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Luach neamhbhailí do record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Ní thugtar ainm na cartlainne"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ní féidir cartlann stdin/stdout a fhíorú"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Is cartlann chomhbhrúite í seo. Úsáid an rogha %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Ní féidir cartlanna comhbhrúite a nuashonrú"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Seicphointe scríofa %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Seicphointe léimh %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Tosach na téipe, ag scor anois"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "An iomarca earráidí, ag scor"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Bloc neamhailínithe (%lu beart) sa chartlann"
+msgstr[1] "Bloc neamhailínithe (%lu bheart) sa chartlann"
+msgstr[2] "Bloc neamhailínithe (%lu bheart) sa chartlann"
+msgstr[3] "Bloc neamhailínithe (%lu mbeart) sa chartlann"
+msgstr[4] "Bloc neamhailínithe (%lu beart) sa chartlann"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Méid taifid = %lu bloc"
+msgstr[1] "Méid taifid = %lu bhloc"
+msgstr[2] "Méid taifid = %lu bhloc"
+msgstr[3] "Méid taifid = %lu mbloc"
+msgstr[4] "Méid taifid = %lu bloc"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Ní féidir an chartlann a chúlú; is dócha gur doléite í gan -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "Níor stopadh rmtlseek ag teorainn taifid"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: tá uimhir imleabhair neamhbhailí ann"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Uimhir imleabhair thar maoil"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr ""
+"Socraigh an t-imleabhar #%d le haghaidh %s agus brúigh an eochair iontrála: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Fuarthas comhadchríoch in áit freagra ón úsáideoir"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "RABHADH: Tá an chartlann neamhiomlán"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n ainm Cuir comhadainm nua ar an chéad imleabhar eile (agus gach "
+"ceann ina dhiaidh)\n"
+" q Tobscoir tar\n"
+" y nó líne nua Lean ar aghaidh\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Sceith fobhlaosc\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Priontáil an liosta seo\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Níl aon imleabhar nua; ag scor.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Ainm an chomhaid gan sonrú. Bain triail eile as.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Ionchur neamhbhailí. Iontráil ? chun cabhair a fháil.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "Theip ar ordú %s"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Ní cosúil le cartlann `tar' é seo"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"Seans go leanann %s ar aghaidh ar an imleabhar seo: tá ainm teasctha sa "
+"cheanntásc"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "Ní leanann %s ar an imleabhar seo"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "Níl %s an méid ceart (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Tá an t-imleabhar seo as ord"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Lipéad ar chartlann nach comhoiriúnaithe le %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Níl an t-imleabhar %s comhoiriúnaithe le %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: ní féidir an comhadainm seo a stóráil i gceanntásc il-imleabhar GNU; "
+"teasctha"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Níorbh fhéidir ach %lu de %lu beart a léamh"
+msgstr[1] "Níorbh fhéidir ach %lu de %lu bheart a léamh"
+msgstr[2] "Níorbh fhéidir ach %lu de %lu bheart a léamh"
+msgstr[3] "Níorbh fhéidir ach %lu de %lu mbeart a léamh"
+msgstr[4] "Níorbh fhéidir ach %lu de %lu beart a léamh"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Tá difríocht idir na hábhair"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Comhadchríoch gan choinne i gcartlann"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Tá difríocht idir na cineálacha comhaid"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Tá difríocht idir na móid"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Tá difríocht idir na UIDanna"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Tá difríocht idir na GIDanna"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Tá difríocht idir na hamanna modhnaithe"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Tá difríocht idir na méideanna"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ní ceangailte le %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Tá difríocht idir na naisc shiombalacha"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Tá difríocht idir na huimhreacha gléis"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Fíoraigh "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Cineál anaithnid comhaid `%c', déan diff mar ghnáthchomhad"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Tá comhaid sa chartlann agus a réimíreanna scriosta."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Nach féidir i gcónaí na bunchomhaid a aimsiú agus le linn fíoraithe."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "THEIP AR DHEIMHNIÚ: aimsíodh %d ceanntásc neamhbhailí"
+msgstr[1] "THEIP AR DHEIMHNIÚ: aimsíodh %d cheanntásc neamhbhailí"
+msgstr[2] "THEIP AR DHEIMHNIÚ: aimsíodh %d cheanntásc neamhbhailí"
+msgstr[3] "THEIP AR DHEIMHNIÚ: aimsíodh %d gceanntásc neamhbhailí"
+msgstr[4] "THEIP AR DHEIMHNIÚ: aimsíodh %d ceanntásc neamhbhailí"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: tá clib chomhadlainne taisce ann; nach dumpáilte"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "tá an luach %s as raon %s: %s..%s; ag cur %s ina ionad"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "tá an luach %s as raon %s: %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Ceanntásca ochtnártha diúltacha á gcruthú"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: ainm comhaid rófhada (uasmhéid %d); nach dumpáilte"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: ainm comhaid rófhada (ní féidir é a scoilt); nach dumpáilte"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: ainm naisc rófhada; nach dumpáilte"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: %s beart níos lú sa chomhad; ag stuáil le nialais"
+msgstr[1] "%s: %s bheart níos lú sa chomhad; ag stuáil le nialais"
+msgstr[2] "%s: %s bheart níos lú sa chomhad; ag stuáil le nialais"
+msgstr[3] "%s: %s mbeart níos lú sa chomhad; ag stuáil le nialais"
+msgstr[4] "%s: %s beart níos lú sa chomhad; ag stuáil le nialais"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: is ar chóras comhad eile é an comhad; nach dumpáilte"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Cineál anaithnid comhaid; ag déanamh neamhshuim air"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "Naisc le %s ar iarraidh.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "tá %s gan athrú; nach dumpáilte"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: is ionann é agus an chartlann féin; nach dumpáilte"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Scriosadh an comhad sular léadh é"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: tá clib chomhadlainne taisce ann; nach dumpáilte"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: athraíodh an comhad agus á léamh"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: rinneadh neamhshuim ar an soicéad"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: rinneadh neamhshuim ar an doras"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Ag bogadh go dtí an chéad cheanntásc eile"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Comhad nach ceanntásc á scriosadh ón chartlann"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: ní dócha go bhfuil an stampa ama ársa %s ceart"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: tá an stampa ama %s %s soicind amach anseo"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Bunoscionntacht gan choinne agus comhadlann á cruthú"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+"%s: Athainmníodh an chomhadlann sularbh fhéidir a stádas a bhaint amach"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Comhaid theorantacha á mbaint amach mar ghnáthchomhaid"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr ""
+"Ag déanamh iarracht ar naisc shiombalacha a bhaint amach mar naisc chrua"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "%s á léamh\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Ní féidir an comhad a bhaint amach -- ar lean ó imleabhar eile"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Ceanntásc ainm fada gan choinne"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Cineál anaithnid comhaid `%c', á bhaint amach mar ghnáthchomhad"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Tá an %s reatha níos nuaí nó ar comhaois"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Níorbh fhéidir cúltaca a dhéanamh"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Ní féidir %s a athainmniú go %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Ní féidir biseach a dhéanamh i ndiaidh earráid: ag scor"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Athainmníodh an chomhadlann ó %s"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Athainmníodh an chomhadlann"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Comhadlann nua"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Stampa ama neamhbhailí"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Am neamhbhailí mionathraithe (soicindí)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Am neamhbhailí mionathraithe (nanashoicindí)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Uimhir neamhbhailí gléis"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Uimhir inode as raon"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Réimse rófhada agus an comhad roghbhlúire á léamh"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Earráid agus an comhad roghbhlúire á léamh"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Comhadchríoch gan choinne sa chomhad roghbhlúire"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Luach réimse gan choinne sa chomhad roghbhlúire"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Críochnaitheoir taifid ar iarraidh"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Drochfhormáid incriminteach"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+"Ní thacaítear leis an leagan seo den fhormáid incriminteach: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "dumpdir míchumtha: bhíothas ag súil le '%c' ach fuarthas %#3o"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "dumpdir míchumtha: 'X' faoi dhó"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "dumpdir míchumtha: ainm folamh i 'R'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "dumpdir míchumtha: 'T' gan 'R' roimhe"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "dumpdir míchumtha: ainm folamh i 'T'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+"dumpdir míchumtha: bhíothas ag súil le '%c' ach fuarthas deireadh na sonraí"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "dumpdir míchumtha: níor úsáideadh 'X' riamh"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Ní féidir comhadlann shealadach a chruthú le teimpléad %s"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: ní féidir an chomhadlann a stat: nach purgaithe"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: tá an chomhadlann ar ghléas eile ar fad; nach purgaithe"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Ag scriosadh %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Ní féidir scriosadh a dhéanamh"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: ag fágáil ar lár"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "bloc %s: ** bloc de NULanna **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Bloc nialasach scoite ag %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "bloc %s: ** Deireadh comhaid **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "bloc %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Bearnaí sa cheanntásc; ag súil le luach uimhriúil %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Tá an luach ochtnártha %.*s as raon %s sa chartlann;\n"
+"ag glacadh le comhlánú dénártha"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Tá an luach ochtnártha %.*s as raon %s sa chartlann"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Tá ceanntásca le bunuimhir 64 i léig sa chartlann"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Teaghrán %s le sín agus bunuimhir 64 as raon %s sa chartlann"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Tá an luach le bunuimhir 256 as raon %s sa chartlann"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Tá %.*s sa chartlann; ag súil le luach uimhriúil %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Tá an luach cartlainne %s as raon %s: %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " nasc le %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " cineál anaithnid comhaid %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Nasc Fada--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Ainm Fada--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Ceanntásc Imleabhair--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Ar lean ag beart %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Comhadlann á cruthú:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "%s á athainmniú go %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Ní féidir athainmniú go %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "%s á athainmniú go %s arís\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Ní féidir an chomhadlann reatha a shábháil"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Ní féidir an chomhadlann reatha a athrú"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "macphróiseas"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "bealach idir próisis"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Aimsíodh saoróga in ainmneacha comhaid."
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr "Úsáid --wildcards chun meaitseáil patrún a chumasú, nó --no-wildcards"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "chun an rabhadh seo a mhúchadh."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Ní sa chartlann é"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Níl rud riachtanach sa chartlann"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Tá gá leis an ionchur caighdeánach ar na roghanna `-%s' agus `-%s'"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Formáid neamhbhailí chartlainne"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Níl roghanna GNU ar fáil d'fhormáid neamh-chomhoiriúnach chartlainne"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Stíl anaithnid athfhriotail `%s'. Bain triail as `%s --quoting-style=help' "
+"chun liosta a fheiceáil."
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"Sábhálann GNU tar comhaid le chéile i gcartlann aonair ar théip nó ar "
+"dhiosca, agus is féidir comhaid ar leith a athchóiriú as an gcartlann.\n"
+"\n"
+"Samplaí:\n"
+" tar -cf cartlann.tar fú barr # Cruthaigh cartlann.tar as comhaid fú 7 "
+"barr.\n"
+" tar -tvf cartlann.tar # Taispeáin gach comhad i cartlann.tar "
+"(foclach).\n"
+" tar -xf cartlann.tar # Bain gach comhad amach as cartlann.tar.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Is é `~' an iarmhír chúltaca, mura dtugtar é le --suffix nó le hathróg\n"
+"timpeallachta SIMPLE_BACKUP_SUFFIX.\n"
+"Is féidir an modh rialaithe foinsí a shocrú le --backup nó le hathróg\n"
+"thimpeallachta VERSION_CONTROL. Is iad seo na luachanna bailí:\n"
+"\n"
+" none, off ná déan cúltaca riamh\n"
+" t, numbered déan cúltacaí agus uimhreacha orthu\n"
+" nil, existing 'numbered' má tá uimhreacha orthu anois, 'simple' mura "
+"bhfuil\n"
+" never, simple déan cúltacaí simplí i gcónaí\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Príomh-mhód oibre:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "taispeáin an t-ábhar i gcartlann"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "bain comhaid as cartlann"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "cruthaigh cartlann nua"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "taispeáin difríochtaí idir cartlann agus córas comhaid"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "iarcheangail le deireadh cartlainne"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "ná hiarcheangail ach comhaid mhionathraithe leis an gcartlann"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "iarcheangail comhaid tar le cartlann"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "scrios as an gcartlann (nach ar théipeanna maighnéadacha!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "tástáil lipéad imleabhair na cartlainne agus scoir"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Mionathraitheoirí oibríochta:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "caith le gannchomhaid go héifeachtach"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "PRÍOMH[.MION]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+"socraigh leagan fhormáid na ngannchomhad le húsáid (--sparse intuigthe)"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "déan cúltaca incriminteach de shean-nós GNU"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "COMHAD"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "déan cúltaca incriminteach nua-aoise GNU"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "ná scoir le stádas earráide má tá comhad doléite ann"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "UIMHIR"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"ná próiseáil ach an UIMHIRú leagan de gach comhad sa chartlann; níl an rogha "
+"bhailí ach in éineacht le ceann de na fo-orduithe --delete, --diff, --"
+"extract nó --list agus nuair a thugtar liosta comhad ar líne na n-orduithe "
+"nó leis an rogha -T; de réir réamhshocraithe UIMHIR=1"
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "tá an chartlann inchuardaithe"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "Rialú forscríofa:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "fíoraigh an chartlann i ndiaidh ag scríobh"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "scrios comhaid i ndiaidh iad a chur leis an gcartlann"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "ná forscríobh comhaid atá ann le linn baint amach"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"ná forscríobh comhaid atá ann má tá siad níos nuaí ná na cinn sa chartlann"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "forscríobh comhaid atá ann le linn baint amach"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "scrios gach comhaid sula scríobhtar air"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "folmhaigh géagchóras sula mbaintear comhadlann amach"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "ná forscríobh meiteashonraí comhadlainne"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"forscríobh meiteashonraí de chomhadlanna atá ann agus cartlanna á mbaint "
+"amach (réamhshocrú)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Roghnaigh sruth aschurtha:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "bain comhaid amach agus scríobh ar aschur caighdeánach"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "ORDÚ"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "píopaigh comhaid bhainte go ríomhchlár eile"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "ná bac le cóid scortha na macphróiseas"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "láimhseáil cóid scortha nach nialas ó mhacphróisis mar earráidí"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Tréithe comhaid á láimhseáil:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "éiligh AINM mar úinéir de chomhaid bhreise"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "éiligh AINM mar ghrúpa de chomhaid bhreise"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DÁTA-NÓ-COMHAD"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "socraigh am mionathraithe na gcomhad nua de réir DÁTA-NÓ-COMHAD"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "ATHRUITHE"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "déan ATHRUITHE ar mhód de chomhaid bhreise"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "MODH"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"coimeád amanna rochtana de chomhaid dhumpáilte, trí athchóiriú na n-amanna i "
+"ndiaidh na comhaid a léamh (MODH='replace', réamhshocraithe), nó gan a "
+"bheith ag socrú na n-amanna sa chéad áit (MODH='system')"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "ná bain am mionathraithe an chomhaid"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "bain triail as úinéireacht a choinneáil"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "bain comhaid amach mar thusa féin"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "bain úsáid as uimhreacha d'ainmneacha úsáideora/grúpa"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr "bain eolas faoi cheadanna (réamhshocrú don fhorúsáideoir)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"cuir umask an úsáideora i bhfeidhm agus ceadanna á mbaint ón chartlann "
+"(réamhshocrú do ghnáthúsáideoirí)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "sórtáil ainmneacha le cur in oiriúint"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "ar comhbhrí le -p agus -s araon"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"ná socraigh amanna mionathraithe ná ceadanna de na comhadlanna go dtí go "
+"bhfuil an bhaint curtha i gcrích"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "cealaigh an éifeacht de rogha --delay-directory-restore"
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Roghnú gléis agus malartú:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "CARTLANN"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "bain úsáid as cartlann chomhaid nó gléas CARTLANN"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "is logánta í an chartlann fiú má tá idirstad ina hainm"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "bain úsáid as ORDÚ in ionad rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "bain úsáid as ORDÚ cian in ionad rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "sonraigh tiomántán agus a dhlús"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "cruthaigh/liostaigh/bain amach cartlann le hiliomad imleabhair"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "athraigh téip i ndiaidh UIMHIR × 1024 beart"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "rith script i ndiaidh gach téip (-M intuigthe)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "úsáid/nuashonraigh an uimhir imleabhair i gCOMHAD"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Blocáil ghléis:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOIC"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLOIC × 512 beart sa taifead"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "UIMHIR beart sa taifead, iolraí de 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "déan neamhshuim ar bhloic nialasacha sa chartlann (is ionann le EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "athbhlocáil le linn léimh (le píopaí 4.2BSD)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Roghnú formáide:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMÁID"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "cruthaigh cartlann san fhormáid seo"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "Is FORMÁID ceann de na rudaí seo:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "seanfhormáid V7 tar"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "formáid de réir GNU tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "formáid de réir GNU tar 1.13"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "formáid POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "formáid POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "ar comhbhrí le pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "is ionann le --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "is ionann le --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "lorgfhocal[[:]=luach][,lorgfhocal[[:]=luach]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "rialaigh lorgfhocail pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TÉACS"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"cruthaigh cartlann le TÉACS mar ainm imleabhair; úsáid TÉACS mar phatrún "
+"globála ar an ainm imleabhair agus an chartlann á liostú/baint amach"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "scag an chartlann le bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "scag an chartlann le gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "scag an chartlann le compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "CLÁR"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "scag le CLÁR (ní foláir -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Roghnú comhaid logánta:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"cuir an COMHAD sainithe leis an gcartlann (is áisiúil an rogha seo nuair atá "
+"dais ag tosach an chomhadainm)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "COMHADLANN"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "athraigh go dtí COMHADLANN"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "tóg ainmneacha le baint/cruthú as comhad COMHAD"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "léigh ainmneacha, foirceanta le NULanna; múch -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+"bain comharthaí athfhriotail ó chomhadainmneacha a léadh le -T (réamhshocrú)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "ná bain comharthaí athfhriotail ó chomhadainmneacha a léadh le -T"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "PATRÚN"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "fág comhaid as an áireamh, tugtha mar PHATRÚN"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "fág as an áireamh aon phatrún atá i gCOMHAD"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "gabh thar chomhadlanna a bhfuil clib thaisce iontu"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "gabh thar chomhadlanna a bhfuil clib thaisce iontu"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "gabh thar chomhadlanna a bhfuil clib thaisce iontu"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "gabh thar chomhadlanna a bhfuil clib thaisce iontu"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "gabh thar chomhadlanna a bhfuil clib thaisce iontu"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "gabh thar chomhadlanna a bhfuil clib thaisce iontu"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "ná téigh isteach i bhfochomhadlanna go huathoibríoch"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "ná fág an córas comhaid seo agus cartlann á cruthú"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "téigh isteach i gcomhadlanna (réamhshocrú)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "ná struipeáil `/' tosaigh ó ainmneacha comhaid"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+"lean naisc shiombalacha; cartlannaigh agus dumpáil na comhaid a nascann na "
+"naisc leo"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "AINM-BAILL"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "tosaigh ag ball AINM-BAILL sa chartlann"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "ná sábháil comhaid níos nuaí ná DÁTA-NÓ-COMHAD"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DÁTA"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "déan comparáid le dáta/am modhnaithe"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "MODH"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "déan cúltaca sula scriostar, roghnaigh modh oibre maidir le leaganacha"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "TEAGHRÁN"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"déan cúltaca roimh bhaint, agus sáraigh an gnáth-iarmhír ('~' mura dtugtar é "
+"leis an athróg thimpeallachta SIMPLE_BACKUP_SUFFIX)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Trasfhoirmiú ainmneacha comhaid:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "struipeáil UIMHIR comhpháirt tosaigh ó ainmneacha comhaid"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "SLONN"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+"Úsáid ordú ionadaíochta SLONN, i bhformáid \"sed\", chun ainmneacha comhaid "
+"a thrasfhoirmiú"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+"Roghanna maidir le meaitseáil ainmneacha comhaid (cuirfear iad seo i "
+"bhfeidhm do phatrúin eisiata agus do phatrúin iniata araon):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "ná bí cásíogair"
+
+# subject is "exclude patterns"
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "meaitseálann patrúin le tosach d'ainmneacha comhaid"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "meaitseálann patrúin tar éis gach `/' (réamhshocrú i gcás eisiata)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "dealaigh idir litreacha beaga/móra (réamhshocrú)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "úsáid saoróga (réamhshocrú do phatrúin eisiata)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "meaitseáil teaghráin carachtar ar charachtar"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "ní ghlacann saoróga le `/'"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "meaitseálann saoróga le `/' (réamhshocrú le patrúin eisiata)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Aschur faisnéiseach:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "taispeáin gach comhad atá próiseáilte, go foclach"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]UIMHIR"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "cuir dul chun cinn ar taispeáint, gach UIMHIRú taifid (réamhshocrú 10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "taispeáin eolas mura bhfuil gach nasc dumpáilte"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "COMHARTHA"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"taispeáin líon iomlán na mbeart tar éis na cartlainne a phróiseáil; le "
+"hargóint - taispeáin líon iomlán na mbeart nuair a thugtar an COMHARTHA seo; "
+"Ceadaítear na comharthaí seo a leanas: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 agus "
+"SIGUSR2; glacfar leis na hainmneacha céanna gan an réimír SIG freisin"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "taispeáin dátaí mionathraithe de réir UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "scríobh aschur foclach i gCOMHAD"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "taispeáin bloc sa chartlann le gach teachtaireacht"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "iarr deimhniú ar gach gníomh"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "taispeáin réamhshocruithe tar"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"agus á liostú nó á bhaint amach, taispeáin gach comhadlann nach meaitseálann "
+"leis an gcuardach"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "taispeáin ainmneacha comhaid/cartlainne i ndiaidh trasfhoirmithe"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "STÍL"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+"socraigh stíl athfhriotail ainmneacha; féach thíos le haghaidh luachanna "
+"bailí do STÍL"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "cuir carachtair athfhriotail timpeall na carachtair ó TEAGHRÁN"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "ná húsáid comharthaí athfhriotail timpeall carachtair ó TEAGHRÁN"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Roghanna Comhoiriúnachta:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"is ionann le --old-archive le linn cruthaithe; is ionann le --no-same-owner "
+"le linn baint"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Roghanna eile:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "cuir bac ar úsáid de roghanna gurbh fhéidir leo a bheith urchóideach"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Ná tabhair ach ceann de na roghanna `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Roghanna contrártha comhbhrúite"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Comhartha anaithnid: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Comhad samplach dáta gan aimsiú"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Formáid dáta anaithnid; ag baint úsáid as %s in ionad %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Rogha %s: Ag caitheamh le dáta `%s' mar %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: léadh an liosta comhad cheana"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: tá carachtar nialasach sa chomhadainm a léadh"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "Argóintí bailí do roghanna --quoting-style:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"Luachanna réamhshocraithe don tar *seo*:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Fachtóir bacainneach neamhbhailí"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Rabhadh: níl an rogha -I ar fáil; ar mhaith leat -j nó -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Fad téipe neamhbhailí"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Níos mó ná spriocdháta amháin"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "Leagan neamhbhailí ar fhormáid na ngannchomhad"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "ní thacaítear le --atime-preserve='system' ar an chóras seo"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "ní mór do luach --checkpoint a bheith ina slánuimhir"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Grúpa neamhbhailí"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Mód neamhbhailí ar rogha"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Uimhir neamhbhailí"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Úinéir neamhbhailí"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Méid taifid neamhbhailí"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Ní foláir méid taifid a bheith iolraí de %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Tá líon na mball neamhbhailí"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "Ní cheadaítear ach aon rogha --to-command amháin"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Tá an argóint dlúis míchumtha: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Dlús anaithnid: `%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Níl na roghanna `-[0-7][lmh]' ar fáil sa leagan seo tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[COMHAD]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Tá gá le hargóint ar an seanrogha `%c'."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "tá an rogha --occurrence gan bhrí in éagmais liosta comhad"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "níl an rogha --occurrence ar fáil sa mhód iarrtha"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Ní foláir an rogha `-M' le níos mó ná cartlann amháin"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Ní féidir --listed-incremental a úsáid le --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Lipéad imleabhair rófhada (%lu beart ar a mhéad)"
+msgstr[1] "%s: Lipéad imleabhair rófhada (%lu bheart ar a mhéad)"
+msgstr[2] "%s: Lipéad imleabhair rófhada (%lu bheart ar a mhéad)"
+msgstr[3] "%s: Lipéad imleabhair rófhada (%lu mbeart ar a mhéad)"
+msgstr[4] "%s: Lipéad imleabhair rófhada (%lu beart ar a mhéad)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Ní féidir cartlanna le hiliomad imleabhair a fhíorú"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Ní féidir cartlanna comhbhrúite a fhíorú"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Ní féidir úsáid a bhaint as cartlanna il-ranna comhbhrúite"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Ní féidir cartlanna comhbhrúite a iarcheangal"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "níl an rogha --pax-option le fáil ach le cartlanna POSIX"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Ní chruthófar cartlann fholamh (go cladhartha)"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Níl na roghanna `-Aru' ar fáil in éineacht le `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Ní foláir rogha amháin de `-Acdtrux' ar a laghad"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Earráid; tobscor moillithe ó earráidí roimhe seo"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Chrap an comhad %s beart"
+msgstr[1] "%s: Chrap an comhad %s bheart"
+msgstr[2] "%s: Chrap an comhad %s bheart"
+msgstr[3] "%s: Chrap an comhad %s mbeart"
+msgstr[4] "%s: Chrap an comhad %s beart"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Tá an lorgfhocal %s anaithnid nó nach bhfuil sé curtha i bhfeidhm fós"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Ní féidir an patrún %s a úsáid"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Ní féidir an lorgfhocal %s a shárú"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Ceanntásc míchumtha breisithe: fad ar iarraidh"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "Fad an cheanntáisc breisithe as raon"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Fad %*s as raon sa cheanntásc breisithe"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "Ceanntásc míchumtha breisithe: spás bán ar iarraidh tar éis an fhaid"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Ceanntásc míchumtha breisithe: sín chothroime ar iarraidh"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Ceanntásc míchumtha breisithe: líne nua ar iarraidh"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+"Eochairfhocal anaithnid `%s' sa cheanntásc breisithe; ag déanamh neamhshuim "
+"air"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+"Tá an péire a cruthaíodh (eochairfhocal/luach) rófhada (eochairfhocal=%s, "
+"fad=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Tá an ceanntásc breisithe %s=%s as raon %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Ceanntásc míchumtha breisithe: %s=%s neamhbhailí"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Ceanntásc míchumtha breisithe: %s=%s sa bhreis"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+"Ceanntásc míchumtha breisithe: %s neamhbhailí: bhíothas ag súil le "
+"teormharcóir %c"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Ceanntásc míchumtha breisithe: %s neamhbhailí: corruimhir de luachanna"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"Láimhseálann genfile comhaid shonraí le haghaidh an tsratha tástála GNU "
+"paxutils.\n"
+"Is iad na ROGHANNA:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Roghanna - cruthú comhad:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "MÉID"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Cruthaigh comhad leis an MÉID seo"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "Scríobh i gcomhad AINM, in ionad an aschuir chaighdeánaigh"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Léigh ainmneacha comhaid ó COMHAD"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "Léann -T ainmneacha, foirceanta le NULanna"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+"Líon an comhad leis an PATRÚN sonraithe. Is é PATRÚN 'default' nó 'zeros'"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Méid bhloic sa gannchomhad"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+"Cruthaigh gannchomhad. Tugtar an mapa comhaid ar an chuid eile de líne na n-"
+"orduithe."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "fíoraigh an chartlann i ndiaidh ag scríobh"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Roghanna - staitisticí comhaid"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"Taispeáin inneachar an struct stat le haghaidh gach comhad sonraithe. "
+"FORMÁID réamhshocraithe: "
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Roghanna - feidhmiú sioncrónach:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"Rith an tORDÚ sonraithe. Is áisiúil an rogha seo le --checkpoint agus ceann "
+"de --cut, --append, nó --touch"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+"Déan an gníomh sonraithe (féach thíos) nuair a shroichtear seicphointe UIMHIR"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Socraigh an dáta le haghaidh an chéad rogha --touch eile"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "Taispeáin na seicphointí a ritheadh agus stádas scortha den ORDÚ"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Gníomhartha rite sioncrónaigh. Ritear iad seo nuair a shroichtear an uimhir "
+"sheicphointe a sonraíodh leis an rogha --checkpoint"
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"Teasc COMHAD go dtí an mhéid a sonraíodh leis an rogha --length roimhe seo "
+"(nó teasc go dtí 0, mura sonraítear an rogha seo)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+"Iarcheangail MÉID beart le COMHAD. Tógtar MÉID ón rogha --length roimhe seo."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "Nuashonraigh na hamanna rochtana/mionathraithe de CHOMHAD"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "Rith ORDÚ"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Méid neamhbhailí: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Uimhir as raon: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Méid diúltach: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "theip ar stat(%s)"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Earráid agus uimhir á parsáil i ngar do `%s'"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Formáid anaithnid ar an dáta"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARGÓINTÍ...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "ní féidir `%s' a oscailt"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Ní féidir 'seek' a dhéanamh ag %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "tá carachtar nialasach sa chomhadainm"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"ní féidir gannchomhaid a chruthú ar an aschur caighdeánach; úsáid rogha --"
+"file"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "masc mícheart (i ngar do `%s')"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "Réimse anaithnid `%s'"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "ní féidir an t-am a shocrú ar `%s'"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "D'éirigh leis an ordú\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Theip ar an ordú le stádas %d\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Stopadh an t-ordú le comhartha %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Stopadh an t-ordú ar chomhartha %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Rinne an t-ordú córdhumpa\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Ordú críochnaithe\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "Tá ainmneacha comhaid de dhíth ar --stat"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "an iomarca argóintí"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Earráid léimh ag beart %s, agus %lu beart á léamh"
+#~ msgstr[1] "%s: Earráid léimh ag beart %s, agus %lu bheart á léamh"
+#~ msgstr[2] "%s: Earráid léimh ag beart %s, agus %lu bheart á léamh"
+#~ msgstr[3] "%s: Earráid léimh ag beart %s, agus %lu mbeart á léamh"
+#~ msgstr[4] "%s: Earráid léimh ag beart %s, agus %lu beart á léamh"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Ainmneacha comhaid coscartha--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Comhadchríoch gan choinne in ainmneacha coscartha"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Athainmníodh %s go %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Ní féidir nasc siombalach a dhéanamh le %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Nasctha %s le %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Ordú anaithnid díchoscartha %s"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Stampa ama as raon"
+
+#~ msgid "Modification time (seconds) out of range"
+#~ msgstr "Am mionathraithe (soicindí) as raon"
+
+#~ msgid "Modification time (nanoseconds) out of range"
+#~ msgstr "Am mionathraithe (nanashoicindí) as raon"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Uimhir ghléis as raon"
+
+#~ msgid "Error reading time stamp"
+#~ msgstr "Earráid agus stampa ama á léamh"
+
+#~ msgid "Unexpected EOF"
+#~ msgstr "Comhadchríoch gan choinne"
+
+#~ msgid "same as -N"
+#~ msgstr "ar comhbhrí le -N"
+
+#~ msgid ""
+#~ "creating multi-volume archives in posix format requires using --tape-"
+#~ "length (-L) option"
+#~ msgstr ""
+#~ "Ní mór an rogha --tape-length (-L) a úsáid agus cartlanna il-imleabhair á "
+#~ "gcruthú i bhformáid posix"
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Ordú dramhaíola %c\n"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Ainm comhaid ar iarraidh i ndiaidh -C"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "ná bain úsáid as saoróga i bpatrúin eisiata"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "bain úsáid as saoróga i bpatrúin (réamhshocrú)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "taispeáin líon na mbloc scríofa sa chartlann"
+
+#~ msgid ""
+#~ "When creating archive in verbose mode, list member names as stored in the "
+#~ "archive"
+#~ msgstr ""
+#~ "Agus cartlann á cruthú sa mhód foclach, taispeáin ainmneacha na mball "
+#~ "nuair a chuirtear iad sa chartlann"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "Athróidh an bhrí den rogha -l i leaganacha amach anseo."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Bain úsáid as --one-file-system ina ionad, le do thoil."
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Níl baránta AR BITH leis an gclár seo, an oiread atá ceadaithe de réir "
+#~ "dlí.\n"
+#~ "Is féidir leat á scaipeadh de réir na gcoinníollacha den GNU General "
+#~ "Public License;\n"
+#~ "Féach ar an chomhad `COPYING' chun tuilleadh eolais a fháil."
+
+#~ msgid "Quitting now."
+#~ msgstr "Á scor anois."
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "RABHADH: níl ceanntásc imleabhair ann"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Earráid le hainm fada infheicthe"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Earráid le hainm fada infheicthe"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "ná hathraigh amanna modhnaithe de chomhaid dhumpáilte"
+
+#~ msgid "extract permissions information"
+#~ msgstr "bain eolas faoina ceadanna"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "ná bain eolas faoina ceadanna"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "lean naisc shiombalacha le linn dumpála"
+
+#~ msgid "Print license and exit"
+#~ msgstr "Taispeáin an ceadúnas agus scoir"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Bunaithe ar obair de John Gilmore agus Jay Fenlason. Tá an liosta údar\n"
+#~ "ina iomláine ar fáil sa chomhad AUTHORS.\n"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Rabhadh: níl an rogha -y ar fáil; ar mhaith leat -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Earráid le linn scríobh ar aschur caighdeánach"
diff --git a/po/gl.gmo b/po/gl.gmo
new file mode 100644
index 0000000..ac4338a
--- /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..33ceb2c
--- /dev/null
+++ b/po/gl.po
@@ -0,0 +1,3097 @@
+# Galician translation of GNU tar.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Jacobo Tarrío Barreiro <jtarrio@iname.com>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.13.25\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2002-03-26 19:17+0100\n"
+"Last-Translator: Jacobo Tarrío Barreiro <jtarrio@iname.com>\n"
+"Language-Team: Galician <gpul-traduccion@ceu.fi.udc.es>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argumento %s non válido para %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argumento %s ambiguo para %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Os argumentos válidos son:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Emprego: %s [OPCIÓN]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Escriba '%s --help' para máis información.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+"Informe dos erros no programa a <bug-tar@gnu.org>.\n"
+"Informe dos erros na traducción a <proxecto@trasno.net>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Erro do sistema descoñecido"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: a opción \"%s\" precisa dun argumento\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: a opción \"%s\" é ambigua\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: a opción \"--%s\" non admite un argumento\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: a opción \"%c%s\" non admite un argumento\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: a opción \"%s\" precisa dun argumento\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opción \"--%s\" non recoñecida\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opción \"%c%s\" non recoñecida\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opción non admitida -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opción non válida -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: a opción precisa dun argumento -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: a opción \"-W %s\" é ambigua\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: a opción \"-W %s\" non admite un argumento\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "tamaño de bloque"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "memoria esgotada"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Non se pode %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Aviso: Non se pode %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Non se pode cambia-lo modo a %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Non se pode cambia-la propiedade ao uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Non se pode libar a %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Erro de lectura no byte %s, lendo %lu bytes"
+msgstr[1] "%s: Erro de lectura no byte %s, lendo %lu bytes"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Aviso: Erro de lectura no byte %s, lendo %lu bytes"
+msgstr[1] "%s: Aviso: Erro de lectura no byte %s, lendo %lu bytes"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Non se pode saltar a %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Aviso: Non se pode saltar a %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Non se pode crear unha ligazón simbólica a %s"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Graváronse só %lu de %lu bytes"
+msgstr[1] "%s: Graváronse só %lu de %lu bytes"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Eliminadndo o \"%.*s\" inicial dos nomes dos membros"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Eliminadndo o \"%.*s\" inicial dos nomes dos membros"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "Eliminadndo o \"%.*s\" inicial dos nomes dos membros"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "\""
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "\""
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Servicio non dispoñible"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "entrada estándar"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "saída estándar"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Non se pode executar un intérprete de comandos remoto"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Non se pode reservar espacio para o buffer\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Non se pode reservar espacio para o buffer"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Escriba '%s --help' para máis información.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Emprego: %s [OPCIÓN]\n"
+"Manipula unha unidade de fita, aceptando comandos dun proceso remoto.\n"
+"\n"
+" --version Amosar información da versión.\n"
+" --help Amosar esta axuda.\n"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Informe dos erros no programa a <bug-tar@gnu.org>.\n"
+"Informe dos erros na traducción a <proxecto@trasno.net>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Desprazamento fóra de rango"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Desprazamento fóra de rango"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Dirección de desprazamento fóra de rango"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Fin de ficheiro prematura\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Fin de ficheiro prematura"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Comando lixo"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Bytes totais escritos: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Bytes totais escritos: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(canalización)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Valor non válido para record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Non se proporcionou o nome do arquivo"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Non se poden verifica-los arquivos da entrada/saída estándar"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Non se poden actualiza-los arquivos comprimidos"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Punto de control de escritura %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Punto de control de lectura %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "No comezo da cinta, saíndo agora"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Demasiados erros, saíndo"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Bloque desaliñado (%lu bytes) no arquivo"
+msgstr[1] "Bloque desaliñado (%lu bytes) no arquivo"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Tamaño do rexistro = %lu bloques"
+msgstr[1] "Tamaño do rexistro = %lu bloques"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Non se pode recuar no arquivo; pode ser ilexible sen -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: contén un número de volume non válido"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Desbordamento no número de volume"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Prepare o volume #%d para %s e prema enter: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Chegouse á fin de ficheiro onde se esperaba unha resposta do usuario"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "AVISO: O arquivo está incompleto"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [nome] Dar un novo nome de ficheiro para os seguintes volumes\n"
+" q Abortar tar\n"
+" ! Executar outro intérprete de comandos\n"
+" ? Amosar esta lista\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Non hai novos volumes; saíndo.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "O comando \"%s\" fallou"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Isto non semella un arquivo tar"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s non continúa neste volume"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s non continúa neste volume"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s ten un tamaño incorrecto (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Este volume está fora da secuencia"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "O arquivo non está etiquetado para coincidir con %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "O volume %s non coincide con %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "So se puido ler %lu de %lu bytes"
+msgstr[1] "So se puido ler %lu de %lu bytes"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "O contido é diferente"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Fin de ficheiro inesperado no arquivo"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "O tipo de ficheiro é diferente"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "O modo é diferente"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Os uid son diferentes"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Os gid son diferentes"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "A data de modificación é diferente"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "O tamaño é diferente"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Non ligado a %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "A ligazón simbólica é diferente"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "O número de dispositivo é diferente"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verificar "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr ""
+"%s: Tipo de ficheiro \"%c\" descoñecido; trátase coma un ficheiro normal"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "FALLO NA VERIFICACION: detectáronse %d cabeceiras non válidas"
+msgstr[1] "FALLO NA VERIFICACION: detectáronse %d cabeceiras non válidas"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: o ficheiro é o arquivo; non se envorca"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "valor %s fóra do rango de %s %s..%s; substituíndo %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "valor %s fóra do rango de %s %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Xerando cabeceiras octais negativas"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: ficheiro sen cambios; non se envorca"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: ficheiro sen cambios; non se envorca"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: ficheiro sen cambios; non se envorca"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: O ficheiro encolleu %s bytes; enchendo con ceros"
+msgstr[1] "%s: O ficheiro encolleu %s bytes; enchendo con ceros"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: o ficheiro está nun sistema de ficheiros diferente; non se envorca"
+
+#: src/create.c:1217 src/create.c:1228
+#, fuzzy
+msgid "contents not dumped"
+msgstr " (memoria volcada)"
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Tipo de ficheiro descoñecido; ignórase este ficheiro"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " ligazón a %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: ficheiro sen cambios; non se envorca"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: o ficheiro é o arquivo; non se envorca"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Ficheiro eliminado antes da súa lectura"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: o ficheiro é o arquivo; non se envorca"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: o ficheiro cambiou mentres se lía"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: ignórase o socket"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: ignórase a porta"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Pasando á seguinte cabeceira"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Borrando o que non sexan cabeceiras do arquivo"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: a marca de tempo %s está %lu segundos no futuro"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Inconsistencia inesperada ao crea-lo directorio"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Renomeouse o directorio antes de poder estrae-lo seu estado"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Extraendo os ficheiros contiguos coma ficheiros normais"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Tentando extrae-las ligazóns simbólicas coma ligazóns duras"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Lendo %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Non se pode extraer -- o ficheiro é continuación doutro volume"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Fin de ficheiro (EOF) inesperado no arquivo"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr ""
+"%s: Tipo de ficheiro \"%c\" descoñecido, extraéndoo coma ficheiro normal"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Non se puido copiar este ficheiro"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Non se pode renomear a %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "O erro non é recuperable: sáese agora"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Renomeouse o directorio"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Renomeouse o directorio"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: O directorio é novo"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Marca de tempo non válida"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Proporcionouse na opción un modo non válido"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Número de dispositivo non válido"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Número de inode non válido"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "Erro de lectura en %s"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Fin de ficheiro (EOF) inesperado no arquivo"
+
+#: src/incremen.c:872 src/incremen.c:912
+#, fuzzy
+msgid "Unexpected field value in snapshot file"
+msgstr "Fin de ficheiro (EOF) inesperado no arquivo"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Non se pode reservar memoria para o factor de bloqueo %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: o ficheiro está nun sistema de ficheiros diferente; non se envorca"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Borrando %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Non se pode eliminar"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Omitíndoo"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "bloque %s: ** Bloque de nulos **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "bloque %s: ** Fin de Ficheiro **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "bloque %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr ""
+"Atopáronse espacios na cabeceira onde se esperaba un valor númerico de %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"O valor octal do arquivo %.*s está fóra do rango de %s; suponse complemento "
+"a 2"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "O valor octal do arquivo %.*s está fóra do rango de %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "O arquivo contén cabeceiras base-64 obsoletas"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "A cadea base-64 asinada do arquivo %s está fóra do rango de %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "O valor base-256 do arquivo está fóra do rango de %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "O arquivo contén %.*s onde se esperaba un valor numérico de %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "O valor do arquivo %s está fóra do rango de %s %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " ligazón a %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " Tipo de ficheiro %s descoñecido\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Cabeceira de Volume--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Continúa no byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Creando o directorio:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Renomeando %s a %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Non se pode renomear a %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Renomeando %s a %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Non se pode armacena-lo directorio de traballo"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Non se pode cambia-lo directorio de traballo"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "proceso fillo"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "canle interproceso"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Non atopado no arquivo"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Non atopado no arquivo"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "As opcións \"-%s\" e \"-%s\" precisan da entrada estándar"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Grupo non válido"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Quérense as características de GNU no formato de arquivo incompatible"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Emprego: %s [OPCIÓN]... [FICHEIRO]...\n"
+"\n"
+"Exemplos:\n"
+" %s -cf arquivo.tar pepe xoan # Crear arquivo.tar dos ficheiros pepe e "
+"xoan.\n"
+" %s -tvf arquivo.tar # Listar tódolos ficheiros de arquivo.tar\n"
+" # dando moitos datos\n"
+" %s -xf arquivo.tar # Extraer tódolos ficheiros de arquivo.tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+"O sufixo de copia de seguridade é \"~\", agás se se cambia con --suffix ou\n"
+"SIMPLE_BACKUP_SUFFIX. O control de versións pode estabrecerse con --backup "
+"ou\n"
+"VERSION_CONTROL, os valores son:\n"
+"\n"
+" t, numbered crea copias de seguridade numeradas\n"
+" nil, existing numera se existen copias de seguridade numeradas\n"
+" never, simple sempre fai copias de seguridade sinxelas\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Fin de ficheiro inesperado no arquivo"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+#, fuzzy
+msgid "remove files after adding them to the archive"
+msgstr "Borrando a especificación de unidade dos nomes do arquivo"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Erro ao gravar na saída estándar"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Non se pode verifica-los arquivos multi-volume"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Arquivar da entrada estándar"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s: o ficheiro é o arquivo; non se envorca"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s: o ficheiro é o arquivo; non se envorca"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Non se pode cambia-lo directorio de traballo"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Eliminadndo o \"%.*s\" inicial dos nomes dos membros"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "O volume %s non coincide con %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+#, fuzzy
+msgid "ask for confirmation for every action"
+msgstr "Non se puido le-la confirmación do usuario"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Non pode especificar máis dunha das opcións \"-Acdtrux\""
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Opcións de compresión conflictivas"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " Tipo de ficheiro %s descoñecido\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Non se atopou o ficheiro de data"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Substituíndo o formato de data descoñecido %2$s por %1$s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: o ficheiro é o arquivo; non se envorca"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Factor de bloqueo non válido"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Aviso: a opción -I non está soportada; ¿quería dicir -j ou -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Lonxitude da fita non válida"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Máis dunha data de umbral"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Grupo non válido"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Proporcionouse na opción un modo non válido"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "Número de inode non válido"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Propietario non válido"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Tamaño de rexistro non válido"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "O tamaño do rexistro debe ser múltiplo de %d."
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "Lonxitude da fita non válida"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Patrón descoñecido `%s'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Opcións `-[0-7][lmh]' non soportadas por *este* tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "A antiga opción \"%c\" precisa dun argumento."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Varios ficheiros de arquivo requiren a opción \"-M\""
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Non se pode combinar --listed-incremental con --newer"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: A etiqueta do volume é longa de máis (o límite é %lu bytes)"
+msgstr[1] "%s: A etiqueta do volume é longa de máis (o límite é %lu bytes)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Non se pode verifica-los arquivos multi-volume"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Non se poden verifica-los arquivos comprimidos"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Non se poden empregar arquivos comprimidos multi-volume"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Non se poden actualiza-los arquivos comprimidos"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "De xeito cobarde rexéitase crear un ficheiro baleiro"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "As opcións \"-Aru\" son incompatibles con \"-f -\""
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Debe especificar unha das opcións \"-Acdtrux\""
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Saída por erro retrasada dos erros anteriores"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: O ficheiro encolleu %s bytes"
+msgstr[1] "%s: O ficheiro encolleu %s bytes"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "A cadea base-64 asinada do arquivo %s está fóra do rango de %s"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "O valor do arquivo %s está fóra do rango de %s %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Xera-los ficheiros de datos para a suite de probas de GNU tar.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Opcións de compresión conflictivas"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Erro ao gravar na saída estándar"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+#, fuzzy
+msgid "Update the access and modification times of FILE"
+msgstr "%s: Non se puido cambia-la hora de acceso e modificación"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Marca de tempo non válida"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Número de inode fóra de rango"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Erro do sistema descoñecido"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "Non se puido abrir %s"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "Non se puido executar %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr "Patrón descoñecido `%s'"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "Non se puido evalua-lo ficheiro %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "O fillo morreu co sinal %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Nomes de ficheiro alterados--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close"
+#~ msgstr "Non se pode pechar"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Non se pode duplicar"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Non se pode empregar arquivos comprimidos ou remotos"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (fillo)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (neto)"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "AVISO: Non hai unha cabeceira de volume"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "O fillo devolveu o estado %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Os nomes dos membros conteñen \"..\""
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: O nome do membro contén \"..\""
+
+#~ msgid "Visible long name error"
+#~ msgstr "Erro no nome longo visible"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Marca de tempo fóra de rango"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Número de dispositivo fóra de rango"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Erro de nome longo visible"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Fin de ficheiro inesperado nos nomes alterados"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Renomeado %s a %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Non se pode crear unha ligazón simbólica a %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Creada unha ligazón simbólica de %s a %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Comando de corrección %s descoñecido"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Falta o nome de ficheiro despois de -C"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Este programa vén SEN GARANTÍA, ata o permitido pola lei. Pode "
+#~ "redistribuílo\n"
+#~ "baixo os termos da Licencia Pública Xeral de GNU; vexa o ficheiro "
+#~ "chamado\n"
+#~ "COPYING para máis detalles."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Comando lixo %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU `tar' armacena varios ficheiros xuntos nun só arquivo en fita ou "
+#~ "disco, e\n"
+#~ "pode restaurar ficheiros individuais do arquivo.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Se unha opción longa ten un argumento obrigatorio, tamén o é para a\n"
+#~ "opción curta equivalente. A mesma regra para os argumentos opcionais.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modo de operación principal:\n"
+#~ " -t, --list lista o contido dun arquivo\n"
+#~ " -x, --extract, --get extrae ficheiros dun arquivo\n"
+#~ " -c, --create crea un novo arquivo\n"
+#~ " -d, --diff, --compare busca diferencias entre o arquivo e o sistema\n"
+#~ " de ficheiros\n"
+#~ " -r, --append engade ficheiros na fin do arquivo\n"
+#~ " -u, --update só engade ficheiros máis novos cá copia do "
+#~ "arquivo\n"
+#~ " -A, --catenate engade ficheiros tar a un arquivo\n"
+#~ " --concatenate igual que -A\n"
+#~ " --delete borra do arquivo (¡non en fitas!)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modificadores de operación:\n"
+#~ " -W, --verify tenta verifica-lo arquivo despois de "
+#~ "escribilo\n"
+#~ " --remove-files borra os ficheiros despois de engadilos no "
+#~ "arquivo\n"
+#~ " -k, --keep-old-files non sobrescribe ficheiros existentes ao "
+#~ "extraer\n"
+#~ " --overwrite sobrescribe os ficheiros existentes ao "
+#~ "extraer\n"
+#~ " --overwrite sobrescribe metadatos dos directorios ao "
+#~ "extraer\n"
+#~ " -U, --unlink-first borra cada ficheiro antes de extraer sobre "
+#~ "el\n"
+#~ " --recursive-unlink borra a árbore de directorios antes de "
+#~ "extraer\n"
+#~ " -S, --sparse manexa eficientemente os ficheiros "
+#~ "dispersos\n"
+#~ " -O, --to-stdout extrae os ficheiros á saída estándar\n"
+#~ " -G, --incremental trata os antigos arquivos incrementais GNU\n"
+#~ " -g, --listed-incremental trata os novos arquivos incrementais GNU\n"
+#~ " --ignore-failed-read non saír con erro polos ficheiros ilexibles\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Manexo dos atributos dos ficheiros:\n"
+#~ " --owner=NOME forza NOME coma dono dos ficheiros "
+#~ "engadidos\n"
+#~ " --group=NOME forza NOME como grupo dos ficheiros "
+#~ "engadidos\n"
+#~ " --mode=CAMBIOS forza o modo CAMBIOS para os ficheiros "
+#~ "engadidos\n"
+#~ " --atime-preserve non cambia as datas de acceso dos "
+#~ "ficheiros\n"
+#~ " -m, --modification-time non extrae a data de modificación dos "
+#~ "ficheiros\n"
+#~ " --same-owner tenta extrae-los ficheiros co mesmo "
+#~ "propietario\n"
+#~ " --no-same-owner extrae-los ficheiros coma o usuario "
+#~ "actual\n"
+#~ " --numeric-owner sempre usa números para os nomes de dono/"
+#~ "grupo\n"
+#~ " -p, --same-permissions extrae toda a información dos permisos\n"
+#~ " --no-same-permissions non extrae a información dos permisos\n"
+#~ " --preserve-permissions igual que -p\n"
+#~ " -s, --same-order ordea os nomes a extraer igual que os do "
+#~ "arquivo\n"
+#~ " --preserve-order igual que -s\n"
+#~ " --preserve igual que -p e -s ao mesmo tempo\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selección e cambio de dispositivo:\n"
+#~ " -f, --file=ARQUIVO usa o ficheiro ou o dispositivo ARQUIVO\n"
+#~ " --force-local arquivo local incluso cun signo de dous "
+#~ "puntos\n"
+#~ " --rsh-command=COMANDO emprega-lo COMANDO remoto no canto de "
+#~ "rsh\n"
+#~ " -[0-7][lmh] especificar unidade e densidade\n"
+#~ " -M, --multi-volume crear/listar/extraer un arquivo multi-"
+#~ "volume\n"
+#~ " -L, --tape-length=NUM cambia-la fita tras gravar NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FICH executa-lo script tras cada fita "
+#~ "(implica -M)\n"
+#~ " --new-volume-script=FICH o mesmo que -F FICH\n"
+#~ " --volno-file=FICH usar/actualizar o número de volume en "
+#~ "FICH\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Bloqueo dos dispositivos:\n"
+#~ " -b, --blocking-factor=BLOQUES BLOQUES x 512 bytes por rexistro\n"
+#~ " --record-size=TAM TAM bytes por rexistro, múltiplo de 512\n"
+#~ " -i, --ignore-zeros ignora-los bloques de ceros do arquivo\n"
+#~ " -B, --read-full-records cambia-lo factor de blocaxe mentres se "
+#~ "le\n"
+#~ "\t\t\t (para canalizacións 4.2BSD)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selección do formato do arquivo:\n"
+#~ " -V, --label=NOME crear un arquivo co nome de volume "
+#~ "NOME\n"
+#~ " PATRÓN ao listar/extraer, emprega-lo "
+#~ "PATRÓN\n"
+#~ " -o, --old-archive, --portability escribir un arquivo con formato V7\n"
+#~ " --posix escribir un arquivo con formato "
+#~ "POSIX\n"
+#~ " -j, --bzip2 filtra-lo arquivo por bzip2\n"
+#~ " -z, --gzip, --ungzip filtra-lo arquivo por gzip\n"
+#~ " -Z, --compress, --uncompress filtra-lo arquivo por compress\n"
+#~ " --use-compress-program=PROG filtra-lo arquivo polo PROGrama\n"
+#~ " (debe aceptar -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selección de ficheiros locais:\n"
+#~ " -C, --directory=DIR cambiar ó directorio DIR\n"
+#~ " -T, --files-from=FICH obte-los nomes a extraer ou engadir do "
+#~ "FICHeiro\n"
+#~ " --null -T le nomes terminados en nulo, desactiva -"
+#~ "C\n"
+#~ " --exclude=PATRÓN excluir ficheiros, dados coma un PATRÓN\n"
+#~ " -X, --exclude-from=FICH patróns de exclusión listados no FICHeiro\n"
+#~ " --anchored os patróns de exclusión encaixan no "
+#~ "principio\n"
+#~ " do nome do ficheiro (por defecto)\n"
+#~ " --no-anchored os patróns de exclusión encaixan despois "
+#~ "de /\n"
+#~ " --ignore-case exclusión que ignora maiúsculas/"
+#~ "minúsculas\n"
+#~ " --no-ignore-case exclusión que distingue maiúsculas/"
+#~ "minúsculas\n"
+#~ " --wildcards os patróns de exclusión empregan comodíns\n"
+#~ " --wildcards-match-slash os patróns de exclusión encaixan en / "
+#~ "(def.)\n"
+#~ " --no-wildcards-match-slash os patróns de exclusión non encaixan "
+#~ "en /\n"
+#~ " -P, --absolute-names non elimina-las / iniciais dos nomes de "
+#~ "ficheiro\n"
+#~ " -h, --dereference envorca-los ficheiros aos que levan as "
+#~ "ligazóns\n"
+#~ " --no-recursion evita-lo descenso pola árbore de "
+#~ "directorios\n"
+#~ " -l, --one-file-system quedar no sistema de ficheiros local\n"
+#~ " ao crea-lo arquivo\n"
+#~ " -K, --starting-file=NOME comeza-lo arquivo polo ficheiro NOME\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATA gravar só os ficheiros posteriores á DATA\n"
+#~ " --newer-mtime comparar data e hora só cando cambien os "
+#~ "datos\n"
+#~ " --after-date=DATA o mesmo que -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=CONTROL] copiar antes de borrar, escoller control\n"
+#~ " de versións\n"
+#~ " --suffix=SUFIXO copiar antes de borrar, ignora-lo sufixo "
+#~ "normal\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Mensaxes informativas:\n"
+#~ " --help amosar esta axuda e saír\n"
+#~ " --version amosa-lo número de versión de tar e saír\n"
+#~ " -v, --verbose lista-los ficheiros procesados\n"
+#~ " --checkpoint escribi-los nomes dos directorios ao le-lo "
+#~ "arquivo\n"
+#~ " --totals indica-los bytes totais escritos ao crea-lo "
+#~ "arquivo\n"
+#~ " -R, --block-number amosa-lo número do bloque no arquivo en cada "
+#~ "mensaxe\n"
+#~ " -w, --interactive pedir confirmación para cada acción\n"
+#~ " --confirmation o mesmo que -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar non pode ler nin producir arquivos `--posix'. Se a variable de\n"
+#~ "ambiente POSIXLY_CORRECT existe, as extensións GNU quedan desactivadas "
+#~ "coa\n"
+#~ "opción `--posix'.\n"
+#~ "\n"
+#~ "O soporte de POSIX está só parcialmente implementado, non se fíe dela "
+#~ "aínda.\n"
+#~ "ARQUIVO pode ser un FICHEIRO, SERVIDOR:FICHEIRO ou USUARIO@SERVIDOR:"
+#~ "FICHEIRO;\n"
+#~ "DATA pode ser unha data textual ou un nome de ficheiro que comeza por \"/"
+#~ "\" ou\n"
+#~ "\".\"; neste caso emprégase a data do ficheiro.\n"
+#~ "As opcións por defecto *deste* tar son \"-f%s -b%d\".\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Opción obsoleta, agora implicada por --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Nome de opción obsoleta substituído por --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Nome de opción obsoleta substituído por --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Nome de opción obsoleta substituído por --touch"
+
+#~ msgid "Conflicting archive format options"
+#~ msgstr "Opcións de formato de arquivo conflictivas"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Nome de opción obsoleta substituído por --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Nome de opción obsoleta substituído por --block-number"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Aviso: a opción -y non está soportada; ¿quería dicir -j?"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Nome de opción obsoleta substituído por --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Escrito por John Gilmore e Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Se unha opción longa ten un argumento obrigatorio, tamén o é para a "
+#~ "opción\n"
+#~ "curta equivalente.\n"
+#~ "\n"
+#~ " -l, --file-length=LONXIT LONXITude do ficheiro xerado\n"
+#~ " -p, --pattern=PATRÓN PATRÓN é \"default\" ou \"zeros\"\n"
+#~ " --help amosar esta axuda e saí\n"
+#~ " --version amosar información sobre a versión e saír\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Escrito por François Pinard"
+
+#~ msgid "Cannot close descriptor %d"
+#~ msgstr "Non se puido cerra-lo descriptor %d"
+
+#~ msgid "Cannot properly duplicate %s"
+#~ msgstr "Non se puido duplicar %s"
+
+#~ msgid "Cannot open pipe"
+#~ msgstr "Non se puido crear unha canalización"
+
+#~ msgid "Cannot fork"
+#~ msgstr "Non se puido bifurcar"
+
+#~ msgid "(child) Pipe to stdin"
+#~ msgstr "(fillo) Canalizar da entrada estándar"
+
+#~ msgid "Cannot open archive %s"
+#~ msgstr "Non se puido abri-lo arquivo %s"
+
+#~ msgid "Archive to stdout"
+#~ msgstr "Arquivar á saída estándar"
+
+#~ msgid "Child cannot fork"
+#~ msgstr "O fillo non puido ser bifurcado"
+
+#~ msgid "((child)) Pipe to stdout"
+#~ msgstr "((fillo)) Canalizar á saída estándar"
+
+#~ msgid "(grandchild) Pipe to stdin"
+#~ msgstr "(neto) Canalizar da entrada estándar"
+
+#~ msgid "Cannot read from compression program"
+#~ msgstr "Non se puido ler dende o programa de compresión"
+
+#~ msgid "(child) Pipe to stdout"
+#~ msgstr "(fillo) Canalizar á saída estándar"
+
+#~ msgid "((child)) Pipe to stdin"
+#~ msgstr "((fillo)) Canalización da entrada estándar"
+
+#~ msgid "(grandchild) Pipe to stdout"
+#~ msgstr "(neto) Canalización á saída estándar"
+
+#~ msgid "Cannot write to compression program"
+#~ msgstr "Non se puido escribir no programa de compresión"
+
+#~ msgid "Write to compression program short %d bytes"
+#~ msgstr "Quedan %d bytes por escribir ao programa de compresión"
+
+#~ msgid "Only wrote %u of %u bytes to %s"
+#~ msgstr "Só escritos %u dun total de %u bytes en %s"
+
+#~ msgid "Archive %s EOF not on block boundary"
+#~ msgstr ""
+#~ "A fin do ficheiro (EOF) do arquivo %s non se atopa no límite do bloque"
+
+#~ msgid "Only read %d bytes from archive %s"
+#~ msgstr "So lidos %d bytes do arquivo %s"
+
+#~ msgid "WARNING: Cannot close %s (%d, %d)"
+#~ msgstr "ATENCIÓN: Non se puido cerrar %s (%d, %d)"
+
+#~ msgid "Cannot fork!"
+#~ msgstr "¡Non se puido bifurcar!"
+
+#~ msgid "Cannot exec a shell %s"
+#~ msgstr "Non se puido executar un intérprete de comandos %s"
+
+#~ msgid "Removing leading `/' from absolute path names in the archive"
+#~ msgstr "Borrando o caracter '/' inicial das rutas absolutas do arquivo"
+
+#~ msgid "Wrote %ld of %ld bytes to file %s"
+#~ msgstr "Escritos %ld de %ld bytes no ficheiro %s"
+
+#~ msgid "Amount actually written is (I hope) %d.\n"
+#~ msgstr "Actualmente escritos (espero) %d.\n"
+
+#~ msgid "Cannot add file %s"
+#~ msgstr "Non se puido engadi-lo ficheiro %s"
+
+#~ msgid "Cannot add directory %s"
+#~ msgstr "Non se puido engadi-lo directorio %s"
+
+#~ msgid "Cannot open directory %s"
+#~ msgstr "Non se puido abri-lo directorio %s"
+
+#~ msgid "File name %s%s too long"
+#~ msgstr "O nome do ficheiro %s%s é demasiado longo"
+
+#~ msgid "Could not allocate memory for diff buffer of %d bytes"
+#~ msgstr ""
+#~ "Non se puido reservar memoria para un buffer de diferencias de %d bytes"
+
+#~ msgid "Data differs"
+#~ msgstr "Datos diferentes"
+
+#~ msgid "File does not exist"
+#~ msgstr "O ficheiro non existe"
+
+#~ msgid "Not a regular file"
+#~ msgstr "Non é un ficheiro normal"
+
+#~ msgid "Error while closing %s"
+#~ msgstr "Erro mentres se cerraba %s"
+
+#~ msgid "Does not exist"
+#~ msgstr "Non existe"
+
+#~ msgid "No such file or directory"
+#~ msgstr "Non se atopa o ficheiro ou directorio"
+
+#~ msgid "Mode or device-type changed"
+#~ msgstr "O modo ou o tipo do dispositivo cambiaron"
+
+#~ msgid "No longer a directory"
+#~ msgstr "Xa non é un directorio"
+
+#~ msgid "Cannot open file %s"
+#~ msgstr "Non se puido abrir o ficheiro %s"
+
+#~ msgid "Cannot seek to %ld in file %s"
+#~ msgstr "No se puido posicionar en %ld no ficheiro %s"
+
+#~ msgid "Could not rewind archive file for verify"
+#~ msgstr "Non se puido rebobinar-lo ficheiro de arquivo para verificar"
+
+#~ msgid "Could not re-position archive file"
+#~ msgstr "Non se puido reposicionar o ficheiro de arquivo"
+
+#~ msgid "%s: Cannot lchown to uid %d gid %d"
+#~ msgstr "%s: Non se puido facer lchown a uid %d e gid %d"
+
+#~ msgid "%s: Cannot chown to uid %d gid %d"
+#~ msgstr "%s: Non se puido facer chown a uid %d e gid %d"
+
+#~ msgid "%s: Could not write to file"
+#~ msgstr "%s: Non se puido escribir no ficheiro"
+
+#~ msgid "%s: Could not create file"
+#~ msgstr "%s: Non se puido crea-lo ficheiro"
+
+#~ msgid "%d at %d\n"
+#~ msgstr "%d a %d\n"
+
+#~ msgid "%s: Error while closing"
+#~ msgstr "%s: Erro pechando"
+
+#~ msgid "%s: Could not link to `%s'"
+#~ msgstr "%s: Non se puido enlazar a %s"
+
+#~ msgid "%s: Could not make node"
+#~ msgstr "%s: Non se puido facer un nodo"
+
+#~ msgid "%s: Could not make fifo"
+#~ msgstr "%s: Non se puido facer un fifo"
+
+#~ msgid "%s: Could not create directory"
+#~ msgstr "%s: No se puido crear un directorio"
+
+#~ msgid "Added write and execute permission to directory %s"
+#~ msgstr "Engadidos permisos de lectura e escritura ó directorio %s"
+
+#~ msgid "Could not get current directory"
+#~ msgstr "Non se puido obte-lo directorio actual"
+
+#~ msgid "Could not get current directory: %s"
+#~ msgstr "Non se puido obte-lo directorio actual: %s"
+
+#~ msgid "File name %s/%s too long"
+#~ msgstr "O nome de ficheiro %s/%s é demasiado longo"
+
+#~ msgid "Cannot chdir to %s"
+#~ msgstr "Non se puido ir ao directorio %s"
+
+#~ msgid "Error while deleting %s"
+#~ msgstr "Erro durante o borrado de %s"
+
+#~ msgid "Hmm, this doesn't look like a tar archive"
+#~ msgstr "Hum, isto non semella un arquivo tar"
+
+#~ msgid "Skipping to next file header"
+#~ msgstr "Pasando á seguinte cabeceira de ficheiro"
+
+#~ msgid "EOF in archive file"
+#~ msgstr "Fin de ficheiro (EOF) no ficheiro de arquivo"
+
+#~ msgid "Only wrote %ld of %ld bytes to file %s"
+#~ msgstr "Só se escribiron %ld de %ld bytes no ficheiro %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [OPTION]... [FILE]...\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Uso: %s [[OPTION]... [FICHEIRO]...\n"
+
+#~ msgid "Invalid group given on option"
+#~ msgstr "Grupo incorrecto dado na opción"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, "
+#~ "Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, "
+#~ "Inc.\n"
+
+#~ msgid ""
+#~ "This is free software; see the source for copying conditions. There is "
+#~ "NO\n"
+#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR "
+#~ "PURPOSE.\n"
+#~ msgstr ""
+#~ "Iso é software libre; vexa o código fonte para as condicións de copia. "
+#~ "NON hai\n"
+#~ "garantía; nin sequera de MERCABILIDADE ou IDONEIDADE PARA UNHA FIN "
+#~ "PARTICULAR.\n"
+
+#~ msgid "Read error at byte %ld reading %d bytes in file %s"
+#~ msgstr "Erro de lectura no byte %ld lendo %d bytes no ficheiro %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Written by François Pinard <pinard@iro.umontreal.ca>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Escrito por François Pinard <pinard@iro.umontreal.ca>.\n"
diff --git a/po/hr.gmo b/po/hr.gmo
new file mode 100644
index 0000000..6a71f22
--- /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..41a329d
--- /dev/null
+++ b/po/hr.po
@@ -0,0 +1,2880 @@
+# GNU tar .po message translation file for hr_HR locale
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Mirsad Todorovac <mtodorov_69@yahoo.com>, 2002.
+# ... wishes to thank everybody who helped in good faith.
+#
+# Well, in 03:12 hrs (for 1st pass)!! who beats me I owe him a pizza ;-) -- TM
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.13.25\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2002-04-26 10:49+MET(DST)(UTC+2)\n"
+"Last-Translator: Mirsad Todorovac <mtodorov_69@yahoo.com>\n"
+"Language-Team: Croatian <lokalizacija@linux.hr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "pogre¹an argument %s za %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "nejednoznaèan argument %s za %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Ispravni argumenti su:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Kori¹tenje: %s [OPCIJA]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Poku¹ajte `%s --help' za vi¹e informacija.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+"Prijavi gre¹ke i bugove na <bug-tar@gnu.org>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Nepoznata pogre¹ka u sistemu"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: za opciju `%s' neophodan je argument\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: opcija `%s' nije jednoznaèna\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: opcija `--%s' ne dozvoljava argument\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: opcija `%c%s' ne dozvoljava argument\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: za opciju `%s' neophodan je argument\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: ne prepoznajem opciju `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: ne prepoznajem opciju `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ilegalna opcija -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: pogre¹na opcija -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opcija zahtijeva neophodan argument -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: opcija `-W %s' nije jednoznaèna\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: opcija `-W %s' ne dozvoljava argument\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "velièina bloka"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "iscrpljena memorija"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Ne mogu %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Upozorenje: Ne mogu %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Ne mogu promijeniti mod u %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Ne mogu promijeniti vlasni¹tvo na uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Ne mogu napraviti hard link na %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Pogre¹ka u èitanju na bajtu %s, èitam %lu bajtova"
+msgstr[1] "%s: Pogre¹ka u èitanju na bajtu %s, èitam %lu bajtova"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Upozorenje: Pogre¹ka u èitanju na bajtu %s, èitam %lu bajtova"
+msgstr[1] "%s: Upozorenje: Pogre¹ka u èitanju na bajtu %s, èitam %lu bajtova"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Neuspjeli seek na %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Upozorenje: Neuspjeli seek na %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Ne mogu kreirati simbolièki link prema %s"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Upsje¹no zapisao samo %lu od %lu bajtova"
+msgstr[1] "%s: Upsje¹no zapisao samo %lu od %lu bajtova"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Uklanjam vodeæe `%.*s' iz imena èlanova"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Uklanjam vodeæe `%.*s' iz imena èlanova"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "Uklanjam vodeæe `%.*s' iz imena èlanova"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr ""
+
+#
+# MT -- FIXME -- for now this is left untranslated, until we
+# come to UTF-8 or something alike (20020412)
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Servis nije dostupan"
+
+# FIXME -- verify against source
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin -- standardni ulaz"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout -- standardni ulaz"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Ne mogu pokrenuti udaljenu (remote) ljusku"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Ne mogu alocirati prostor za meðuspremnik\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Ne mogu alocirati prostor za meðuspremnik"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Poku¹ajte `%s --help' za vi¹e informacija.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Kori¹tenje: %s [OPCIJA]\n"
+"Upravljaj jedinicom trake, prihvaæajuæi naredbe od udaljenih procesa.\n"
+"\n"
+" --version Informacije o verziji programskih ispisa.\n"
+" --help Ispi¹i ovu pomoæ.\n"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Prijavi gre¹ke i bugove na <bug-tar@gnu.org>.\n"
+
+# FIXME -- find xlation for 'seek offset' -- TM
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Seek ofset izvan opsega"
+
+# FIXME -- find xlation for 'seek offset' -- TM
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Seek ofset izvan opsega"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Seek smjer izvan opsega"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Prerani eof\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Prerani kraj datoteke"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Neispravna naredba"
+
+# FIXME -- ovo neæe raditi ako je prevedeno -- Denis?
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Ukupno ispisano bajtova: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+# FIXME -- ovo neæe raditi ako je prevedeno -- Denis?
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Ukupno ispisano bajtova: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(cjevovod - pipe)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Pogre¹na vrijednost za record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Nije dano ime arhive"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ne mogu verificirati stdin/stdout arhive"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Ne mogu a¾urirati komprimirane arhive"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Toèka provjere ispisa %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Toèka provjere èitanja %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Poèetak trake, zavr¹avam"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Previ¹e pogre¹aka, zavr¹avam"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Neporavnat (unaligned) blok (%lu bajtova) unutar arhive"
+msgstr[1] "Neporavnat (unaligned) blok (%lu bajtova) unutar arhive"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Velièina sloga = %lu blokova"
+msgstr[1] "Velièina sloga = %lu blokova"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Ne mogu se pomicati unazad unutar arhive; mo¾e biti neèitljiva bez -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: sadr¾i pogre¹an broj dijela arhive"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Prekoraèenje u broju dijela arhive"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Pripremite dio arhive #%d za %s i pritisni <RETURN>:"
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Naðen EOF gdje sam oèekivao odgovor korisnika"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "UPOZORENJE: Arhiva nije kompletirana"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [ime] Daj novo ime datoteke za slijedeæi (i nadovezujuæe) dijelove\n"
+" q Zavr¹i tar\n"
+" ! Pokreni podljusku operativnog sistema\n"
+" ? Ispi¹i ovu listu\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Nema novog dijela arhive; zavr¹avam.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "Neuspjela `%s' naredba"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Ovo ne izgleda kao tar arhiva"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s nije nastavljen za ovom dijelu arhive"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s nije nastavljen za ovom dijelu arhive"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s je pogre¹ne velièine (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Ovaj dio arhive je izvan slijeda"
+
+# FIXME -- clean against source! (TM)
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arhiva nije oznaèena labelom da odgovara %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Dio arhive %s ne odgovara %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Uspio proèitati samo %lu od %lu bajtova"
+msgstr[1] "Uspio proèitati samo %lu od %lu bajtova"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Sadr¾aji se razlikuju"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Neoèekivani EOF u arhivi"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Tipovi datoteka se razlikuju"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Mod se razlikuje"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid se razlikuje"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid se razlikuje"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Mod time (vrijeme modifikacije) se razlikuje"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Velièina se razlikuje"
+
+# FIXME -- language purists might lynch me for this "polinkan" -- TM
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Nije polinkan na %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Simbolièki link se razlikuje"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Broj ureðaja (device number) se razlikuje"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verificiraj "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Nepoznat tip datoteke '%c', diff-iran kao normalna datoteka"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "NEUSPJELA VERIFIKACIJA: detektirano %d pogre¹nih zaglavlja"
+msgstr[1] "NEUSPJELA VERIFIKACIJA: detektirano %d pogre¹nih zaglavlja"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: datoteka je arhiva; ne arhiviram ju"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "vrijednost %s izvan %s raspona %s..%s; substituiram %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "vrijednost %s izvan %s raspona %s..%s"
+
+# FIXME -- find `pade¾' here from source
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Generiram negativna oktalna zaglavlja"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: datoteka nepromijenjena; ne arhiviram ju"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: datoteka nepromijenjena; ne arhiviram ju"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: datoteka nepromijenjena; ne arhiviram ju"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Datoteka se skratila za %s bajtova; nadopunjujemo nulama"
+msgstr[1] "%s: Datoteka se skratila za %s bajtova; nadopunjujemo nulama"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: datoteka je na drugom datoteènom sustavu; ne arhiviram ju"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Nepoznat tip datoteke; datoteka ignorirana"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " link do %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: datoteka nepromijenjena; ne arhiviram ju"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: datoteka je arhiva; ne arhiviram ju"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Datoteka uklonjena (removed) prije nego ¹to smo ju proèitali"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: datoteka je arhiva; ne arhiviram ju"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: datoteka se promijenila dok smo ju èitali"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: socket ignoriran"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: door ignoriran"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Preskaèem do slijedeæeg zaglavlja"
+
+# FIXME -- non-header dubious -- clean against source! -- TM
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Bri¹em neispravno zaglavlje iz arhive"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: oznaka vremena %s je %lu sekundi u buduænost"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Neoèekivana nekonzistentnost kod otvaranja direktorija"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Direktoriju promijenjeno ime prije nego ¹to mu je dobavljen status"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Ekstrahiram neprekinute datoteke kao regularne datoteke"
+
+# FIXME -- 'hard links' -- TM
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Poku¹avam ekstrakciju simbolièkih linkova kao hard linkova"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Èitam %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr ""
+"%s: Ne mogu ekstrahirati -- datoteka se nastavlja iz drugog dijela arhive"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Neoèekivan EOF u mangliranim imenima"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Nepoznat tip datoteke '%c', ekstrahiran kao normalna datoteka"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Nisam uspio napraviti backup ove datoteke"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Ne mogu preimenovati u %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Gre¹ka iz koje se ne mogu oporaviti: zavr¹avam s radom"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Direktoriju promijenjeno ime"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Direktoriju promijenjeno ime"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Novi direktorij"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Pogre¹na oznaka vremena"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Pogre¹an mod dan opcijom"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Pogre¹an broj ureðaja"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Pogre¹an inode broj"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Neoèekivani EOF u arhivi"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+# FIXME -- blocking factor -- can't translate (ask others) -- TM
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Ne mogu alocirati memoriju za faktor pakiranja u blokove %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: datoteka je na drugom datoteènom sustavu; ne arhiviram ju"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Bri¹em %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Ne mogu obrisati"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Izostavljam"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** Blok ispunjen NULama **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok %s: ** Kraj datoteke **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Razmaci u zaglavlju gdje se oèekuje numerièka %s vrijednost"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Oktalna vrijednost %.*s iz arhive je izvan %s opsega; pretpostavljam dvojni "
+"komplement"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Oktalna vrijednost iz arhive %.*s je izvan %s opsega"
+
+# FIXME -- obsolescent -- TM
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Arhiva sadr¾i base-64 zaglavlja zastarjelog formata"
+
+# FIXME??
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Base-64 vrijednost s predznakom %s iz arhive je izvan %s opsega"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Base-256 vrijednost iz arhive je izvan %s opsega"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arhiva sadr¾i %.*s gdje je oèekivana numerièka %s vrijednost"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Vrijednost %s iz arhive je izvan %s opsega %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " link do %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " nepoznat tip datoteke %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Zaglavlje dijela arhive--\n"
+
+# FIXME -- clarify against source -- TM
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Nastavljeno s bajtom %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Kreiram direktorij:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Preimenujem %s u %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Ne mogu preimenovati u %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Preimenujem %s natrag u %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Ne mogu pohraniti radni direktorij"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Ne mogu promijeniti radni direktorij"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "podproces"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "meðuprocesni kanal"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Nije naðeno u arhivi"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Nije naðeno u arhivi"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Opcije `-%s' i `-%s' obje zahtijevaju standardni ulaz"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Pogre¹na grupa"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU specijalne pogodnosti zatra¾ene na nekompatibilnom formatu arhive"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Usage: %s [OPCIJA]... [DATOTEKA]...\n"
+"\n"
+"Primjeri:\n"
+" %s -cf arhiva.tar foo bar # Kreiraj arhiva.tar od datoteka foo i bar.\n"
+" %s -tvf arhiva.tar # Ispi¹i redom sve datoteke iz arhiva.tar "
+"op¹irno.\n"
+" %s -xf arhiva.tar # Ekstrahiraj sve datoteke iz arhiva.tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+"Backup sufiks je `~', osim ako je postavljen drugi s --suffix ili\n"
+"SIMPLE_BACKUP_SUFFIX. Kontrola verzije mo¾e biti postavljena s --backup\n"
+"ili s VERSION_CONTROL, vrijednosti su:\n"
+"\n"
+" t, numbered radi pobrojane (numbered) backup-e\n"
+" nil, existing pobrojani ako pobrojani veæ postoje, inaèe jednostavni\n"
+" never, simple uvijek radi jednostavne backupe\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Neoèekivani EOF u arhivi"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Pogre¹ka u pisanju na standardni izlaz"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+# FIXME -- volume -- find more suitable (ask others) -- TM
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Ne mogu verificirati vi¹edjelne arhive"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Konfliktne opcije formata arhive"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s: datoteka je arhiva; ne arhiviram ju"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s: datoteka je arhiva; ne arhiviram ju"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Ne mogu promijeniti radni direktorij"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Uklanjam vodeæe `%.*s' iz imena èlanova"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Dio arhive %s ne odgovara %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Ne mo¾ete navesti vi¹e od jedne od `-Acdtrux' opcija"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Konfliktne opcije za kompresiju"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " nepoznat tip datoteke %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Datoteka s datumom nije pronaðena"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Substituiram %s za nepoznat format datuma %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: datoteka je arhiva; ne arhiviram ju"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+# FIXME -- clarify this against source and man -- TM
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Pogre¹an faktor pakiranja u blokove"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Upozorenje: opcija -I nije podr¾ana; mo¾da ste mislili -j ili -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Pogre¹na duljina trake"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Vi¹e od jednog datuma s pragom (threshold)"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Pogre¹na grupa"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Pogre¹an mod dan opcijom"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "Pogre¹an inode broj"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Pogre¹an vlasnik"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Pogre¹na velièina sloga (record)"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Velièina sloga (record) mora biti vi¹ekratnik %d."
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "Pogre¹na duljina trake"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr ""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Opcije `-[0-7][lmh]' nisu podr¾ane od strane *ovog* tar-a"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Stara opcija `%c' zahtijeva obavezan argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Vi¹edjelne arhive zahtijevaju `-M' opciju"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Ne mogu kombinirati --listed-incremental s --newer"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Oznaka dijela arhive je predugaèka (limit je %lu bajtova)"
+msgstr[1] "%s: Oznaka dijela arhive je predugaèka (limit je %lu bajtova)"
+
+# FIXME -- volume -- find more suitable (ask others) -- TM
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Ne mogu verificirati vi¹edjelne arhive"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Ne mogu verificirati komprimirane arhive"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Ne mogu koristiti vi¹edjelne komprimirane arhive"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Ne mogu a¾urirati komprimirane arhive"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+# LOL -- TM
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Kukavièki odbijam kreirati praznu arhivu!"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Opcije `-Aru' nisu kompatibilne s `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Morate specificirati jednu od `-Acdtrux' opcija"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Pogre¹an izlaz (naknadno) zbog prija¹njih pogre¹aka"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Datoteka se skratila za %s bajtova"
+msgstr[1] "%s: Datoteka se skratila za %s bajtova"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+# FIXME??
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Base-64 vrijednost s predznakom %s iz arhive je izvan %s opsega"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Vrijednost %s iz arhive je izvan %s opsega %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Generiraj podatkovne datoteke za GNU tar skup test programa.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Konfliktne opcije za kompresiju"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Pogre¹ka u pisanju na standardni izlaz"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Pogre¹na oznaka vremena"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Inode broj izvan opsega"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Nepoznata pogre¹ka u sistemu"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Neuspjeli seek na %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " nepoznat tip datoteke %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Neuspjeli seek na %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Potproces zavr¹io uz signal %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+# FIXME -- 'mangled filenames'???
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Manglirana imena datoteka--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close"
+#~ msgstr "Ne mogu zatvoriti"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Neuspjeli dup"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Ne mogu koristiti komprimirane ili udaljene (remote) arhive"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (podproces)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (pod-podproces)"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "UPOZORENJE: Nema zaglavlja za dio arhive"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Podproces zavr¹io uz status %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Imena èlanova sadr¾e `..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: Ime èlana sadr¾i `..'"
+
+# FIXME -- clarify this against source -- TM -- didn't help
+# Paul E. said this means:
+#
+# "tar" read a LONGNAME or LONGLINK header from the archive in a context
+# where it was not expected.
+#~ msgid "Visible long name error"
+#~ msgstr "Vidljiva pogre¹ka u dugom imenu"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Oznaka vremena izvan opsega"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Broj ureðaja izvan opsega"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Vidljiva pogre¹ka u dugom imenu"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Preimenovao %s u %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Ne mogu napraviti simbolièki link prema %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Napravio simbolièki link %s prema %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Nepoznata naredba za demangliranje %s"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Nedostaje ime datoteke nakon -C"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Ovaj program dolazi BEZ GARANCIJA, do granica dozvoljenih zakonom.\n"
+#~ "Mo¾ete ga redistribuirati pod uvjetima GNU General Public License;\n"
+#~ "vidi datoteku imena COPYING za detalje."
+
+# FIXME -- now this is supposed to be funny
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: %c je neispravna naredba\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU `tar' sprema mnogo datoteka zajedno u jednu arhivu na traci ili "
+#~ "disku, i\n"
+#~ "mo¾e povratiti pojedinaène datoteke iz arhive.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Ako duga opcija pokazuje agument kao obavezan, onda je obavezan\n"
+#~ "i za ekvivalentnu kratku opciju takoðer. Jednako vrijedi i za "
+#~ "opcionalne\n"
+#~ "argumente.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Glavni mod rada:\n"
+#~ " -t, --list ispi¹i sadr¾aje arhive\n"
+#~ " -x, --extract, --get ekstrahiraj datoteke iz arhive\n"
+#~ " -c, --create kreiraj novu arhivu\n"
+#~ " -d, --diff, --compare naði razlike izmeðu arhive i datoteènog "
+#~ "sustava\n"
+#~ " -r, --append nadodaj datoteke na kraj arhive\n"
+#~ " -u, --update nadodaj samo datoteke novije od kopije u "
+#~ "arhivi\n"
+#~ " -A, --catenate nadodaj tar datoteke na arhivu\n"
+#~ " --concatenate isto kao -A\n"
+#~ " --delete izbri¹i iz arhive (ne radi na magnetskim "
+#~ "trakama!)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modifikatori operacija: -W, --verify poku¹aj verificirati "
+#~ "arhivu nakon pisanja\n"
+#~ " --remove-files obri¹i datoteke nakon njihovog dodavanja "
+#~ "arhivi\n"
+#~ " -k, --keep-old-files ne zamjenjuj postojeæe datoteke kod "
+#~ "ekstrakcije\n"
+#~ " --overwrite prepisuj postojeæe datoteke kod ekstrakcije\n"
+#~ " --overwrite-dir prepisuj meta-podatke direktorija kod "
+#~ "ekstrakcije\n"
+#~ " -U, --unlink-first obri¹i svaku datoteku prije ekstrakcije preko "
+#~ "nje\n"
+#~ " --recursive-unlink isprazni hijerarhije prije ekstrahiranja u\n"
+#~ " direktorij\n"
+#~ " -S, --sparse tretiraj efikasno 'sparse' datoteke\n"
+#~ " (slabo popunjene datoteke)\n"
+#~ " -O, --to-stdout ekstrahiraj datoteke na standardni izlaz\n"
+#~ " -G, --incremental obradi inkrementalni backup starog GNU-"
+#~ "formata\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " obradi inkrementalni backup novog GNU-formata\n"
+#~ " --ignore-failed-read\n"
+#~ " ne zavr¹avaj uz ne-nula izlazni kod na\n"
+#~ " neèitljivim datotekama\n"
+
+# FIXME -- 'volume number' -- TM
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tretiranje atributa datoteka:\n"
+#~ " --owner=NAME forsiraj NAME za vlasnika dodanih "
+#~ "datoteka\n"
+#~ " --group=NAME forsiraj NAME za grupu dodanih datoteka\n"
+#~ " --mode=CHANGES forsiraj (symbolièke) promjene pristupnog\n"
+#~ " moda za dodane datoteke\n"
+#~ " --atime-preserve ne mijenjaj vremena pristupa (access "
+#~ "time)\n"
+#~ " pohranjenim datotekama\n"
+#~ " -m, --modification-time ne ekstrahiraj vremena modifikacije\n"
+#~ " --same-owner poku¹aj postaviti vlasni¹tvo datoteka\n"
+#~ " kao u arhivi\n"
+#~ " --no-same-owner ekstrahiraj datoteke pod svojim "
+#~ "vlasni¹tvom\n"
+#~ " --numeric-owner uvijek koristi numerièka imena\n"
+#~ " korisnika/grupa\n"
+#~ " -p, --same-permissions ekstrahiraj informacije o dozvolama\n"
+#~ " --no-same-permissions ne ekstrahiraj informacije o dozvolama\n"
+#~ " --preserve-permissions isto kao -p\n"
+#~ " -s, --same-order sortiraj imena kod ekstrakcije da "
+#~ "odgovaraju\n"
+#~ " arhivi\n"
+#~ " --preserve-order isto kao -s\n"
+#~ " --preserve isto kao -p i -s zajedno\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selektiranje i mijenjanje ureðaja:\n"
+#~ " -f, --file=ARCHIVE koristi datoteku ili ureðaj za "
+#~ "arhiviranje\n"
+#~ " ARCHIVE\n"
+#~ " --force-local ime arhive je lokalno èak i ako sadr¾i\n"
+#~ " dvotoèku\n"
+#~ " --rsh-command=COMMAND koristi remote COMMAND umjesto rsh\n"
+#~ " -[0-7][lmh] specificiraj drive i density\n"
+#~ " -M, --multi-volume kreiraj/izlistaj/ekstrahiraj vi¹edjelne\n"
+#~ " arhive\n"
+#~ " -L, --tape-length=NUM promijeni traku nakon ispisivanja\n"
+#~ " NUM x 1024 bajtova\n"
+#~ " -F, --info-script=FILE pokreni skriptu na kraju svake trake\n"
+#~ " (podrazumijeva -M)\n"
+#~ " --new-volume-script=FILE isto kao -F FILE\n"
+#~ " --volno-file=FILE koristi/nadopuni volume number u FILE\n"
+
+# FIXME -- clear this 'device blocking' xlation -- TM
+# FIXME -- vidi ovaj 'znaèi EOF' u man -- TM
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Faktor grupiranja u blokove na ureðaju (device blocking):\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bajtova po zapisu (record)\n"
+#~ " --record-size=SIZE SIZE bajtova po zapisu, vi¹ekratnik od "
+#~ "512\n"
+#~ " -i, --ignore-zeros ignoriraj blokove ispunjene nulama u "
+#~ "arhivi\n"
+#~ " (koji inaèe znaèe EOF)\n"
+#~ " -B, --read-full-records pregrupiraj blokove dok èita¹\n"
+#~ " (za 4.2BSD cjevovode -- pipes)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selekcija formata arhive:\n"
+#~ " -V, --label=NAME kreiraj arhivu s imenom dijela "
+#~ "arhive NAME\n"
+#~ " PATTERN u vrijeme izlistavanja/ekstrakcije,\n"
+#~ " koristi PATTERN za globbing\n"
+#~ " -o, --old-archive, --portability ispi¹i V7 format arhivu\n"
+#~ " --posix ispi¹i POSIX format arhivu\n"
+#~ " -j, --bzip2 filtriraj arhivu kroz bzip2\n"
+#~ " -z, --gzip, --ungzip filtriraj arhivu kroz gzip\n"
+#~ " -Z, --compress, --uncompress filtriraj arhivu kroz compress\n"
+#~ " --use-compress-program=PROG filtriraj kroz program PROG (moji "
+#~ "mora\n"
+#~ " prihvaæati opciju -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selekcija lokalnih datoteka:\n"
+#~ " -C, --directory=DIR promijeni direktorij u DIR\n"
+#~ " -T, --files-from=NAME dobavi imena za ekstrahirati ili kreirati\n"
+#~ " iz datoteke NAME\n"
+#~ " --null -T èita nul-terminirana imena, onemoguæi -"
+#~ "C\n"
+#~ " --exclude=PATTERN izostavi datoteke, dane s PATTERN\n"
+#~ " -X, --exclude-from=FILE izostavi uzorak datoteka: pobrojane u "
+#~ "FILE\n"
+#~ " --anchored - koje zapoèinju tim imenom (default)\n"
+#~ " --no-anchored - koje se podudaraju s uzorkom nakon "
+#~ "nekog '/'\n"
+#~ " --ignore-case izostavljanje ignorira razliku\n"
+#~ " izmeðu velikih i malih slova\n"
+#~ " --no-ignore-case izostavljanje uzima u obzir razliku\n"
+#~ " izmeðu malih i velikih slova "
+#~ "(default)\n"
+#~ " --wildcards izostavi uzorke koristi wildcard "
+#~ "(default)\n"
+#~ " --no-wildcards uzorci za izostavljanje su obièni nizovi\n"
+#~ " --wildcards-match-slash izostavi uzorak wildcard podudara '/'\n"
+#~ " (default)\n"
+#~ " --no-wildcards-match-slash\n"
+#~ " izostavi uzorak - wildcard ne podudara "
+#~ "'/'\n"
+#~ " -P, --absolute-names ne bri¹i vodeæe `/' iz imena datoteka\n"
+#~ " -h, --dereference ne arhiviraj simbolièki link nego "
+#~ "datoteku\n"
+#~ " na koju pokazuje\n"
+#~ " --no-recursion ne idi rekurzivno u poddirektorije\n"
+#~ " -l, --one-file-system ne prelazi na drugi datoteèni sustav\n"
+#~ " kod kreiranja datoteka\n"
+#~ " -K, --starting-file=NAME poèni s imenom NAME u arhivi kod "
+#~ "ekstrakcije\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATE pohranjuj samo datoteke novije od DATE\n"
+#~ " --newer-mtime=DATE usporedi datum i vrijeme samo\n"
+#~ " ako su se promijenili podaci\n"
+#~ " --after-date=DATE isto kao -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=CONTROL] backup-iraj prije brisanja, izaberi "
+#~ "mehanizam\n"
+#~ " kontrole verzije\n"
+#~ " --suffix=SUFFIX backup-iraj prije brisanja, promijeni\n"
+#~ " standardni sufiks.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Informativni ispis:\n"
+#~ " --help ispi¹i ovu pomoæ, potom zavr¹i\n"
+#~ " --version ispi¹i broj verzije tar programa, potom zavr¹i\n"
+#~ " -v, --verbose op¹irno izlistaj imena datoteka kod procesiranja\n"
+#~ " --checkpoint ispisuj imena direktorija dok èita¹ arhivu\n"
+#~ " --totals ispisuj ukupan broj ispisanih bajtova dok "
+#~ "kreira¹\n"
+#~ " arhivu\n"
+#~ " -R, --block-number prika¾i broj bloka unutar arhive uz svaku poruku\n"
+#~ " -w, --interactive tra¾i odobrenje za svaku akciju\n"
+#~ " --confirmation isto kao -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar ne mo¾e èitati ili proizvoditi `--posix' arhive. Ako je\n"
+#~ "POSIXLY_CORRECT definirano u environment okolini, GNU ekstenzije se\n"
+#~ "onemoguæuju pomoæu `--posix'. Podr¹ka za POSIX je samo djelomièno\n"
+#~ "implementirana, ne raèunajte jo¹ na nju.\n"
+#~ "ARCHIVE mo¾e biti FILE, HOST:FILE ili USER@HOST:FILE; DATE mo¾e biti\n"
+#~ "tekstualni datum ili ime datoteke koje zapoèinje s `/' ili `.',\n"
+#~ "u kojem sluèaju je kori¹ten datum datoteke.\n"
+#~ "*Ovaj* `tar' podrazumijeva `-f%s -b%d'.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Zastarjela opcija, sada podrazumijevana s --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Zastarjelo ime opcije zamijenjeno s --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Zastarjelo ime opcije zamijenjeno s --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Zastarjelo ime opcije zamijenjeno s --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Zastarjelo ime opcije zamijenjeno s --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Zastarjelo ime opcije zamijenjeno s --block-number"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Upozorenje: opcija -y nije podr¾ana; mo¾da ste ¾eljeli -j?"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Zastarjelo ime opcije zamijenjeno s --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Napisali John Gilmore i Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Ako duga opcija pokazuje argument kao obavezan, tada je on obavezan\n"
+#~ "takoðer i za ekvivalentnu kratku verziju opcije.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH (duljina) generirane datoteke\n"
+#~ " -p, --pattern=PATTERN PATTERN je `default' ili `zeros'\n"
+#~ " --help ispi¹i ovu pomoæ i zavr¹i\n"
+#~ " --version ispi¹i informaciju o verziji i zavr¹i\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Napisao François Pinard."
diff --git a/po/hu.gmo b/po/hu.gmo
new file mode 100644
index 0000000..d1eb9ab
--- /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..3aa2b3b
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,2482 @@
+# Hungarian translation of the GNU tar.
+# Copyright (C) 2002, 2006 Free Software Foundation, Inc.
+#
+# Gábor István <stive@mezobereny.hu>, 2002.
+# Gabor Kelemen <kelemeng@gnome.hu>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.15.92\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-10-13 13:51+0200\n"
+"Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
+"Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "a(z) \"%s\" argumentum érvénytelen a következőhöz: %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "a(z) \"%s\" argumentum nem egyértelmű a következőhöz: \"%s\""
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Az érvényes argumentumok a következők:"
+
+#: lib/argp-help.c:148
+#, 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"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: Az ARGP_HELP_FMT paraméter egy értéket igényel"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: Az ARGP_HELP_FMT paraméternek pozitívnak kell lennie"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Ismeretlen ARGP_HELP_FMT paraméter"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Szemét az ARGP_HELP_FMT-ben: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"A hosszú kapcsolók kötelező vagy elhagyható argumentumai a megfelelő rövid "
+"kapcsolókhoz is kötelezőek vagy elhagyhatóak."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Használat:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " vagy: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [KAPCSOLÓ...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr ""
+"További információkért próbáld kiadni a \"%s --help\" vagy \"%s --usage\" "
+"parancsokat.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "A hibákat a(z) %s címen jelentsd.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Ismeretlen rendszerhiba"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "ezen súgószöveg megjelenítése"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "rövid használati utasítás megjelenítése"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NÉV"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "a program nevének beállítása"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "MP"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "szünet MP másodpercre (alapértelmezetten 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "a programverzió kiírása"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(PROGRAMHIBA) A verziószám ismeretlen???"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: túl sok argumentum\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(PROGRAMHIBA) A kapcsolót fel kellett volna ismerni???"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: a(z) \"%s\" kapcsoló nem egyértelmű\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: a(z) \"--%s\" kapcsoló nem enged meg argumentumot\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, 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"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: a(z) \"%s\" kapcsolóhoz argumentum szükséges\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: a(z) \"--%s\" kapcsoló ismeretlen\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: a(z) \"%c%s\" kapcsoló ismeretlen\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: illegális kapcsoló -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: érvénytelen kapcsoló -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: a kapcsoló egy argumentumot igényel -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: a \"-W %s\" kapcsoló nem egyértelmű\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: a \"-W %s\" kapcsoló nem enged meg argumentumot\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "blokkméret"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "elfogyott a memória"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: a következő függvény meghiúsult: %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Figyelmeztetés: a következő függvény meghiúsult: %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Nem lehet %s módba váltani"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Nem módosítható a tulajdonos uid-ja %lu, gid-je %lu értékekre"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Nem hozható létre hard link a következőre: %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Olvasási hiba a(z) %s. bájtnál, %lu bájt beolvasása közben"
+msgstr[1] "%s: Olvasási hiba a(z) %s. bájtnál, %lu bájt beolvasása közben"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] ""
+"%s: Figyelmeztetés: Olvasási hiba a(z) %s. bájtnál, %lu bájt beolvasása "
+"közben"
+msgstr[1] ""
+"%s: Figyelmeztetés: Olvasási hiba a(z) %s. bájtnál, %lu bájt beolvasása "
+"közben"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Nem lehet a(z) %s helyre pozicionálni"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Figyelmeztetés: Nem lehet a(z) %s helyre pozicionálni"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Nem hozható létre szimbolikus link a következőre: %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Csak %lu bájt került kiírásra, összesen %lu bájtból"
+msgstr[1] "%s: Csak %lu bájt került kiírásra, összesen %lu bájtból"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "A kezdő \"%s\" eltávolítása a nevek elejéről"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "A kezdő \"%s\" eltávolítása a közvetlen linkek céljaiból"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Egy . helyettesítése az üres tagnév helyett"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Egy . helyettesítése a közvetlen link üres célja helyett"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "\""
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "\""
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[iIyY]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/TCP: A szolgáltatás nem érhető el"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "szabványos bemenet"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "szabványos kimenet"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Nem futtatható távoli parancssor"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "A bemeneti karakterlánc túl hosszú"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Számszintaxis hiba"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Nem foglalható hely a puffernek\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Nem foglalható hely a puffernek"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "További információkért próbáld kiadni a \"%s --help\" parancsot.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Használat: %s [KAPCSOLÓ]\n"
+"Egy szalagmeghajtó kezelése, egy távoli folyamattól származó parancsok\n"
+"elfogadása.\n"
+"\n"
+" --version Kiírja a verzióinformációkat\n"
+" --help Ezen súgó megjelenítése\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"A programhibákat a(z) <%s> címen jelentheted.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Keresésieltolás-hiba"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "A keresési eltolás kívül esik a tartományon"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "A keresési irány kívül esik a tartományon"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Idő előtti fájlvége\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Idő előtti fájlvége"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Fölösleges parancs"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Kiírt bájtok teljes száma"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Olvasott bájtok teljes száma"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Törölt bájtok teljes száma: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(cső)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "A record_size értéke érvénytelen"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Nem adott meg archívumnevet"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Nem ellenőrizhető az archívum, ha a szabványos be/kimenetet használja"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Az archívum tömörített. Használja a(z) %s kapcsolót."
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Tömörített archívumok nem frissíthetők"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "%u. írási ellenőrzőpont"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "%u. olvasási ellenőrzőpont"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "A szalag eleje, most kilépek"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Túl sok hiba, kilépek"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Kitöltetlen blokk (%lu bájt) az archívumban"
+msgstr[1] "Kitöltetlen blokk (%lu bájt) az archívumban"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Rekordméret = %lu blokk"
+msgstr[1] "Rekordméret = %lu blokk"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Nem törölhető vissza az archív fájl, lehet hogy olvashatatlan lesz a -i "
+"nélkül"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "az rmtlseek nem állt meg egy rekord határán"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: érvénytelen kötetszámot tartalmaz"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Kötetszám-túlcsordulás"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Készítse elő a(z) %d kötetet %s számára és üssön entert:"
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF ahol a program felhasználói választ várt"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "FIGYELMEZTETÉS: Az archívum befejezetlen"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n név Új fájlnév megadása a következő (és az azt követő) köteteknek\n"
+" q A Tar megszakítása\n"
+" y vagy újsor A művelet folytatása\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Új parancsértelmező hívása\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Ezen lista kiírása\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Nincs új kötet, kilépés.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Nincs megadva fájlnév, próbálkozzon újra.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Érvénytelen bemenet. A súgó a ? beírásával kérhető le.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "A(z) \"%s\" parancs meghiúsult"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Ez nem úgy néz ki, mint egy tar archívum"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"%s lehetséges, hogy ezen a köteten folytatódott: a fejléc csonkolt nevet "
+"tartalmaz"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s nem folytatódik ezen a köteten"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s mérete hibás (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Ez a kötet túl van a sorozaton"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Az archívum nincs úgy címkézve, hogy megfeleljen a következőhöz: %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "A(z) %s kötet nem felel meg a következőnek: %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: a fájlnév túl hosszú egy GNU többkötetes fejlécben való tároláshoz, "
+"csonkításra került"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Csak %lu bájt olvasható %lu bájtból"
+msgstr[1] "Csak %lu bájt olvasható %lu bájtból"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "A tartalom eltér"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Váratlan EOF az archívumban"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "A fájltípus eltér"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "A mód eltér"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Az Uid eltér"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "A Gid eltér"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "A módosítási idő eltér"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "A méret eltér"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Nincs a következőre linkelve: %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "A szimbolikus hivatkozás eltér"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Az eszközszám eltér"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Ellenőrzés "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr ""
+"%s: A(z) \"%c\" fájltípus ismeretlen, a diffelés normális fájlként történt"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Az archívum eltávolított előtagokkal rendelkező fájlneveket tartalmaz."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+"Lehetséges, hogy az ellenőrzés nem fogja megtalálni az eredeti fájlokat."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "AZ ELLENÅRZÉS SIKERTELEN: %d érvénytelen fejléc található"
+msgstr[1] "AZ ELLENÅRZÉS SIKERTELEN: %d érvénytelen fejléc található"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: fájl gyorsítótár-könyvtár címkét tartalmaz, nem kerül kiírásra"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr ""
+"a(z) %s érték a(z) %s %s...%s tartományán kívül esik, helyettesítve a "
+"következővel: %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "a(z) %s érték a(z) %s %s...%s tartományán kívül esik"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Negatív oktális fejlécek előállítása"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: a fájlnév túl hosszú (maximum: %d), nem kerül kiírásra"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: a fájlnév túl hosszú (nem darabolható), nem kerül kiírásra"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: a fájlnév túl hosszú, nem kerül kiírásra"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: a fájl zsugorítva %s bájtra, nullákkal kerül kitöltésre"
+msgstr[1] "%s: a fájl zsugorítva %s bájtra, nullákkal kerül kitöltésre"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: a fájl eltérő fájlrendszeren van, nem kerül kiírásra"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Ismeretlen fájltípus, fájl a figyelmen kívül hagyva"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "Hiányzó linkek a következőre: \"%s\".\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: a fájl változatlan, nem kerül kiírásra"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: a fájl az archívumban van, nem kerül kiírásra"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: a fájl el lett távolítva a beolvasás előtt"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: fájl gyorsítótár-könyvtár címkét tartalmaz, nem kerül kiírásra"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: a fájl módosult olvasás közben"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: a foglalat figyelmen kívül hagyva"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: ajtó figyelmen kívül hagyva"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Ugrás a következő fejlécre"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "A nem fejlécek törlése az archívumból"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: valószínűtlenül régi időbélyeg: %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: a(z) %s időbélyeg %s másodperccel a jövőbe mutat"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Váratlan inkonzisztencia a könyvtár létrehozása során"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: a könyvtár átnevezésre került az állapotának kinyerése előtt"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "A folytonos fájlok kibontása normál fájlként"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr ""
+"Kísérlet a szimbolikus hivatkozások kibontására közvetlen hivatkozásként"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "%s olvasása\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: nem lehet kibontani -- a fájl egy másik köteten folytatódik"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Váratlan hosszú névfejléc"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Ismeretlen fájltípus: \"%c\", normál fájlként lesz kibontva"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "A jelenlegi \"%s\" újabb vagy egyező korú"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Nem sikerült biztonsági mentést készíteni erről a fájlról"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Nem nevezhető át a következőre: %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "A hiba nem hozható helyre: kilépés"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: A könyvtár át lett nevezve a következőről: %s"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: a könyvtár át lett nevezve"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: a könyvtár új"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Érvénytelen időbélyeg"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Érvénytelen módosítási idő (másodperc)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Érvénytelen módosítási idő (nanomásodperc)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Érvénytelen eszközszám"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Érvénytelen inode-szám"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Túl hosszú mező a pillanatképfájl olvasása közben"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Olvasási hiba a pillanatképfájlban"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Váratlan fájlvége a pillanatképfájlban"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Váratlan mezőérték a pillanatképfájlban"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Hiányzó rekordlezáró"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Hibás növekményes fájlformátum"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "Nem támogatott növekményes formátumverzió: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+"Rosszul formázott kiíratási könyvtár: a várt \"%c\" helyett %#3o található"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Rosszul formázott kiíratási könyvtár: az \"X\" többször szerepel"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Rosszul formázott kiíratási könyvtár: üres név az \"R\"-ben"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Rosszul formázott kiíratási könyvtár: a \"T\"-t nem előzi meg az \"R\""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Rosszul formázott kiíratási könyvtár: üres név a \"T\"-ben"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+"Rosszul formázott kiíratási könyvtár: a várt \"%c\" helyett az adatok vége "
+"található"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+"Rosszul formázott kiíratási könyvtár: az \"X\" soha nem került felhasználásra"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr ""
+"Nem hozható létre ideiglenes könyvtár a következő sablon használatával: %s"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: a könyvtár nem kerül törlésre: nem érhető el"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: a fájl egy másik eszközön van: nem kerül törlésre"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: %s törlése\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: nem távolítható el"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: kihagyás"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blokk %s: ** A blokk üres **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Egy magányos nulla blokk %s helyen"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blokk %s: ** A fájl vége **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blokk %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr ""
+"Üres értékek a fejléc azon részében, ahol a program a(z) %s számértéket várta"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Az archívum %.*s oktális értéke túllépi a(z) %s tartományt, a program "
+"feltételezi, hogy kettes komplemens"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Az archívum %.*s oktális értéke túllépi a(z) %s tartományt"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Az archívum elavulófélben levő base-64-es fejléceket tartalmaz"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+"Az archívum előjeles base-64 karakterlánca (%s) túllépi a(z) %s tartományt"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Az archívum base-256-os értéke túllépi a(z) %s tartományt"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Az archívum %.*s értéket tartalmaz, ahol a program %s számértéket vár"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Az archívum %s értéke túllépi a(z) %s %s..%s tartományát"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " link a következőre: %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " ismeretlen fájltípus: %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Hosszú link--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Hosszú név--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Kötetfejléc--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Folytatva %s bájttól--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Könyvtár létrehozása:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "%s átnevezése a következőre: %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Nem nevezhető át a következőre: %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "%s helyreállítása a következő névre: %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "A munkakönyvtár nem menthető"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "A munkakönyvtár nem módosítható"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "gyermekfolyamat"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "folyamatközi csatorna"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Mintaillesztő karaktereket használt a fájlnevekben. "
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+"Használja a --wildcards kapcsolót a mintaillesztés engedélyezéséhez vagy a --"
+"no-wildcards kapcsolót "
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "ezen figyelmeztetés elnyomásához."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Nem található az archívumban"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: A szükséges előfordulás nem található az archívumban"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr ""
+"A(z) \"-%s\" és a(z) \"-%s\" kapcsolók mind a szabványos bemenetet igénylik"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Érvénytelen archívumformátum"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU szolgáltatásokat kértél inkompatibilis az archívumformátumokon"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"A(z) \"%s\" idézési stílus ismeretlen. Próbálja a \"%s --quoting-style=help"
+"\" parancsot segítségért."
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"A GNU \"tar\" több fájlt egyetlen szalagos vagy lemezes archívumba ment és "
+"képes az egyes fájlokat helyreállítani az archívumból.\n"
+"\n"
+"Például:\n"
+" tar -cf archívum.tar foo bar # Létrehozza az archívum.tar fájlt a foo\n"
+" és bar fájlokból.\n"
+" tar -tvf archívum.tar # Bőbeszédűen felsorolja az archívum.tar\n"
+" fájljait.\n"
+" tar -xf archívum.tar # Kibontja az összes fájlt az archívum.tar\n"
+" fájlból.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+" A biztonsági mentés utótagja \"~\", hacsak nem változtatja meg a \"--suffix"
+"\"\n"
+"vagy a SIMPLE_BACKUP_SUFFIX segítségével.\n"
+"A verziófelügyelet a --backup vagy a VERSION_CONTROL segítségével "
+"kezelheti,\n"
+"az értékek:\n"
+" none, off soha ne mentsen\n"
+" t, numbered számozott mentések létrehozása\n"
+" nil, existing számozott, ha már létezik számozott mentés,\n"
+" egyébként egyszerű\n"
+" never, simple mindig egyszerű mentés létrehozása\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Fő működési mód:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "felsorolja egy archívum tartalmát"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "fájlok kibontása egy archívumból"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "új archívum létrehozása"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "különbségek keresése az archívum és a fájlrendszer között"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "fájlok hozzáfűzése egy archívum végéhez"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "csak az archívumban lévő másolatnál újabb fájlok hozzáfűzése"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "tar fájlok hozzáfűzése egy archívumhoz"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "törlés az archívumból (szalagon nem működik!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "az archívum kötetcímkéjének tesztelése és kilépés"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Műveletmódosítók:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "ritka fájlok hatékony kezelése"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "MAGAS[.ALACSONY]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+"a használandó ritka formátum verziójának beállítása (magával vonja\n"
+" a --sparse kapcsolót)"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "régi GNU formátumú növekményes mentés kezelése"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "FÃJL"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "új GNU formátumú növekményes mentés kezelése"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "ne lépjen ki nem nulla értékkel ha a fájl olvashatatlan"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "SZÃM"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"az archívum minden egyes fájljának csak a SZÃM-adik elÅ‘fordulásának "
+"feldolgozása. Ez a kapcsoló csak a --delete, --diff, --extract vagy --list "
+"alparancsok egyikével használható és csak akkor, ha egy fájllista kerül "
+"átadásra a parancssoron vagy a -T kapcsolón keresztül. A SZÃM "
+"alapértelmezett értéke az 1."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "az archívum kereshető"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "Felülírás felügyelete:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "kísérlet az archívum ellenőrzésére annak kiírása után"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "fájlok eltávolítása azok archívumhoz adása után"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "ne cserélje a meglévő fájlokat kibontáskor"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "ne cserélje az archív változatuknál újabb meglévő fájlokat"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "meglévő fájlok felülírása kibontáskor"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "minden egyes fájl eltávolítása a rá történő kibontás előtt"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "hierarchiák kiürítése könyvtár kibontása előtt"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "meglévő könyvtárak metaadatainak megőrzése"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"meglévő könyvtárak metaadatainak felülírása kibontáskor (alapértelmezett)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Kimeneti adatfolyam kiválasztása:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "fájlok kibontása a szabványos kimenetre"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "PARANCS"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "kibontott fájlok továbbítása másik program számára"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "utódok kilépési kódjainak figyelmen kívül hagyása"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "az utódok nem nulla kilépési kódjainak kezelése hibaként"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Fájlattribútumok kezelése:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "a NÉV kényszerítése a hozzáadott fájlok tulajdonosaként"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "a NÉV kényszerítése a hozzáadott fájlok csoportjaként"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DÃTUM-VAGY-FÃJL"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "a DÃTUM-VAGY-FÃJL dátumnál újabb fájlok mtime értékének beállítása"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "MÓDOSÃTÃSOK"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "a (szimbolikus) mód módosítások kényszerítése a hozzáadott fájlokra"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "MÓDSZER"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"a kiíratott fájlok hozzáférési időpontjainak megőrzése, vagy az időpontok "
+"olvasás után történő visszaállításával (MÓDSZER='replace'; alapértelmezett) "
+"vagy az időpontok be nem állításával az első helyen (MÓDSZER='system')"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "ne bontsa ki a fájl módosításának időpontját"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "próbálja azonos tulajdonossal kibontani a fájlokat"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "fájlok kibontása az Ön nevében"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "mindig számok használata a felhasználó- vagy csoportnevekhez"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+"a fájl jogosultságaival kapcsolatos információk kibontása (alapértelmezett a "
+"rendszergazda számára)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"a felhasználó umask értékének alkalmazása a jogosultságok kibontásakor az "
+"archívumból (alapértelmezett az egyszerű felhasználók számára)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "kibontandó nevek rendezése, az archívumnak való megfelelés érdekében"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "azonos, mint a -p és -s egyszerre"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"kibontott könyvtárak módosítási idői és jogosultságai beállításának "
+"késleltetése a kibontás befejeztéig"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "a --delay-directory-restore kapcsoló hatásának megszüntetése"
+
+#: src/tar.c:497
+#, fuzzy
+msgid "Device selection and switching:"
+msgstr "Eszköz kiválasztása és váltása:\n"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARCHÃVUM"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "az ARCHÃVUM archívumfájl vagy -eszköz használata"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "az archívumfájl helyi, még ha tartalmaz is kettőspontot"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "az adott rmt PARANCS használata az rmt helyett"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "a távoli PARANCS használata az rsh helyett"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "meghajtó és sűrűség megadása"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "többkötetes archívum létrehozása/listázása/kibontása"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "szalagváltás a SZÃM x 1024 bájt kiírása után"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "parancsfájl futtatása minden egyes szalag végén (-M esetén)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "a FÃJLBAN található számú kötet használata/frissítése"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Eszközblokkolás:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOKK"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "rekordonként BLOKK x 512 bájt"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "SZÃM bájt rekordonként, az 512 többszöröse"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "nullázott blokkok (EOF) mellőzése az archívumban"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "újrablokkolás olvasáskor (4.2BSD csövekhez)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Archívumformátum kiválasztása:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMÃTUM"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "az adott formátumú archívum létrehozása"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "A FORMÃTUM a következÅ‘k egyike:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "régi V7 tar formátum"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "A tar <= 1.12 által használt GNU formátum"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU tar 1.13.x formátum"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "POSIX 1003.1-1988 (ustar) formátum"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "POSIX 1003.1-2001 (pax) formátum"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "azonos a pax formátummal"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "azonos a --format=v7 formátummal"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "azonos a --format=posix formátummal"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "kulcsszó[[:]=érték][,kulcsszó[[:]=érték]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "a pax kulcsszavak irányítása"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "SZÖVEG"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"archívum létrehozása a SZÖVEG kötetnévvel. Listázáskor vagy kibontáskor "
+"használja a kötetnév keresési mintájaként a SZÖVEGET"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "az archívum tömörítése a bzip2 használatával"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "az archívum tömörítése a gzip használatával"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "az archívum tömörítése a compress használatával"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "tömörítése a PROG használatával (el kell fogadnia a -d kapcsolót)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Helyi fájlválasztás:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"az adott FÃJL hozzáadása az archívumhoz (hasznos, ha neve kötÅ‘jellel "
+"kezdődik)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "KÖNYVTÃR"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "váltás a KÖNYVTÃR könyvtárba"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "kibontandó nevek lekérdezése vagy létrehozás a FÃJLBÓL"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "a -T nullal lezárt neveket olvas, letiltja a -C kapcsolót"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+"a -T segítségével beolvasott fájlnevek idézettségének megszüntetése "
+"(alapértelmezett)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "ne szüntesse meg a -T segítségével beolvasott fájlnevek idézettségét"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "MINTA"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "a MINTAKÉNT megadott fájlok kihagyása"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "a FÃJLBAN megadott minták kihagyása"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "a cache címkét tartalmazó könyvtárak kihagyása"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "a cache címkét tartalmazó könyvtárak kihagyása"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "a cache címkét tartalmazó könyvtárak kihagyása"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "a cache címkét tartalmazó könyvtárak kihagyása"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "a cache címkét tartalmazó könyvtárak kihagyása"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "a cache címkét tartalmazó könyvtárak kihagyása"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "ne lépjen be automatikusan a könyvtárakba"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "az archívum létrehozásakor maradjon a helyi fájlrendszeren"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "belépés a könyvtárakba rekurzívan (alapértelmezett)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "ne vágja le a kezdő \"/\" jelet a fájlnevekből"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+"szimbolikus hivatkozások követése; az általuk mutatott fájlok archiválása és "
+"kiíratása"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "TAGNÉV"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "kezdés a TAGNÉV tagnál az archívumban"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "csak a DÃTUM-VAGY-FÃJL dátumnál újabb fájlok tárolása"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DÃTUM"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "dátum és idő összehasonlítása ha csak a dátum módosult"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "FELÃœGYELET"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "mentés eltávolítás előtt, a FELÜGYELET verzió kiválasztása"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "KARAKTERLÃNC"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"mentés eltávolítás előtt, a szokásos utótag (\"~\", hacsak a "
+"SIMPLE_BACKUP_SUFFIX környezeti változó nem bírálja felül) felülbírálása"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Fájlnév-átalakítások:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "a fájlnevek SZÃM darab kezdÅ‘ összetevÅ‘jének levágása kibontáskor"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "KIFEJEZÉS"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+"A KIFEJEZÉS sed helyettesítőkifejezés használata fájlnevek átalakítására"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+"Fájlnévillesztés beállításai (érintik mind a kihagyási, mind a felvételi "
+"mintákat):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "kis- és nagybetűk figyelmen kívül hagyása"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "a minták illesztése a fájlnevek elejére"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "a minták illesztése bármely / után (alapértelmezett kihagyáskor)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "kis- és nagybetűkre érzékeny illesztés (alapértelmezett)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "helyettesítő karakterek használata (alapértelmezett kihagyáskor)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "szó szerinti karakterlánc-illesztés"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "a helyettesítő karakterek nem illeszkednek a perjelre"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+"a helyettesítőkarakterek illeszkednek a \"/\" jelre (alapértelmezett "
+"kihagyáskor)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Informatív kimenet:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "feldolgozott fájlok bőbeszédű listázása"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]SZÃM"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+"elÅ‘rehaladási üzenetek megjelenítése minden SZÃM. rekordnál (alapértelmezés: "
+"10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "üzenet kiírása, ha nem minden hivatkozás került kiíratásra"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "SZIGNÃL"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"a bájtok teljes számának megjelenítése az archívum feldolgozása után egy "
+"argumentummal hívva kiírja a bájtok teljes számát ezen SZIGNÃL megkapásakor. "
+"Az engedélyezett szignálok: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 és SIGUSR2; a "
+"SIG előtag nélküli nevek is elfogadottak"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "a fájlmódosítási dátumok kiírása UTC szerint"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "bÅ‘beszédű kimenet küldése a FÃJLBA"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "az archívumon belüli blokkszám megjelenítése minden egyes üzenettel"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "megerősítés kérése minden egyes művelethez"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "a tar alapértelmezéseinek megjelenítése"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"listázáskor vagy kibontáskor minden egyes, a keresési feltételnek meg nem "
+"felelő könyvtár listázása"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "fájl- vagy archívumnevek megjelenítése átalakítás után"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "STÃLUS"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr "az idézési stílus beállítása, az érvényes STÃLUS értékeket lásd alább"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "a KARAKTERLÃNCBÓL származó karakterek kiegészítÅ‘ idézése"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "a KARAKTERLÃNCBÓL származó karakterek idézésének letiltása"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Kompatibilitási kapcsolók:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"létrehozáskor megegyezik a --old-archive kapcsolóval; kibontáskor a --no-"
+"same-owner kapcsolóval"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Egyéb kapcsolók:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "néhány potenciálisan káros kapcsoló használatának letiltása"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "A következő kapcsolók közül egynél többet nem használhat: \"-Acdtrux\""
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "A tömörítési kapcsolók ütköznek"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Ismeretlen szignálnév: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "A dátummintafájl nem található"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "%s cseréje az ismeretlen %s dátumformátumhoz"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "\"%s\" kapcsoló: A(z) \"%s\" dátum kezelése mint %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: a fájllista már be van olvasva"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: a beolvasott fájlnév null karaktert tartalmaz"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "A --quoting-style kapcsolók érvényes argumentumai:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Ezen* tar alapértelmezései:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Érvénytelen blokkolási tényező"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+"Figyelmeztetés: a \"-l\" kapcsoló nem támogatott; talán a \"-j\" vagy a \"-T"
+"\" egyikére gondolt?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Érvénytelen szalagméret"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Egynél több küszöbdátum"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "Érvénytelen ritka verzió érték"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+"Az --atime-preserve='system' nem támogatott ezen az operációs rendszeren"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "A --checkpoint értéke nem egy egész"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Érvénytelen csoport"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Érvénytelen mód került megadásra a kapcsolóban"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Érvénytelen szám"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Érvénytelen tulajdonos"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Érvénytelen rekordméret"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "A rekordméretnek %d többszörösének kell lennie."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Érvénytelen elemszám"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "Csak egy --to-command kapcsoló engedélyezett"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Rosszul formázott sűrűségargumentum: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Ismeretlen sűrűség: \"%c\""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "A \"-[0-7][lmh]\" kapcsolókat *ez* a tar NEM támogatja"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[FÃJL]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "A régi \"%c\" kapcsoló paramétert igényel."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "a --occurrence értelmetlen fájllista nélkül"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "a --occurrence nem használható a kért működési módban"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Több archívumfájl esetén szükséges a \"-M\" kapcsoló"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr ""
+"A --listed-incremental és a --newer kapcsolók nem használhatók egyszerre"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: A kötetcímke túl hosszú (a korlát %lu bájt)"
+msgstr[1] "%s: A kötetcímke túl hosszú (a korlát %lu bájt)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "A többkötetes archívumok nem ellenőrizhetők"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "A tömörített archívumok nem ellenőrizhetők"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Nem használhatók többkötetes tömörített archívumok"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Tömörített archívumok nem fűzhetők össze"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "a --pax kapcsoló csak POSIX archívumokon használható"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Az üres archívum létrehozását gyáván visszautasítom"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Az \"-Aru\" kapcsolók összeférhetetlenek a \"-f\" kapcsolóval"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "A következő kapcsolók közül egyikét meg kell adnia: \"-Acdtrux\""
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "A hibás kilépés késleltetve a korábbi hibákból"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: A fájl zsugorítva %s bájttal"
+msgstr[1] "%s: A fájl zsugorítva %s bájttal"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "A(z) %s kulcsszó ismeretlen vagy még nincs megvalósítva"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "A(z) %s minta nem használható"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "A(z) %s minta nem bírálható felül"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Rosszul formázott kiterjesztett fejléc: a hossz hiányzik"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "A kiterjesztett fejléc hossza kívül esik a tartományon"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "A kiterjesztett fejléc %*s hossza kívül esik a tartományon"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+"Rosszul formázott kiterjesztett fejléc: a hossz után hiányzik egy üreshely "
+"karakter"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "A kiterjesztett fejléc hibás: egy egyenlőségjel hiányzik"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Rosszul formázott kiterjesztett fejléc: az újsor hiányzik"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+"A(z) \"%s\" ismeretlen kiterjesztett fejléc kulcsszó figyelmen kívül marad"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr "Az előállított kulcsszó/érték pár túl hosszú (kulcsszó: %s, hossz: %s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "A kiterjesztett fejléc %s=%s értéke túllépi a(z) %s..%s tartományát"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Rosszul formázott kiterjesztett fejléc: érvénytelen %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Rosszul formázott kiterjesztett fejléc: többlet %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+"Rosszul formázott kiterjesztett fejléc: érvénytelen %s: váratlan határoló (%"
+"c)"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+"Rosszul formázott kiterjesztett fejléc: érvénytelen %s: az értékek száma "
+"páratlan"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"a genfiles adatfájlokat kezel a GNU paxutils tesztcsomag számára.\n"
+"A KAPCSOLÓK:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Fájllétrehozási kapcsolók:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "MÉRET"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Az adott MÉRETŰ fájl létrehozása"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "Ãrás a NÉV nevű fájlba a szabványos kimenet helyett"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Fájlnevek beolvasása a FÃJLBÓL"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "a -T nullal lezárt neveket olvas"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+"A fájl feltöltése az adott MINTÃVAL. A MINTA a 'default' (alapértelmezett) "
+"vagy 'zeros' (nullák) egyike"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Egy blokk mérete ritka fájlhoz"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+"Ritka fájl előállítása. A parancssor többi része megadja a fájlleképezést."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "kísérlet az archívum ellenőrzésére annak kiírása után"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Fájlstatisztika kapcsolói:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"A stat struktúra tartalmának kiírása minden egyes megadott fájlhoz. Az "
+"alapértelmezett FORMÃTUM: "
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Szinkron végrehajtási kapcsolók:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"Az adott PARANCS végrehajtása. Hasznos a --checkpoint és a --cut, --append "
+"vagy --touch egyikével"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+"Az adott művelet (lásd alább) végrehajtása a SZÃM-adik ellenÅ‘rzÅ‘pont elérése "
+"után"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Dátum beállítása a következő --touch kapcsoló számára"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+"Végrehajtott ellenőrzőpontok és a PARANCS kilépési állapotának megjelenítése"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Szinkron végrehajtási tevékenységek. Ezek a --checkpoint kapcsoló által "
+"megadott számú ellenőrzőpont elérésekor kerülnek végrehajtásra."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"A FÃJL csonkolása az elÅ‘zÅ‘ --length kapcsoló által megadott méretre (vagy "
+"nullára, ha nincs megadva)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+"MÉRET bájt hozzáfűzése a FÃJLHOZ. A MÉRETET az elÅ‘zÅ‘ --length kapcsoló adja "
+"meg."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "A FÃJL hozzáférési és módosítási idejének frissítése"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "A PARANCS végrehajtása"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Érvénytelen méret: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "A szám kívül esik az engedélyezett tartományon: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Negatív méret: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "a stat(%s) meghiúsult"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Hiba a(z) \"%s\" közelében található szám elemzésekor"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Ismeretlen dátumformátum"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARGUMENTUMOK...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "a(z) \"%s\" nem nyitható meg"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Nem lehet a(z) %s helyre pozicionálni"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "a fájlnév null karaktert tartalmaz"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"nem állíthatók elő ritka fájlok a szabványos kimeneten, használja a --file "
+"kapcsolót"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "helytelen maszk (a(z) \"%s\" közelében)"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "Ismeretlen mező: \"%s\""
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "nem állítható be az idő a következőn: \"%s\""
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "A parancs sikeresen befejeződött\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "A parancs meghiúsult a következő állapottal: %d\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "A parancs befejeződött a következő szignállal: %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "A parancs leállítva a következő szignállal: %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "A parancs hibakeresési kimenetet adott vissza\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "A parancs befejeződött\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "a --stat fájlneveket igényel"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "túl sok argumentum"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Olvasási hiba a(z) %s. bájtnál, %lu bájt beolvasva"
+#~ msgstr[1] "%s: Olvasási hiba a(z) %s. bájtnál, %lu bájt beolvasva"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Megcsonkított fájlnevek--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Váratlan EOF a megcsonkított nevekben"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "%s átnevezve a következőre: %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Nem hozható létre szimbolikus link a következőhöz: %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s szimbolikus link létrehozva a következőre: %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Ismeretlen csonkító parancs: %s"
diff --git a/po/id.gmo b/po/id.gmo
new file mode 100644
index 0000000..813572d
--- /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..3c72ad5
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,2836 @@
+# tar-1.13.25 (Indonesian)
+# Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+# Tedi Heriyanto <tedi_h@gmx.net>, 1999, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.13.25\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2002-07-24 22:02GMT+0700\n"
+"Last-Translator: Tedi Heriyanto <tedi_h@gmx.net>\n"
+"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 0.9.5\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argumen tidak valid %s untuk %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argumen rancu %s untuk %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Argumen yang valid adalah:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Gunakan: %s [OPTION]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Ketik `%s --help' untuk informasi lebih lengkap.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+"Laporkan bug kepada <bug-tar@gnu.org>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Kesalahan sistem tidak dikenal"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: option `%s' membutuhkan sebuah argumen\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: option `%s' rancu\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: option `--%s' tidak membolehkan sebuah argumen\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: option `%c%s' tidak membolehkan sebuah argumen\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: option `%s' membutuhkan sebuah argumen\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: option tidak dikenal `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: option tidak dikenal `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: option ilegal -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: option tidak valid -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: option membutuhkan sebuah argumen -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: option `-W %s' rancu\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: option `-W %s' tidak membolehkan sebuah argumen\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "ukuran blok"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "Memory habis"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Tidak dapat %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Peringatan: Tidak dapat %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Tidak dapat mengganti mode ke %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Tidak dapat merubah kepemilikan ke uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Tidak dapat membuat hard link ke %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s:Kesalahan pembacaan pada byte %s, terbaca %lu byte"
+msgstr[1] "%s:Kesalahan pembacaan pada byte %s, terbaca %lu byte"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Peringatan: Kesalahan pembacaan pada byte %s, terbaca %lu byte"
+msgstr[1] "%s: Peringatan: Kesalahan pembacaan pada byte %s, terbaca %lu byte"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Tidak dapat mencari ke %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Peringatan: Tidak dapat mencari ke %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Tidak dapat membuat symlink ke %s"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Hanya dapat menulis %lu dari %lu byte"
+msgstr[1] "%s: Hanya dapat menulis %lu dari %lu byte"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Menghilangkan awalan `%.*s' dari nama anggota"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Menghilangkan awalan `%.*s' dari nama anggota"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "Menghilangkan awalan `%.*s' dari nama anggota"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Service tidak tersedia"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Tidak dapat menjalankan remote shell"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Tidak dapat mengalokasi buffer space\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Tidak dapat mengalokasi buffer space"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Ketik `%s --help' untuk informasi lebih lengkap.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Penggunaan: %s [OPTION]\n"
+"Manipulasi sebuah tape drive, menerima perintah dari proses remote.\n"
+"\n"
+" --version Tampilkan info versi.\n"
+" --help Tampilkan bantuan ini.\n"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Laporkan bug kepada <bug-tar@gnu.org>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Offset pencarian di luar batasan"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Offset pencarian di luar batasan"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Arah pencarian di luar batasan"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: EOF prematur\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Akhir file prematur"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Command tidak terpakai"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Total byte ditulis: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Total byte ditulis: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(pipe)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Nilai record_size salah"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Tidak diberikan nama archive"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Tidak dapat verifikasi stdin/stdout archive"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Tidak dapat update compressed archives"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Menulis checkpoint %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Membaca checkpoint %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Berada pada awal tape, keluar"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Terlalu banyak kesalahan, keluar"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Blok tidak sesuai (%lu byte) dalam arsip"
+msgstr[1] "Blok tidak sesuai (%lu byte) dalam arsip"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Ukuran record = %lu blok"
+msgstr[1] "Ukuran record = %lu blok"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Tidak dapat backspace file archives; kemungkinan tidak bisa dibaca tanpa -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: berisi nomor volum yang tidak valid"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Nomor volum overflow"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Mempersiapkan volume #%d untuk %s dan tekan return: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF pada saat user reply diharapkan"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "PERINGATAN: Archive tidak lengkap"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [name] Memberi nama baru pada file untuk volume selanjutnya\n"
+" q Batalkan tar\n"
+" ! Spawn subshell\n"
+" ? Cetak keterangn ini\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Tidak ada new volume; keluar.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "Perintah `%s' gagal"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Sepertinya bukan tar archive"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s tidak dilanjutkan pada volume ini"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s tidak dilanjutkan pada volume ini"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s adalah ukuran yang salah (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Volume ini di luar urutan"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Label archive tidak cocok dengan '%s'"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Volume %s tidak sesuai dengan %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Hanya dapat membaca %lu dari %lu byte"
+msgstr[1] "Hanya dapat membaca %lu dari %lu byte"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Isi berbeda"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Unexpected EOF dalam archive"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Tipe file berbeda"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Mode berbeda"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid berbeda"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid berbeda"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Mod time berbeda"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Ukuran berbeda"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Tidak dilink ke %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symlink berbeda"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Nomor device berbeda"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verifikasi "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s:File type '%c' tidak dikenal, lakukan diff sebagai file normal"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "GAGAL VERIFIKASI: ditemukan %d invalid header"
+msgstr[1] "GAGAL VERIFIKASI: ditemukan %d invalid header"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: file adalah archive; tidak di-dump"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "nilai %s dari %s di luar daerah %s..%s; mengganti %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "nilai %s dari %s di luar daerah %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Membuat header oktal negatif"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: file tidak berubah; tidak di-dump"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: file tidak berubah; tidak di-dump"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: file tidak berubah; tidak di-dump"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: File diperkecil %s byte, dipadding dengan nol"
+msgstr[1] "%s: File diperkecil %s byte, dipadding dengan nol"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: file berada pada filesistem yang berbeda; tidak di-dump"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Tipe file tidak dikenal; file diabaikan"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " link ke %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: file tidak berubah; tidak di-dump"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: file adalah archive; tidak di-dump"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: File dihapus sebelum kita membacanya"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: file adalah archive; tidak di-dump"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: file berubah saat kita membacanya"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: soket diabaikan"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: door diabaikan"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Skip ke header berikutnya"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Menghapus non-header dari archive"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: time stamp %s adalah %lu dalam masa datang"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Inkonsistensi tidak diharapkan ketika membuat direktori"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Direktori diganti nama sebelum statusnya dapat diperoleh"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Sedang extract contiguous file sebagai regular file"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Mencoba extract symbolic link sebagai hard link"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Membaca %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Tidak dapat mengekstrak -- file adalah kelanjutan dari volume lain"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Unexpected EOF dalam mangled names"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Tipe file tidak dikenal '%c', diekstraksi sebagai file normal"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Tidak dapat melakukan backup file ini"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s:Tidak dapat mengganti nama ke %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Kesalahan tidak dapat diperbaiki, keluar"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Direktori telah diganti nama"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Direktori telah diganti nama"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Direktori adalah baru"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Time stamp tidak valid"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Mode tidak tepat diberikan pada opsi"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Nomor device tidak valid"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Nomor inode tidak valid"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Unexpected EOF dalam archive"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Tidak dapat mengalokasi memori untuk faktor blocking %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: file berada pada filesistem yang berbeda; tidak di-dump"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Menghapus %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Tidak dapat menghapus"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Menghilangkan"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** Block NULs **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok %s: ** Akhir file **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Blank dalam header saat diharapkan nilai %s numerik"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr "Nilai oktal arsip %.*s di luar batasan %s; asumsikan komplemen dua"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Nilai oktal arsip %.*s di luar batasan %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Arsip berisikan header base-64 yang kadaluarsas"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Arsip yang ditandatangahi dengan string base-64 %s di luar batasan %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Nilai arsip base-256 di luar batasan %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arsip berisikan %.*s ketika nilai numerik %s diharapkan"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Nilai arsip %s dari %s di luar batasan %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " link ke %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " tipe file tidak dikenal %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Volume Header--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Diteruskan pada byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Membuat direktori:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Mengganti nama %s ke %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s:Tidak dapat mengganti nama ke %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Mengganti nama %s kembali ke %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Tidak dapat menyimpan direktori kerja"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Tidak bisa pindah direktori kerja"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "proses anak"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "saluran interproses"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Tidak ditemukan dalam archive"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Tidak ditemukan dalam archive"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Opsi `-%s' dan `-%s' membutuhkan standard input"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: grup tidak valid"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Feature GNU dibutuhkan untuk format archive yang tidak kompatibel"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Penggunaan: %s [OPTION]... [FILE]...\n"
+"\n"
+"Contoh:\n"
+" %s -cf archive.tar foo bar # Buat archive.tar dari file foo dan bar.\n"
+" %s -tvf archive.tar # Tampilkan semua file dalam archive.tar "
+"secara rinci.\n"
+" %s -xf archive.tar # Bongkar semua file dari archive.tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+"Akhiran dari backup adalah `~', kecuali bila diset dengan --suffix atau "
+"SIMPLE_BACKUP_SUFFIX.\n"
+"Version control dapat diset dengan -backup atau VERSION_CONTROL, nilainya:\n"
+"\n"
+" t, numbered gunakan numbered backups\n"
+" nil, existing beri nomor bila nomor backup telah ada, simple sebaliknya\n"
+" never, simple selalu buat simple backups\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Unexpected EOF dalam archive"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Kesalahan dalam menulis ke output standar"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Tidak dapat verifikasi multi-volume archives"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Opsi format archive konflik"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s: file adalah archive; tidak di-dump"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s: file adalah archive; tidak di-dump"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Tidak bisa pindah direktori kerja"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Menghilangkan awalan `%.*s' dari nama anggota"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Volume %s tidak sesuai dengan %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Anda tidak bisa menjalankan lebih dari satu opsi `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Opsi kompresi konflik"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " tipe file tidak dikenal %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Tanggal file tidak ditemukan"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Menggantikan %s untuk format tanggal tidak dikenal %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: file adalah archive; tidak di-dump"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Faktor bloking tidak valid"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Peringatan: option -l tidak didukung; mungkin maksud anda -j atau -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Panjang tape tidak valid"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Lebih dari satu treshold date"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: grup tidak valid"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Mode tidak tepat diberikan pada opsi"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "Nomor inode tidak valid"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Pemilik tidak valid"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Ukuran record tidak valid"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Jumlah record harus kelipatan dari %d."
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "Panjang tape tidak valid"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr ""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Opsi `-[0-7][lmh]' tidak didukung oleh tar *ini*"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Opsi 'lama' `%c' membutuhkan argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "File multiple archive membutuhkan opsi '-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Tidak dapat menggabungkan --listed-incremental dengan --newer"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Label volume terlalu panjang (batasnya adalah %lu byte)"
+msgstr[1] "%s: Label volume terlalu panjang (batasnya adalah %lu byte)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Tidak dapat verifikasi multi-volume archives"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Tidak dapat verify compressed archives"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Tidak dapat menggunakan multi-volume compressed archives"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Tidak dapat update compressed archives"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Tidak bisa membuat archive yang kosong"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Opsi '-Aru' tidak kompatibel dengan `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Anda harus menggunakan salah satu dari opsi `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Kesalahan exit ditunda dari error sebelumnya"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: file mengecil sebanyak %s byte"
+msgstr[1] "%s: file mengecil sebanyak %s byte"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Arsip yang ditandatangahi dengan string base-64 %s di luar batasan %s"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Nilai arsip %s dari %s di luar batasan %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Hasilkan file data untuk GNU test suite.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Opsi kompresi konflik"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Kesalahan dalam menulis ke output standar"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Time stamp tidak valid"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Nomor inode di luar batasan"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Kesalahan sistem tidak dikenal"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Tidak dapat mencari ke %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " tipe file tidak dikenal %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Tidak dapat mencari ke %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Child berhenti dengan signal %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Mangled file names--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close"
+#~ msgstr "Tidak dapat menutup"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Tidak dapat melakukan dup"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Tidak dapat menggunakan compressed atau remote archives"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (child)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (grandchild)"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "PERINGATAN: Tidak ada volume header"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Child mengembalikan status %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Nama anggota mengandung `..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: Nama anggota berisikan `..'"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Kesalahan visible long file name"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Time stamp di luar batasan"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Nomor device di luar batasan"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Kesalahan visible longname"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Berganti nama dari %s ke %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Tidak dapat symlink ke %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Symlink %s ke %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Perintah demangling %s tidak dikenal"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "File name tidak ditemukan setelah -C"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Command tidak terpakai %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU `tar' menyimpan sejumlah file dalam sebuah tape atau disk archive, "
+#~ "dan\n"
+#~ "dapat restore sebuah file dari archive.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Bila long option menunjukkan argumen sebagai mandatory, maka opsi "
+#~ "tersebut\n"
+#~ "adalah mandatory juga untuk short option. Hal yang sama berlaku untuk\n"
+#~ "optional argumen.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modus operasi utama:\n"
+#~ " -t, --list melihat isi archive\n"
+#~ " -x, --extract, --get mengekstrak file archive\n"
+#~ " -c, --create membuat archive baru\n"
+#~ " -d, --diff, --compare mencari beda antara archive dan file system\n"
+#~ " -r, --append menambahkan file pada bagian akhir archive\n"
+#~ " -u, --update hanya menambahkan file yang lebih baru daripada "
+#~ "yang ada di archive\n"
+#~ " -A, --catenate append file tar ke dalam archive\n"
+#~ " --concatenate sama seperti -A\n"
+#~ " --delete menghapus dari archive (tidak berlaku untuk mag "
+#~ "tapes!)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modifier operasi:\n"
+#~ " -W, --verify berusaha verifikasi archive setelah "
+#~ "menulisnya\n"
+#~ " --remove-files hapus file setelah menambahkannya ke dalam "
+#~ "archive\n"
+#~ " -k, --keep-old-files tidak menimpa file yang telah ada ketika "
+#~ "membongkar\n"
+#~ " --overwrite timpa file yang ada ketika membongkar\n"
+#~ " --overwrite-dir timpa metadata direktori ketika membongkar\n"
+#~ " -U, --unlink-first hapus setiap file sebelum membongkar "
+#~ "kepadanya\n"
+#~ " --recursive-unlink mengosongkan hierarchies sebelum membongkar "
+#~ "direktori\n"
+#~ " -S, --sparse menangani file sparse dengan efisien\n"
+#~ " -O, --to-stdout extract file ke standard output\n"
+#~ " -G, --incremental menangani old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " menangani new GNU-format incremental backup\n"
+#~ " --ignore-failed-read tidak keluar dengan nonzero pada file yang "
+#~ "tidak terbaca\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Menangani atribut file:\n"
+#~ " --owner=NAME paksa NAME sebagai owner file yang "
+#~ "ditambahkan\n"
+#~ " --group=NAME paksa NAME sebagai group file yang "
+#~ "ditambahkan\n"
+#~ " --mode=CHANGES paksa modus (symbolic) CHANGES untuk file "
+#~ "yang ditambahkan\n"
+#~ " --atime-preserve tidak mengganti access time pada dumped "
+#~ "file\n"
+#~ " -m, --modification-time tidak extract modification time dari file\n"
+#~ " --same-owner mencoba extract file dengan ownership yang "
+#~ "sama\n"
+#~ " --no-same-owner extract file sebagai anda sendiri\n"
+#~ " --numeric-owner selalu gunakan angka untuk nama user/"
+#~ "group\n"
+#~ " -p, --same-permissions extract semua informasi protection\n"
+#~ " --no-same-permissions jangan bongkar informasi permisi\n"
+#~ " --preserve-permissions sama seperti -p\n"
+#~ " -s, --same-order sort name yang akan diextract sesuai "
+#~ "dengan archive\n"
+#~ " --preserve-order sama seperti -s\n"
+#~ " --preserve sama seperti -p dan -s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Pemilihan dan penggantian device:\n"
+#~ " -f, --file=ARCHIVE gunakan file atau device ARCHIVE\n"
+#~ " --force-local file archive local, walaupun memiliki "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND gunakan COMMAND remote selain rsh\n"
+#~ " -[0-7][lmh] menentukan drive dan density\n"
+#~ " -M, --multi-volume buat/lihat/extract archive multi-volume\n"
+#~ " -L, --tape-length=NUM ganti tape setelah menulis NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE jalankan script pada akhir setiap tape "
+#~ "(berlaku untuk -M)\n"
+#~ " --new-volume-script=FILE sama seperti -F FILE\n"
+#~ " --volno-file=FILE gunakan/update volume number dalam FILE\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Device blok:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes setiap record\n"
+#~ " --record-size=SIZE SIZE bytes setiap record, kelipatan dari "
+#~ "512\n"
+#~ " -i, --ignore-zeros abaikan zeroed blocks dalam archive "
+#~ "(berarti EOF)\n"
+#~ " -B, --read-full-records block ulang pada saat baca (untuk 4.2BSD "
+#~ "pipes)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Pilihan format archive:\n"
+#~ " -V, --label=NAME buat archive dengan volume name "
+#~ "NAME\n"
+#~ " PATTERN saat list/extract, globbing PATTERN\n"
+#~ " -o, --old-archive, --portability tulis dalam format archive V7\n"
+#~ " --posix tulis dalam format archive POSIX\n"
+#~ " -j, --bzip2 filter arsip menggunakan bzip2\n"
+#~ " -z, --gzip, --ungzip filter archive menggunakan gzip\n"
+#~ " -Z, --compress, --uncompress filter archive menggunakan compress\n"
+#~ " --use-compress-program=PROG filter menggunkan PROG (harus "
+#~ "menggunakan -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Pilihan local file:\n"
+#~ " -C, --directory=DIR pindah ke directory DIR\n"
+#~ " -T, --files-from=NAME gunakan NAME untuk extract atau buat dari "
+#~ "file\n"
+#~ " --null -T membaca null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN abaikan file dengan pola PATTERN\n"
+#~ " -X, --exclude-from=FILE abaikan pola yang ada dalam file FILE\n"
+#~ " --anchored abaikan pola yang cocok dengan awal "
+#~ "nama file (default)\n"
+#~ " --no-anchored abaikan pola yang cocok setelah "
+#~ "sembarang /\n"
+#~ " --ignore-case abaikan ignore-case\n"
+#~ " --no-ignore-case pengabaian adalah case sensitive "
+#~ "(default)\n"
+#~ " --wildcards abaikan pola yang menggunakan "
+#~ "wildcards (default)\n"
+#~ " --no-wildcards abaikan pola yang string biasa\n"
+#~ " --wildcards-match-slash abaikan pola wildcard yang cocok dengan "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash abaikan pola wildcard yang tidak cocok "
+#~ "dengan '/'\n"
+#~ " -P, --absolute-names tidak menghilangkan awalan `/'s dari nama "
+#~ "file\n"
+#~ " -h, --dereference dump file yang ditunjuk oleh symlink\n"
+#~ " --no-recursion tidak otomatis menyertakan sub directory\n"
+#~ " -l, --one-file-system tetap pada local file system saat membuat "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME mulai dengan file NAME dalam archive\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATE hanya simpan files yang lebih baru dari "
+#~ "DATE\n"
+#~ " --newer-mtime bandingkan date dan time hanya saat data "
+#~ "berubah\n"
+#~ " --after-date=DATE sama seperti -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=CONTROL] backup sebelum menghapus, pilih version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup sebelum menghapus, ganti akhiran "
+#~ "SUFFIX\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Output informasi:\n"
+#~ " --help menampilkan help ini dan keluar\n"
+#~ " --version menampilkan versi program tar dan keluar\n"
+#~ " -v, --verbose menampilkan keterangan file yang sedang diproses\n"
+#~ " --checkpoint menampilkan nama directory names saat membaca "
+#~ "archive\n"
+#~ " --totals menampilkan jumlah byte yang ditulis saat membuat "
+#~ "archive\n"
+#~ " -R, --block-number menampilkan nomor blok dalam archive dengan "
+#~ "setiap pesan\n"
+#~ " -w, --interactive interaktif, meminta konfirmasi untuk setiap "
+#~ "tindakan\n"
+#~ " --confirmation sama seperti -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar tidak dapat membaca atau menghasilkan archive `--posix' "
+#~ "archives.\n"
+#~ "Bila POSIXLY_CORRECT telah diset pada environment, GNU extensions "
+#~ "diabaikan\n"
+#~ "dengan `--posix'.\n"
+#~ "Support untuk POSIX baru sebagian diimplementasi, jangan bergantung pada "
+#~ "hal ini.\n"
+#~ "ARCHIVE dapat berupa FILE, HOST:FILE atau USER@HOST:FILE; DATE mungkin "
+#~ "berupa \n"
+#~ "tanggal tekstual atau sebuah nama file yang dimulai dengan `/' atau `', "
+#~ "yang akan digunakan tanggal file.\n"
+#~ "Default `tar' *ini* adalah `-f%s -b%d'.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Opsi tidak berlaku lagi, gunakan --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Opsi tidak berlaku lagi, digantikan oleh --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Opsi tidak berlaku lagi, digantikan oleh --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Opsi tidak berlaku lagi, digantikan oleh --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Opsi tidak berlaku lagi, digantikan oleh --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Opsi tidak berlaku lagi, digantikan oleh --block-number"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Peringatan: option -y tidak didukung; mungkin maksud anda -j?"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Opsi tidak berlaku lagi, digantikan oleh --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Ditulis oleh John Gilmore dan Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Bila long option menunjukkan argumen sebagai mandatory, maka opsi "
+#~ "tersebut\n"
+#~ "adalah mandatory juga untuk short option. \n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH dari file yang dihasilkan\n"
+#~ " -p, --pattern=PATTERN PATTERN adalah `default' atau `zeros'\n"
+#~ " --help menampilkan help ini dan keluar\n"
+#~ " --version menampilkan informasi versi dan keluar\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Ditulis oleh F. Pinard"
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..d0f90f7
--- /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..c50330e
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,3008 @@
+# Messaggi in Italiano per GNU tar.
+# Copyright (C) 1996 Free Software Foundation, Inc.
+# Lele Gaifax <lele@nautilus.eclipse.it>, 1996.
+# Marco d'Itri <md@linux.it>, 1998.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU tar 1.14.91\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2004-12-23 11:32+0100\n"
+"Last-Translator: Marco d'Itri <md@linux.it>\n"
+"Language-Team: Italian <tp@lists.linux.it>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argomento %s non valido per %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argomento %s ambiguo per %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Gli argomenti validi sono:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: il parametro ARGP_HELP_FMT richiede un valore"
+
+#: lib/argp-help.c:227
+#, fuzzy, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: il parametro ARGP_HELP_FMT richiede un valore"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: parametro ARGP_HELP_FMT sconosciuto"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Spazzatura in ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Gli argomenti obbligatori o opzionali per le opzioni lunghe lo sono anche "
+"per quelle corte."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Uso:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " o: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [OPZIONE...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Usare `%s --help' o `%s --usage' per ulteriori informazioni.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Segnalare i bug a %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Errore di sistema sconosciuto"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+#, fuzzy
+msgid "give this help list"
+msgstr "Mostra questo aiuto"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+#, fuzzy
+msgid "give a short usage message"
+msgstr "Mostra un breve messaggio sull'uso"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NOME"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+#, fuzzy
+msgid "print program version"
+msgstr "Stampa la versione del programma"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: l'opzione `%s' richiede un argomento\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: l'opzione `%s' è ambigua\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: l'opzione `--%s' non accetta argomenti\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: l'opzione `%c%s' non accetta argomenti\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: l'opzione `%s' richiede un argomento\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opzione `--%s' non riconosciuta\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opzione `%c%s' non riconosciuta\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opzione illecita -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opzione non valida -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: l'opzione richiede un argomento -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: l'opzione `-W %s' è ambigua\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: l'opzione `-W %s' non accetta argomenti\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "dimensione dei blocchi"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "memoria esaurita"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: impossibile %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: attenzione: impossibile %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: impossibile a cambiare il modo a %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: impossibile cambiare il proprietario all'UID %lu e al GID %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: impossibile fare un hard link a %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: errore di lettura al byte %s, leggendo %lu byte"
+msgstr[1] "%s: errore di lettura al byte %s, leggendo %lu byte"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: attenzione: errore di lettura al byte %s, leggendo %lu byte"
+msgstr[1] "%s: attenzione: errore di lettura al byte %s, leggendo %lu byte"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: impossibile fare seek a %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: attenzione: impossibile fare seek a %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: impossibile creare un link simbolico a %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: scritti solo %lu byte di %lu"
+msgstr[1] "%s: scritti solo %lu byte di %lu"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Rimuovo il `%s' iniziale dai nomi dei membri"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "`%s' iniziale rimosso dagli obiettivi degli hard link"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Sostituisco `.' al nome vuoto di un membro"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Sostituisco `.' all'obbiettivo vuoto di un hard link"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "'"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: servizio non disponibile"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Impossibile eseguire la shell remota"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: impossibile allocare spazio per il buffer\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Impossibile allocare spazio per il buffer"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Usare `%s --help' per ulteriori informazioni.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Uso: %s [OPZIONE]\n"
+"Manipola un drive per nastri accettando comandi da un processo remoto.\n"
+"\n"
+" --version Mostra le informazioni sulla versione.\n"
+" --help Mostra questo aiuto.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnalare i bug a <%s>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Offset di seek fuori dai limiti"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Offset di seek fuori dai limiti"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Direzione di seek fuori dai limiti"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: fine del file prematura\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Fine del file prematura"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Comando spazzatura"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Byte totali scritti: %s (%s, %s/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Byte totali scritti: %s (%s, %s/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(pipe)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Valore di record_size non valido"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Non è stato indicato il nome di un archivio"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Impossibile verificare archivi su stdin/stdout"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "L'archivio è compresso. Usare l'opzione %s."
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Impossibile aggiornare archivi compressi"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Checkpoint di scrittura %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Checkpoint di lettura %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "All'inizio del nastro, abbandono adesso"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Troppi errori, abbandono"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Blocco non allineato (%lu byte) nell'archivio"
+msgstr[1] "Blocco non allineato (%lu byte) nell'archivio"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Dimensioni del record = %lu blocco"
+msgstr[1] "Dimensioni del record = %lu blocchi"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Impossibile muoversi all'indietro nel file dell'archivio; potrebbe essere\n"
+"illeggibile senza l'opzione -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek non si è fermato al limite di un record"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: contiene un numero di volume non valido"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Overflow del numero di volume"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Preparare il volume #%d per %s e premere Invio: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Ricevuto EOF quando era attesa la risposta dell'utente"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ATTENZIONE: l'archivio non è completo"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [nome] Cambia il nome del file per il prossimo volume (e i successivi)\n"
+" q Termina tar\n"
+" ! Esegui una subshell\n"
+" ? Stampa questa lista\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Nessun nuovo volume; esco.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "comando `%s' fallito"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Questo non sembra un archivio tar"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s non continua su questo volume"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s non continua su questo volume"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s è la dimensione sbagliata (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Questo volume è fuori sequenza"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "L'archivio non ha un'etichetta corrispondente a %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Il volume %s non corrisponde a %s"
+
+#: src/buffer.c:1392
+#, fuzzy, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: il nome del file è troppo lungo per essere scritto in un'intestazione "
+"GNU multivolume"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Ho potuto leggere solo %lu byte di %lu"
+msgstr[1] "Ho potuto leggere solo %lu byte di %lu"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "I contenuti sono differenti"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "EOF inatteso nell'archivio"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "I tipi dei file sono diversi"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "I modi sono diversi"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Gli UID sono diversi"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "I GID sono diversi"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "I tempi di modifica sono diversi"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Le dimensioni sono diverse"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Non è un link a %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Il link simbolico è diverso"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Il numero del dispositivo è diverso"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verifica "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: tipo di file '%c' sconosciuto, confrontato come un file normale"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "L'archivio contiene nomi di file con i prefissi iniziali rimossi."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "La verifica potrebbe non riuscire a trovare i file originali."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "ERRORE DI VERIFICA: trovata %d intestazione non valida"
+msgstr[1] "ERRORE DI VERIFICA: trovate %d intestazioni non valide"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: è etichettata come cache; non archiviata"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "valore %s fuori dall'intervallo (%s) %s..%s; sostituisco %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "valore %s fuori dall'intervallo (%s) %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Generazione delle intestazioni ottali negative"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: il nome del file è troppo lungo (max %d); non archiviato"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+"%s: il nome del file è troppo lungo (impossibile dividerlo); non archiviato"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: il nome del link è troppo lungo; non archiviato"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: il file si è ristretto di %s byte; lo riempio con zeri"
+msgstr[1] "%s: il file si è ristretto di %s byte; lo riempio con zeri"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: il file si trova su un altro file system; non archiviato"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: tipo di file sconosciuto; file ignorato"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr "Mancano i link a '%s'.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: non modificato; non archiviato"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: il file è l'archivio; non archiviato"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: il file è stato cancellato prima che potessi leggerlo"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: è etichettata come cache; non archiviata"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: il file è cambiato mentre lo stavo leggendo"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: socket ignorato"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: door ignorata"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Salto alla prossima intestazione"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Cancello una non-intestazione dall'archivio"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: l'orario %s è implausibilmente vecchio"
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: l'orario %s è %lu s nel futuro"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: incoerenza inaspettata durante la creazione della directory"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+"%s: directory rinominata prima che fosse possibile estrarre il suo stato"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Estraggo i file contigui come file normali"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Cerco di estrarre i link simbolici come hard link"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Leggo %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: impossibile estrarlo -- il file continua da un altro volume"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "EOF inaspettato nei nomi mutilati"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: il tipo di file '%c' è sconosciuto, estratto come un file normale"
+
+#: src/extract.c:1184
+#, fuzzy, c-format
+msgid "Current %s is newer or same age"
+msgstr "Il `%s' corrente è più recente"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: non è stato possibile fare il backup di questo file"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: impossibile rinominarlo in %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Errore irrimediabile: esco subito"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: la directory è stata rinominata"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: la directory è stata rinominata"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: la directory è nuova"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Orario non valido"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Modo dell'opzione non valido"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Numero di dispositivo non valido"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Numero dell'inode non valido"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "EOF inatteso nell'archivio"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Argomento della densità malformato: '%s'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Argomento della densità malformato: '%s'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Impossibile allocare memoria per il blocking factor %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: non elimino la directory: impossibile fare stat"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: la directory si trova su un altro dispositivo: non eliminata"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: cancello %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: impossibile rimuoverlo"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: omesso"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blocco %s: ** Blocco di NUL **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Un singolo blocco di zeri a %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blocco %s: ** Fine del File **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blocco %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Trovati spazi nell'header dove era atteso il valore numerico %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Il valore ottale %.*s dell'archivio è fuori dall'intervallo %s; si suppone\n"
+"che sia in complemento a due"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Il valore ottale %.*s dell'archivio è fuori dall'intervallo %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "L'archivio contiene intestazioni base-64 obsolescenti"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+"La stringa base-64 con segno %s dell'archivio è fuori dall'intervallo %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Il valore base-256 dell'archvio è fuori dall'intervallo %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "L'archivio contiene %.*s dove era atteso il valore numerico %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, fuzzy, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Il valore %s dell'archivio è fuori dall'intervallo %s %s.%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " link a %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " tipo di file sconosciuto %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Link Lungo--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Nome Lungo--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Intestazione del Volume--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Continua al byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Creo la directory:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Rinomino %s in %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: impossibile rinominarlo in %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Rinomino di nuovo %s in %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Impossibile salvare la directory di lavoro"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Impossibile cambiare la directory di lavoro"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "il processo figlio"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "il canale tra processi"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: non trovato nell'archivio"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: occorrenza richiesta non trovata nell'archivio"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Le opzioni `-%s' e `-%s' richiedono entrambe lo standard input"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: formato dell'archivio non valido"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Richieste funzionalità GNU su un formato di archivio incompatibile"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"\n"
+"Uso: %s [OPZIONE]... [FILE]...\n"
+"\n"
+"Esempi:\n"
+" %s -cf archivio.tar foo bar # Crea archivio.tar dai file foo e bar.\n"
+" %s -tvf archivio.tar # Elenca prolissamente i file in archivio."
+"tar.\n"
+" %s -xf archive.tar # Estrae tutti i file da archivio.tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"GNU `tar' salva molti file in un solo archivio su nastro o disco e può\n"
+"ripristinare singoli file dall'archivio.\n"
+"\n"
+"Esempi:\n"
+" tar -cf archivio.tar foo bar # Crea archivio.tar dai file foo e bar.\n"
+" tar -tvf archive.tar # Elenca prolissamente i file in archivio."
+"tar.\n"
+" tar -xf archive.tar # Estrae tutti i file da archivio.tar.\n"
+"Il suffisso dei backup è `~', a meno che sia impostato con --suffix oppure\n"
+"SIMPLE_BACKUP_SUFFIX.\n"
+"Il controllo di versione può essere impostato con --backup oppure\n"
+"VERSION_CONTROL, i valori possibili sono:\n"
+"\n"
+" t, numbered fa backup numerati\n"
+" nil, existing numerati se esistono backup numerati, altrimenti semplici\n"
+" never, simple fa sempre backup semplici\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Modi operativi principali:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "elenca i contenuti dell'archivio"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "estrae file da un archivio"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "crea un nuovo archivio"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "cerca differenze tra l'archivio e il file system"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "accoda i file alla fine di un archivio"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "accoda solo i file più recenti della copia nell'archivio"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "aggiunge il contenuto di un altro archivio"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "cancella dall'archivio (non su nastri magnetici!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Modificatori delle operazioni:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "gestisce efficientemente i file sparsi"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "gestisce i vecchi backup incrementali GNU"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "FILE"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "gestisce i nuovi backup incrementali GNU"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "non usce con non-zero quando ci sono file illeggibili"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "NUMERO"
+
+#: src/tar.c:404
+#, fuzzy
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"processa solo la N-esima occorrenza di ogni file nell'archivio. Questa "
+"opzione è valida solo se usata insieme con uno dei sottocomandi --delete, --"
+"diff, --extract o --list, e quando una lista di file è fornita da linea di "
+"comando o attraverso l'opzione -T. NUMERO è predefinito a 1."
+
+#: src/tar.c:410
+#, fuzzy
+msgid "archive is seekable"
+msgstr "È possibile posizionarsi nell'archivio"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "prova a verificare l'archivio dopo averlo scritto"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "cancella i file dopo averli aggiunti all'archivio"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "durante l'estrazione non sovrascrive i file esistenti"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "non sostituisce i file esistenti più recenti delle copie nell'archivio"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "sovrascrive i file esistenti durante l'estrazione"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "cancella ogni file prima di estrarre su di esso"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "svuota le directory prima di estrarle"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "preserva i metadati delle directory esistenti"
+
+#: src/tar.c:434
+#, fuzzy
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "sovrascrive i file esistenti durante l'estrazione"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "estrae i file su standard output"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "COMANDO"
+
+#: src/tar.c:445
+#, fuzzy
+msgid "pipe extracted files to another program"
+msgstr "estrae i file su standard output"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Gestione degli attributi dei file:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "forza il proprietario NOME per i file aggiunti"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "forza il gruppo NOME per i file aggiunti"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATA-O-FILE"
+
+#: src/tar.c:461
+#, fuzzy
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "archivia solo i file più recenti di DATA-O-FILE"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "CAMBI"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "forza il modo (simbolico) CAMBI per i file aggiunti"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "non estrae l'orario di ultima modifica del file"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "cerca di estrarre i file mantenendo lo stesso proprietario"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "estrae i file come te stesso"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "usa sempre i numeri per i nomi di utente/gruppo"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "ordina i nomi da estrarre come nell'archivio"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "come -p e -s insieme"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Selezione e cambio del dispositivo:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARCHIVIO"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "usa come archivio il file o il dispositivo ARCHIVIO"
+
+#: src/tar.c:502
+#, fuzzy
+msgid "archive file is local even if it has a colon"
+msgstr "il file dell'archivio è locale anche se contiene `:'"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "usa il COMANDO rmt indicato invece di rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "usa il COMANDO remoto invece di rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "indica drive e densità"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "crea/elenca/estrae archivi multi-volume"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "cambia il nastro dopo avere scritto NUMERO x 1024 byte"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "esegue lo script alla fine di ogni nastro (implica -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "usa/aggiorna il numero del volume nel FILE"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Blocking dei dispositivi:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOCCHI"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "usa record di BLOCCHI x 512 byte"
+
+# Purtroppo non è possibile tradurre SIZE nell'opzione, quindi non posso
+# tradurlo nemmeno in questa descrizione.
+#: src/tar.c:541
+#, fuzzy
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "usa SIZE byte per record, multiplo di 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "ignora i blocchi a zero nell'archivio (significa EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "rifà i blocchi in lettura (per le pipe di 4.2BSD)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Selezione del formato di archiviazione:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMATO"
+
+#: src/tar.c:553
+#, fuzzy
+msgid "create archive of the given format"
+msgstr "crea gli archivi nel formato indicato."
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "Il FORMATO è uno dei seguenti:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "vecchio formato di tar V7"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "formato GNU di tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "formato GNU di tar 1.13.x"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "Formato POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "Formato POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+#, fuzzy
+msgid "same as pax"
+msgstr "Come pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "come --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "come --format=posix"
+
+#: src/tar.c:573
+#, fuzzy
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "parolachiave[[:]=valore][,parolachiave[[:]=calore], ...]"
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "controlla le parole chiavi di pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TESTO"
+
+#: src/tar.c:576
+#, fuzzy
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"crea l'archivio con il NOME di volume. Al momento dell'elencazione o "
+"dell'estrazione, usa il TESTO come modello di globbing"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "filtra l'archivio attraverso bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "filtra l'archivio attraverso gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "filtra l'archivio attraverso compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROGRAMMA"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "filtra usando PROGRAMMA (deve accettare -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Selezione dei file locali:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "DIR"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "entra nella directory DIR"
+
+#: src/tar.c:599
+#, fuzzy
+msgid "get names to extract or create from FILE"
+msgstr "prende i nomi da estrarre o creare dal file NOME"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T legge nomi terminati da NULL, disabilita -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "MODELLO"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "escludi i file i cui nomi corrispondono al MODELLO"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "escludi i modelli elencati in FILE"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "esclude le directory etichettate come cache"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "esclude le directory etichettate come cache"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "esclude le directory etichettate come cache"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "esclude le directory etichettate come cache"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "esclude le directory etichettate come cache"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "esclude le directory etichettate come cache"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "non entra automaticamente nelle directory"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "resta nel file system locale durante la creazione dell'archivio"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "entra ricorsivamente nelle directory (predefinito)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "non rimuove lo `/' iniziale dai nomi dei file"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "NOME"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "comincia dal membro NOME nell'archivio"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "archivia solo i file più recenti di DATA-O-FILE"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATA"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "confronta data e ora solo quando il contenuto è cambiato"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "CONTROLLO"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "fa un backup prima di rimuovere, scegliendo il CONTROLLO di versione"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "STRINGA"
+
+#: src/tar.c:645
+#, fuzzy
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"fa un backup prima di rimuovere, cambiando il solito suffisso '~' a meno che "
+"sia cambiato tramite la variabile di ambiente SIMPLE_BACKUP_SUFFIX"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+#, fuzzy
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "toglie NUMERO componenti iniziali dai nomi dei file"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+#, fuzzy
+msgid "ignore case"
+msgstr "le esclusioni ignorano maiuscole/minuscole"
+
+#: src/tar.c:665
+#, fuzzy
+msgid "patterns match file name start"
+msgstr "i modelli di esclusione corrispondono all'inizio del nome del file"
+
+#: src/tar.c:667
+#, fuzzy
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "i modelli di esclusione vengono confrontati dopo ogni / (predefinito)"
+
+#: src/tar.c:669
+#, fuzzy
+msgid "case sensitive matching (default)"
+msgstr "le esclusioni considerano maiuscole/minuscole (predefinito)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr ""
+"i metacaratteri dei modelli di esclusione non possono corrispondere a `/'"
+
+#: src/tar.c:677
+#, fuzzy
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+"i metacaratteri dei modelli di esclusione possono corrispondere a "
+"`/' (predefinito)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Output informativo:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "elenca prolissamente i file processati"
+
+#: src/tar.c:686
+#, fuzzy
+msgid "[.]NUMBER"
+msgstr "NUMERO"
+
+#: src/tar.c:687
+#, fuzzy
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "mostra i progressi ogni 10 record"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "stampa un messaggio se non tutti i link sono archiviati"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "stampa le date di modifica dei file in formato UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "manda l'output verboso al FILE"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "mostra il numero di blocco nell'archivio ad ogni messaggio"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "chiede conferma per ogni azione"
+
+#: src/tar.c:706
+#, fuzzy
+msgid "show tar defaults"
+msgstr "Mostra le opzioni predefinite di tar"
+
+#: src/tar.c:708
+#, fuzzy
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"All'elencazione o all'estrazione, elenca ogni directory che non corrisponde "
+"ai criteri di ricerca."
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Opzioni di compabilità:"
+
+#: src/tar.c:726
+#, fuzzy
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"alla creazione, uguale a --old-archive. All'estrazione, uguale a --no-same-"
+"owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Altre opzioni:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Impossibile indicare più di una delle opzioni `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Conflitto tra le opzioni di compressione"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " tipo di file sconosciuto %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "File della data non trovato"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Sostituisco %s al posto del formato di data sconosciuto %s"
+
+#: src/tar.c:961
+#, fuzzy, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Tratto la data `%s' come %s + %ld nanosecondo"
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: il file è l'archivio; non archiviato"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Questo* tar ha le seguenti opzioni predefinite:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Blocking factor non valido"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Attenzione: l'opzione -I non è gestita; forse intendevi -j o -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Lunghezza del nastro non valida"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Più di una data di soglia"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: gruppo non valido"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Modo dell'opzione non valido"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Numero non valido"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Proprietario non valido"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Dimensione del record non valida"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "La dimensione del record deve essere un multiplo di %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Numero di elementi non valido"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, fuzzy, c-format
+msgid "Malformed density argument: %s"
+msgstr "Argomento della densità malformato: '%s'"
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Densità sconosciuta: '%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Le opzioni `-[0-7][lmh]' non sono gestite da *questo* tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[FILE]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "La vecchia opzione `%c' richiede un argomento."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence non ha senso senza una lista di file"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence non può essere usata nel modo di operazioni richiesto"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Archivi multipli richiedono l'opzione `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Impossibile combinare --listed-incremental e --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: l'etichetta di volume è troppo lunga (il limite è %lu byte)"
+msgstr[1] "%s: l'etichetta di volume è troppo lunga (il limite è %lu byte)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Impossibile verificare archivi multivolume"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Impossibile verificare archivi compressi"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Impossibile usare archivi multivolume compressi"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Impossibile aggiornare archivi compressi"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option può essere usata solo su archivi POSIX"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Codardamente mi rifiuto di creare un archivio vuoto"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Le opzioni `-Aru' sono incompatibili con `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Bisogna indicare una delle opzioni `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Uscita per errore ritardata dall'errore precedente"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: il file si è rimpicciolito di %s byte"
+msgstr[1] "%s: il file si è rimpicciolito di %s byte"
+
+#: src/xheader.c:158
+#, fuzzy, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "La parola chiave %s è sconosciuta o non ancora implementata"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Il modello %s non può essere usato"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "La parola chiave %s non può essere sostituita"
+
+#: src/xheader.c:498
+#, fuzzy
+msgid "Malformed extended header: missing length"
+msgstr "Intestazione estesa malformata: manca il segno di uguale"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr ""
+"La stringa base-64 con segno %s dell'archivio è fuori dall'intervallo %s"
+
+#: src/xheader.c:525
+#, fuzzy
+msgid "Malformed extended header: missing blank after length"
+msgstr "Intestazione estesa malformata: manca lo spazio dopo la lunghezza"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Intestazione estesa malformata: manca il segno di uguale"
+
+#: src/xheader.c:539
+#, fuzzy
+msgid "Malformed extended header: missing newline"
+msgstr "Intestazione estesa malformata: manca il segno di uguale"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Il valore %s dell'archivio è fuori dall'intervallo %s %s.%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Intestazione estesa malformata: manca il segno di uguale"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, fuzzy, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Intestazione estesa malformata: manca il segno di uguale"
+
+#: src/xheader.c:1328
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "Intestazione estesa malformata: manca il segno di uguale"
+
+#: src/xheader.c:1338
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Intestazione estesa malformata: manca il segno di uguale"
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Genero i file di dati per la suite di test di GNU tar.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Altre opzioni:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+#, fuzzy
+msgid "Create file of the given SIZE"
+msgstr "crea gli archivi nel formato indicato."
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "estrae i file su standard output"
+
+#: tests/genfile.c:131
+#, fuzzy
+msgid "Read file names from FILE"
+msgstr "Letti %s byte da %s"
+
+#: tests/genfile.c:133
+#, fuzzy
+msgid "-T reads null-terminated names"
+msgstr "-T legge nomi terminati da NULL, disabilita -C"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "prova a verificare l'archivio dopo averlo scritto"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+#, fuzzy
+msgid "Execute COMMAND"
+msgstr "COMANDO"
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Orario non valido"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Numero dell'inode fuori dai limiti"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Errore di sistema sconosciuto"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: impossibile fare seek a %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " tipo di file sconosciuto %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: impossibile fare seek a %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Il figlio è morto con il segnale %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Nomi di file mutilati--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details.\n"
+#~ "Questo programma NON HA GARANZIA, per quanto permesso dalla legge.\n"
+#~ "Può essere redistribuito secondo i termini della GNU General Public "
+#~ "License;\n"
+#~ "si veda il file chiamato COPYING per i dettagli."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: comando spazzatura %c\n"
+
+#~ msgid "Quitting now."
+#~ msgstr "Abbandono adesso."
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ATTENZIONE: intestazione del volume mancante"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Errore nel nome lungo visibile"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Orario fuori dai limiti"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Numero di dispositivo fuori dai limiti"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Errore nel nome lungo visibile"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "%s rinominato in %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: impossibile fare il link simbolico a %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Fatto il link simbolico %s a %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Comando di demutilazione %s sconosciuto"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Manca il nome del file dopo -C"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "non cambia l'orario di accesso dei file archiviati"
+
+#~ msgid "extract permissions information"
+#~ msgstr "estrae le informazioni sui permessi"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "non estrae le informazioni sui permessi"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "NOMI-DI-FILE"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "i modelli di esclusione sono stringhe normali"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "archivia i file a cui puntano i link simbolici"
+
+#~ msgid "same as -N"
+#~ msgstr "come -N"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "i modelli di esclusione usano metacaratteri (predefinito)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "stampa il numero totale di byte scritti creando l'archivio"
+
+#~ msgid "Print license and exit"
+#~ msgstr "Mostra la licenza ed esce"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Basato sul lavoro di John Gilmore e Jay Fenlason. Si veda il file "
+#~ "AUTHORS\n"
+#~ "per l'elenco completo degli autori.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " GNU tar è software libero; potete redistribuirlo e/o modificarlo\n"
+#~ " secondo i termini della GNU General Public License come pubblicata\n"
+#~ " dalla Free Software Foundation; la versione 2 della Licenza o\n"
+#~ " (a vostra scelta) ogni versione successiva.\n"
+#~ "\n"
+#~ " GNU tar è distribuito nella speranza che possa essere utile,\n"
+#~ " ma SENZA ALCUNA GARANZIA; anche senza la garanzia implicita di\n"
+#~ " COMMERCIABILITÀ o di IDONEITÀ AD UNO SCOPO PARTICOLARE.\n"
+#~ " Si consulti la GNU General Public License per ulteriori dettagli.\n"
+#~ "\n"
+#~ " Dovreste avere ricevuto una copia della GNU General Public License\n"
+#~ " con GNU tar; altrimenti scrivete alla Free Software Foundation, Inc.,\n"
+#~ " 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.\n"
+#~ "\n"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "La sintassi dell'opzione -l cambierà nelle versioni future."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Per favore si usi invece l'opzione --one-file-system."
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Attenzione: l'opzione -y non è gestita; forse intendevi -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Errore scrivendo sullo standard output"
+
+#~ msgid "Cannot close"
+#~ msgstr "Impossibile chiudere"
+
+#~ msgid "Cannot dup"
+#~ msgstr "impossibile usare dup"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Impossibile usare archivi compressi o remoti"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (figlio)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (nipote)"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Il figlio ha restituito lo status %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "I nomi dei membri contengono `..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: I nomi dei membri contengono `..'"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU `tar' salva molti file insieme in un solo archivio su nastro o su "
+#~ "disco\n"
+#~ "e può ripristinare singoli file dall'archivio.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Se una opzione lunga indica un argomento come obbligatorio, allora lo è "
+#~ "anche\n"
+#~ "per l'opzione corta equivalente. Lo stesso vale per gli argomenti "
+#~ "opzionali.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modi operativi principali:\n"
+#~ " -t, --list elenca il contenuto dell'archivio\n"
+#~ " -x, --extract, --get estrae i file da un archivio\n"
+#~ " -c, --create crea un nuovo archivio\n"
+#~ " -d, --diff, --compare cerca differenze tra l'archivio e il file "
+#~ "system\n"
+#~ " -r, --append accoda i file alla fine di un archivio\n"
+#~ " -u, --update accoda solo i file più nuovi della copia in "
+#~ "archivio\n"
+#~ " -A, --catenate aggiungi il contenuto di un altro archivio\n"
+#~ " --concatenate come -A\n"
+#~ " --delete cancella da un archivio (non su nastri "
+#~ "magnetici!)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modificatori delle operazioni:\n"
+#~ " -W, --verify prova a verificare l'archivio dopo averlo "
+#~ "scritto\n"
+#~ " --remove-files cancella i file dopo averli aggiunti "
+#~ "all'archivio\n"
+#~ " -k, --keep-old-files nell'estrazione non sovrascrive file "
+#~ "esistenti\n"
+#~ " --overwrite sovrascrive i file esistenti durante "
+#~ "l'estrazione\n"
+#~ " --overwrite-dir sovrascrive i metadati delle directory "
+#~ "durante\n"
+#~ " l'estrazione\n"
+#~ " -U, --unlink-first cancella ogni file prima di estrarre su di "
+#~ "esso\n"
+#~ " --recursive-unlink svuota le directory prima di estrarle\n"
+#~ " -S, --sparse gestisce efficientemente i file sparsi\n"
+#~ " -O, --to-stdout estrae i file su standard output\n"
+#~ " -G, --incremental gestisce i vecchi backup incrementali GNU\n"
+#~ " -g, --listed-incremental=FILE gestisce i nuovi backup incrementali "
+#~ "GNU\n"
+#~ " --ignore-failed-read non esce con non-zero con file illeggibili\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Gestione degli attributi dei file:\n"
+#~ " --owner=NOME forza NOME come proprietario dei file "
+#~ "aggiunti\n"
+#~ " --group=NOME forza NOME come gruppo dei file aggiunti\n"
+#~ " --mode=CAMBI forza il modo (simbolico) CAMBI per i "
+#~ "file\n"
+#~ " aggiunti\n"
+#~ " --atime-preserve non cambia il tempo di accesso dei file "
+#~ "archiv.\n"
+#~ " -m, --modification-time non estrae il tempo di ultima modifica del "
+#~ "file\n"
+#~ " --same-owner cerca di estrarre i file con lo stesso "
+#~ "proprietario\n"
+#~ " --no-same-owner estrare i file come te stesso\n"
+#~ " --numeric-owner usa sempre i numeri per i nomi di utente/"
+#~ "gruppo\n"
+#~ " -p, --same-permissions estrae tutti i permessi\n"
+#~ " --no-same-permissions non estrae le informazioni sui permessi\n"
+#~ " --preserve-permissions come -p\n"
+#~ " -s, --same-order ordina i nomi da estrarre come "
+#~ "nell'archivio\n"
+#~ " --preserve-order come -s\n"
+#~ " --preserve come -s e -p insieme\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selezione e cambio del dispositivo:\n"
+#~ " -f, --file=ARCHIVIO usa come archivio il file o il "
+#~ "dispositivo\n"
+#~ " ARCHIVIO\n"
+#~ " --force-local l'archivio è locale anche se contiene "
+#~ "`:'\n"
+#~ " --rsh-command=COMANDO usa la shell remota COMANDO al posto di "
+#~ "rsh\n"
+#~ " -[0-7][lmh] specifica il drive e la densità\n"
+#~ " -M, --multi-volume crea/elenca/estrai archivi multi-volume\n"
+#~ " -L, --tape-length=NUM cambia nastro dopo aver scritto NUMx1024 "
+#~ "byte\n"
+#~ " -F, --info-script=FILE esegui lo script FILE alla file di ogni "
+#~ "nastro\n"
+#~ " (implica -M)\n"
+#~ " --new-volume-script=FILE come -F FILE\n"
+#~ " --volno-file=FILE usa/aggiorna il numero del volume in "
+#~ "FILE\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Blocking dei dispositivi:\n"
+#~ " -b, --blocking-factor=BLOCCHI usa record di BLOCCHI x 512 byte\n"
+#~ " --record-size=SIZE usa record di SIZE bytes, multiplo di "
+#~ "512\n"
+#~ " -i, --ignore-zeros ignora blocchi azzerati nel archivio\n"
+#~ " (significa EOF)\n"
+#~ " -B, --read-full-records reblock in lettura (per le pipe di "
+#~ "4.2BSD)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selezione formato di archiviazione:\n"
+#~ " -V, --label=NOME crea un archivio con nome di volume "
+#~ "NOME\n"
+#~ " MODELLO durante l'elencazione/estrazione, "
+#~ "MODELLO\n"
+#~ " è un globbing pattern\n"
+#~ " -o, --old-archive, --portability scrive un archivio in formato V7\n"
+#~ " --posix scrive un archivio in formato POSIX\n"
+#~ " -j, --bzip2, filtra l'archivio attraverso bzip2\n"
+#~ " -z, --gzip, --ungzip filtra l'archivio attraverso gzip\n"
+#~ " -Z, --compress, --uncompress filtra l'archivio attraverso "
+#~ "compress\n"
+#~ " --use-compress-program=PROG filtra usando PROG (deve accettare -"
+#~ "d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selezione dei file locali:\n"
+#~ " -C, --directory=DIR si sposta nella directory DIR\n"
+#~ " -T, --files-from=NOME prende i nomi da estrarre o creare dal file "
+#~ "NOME\n"
+#~ " --null -T legge nomi terminati da null, disabilita -"
+#~ "C\n"
+#~ " --exclude=MODELLO esclude i file i cui nomi soddisfano il "
+#~ "MODELLO\n"
+#~ " -X, --exclude-from=FILE esclude i modelli elencati nel file FILE\n"
+#~ " --anchored i modelli di esclusione vengono confrontati "
+#~ "con\n"
+#~ " l'inizio del nome del file (predefinito)\n"
+#~ " --no-anchored i modelli di esclusione vengono confrontati dopo "
+#~ "ogni /\n"
+#~ " --ignore-case le esclusioni ignorano maiuscole/minuscole\n"
+#~ " --no-ignore-case le esclusioni considerano le maiuscole "
+#~ "(predef.)\n"
+#~ " --wildcards i modelli di esclusione usano i metacaratteri "
+#~ "(pred.)\n"
+#~ " --no-wildcards i modelli di esclusione sono stringhe "
+#~ "normali\n"
+#~ " --wildcards-match-slash i metacaratteri possono corrispondere a / "
+#~ "(pred.)\n"
+#~ " --no-wildcards-match-slash i metacaratteri non possono "
+#~ "corrispondere a /\n"
+#~ " -P, --absolute-names non rimuove lo '/' iniziale dai nomi dei "
+#~ "file\n"
+#~ " -h, --dereference archivia il file a cui punta il symlink\n"
+#~ " --no-recursion non attraversa automaticamente le directory\n"
+#~ " -l, --one-file-system resta nel file system locale durante la "
+#~ "creazione\n"
+#~ " -K, --starting-file=NOME comincia dal file NOME nell'archivio\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATA archivia solo i file più recenti di DATA\n"
+#~ " --newer-mtime=DATA confronta data e ora solo quando il "
+#~ "contenuto è\n"
+#~ " cambiato\n"
+#~ " --after-date=DATE come -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=CONTROLLO] backup prima di rimuovere, scegli il\n"
+#~ " controllo di versione\n"
+#~ " --suffix=SUFFSSO backup prima di rimuovere, cambia "
+#~ "suffisso\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Output informativo:\n"
+#~ " --help mostra questo aiuto ed esce\n"
+#~ " --version mostra le informazioni sulla versione ed esce\n"
+#~ " -v, --verbose elenca prolissamente i files gestiti\n"
+#~ " --checkpoint leggendo l'archivio stampa i nomi delle "
+#~ "directory\n"
+#~ " --totals stampa i byte scritti in totale creando "
+#~ "l'archivio\n"
+#~ " -R, --block-number mostra il numero di blocco nell'archivio con "
+#~ "ogni\n"
+#~ " messaggio\n"
+#~ " -w, --interactive chiede conferma per ogni azione\n"
+#~ " --confirmation come -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar non può leggere nè produrre archivi `--posix'. Se nell'ambiente "
+#~ "è\n"
+#~ "impostato POSIXLY_CORRECT, `--posix' vieta le estensioni GNU.\n"
+#~ "La gestione degli archivi POSIX è implementata solo parzialmente, non\n"
+#~ "contateci ancora. L'ARCHIVIO può essere un FILE, HOST:FILE oppure\n"
+#~ "UTENTE@HOST:FILE; il FILE può essere un file o un dispositivo.\n"
+#~ "*Questo* `tar' ha come opzioni predefinite `-f%s -b%d'.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Opzione obsoleta, adesso implicata da --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Nome di opzione obsoleto sostituito da --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Nome di opzione obsoleto sostituito da --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Nome di opzione obsoleto sostituito da --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Nome di opzione obsoleto sostituito da --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Nome di opzione obsoleto sostituito da --block-number"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Nome di opzione obsoleto sostituito da --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Scritto da John Gilmore e Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Gli argomenti che sono obbligatori per le opzioni lunghe lo sono anche "
+#~ "per\n"
+#~ "le opzioni corte equivalenti.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH lunghezza del file generato\n"
+#~ " -p, --pattern=MODELLO MODELLO è `default' o `zeros'\n"
+#~ " --help mostra questo aiuto ed esce\n"
+#~ " --version mostra le informazioni sulla versione ed "
+#~ "esce\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Scritto da F. Pinard."
diff --git a/po/ja.gmo b/po/ja.gmo
new file mode 100644
index 0000000..8bcb416
--- /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..60dd52d
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,2405 @@
+# Japanese messages for GNU tar 1.16.1
+# Copyright (C) 1999, 2000, 2001, 2004, 2006 Free Software Foundation, Inc.
+# Masahito Yamaga <ma@yama-ga.com>, 2006.
+# derived from the version by
+# Daisuke Yamashita <yamad@mb.infoweb.ne.jp>, 1999-2001.
+# Masahito Yamaga <yamaga@ipc.chiba-u.ac.jp>, 1999.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU tar 1.16.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-12-10 01:52+0900\n"
+"Last-Translator: Masahito Yamaga <ma@yama-ga.com>\n"
+"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=EUC-JP\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=0;\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "°ú¿ô %s ¤Ï %s ¤ËÂФ·¤Æ̵¸ú¤Ç¤¹"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "°ú¿ô %s ¤Ï %s ¤ËÂФ·¤Æ¤¢¤¤¤Þ¤¤¤Ç¤¹"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Àµ¤·¤¤°ú¿ô¤Ï:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: %s ÃÍ¤Ï %s ¤è¤ê¾®¤µ¤¤¤«Åù¤·¤¤"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: ARGP_HELP_FMT ¥Ñ¥é¥á¡¼¥¿¤ÏÃͤ¬É¬Í×"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: ARGP_HELP_FMT ¥Ñ¥é¥á¡¼¥¿¤ÏÀµ¤ÎÃͤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: ̤ÃΤΠARGP_HELP_FMT ¥Ñ¥é¥á¡¼¥¿"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "ARGP_HELP_FMT ¤Ë¥´¥ß: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Ť¤¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ëɬ¿Ü¤Þ¤¿¤ÏǤ°Õ¤Î°ú¿ô¤ÏÂбþ¤¹¤ëû¤¤¥ª¥×¥·¥ç¥ó¤ËÂФ·¤Æ¤â"
+"ɬ¿Ü¤Þ¤¿¤ÏǤ°Õ¤Ç¤¹."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "»ÈÍÑË¡:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " ¤Þ¤¿¤Ï: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [¥ª¥×¥·¥ç¥ó...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "¤è¤ê¾Ü¤·¤¤¾ðÊó¤Ï `%s --help' ¤Þ¤¿¤Ï `%s --usage' ¤Ç.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "¥Ð¥°¥ì¥Ý¡¼¥È¤Ï %s ¤Þ¤Ç.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "ÉÔÌÀ¤Ê¥·¥¹¥Æ¥à¥¨¥é¡¼"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "¤³¤Î¥Ø¥ë¥×°ìÍ÷¤òɽ¼¨"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "û¤¤»ÈÍÑË¡¥á¥Ã¥»¡¼¥¸¤òɽ¼¨"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NAME"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "¥×¥í¥°¥é¥à̾¤ò»ØÄê"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SECS"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "SECS ÉÃÄä»ß (ɸ½à 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "¥×¥í¥°¥é¥à¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(¥×¥í¥°¥é¥à¥¨¥é¡¼) ¥Ð¡¼¥¸¥ç¥óÉÔÌÀ!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: °ú¿ô¤¬Â¿¤¹¤®¤Þ¤¹\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(¥×¥í¥°¥é¥à¥¨¥é¡¼) ¥ª¥×¥·¥ç¥óǧ¼±ÉÔǽ!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤Ï¤¢¤¤¤Þ¤¤¤Ç¤¹\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: ¥ª¥×¥·¥ç¥ó `--%s' ¤Ë¤Ï°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: ¥ª¥×¥·¥ç¥ó `%c%s' ¤Ë¤Ï°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤Ë¤Ï°ú¿ô¤¬É¬ÍפǤ¹\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: ̤ÃΤΥª¥×¥·¥ç¥ó `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: ̤ÃΤΥª¥×¥·¥ç¥ó `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ÉÔÀµ¤Ê¥ª¥×¥·¥ç¥ó -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ̵¸ú¤Ê¥ª¥×¥·¥ç¥ó -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: ¥ª¥×¥·¥ç¥ó¤Ë¤Ï°ú¿ô¤¬É¬ÍפǤ¹ -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤Ï¤¢¤¤¤Þ¤¤¤Ç¤¹\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤Ë¤Ï°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "¥Ö¥í¥Ã¥¯¥µ¥¤¥º"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "¥á¥â¥ê¤ò»È¤¤ÀÚ¤ê¤Þ¤·¤¿"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: %s ÉÔǽ"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: ·Ù¹ð: %s ÉÔǽ"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: ¥â¡¼¥É¤ò %s ¤ËÊѹ¹¤Ç¤­¤Þ¤»¤ó"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: uid %lu gid %lu ¤Ë½êÍ­¼Ô¤òÊѹ¹¤Ç¤­¤Þ¤»¤ó"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: %s ¤Ë¥Ï¡¼¥É¥ê¥ó¥¯¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: %s ¥Ð¥¤¥ÈÌܤÇÆɤ߹þ¤ß¥¨¥é¡¼ (%lu ¥Ð¥¤¥ÈÆɤ߹þ¤ßÃæ)"
+msgstr[1] "%s: %s ¥Ð¥¤¥ÈÌܤÇÆɤ߹þ¤ß¥¨¥é¡¼ (%lu ¥Ð¥¤¥ÈÆɤ߹þ¤ßÃæ)"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: ·Ù¹ð: %s ¥Ð¥¤¥ÈÌܤÇÆɤ߹þ¤ß¥¨¥é¡¼ (%lu ¥Ð¥¤¥ÈÆɤ߹þ¤ßÃæ)"
+msgstr[1] "%s: ·Ù¹ð: %s ¥Ð¥¤¥ÈÌܤÇÆɤ߹þ¤ß¥¨¥é¡¼ (%lu ¥Ð¥¤¥ÈÆɤ߹þ¤ßÃæ)"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: %s ¤Ø¤Î seek ¤¬¤Ç¤­¤Þ¤»¤ó"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: ·Ù¹ð: %s ¤Ø¤Î seek ¤¬¤Ç¤­¤Þ¤»¤ó"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: `%s' ¤Ø¤Î¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯¤¬ºî¤ì¤Þ¤»¤ó"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%1$s: %3$lu ¥Ð¥¤¥È¤Î¤¦¤Á¡¢%2$lu ¥Ð¥¤¥È¤Î¤ß½ñ¤­¹þ¤ß¤Þ¤·¤¿"
+msgstr[1] "%1$s: %3$lu ¥Ð¥¤¥È¤Î¤¦¤Á¡¢%2$lu ¥Ð¥¤¥È¤Î¤ß½ñ¤­¹þ¤ß¤Þ¤·¤¿"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "¥á¥ó¥Ð̾¤«¤éÀèƬ¤Î `%s' ¤ò¼è¤ê½ü¤­¤Þ¤¹"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "¥Ï¡¼¥É¥ê¥ó¥¯À褫¤éÀèƬ¤Î `%s' ¤ò¼è¤ê½ü¤­¤Þ¤¹"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "¶õ¤Î¥á¥ó¥Ð̾¤Ë `.' ¤òÂåÆþ¤·¤Þ¤¹"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[yY]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: ¤½¤Î¥µ¡¼¥Ó¥¹¤Ï»È¤¨¤Þ¤»¤ó"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "ɸ½àÆþÎÏ"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "ɸ½à½ÐÎÏ"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "±ó³Ö¥·¥§¥ë¤¬¼Â¹Ô¤Ç¤­¤Þ¤»¤ó"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "ÆþÎÏʸ»úÎó¤¬Ä¹²á¤®¤Þ¤¹"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "¿ô»úʸˡ¥¨¥é¡¼"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: ¥Ð¥Ã¥Õ¥¡¤ÎÎΰè¤ò³ÎÊݤǤ­¤Þ¤»¤ó\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "¥Ð¥Ã¥Õ¥¡Îΰè¤ò³ÎÊݤǤ­¤Þ¤»¤ó"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "¤â¤Ã¤È¾Ü¤·¤¤¾ðÊó¤Ï `%s --help' ¤ÈÆþÎϤ¹¤ì¤ÐÆÀ¤é¤ì¤Þ¤¹.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"»È¤¤Êý: %s [¥ª¥×¥·¥ç¥ó]\n"
+"¥Æ¡¼¥×¥É¥é¥¤¥Ö¤òÁàºî,¥ê¥â¡¼¥È¥×¥í¥»¥¹¤«¤é¤Î¥³¥Þ¥ó¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹.\n"
+"\n"
+" --version ¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎÏ.\n"
+" --help ¤³¤Î¥Ø¥ë¥×¤ò½ÐÎÏ.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"¥Ð¥°¥ì¥Ý¡¼¥È¤Ï <%s> ¤Þ¤Ç.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "¸¡º÷¥ª¥Õ¥»¥Ã¥È¥¨¥é¡¼"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "¸¡º÷¥ª¥Õ¥»¥Ã¥È¤¬Èϰϳ°"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "¸¡º÷Êý¸þ¤¬Èϰϳ°"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Á᤹¤®¤ë eof\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "¥Õ¥¡¥¤¥ë¤Î½ªÃ¼¤¬Á᤹¤®¤Þ¤¹"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "ÉÔÍפʥ³¥Þ¥ó¥É"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Áí½ñ¤­½Ð¤·¥Ð¥¤¥È¿ô"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "ÁíÆɤ߹þ¤ß¥Ð¥¤¥È¿ô"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Áíºï½ü¥Ð¥¤¥È¿ô: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(¥Ñ¥¤¥×)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "record_size ¤¬Ìµ¸ú¤ÊÃͤǤ¹"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "¥¢¡¼¥«¥¤¥Ö̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "ɸ½àÆþ½ÐÎϤΥ¢¡¼¥«¥¤¥Ö¤Ï¸¡¾Ú¤Ç¤­¤Þ¤»¤ó"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤Ï°µ½Ì¤µ¤ì¤Æ¤¤¤Þ¤¹. %s ¥ª¥×¥·¥ç¥ó¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "°µ½Ì¤µ¤ì¤¿¥¢¡¼¥«¥¤¥Ö¤Ï¥¢¥Ã¥×¥Ç¡¼¥È¤Ç¤­¤Þ¤»¤ó"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "¥Á¥§¥Ã¥¯¥Ý¥¤¥ó¥È %u ¤ò½ñ¤­½Ð¤·¤Þ¤¹"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "¥Á¥§¥Ã¥¯¥Ý¥¤¥ó¥È %u ¤òÆɤ߹þ¤ß¤Þ¤¹"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "¥Æ¡¼¥×¤ÎÀèƬ¤Ç¤¹. ½èÍý¤òÃæ»ß¤·¤Þ¤¹"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "¥¨¥é¡¼¤¬Â¿¤¹¤®¤Þ¤¹. ½èÍý¤òÃæ»ß¤·¤Þ¤¹"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "¥¢¡¼¥«¥¤¥ÖÆâ¤Î¥¢¥é¥¤¥ó¥á¥ó¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ö¥í¥Ã¥¯ (%lu ¥Ð¥¤¥È)"
+msgstr[1] "¥¢¡¼¥«¥¤¥ÖÆâ¤Î¥¢¥é¥¤¥ó¥á¥ó¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ö¥í¥Ã¥¯ (%lu ¥Ð¥¤¥È)"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "µ­Ï¿¥µ¥¤¥º = %lu ¥Ö¥í¥Ã¥¯"
+msgstr[1] "µ­Ï¿¥µ¥¤¥º = %lu ¥Ö¥í¥Ã¥¯"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"¥¢¡¼¥«¥¤¥Ö¥Õ¥¡¥¤¥ë¤ò¸å¤íÊý¸þ¤ËÌ᤻¤Þ¤»¤ó. -i ¤Ê¤·¤Ç¤ÏÆɤá¤Ê¤¤¤«¤âÃΤì¤Þ¤»¤ó."
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek ¤òµ­Ï¿¤Î¶­³¦¤Ç»ß¤á¤Þ¤»¤ó"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: ̵¸ú¤Ê¥Ü¥ê¥å¡¼¥àÈÖ¹æ¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "¥Ü¥ê¥å¡¼¥àÈֹ椬¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "¥Ü¥ê¥å¡¼¥à #%d (%s) ¤ò½àÈ÷¤·¤Þ¤¹. ¥ê¥¿¡¼¥ó¥­¡¼¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "¥æ¡¼¥¶¤¬±þÅú¤¹¤ë EOF ¤¬É¬ÍפȤʤê¤Þ¤¹"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "·Ù¹ð: ¥¢¡¼¥«¥¤¥Ö¤¬ÉÔ´°Á´¤Ç¤¹"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [name] ¼¡ (¤ª¤è¤Ó¤½¤Î³¤­) ¤Î¥Ü¥ê¥å¡¼¥à¤ËÂФ¹¤ë¿·¤·¤¤¥Õ¥¡¥¤¥ë̾¤ò»Ø"
+"Äê\n"
+" q tar ¤ò½ªÎ»\n"
+" y ¤Þ¤¿¤Ï²þ¹Ô Áàºî¤ò·Ñ³\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! ¥µ¥Ö¥·¥§¥ë¤òµ¯Æ°\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? ¤³¤Î¥ê¥¹¥È¤òɽ¼¨\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "¿·¤·¤¤¥Ü¥ê¥å¡¼¥à¤¬¤¢¤ê¤Þ¤»¤ó. ½ªÎ»¤·¤Þ¤¹.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "¥Õ¥¡¥¤¥ë̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó. ¤â¤¦°ìÅÙ.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "ÉÔÀµ¤ÊÆþÎÏ. ? ¤Ç¥Ø¥ë¥×¤òɽ¼¨\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "%s ¥³¥Þ¥ó¥É¤¬¼ºÇÔ¤·¤Þ¤·¤¿"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "¤³¤ì¤Ï tar ¥¢¡¼¥«¥¤¥Ö¤Ç¤Ï¤Ê¤¤¤è¤¦¤Ç¤¹"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"%s ¤Ï¤³¤Î¥Ü¥ê¥å¡¼¥à¾å¤Ç¤ª¤½¤é¤¯Ï¢Â³¤·¤Æ¤¤¤Þ¤¹: ¥Ø¥Ã¥À¤Ï¾Êά¤µ¤ì¤¿Ì¾Á°¤ò´Þ¤ó¤Ç"
+"¤¤¤Þ¤¹"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s ¤Ï¤³¤Î¥Ü¥ê¥å¡¼¥à¾å¤ÇϢ³¤·¤Æ¤¤¤Þ¤»¤ó"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s ¤ÏÉÔÀµ¤Ê¥µ¥¤¥º¤Ç¤¹ (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "¤³¤Î¥Ü¥ê¥å¡¼¥à¤ÏϢ³¤·¤Æ¤¤¤Þ¤»¤ó"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤Ï %s ¤Ë°ìÃפ¹¤ë¥é¥Ù¥ë¤¬ÉÕ¤¤¤Æ¤¤¤Þ¤»¤ó"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "¥Ü¥ê¥å¡¼¥à %s ¤Ï %s ¤Ë°ìÃפ·¤Þ¤»¤ó"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: ¥Õ¥¡¥¤¥ë̾¤¬Ä¹²á¤®¤Æ GNU ¥Þ¥ë¥Á¥Ü¥ê¥å¡¼¥à¥Ø¥Ã¥À¤ËÊݸ¤Ç¤­¤Ê¤¤¤Î¤ÇÀÚ¤ê¼Î¤Æ"
+"¤Þ¤¹"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "%lu ¥Ð¥¤¥È¤À¤±¤ò %lu ¥Ð¥¤¥È¤«¤éÆɤ߹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤·¤¿"
+msgstr[1] "%lu ¥Ð¥¤¥È¤À¤±¤ò %lu ¥Ð¥¤¥È¤«¤éÆɤ߹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤·¤¿"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "ÆâÍƤ¬°Û¤Ê¤ê¤Þ¤¹"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "¥¢¡¼¥«¥¤¥ÖÃæ¤Ëͽ´ü¤»¤Ì EOF ¤¬¤¢¤ê¤Þ¤¹"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "¥Õ¥¡¥¤¥ë¥¿¥¤¥×¤¬°Û¤Ê¤ê¤Þ¤¹"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "¥â¡¼¥É¤¬°Û¤Ê¤ê¤Þ¤¹"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "¥æ¡¼¥¶ ID ¤¬°Û¤Ê¤ê¤Þ¤¹"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "¥°¥ë¡¼¥× ID ¤¬°Û¤Ê¤ê¤Þ¤¹"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "ºÇ½ª½¤Àµ»þ¹ï¤¬°Û¤Ê¤ê¤Þ¤¹"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "¥µ¥¤¥º¤¬°Û¤Ê¤ê¤Þ¤¹"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "%s ¤Ë¥ê¥ó¥¯¤·¤Æ¤¤¤Þ¤»¤ó"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯¤¬°Û¤Ê¤ê¤Þ¤¹"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "¥Ç¥Ð¥¤¥¹Èֹ椬°ã¤¤¤Þ¤¹"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "¸¡¾Ú"
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: ̤ÃΤΥե¡¥¤¥ë¥¿¥¤¥× `%c', Ä̾ï¥Õ¥¡¥¤¥ë¤Èº¹Ê¬¤ò¼è¤ê¤Þ¤¹"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "¥¢¡¼¥«¥¤¥ÖÃæ¤ËÀÜƬ¼­¤¬ºï½ü¤µ¤ì¤¿¥Õ¥¡¥¤¥ë̾¤¬¤¢¤ê¤Þ¤¹."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "¸µ¤Î¥Õ¥¡¥¤¥ë¤Î½êºß³Îǧ¤Ë¼ºÇÔ¤·¤¿²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "³Îǧ¼ºÇÔ: %d ¸Ä¤Î̵¸ú¤Ê¥Ø¥Ã¥À¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿"
+msgstr[1] "³Îǧ¼ºÇÔ: %d ¸Ä¤Î̵¸ú¤Ê¥Ø¥Ã¥À¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: ¥­¥ã¥Ã¥·¥å ¥Ç¥£¥ì¥¯¥È¥ê ¥¿¥° %s ¤ò´Þ¤ó¤Ç¤¤¤ë¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "ÃÍ %s ¤Ï %s ¤ÎÈÏ°Ï %s..%s ¤Ë¤¢¤ê¤Þ¤»¤ó -- %s ¤òÂåÍÑ"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "ÃÍ %s ¤Ï %s ¤ÎÈÏ°Ï %s..%s ¤Ë¤¢¤ê¤Þ¤»¤ó"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Éé¤Î 8 ¿Ê¥Ø¥Ã¥À¤òÀ¸À®¤·¤Þ¤¹"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: ¥Õ¥¡¥¤¥ë̾¤¬Ä¹²á¤®¤ë (ºÇÂç %d) ¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: ¥Õ¥¡¥¤¥ë̾¤¬Ä¹²á¤®¤ë (ʬ³äÉÔǽ) ¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: ¥ê¥ó¥¯Ì¾¤¬Ä¹²á¤®¤ë¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: %s ¥Ð¥¤¥È¾®¤µ¤¯¤Ê¤Ã¤¿¤Î¤Ç¡¢¥¼¥í¤ÇËä¤á¤Þ¤¹"
+msgstr[1] "%s: %s ¥Ð¥¤¥È¾®¤µ¤¯¤Ê¤Ã¤¿¤Î¤Ç¡¢¥¼¥í¤ÇËä¤á¤Þ¤¹"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: ¥Õ¥¡¥¤¥ë¤Ï°Û¤Ê¤ë¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¾å¤Ë¤¢¤ë¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: ̤ÃΤΥե¡¥¤¥ë·Á¼°; ¥Õ¥¡¥¤¥ë¤Ï̵»ë¤µ¤ì¤Þ¤¹"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "%s ¤Ø¤Î¥ê¥ó¥¯¤¬¤¢¤ê¤Þ¤»¤ó.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: Êѹ¹¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: ¤Ï¥¢¡¼¥«¥¤¥Ö¤Ê¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Æɤ߹þ¤ß°ÊÁ°¤Ëºï½ü¤µ¤ì¤Þ¤·¤¿"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: ¥­¥ã¥Ã¥·¥å¥Ç¥£¥ì¥¯¥È¥ê¥¿¥°¤ò´Þ¤ó¤Ç¤¤¤ë¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: Æɤ߹þ¤ó¤À¥Õ¥¡¥¤¥ë¤¬Êѹ¹¤µ¤ì¤Æ¤¤¤Þ¤¹"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: ¥½¥±¥Ã¥È¤Ï̵»ë¤·¤Þ¤¹"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: door ¤Ï̵»ë¤·¤Þ¤¹"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "¼¡¤Î¥Ø¥Ã¥À¤ò¥¹¥­¥Ã¥×¤·¤Þ¤¹"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤«¤é¥Ø¥Ã¥À¤Ç¤Ê¤¤¤â¤Î¤òºï½ü¤·¤Þ¤¹"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: ¶²¤é¤¯¸Å¤¤¥¿¥¤¥à¥¹¥¿¥ó¥× %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: ¥¿¥¤¥à¥¹¥¿¥ó¥× %s ¤Ï %s ÉÃÀè¤ò¼¨¤·¤Æ¤¤¤Þ¤¹"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥êºîÀ®»þ¤ËÉÔ¬¤ÎÌ·½â¤¬µ¯¤³¤ê¤Þ¤·¤¿"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¤Ï¾õÂÖ¤òŸ³«¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ëÁ°¤Ë̾Á°¤òÊѹ¹¤µ¤ì¤Þ¤·¤¿"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Ϣ³¤·¤¿¥Õ¥¡¥¤¥ë¤òÀµ¾ï¤Ê¥Õ¥¡¥¤¥ë¤È¤·¤Æ¼è¤ê½Ð¤·¤Þ¤¹"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯¤ò¥Ï¡¼¥É¥ê¥ó¥¯¤È¤·¤Æ¼è¤ê½Ð¤·¤Æ¤ß¤Þ¤¹"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "%s ¤òÆɤ߹þ¤ßÃæ¤Ç¤¹\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: ¼è¤ê½Ð¤»¤Þ¤»¤ó -- ¥Õ¥¡¥¤¥ë¤ÏÊ̤Υܥê¥å¡¼¥à¤«¤é³¤¤¤Æ¤¤¤Þ¤¹"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "ͽ´ü¤»¤ÌŤ¤Ì¾Á°¥Ø¥Ã¥À"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: ̤ÃΤΥե¡¥¤¥ë¥¿¥¤¥× '%c', Ä̾ï¥Õ¥¡¥¤¥ë¤È¤·¤ÆÃê½Ð"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "¸½ºß¤Î %s ¤ÎÊý¤¬¿·¤·¤¤¤«Æ±¤¸"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: ¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s ¤Î̾Á°¤ò %s ¤ËÊѹ¹¤Ç¤­¤Þ¤»¤ó"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "¥¨¥é¡¼¤ò²óÉü¤Ç¤­¤Þ¤»¤ó: ľ¤Á¤Ë½ªÎ»¤·¤Þ¤¹"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê̾¤¬ %s ¤«¤éÊѹ¹¤µ¤ì¤Þ¤·¤¿"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê̾¤¬Êѹ¹¤µ¤ì¤Þ¤·¤¿"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¤Ï¿·¤·¤¯ºî¤é¤ì¤Þ¤·¤¿"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "̵¸ú¤Ê¥¿¥¤¥à¥¹¥¿¥ó¥×"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "ÉÔÀµ¤ÊºÇ½ª¹¹¿·»þ¹ï (ÉÃ)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "ÉÔÀµ¤ÊºÇ½ª¹¹¿·»þ¹ï (¥Ê¥ÎÉÃ)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "̵¸ú¤Ê¥Ç¥Ð¥¤¥¹ÈÖ¹æ¤Ç¤¹"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "̵¸ú¤Ê inode ÈÖ¹æ"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "¥¹¥Ê¥Ã¥×¥·¥ç¥Ã¥È¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ßÃæ¤Ë¥Õ¥£¡¼¥ë¥É¤¬Ä¹²á¤®¤Þ¤¹"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "¥¹¥Ê¥Ã¥×¥·¥ç¥Ã¥È¥Õ¥¡¥¤¥ë¤ËÆɤ߹þ¤ß¥¨¥é¡¼"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "¥¹¥Ê¥Ã¥×¥·¥ç¥Ã¥È¥Õ¥¡¥¤¥ë¤Ëͽ´ü¤»¤Ì EOF"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "¥¹¥Ê¥Ã¥×¥·¥ç¥Ã¥È¥Õ¥¡¥¤¥ë¤Ëͽ´ü¤»¤Ì¥Õ¥£¡¼¥ë¥ÉÃÍ"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "½ªÃ¼µ­Ï¿¤Ê¤·"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "ÉÔÀµ¤ÊÁýʬ¥Õ¥¡¥¤¥ë·Á¼°"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "̤¼ÂÁõ¤ÎÁýʬ·Á¼°¥Ð¡¼¥¸¥ç¥ó: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: '%c' ¤¬¤¢¤ë¤Ù¤­¤È¤³¤í¤Ë %#3o"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'X' ¤¬½ÅÊ£"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'R' ¤Ë¶õ¤Î̾Á°"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'T' ¤¬ 'R' ¤ÎÁ°¤Ë¤Ê¤¤"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'T' ¤Ë¶õ¤Î̾Á°"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: '%c' ¤¬¤¢¤ë¤Ù¤­¤È¤³¤í¤Ë¥Ç¡¼¥¿¤Î½ªÃ¼"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'X' ¤¬Ì¤»ÈÍÑ"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "¥Æ¥ó¥×¥ì¡¼¥È %s ¤ò»È¤Ã¤Æ°ì¼¡¥Ç¥£¥ì¥¯¥È¥ê¤òºî¤ì¤Þ¤»¤ó"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¤òºï½ü¤·¤Þ¤»¤ó: ¾õÂÖ¤¬Ê¬¤«¤ê¤Þ¤»¤ó"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¤Ï°Û¤Ê¤ë¥Ç¥Ð¥¤¥¹¾å¤Ë¤¢¤ë¤Î¤Ç¾Ãµî¤·¤Þ¤»¤ó"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: %s ¤òºï½ü\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: ºï½ü¤Ç¤­¤Þ¤»¤ó"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: ¾Êά¤·¤Þ¤¹"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "¥Ö¥í¥Ã¥¯ %s: ** NUL ¤Î¥Ö¥í¥Ã¥¯ **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "%s ¤ËŤ¤¥¼¥í¥Ö¥í¥Ã¥¯"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "¥Ö¥í¥Ã¥¯ %s: ** ¥Õ¥¡¥¤¥ë¤Î½ªÃ¼ **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "¥Ö¥í¥Ã¥¯ %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "¿ôÃÍ %s ¤È¤Ê¤ë¤Ù¤­¥Ø¥Ã¥À°ÌÃÖ¤¬¶õ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr "8 ¿Ê¿ôÃÍ %.*s ¤Ï %s ¤ÎÈϰϳ°¤Ç¤¹ -- 2 ¤ÎÊä¿ô¤È¸«¤Ê¤·¤Þ¤¹"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "8 ¿Ê¿ôÃÍ %.*s ¤Ï %s ¤ÎÈϰϳ°¤Ç¤¹"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤ËÇѤ줿 base-64 ¥Ø¥Ã¥À¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Éä¹æÉÕ¤­ base-64 ʸ»úÎó %s ¤Ï %s ¤ÎÈϰϳ°¤Ç¤¹"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "base-256 ÃÍ¤Ï %s ¤ÎÈϰϳ°¤Ç¤¹"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤Ë %.*s ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¤³¤³¤Ï¿ôÃÍ %s ¤È¤Ê¤ë¤Ï¤º¤Ç¤¹"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤ÎÃÍ %s ¤Ï %s ¤ÎÈÏ°Ï %s..%s Æâ¤Ë¤¢¤ê¤Þ¤»¤ó"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " %s ¤Ø¤Î¥ê¥ó¥¯\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " ÉÔÌÀ¤Ê¥Õ¥¡¥¤¥ë¥¿¥¤¥× %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Ť¤¥ê¥ó¥¯--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Ť¤Ì¾Á°--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--¥Ü¥ê¥å¡¼¥à¥Ø¥Ã¥À--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--¥Ð¥¤¥È %s ¤ÇϢ³--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "̾Á°¤ò %s ¤«¤é %s ¤ËÊѹ¹¤·¤Þ¤¹\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: ̾Á°¤ò %s ¤ËÊѹ¹¤Ç¤­¤Þ¤»¤ó"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "̾Á°¤ò %s ¤«¤é %s ¤ËÌᤷ¤Þ¤¹\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "¥ï¡¼¥¯¥Ç¥£¥ì¥¯¥È¥ê¤òÊݸ¤Ç¤­¤Þ¤»¤ó"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "¥ï¡¼¥¯¥Ç¥£¥ì¥¯¥È¥ê¤òÊѹ¹¤Ç¤­¤Þ¤»¤ó"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "»Ò¥×¥í¥»¥¹"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "¥×¥í¥»¥¹´Ö¥Á¥ã¥Í¥ë"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤Îʸ»ú¤¬¥Õ¥¡¥¤¥ë̾¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹."
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr "--wildcards ¤Ç¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤òÍ­¸ú¤Ë, ¤Þ¤¿ --no-wildcards ¤Ç"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "¤³¤Î·Ù¹ð¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: ¥¢¡¼¥«¥¤¥ÖÆâ¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: ¥¢¡¼¥«¥¤¥ÖÆâ¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "¥ª¥×¥·¥ç¥ó `-%s' ¤È `-%s' ¤Ï¤É¤Á¤é¤âɸ½àÆþÎϤ¬É¬ÍפǤ¹"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: ̵¸ú¤Ê¥¢¡¼¥«¥¤¥Ö·Á¼°"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU ÆÃÍ­¤Îµ¡Ç½¤Ï¡¢Èó¸ß´¹¤Ê·Á¼°¤òɬÍפȤ·¤Þ¤¹"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr "ÉÔÌÀ¤Ê°úÍÑ·Á¼° `%s', `%s --quoting-style=help' ¤Ç°ìÍ÷ɽ¼¨."
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU `tar' ¤Ï¿¤¯¤Î¥Õ¥¡¥¤¥ë¤ò°ì¤Ä¤Î¥Æ¡¼¥×¤ä¥Ç¥£¥¹¥¯¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¤Þ¤È¤á, ¹¹"
+"¤Ë\n"
+"¤½¤³¤«¤é¸Ä¡¹¤Î¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹.\n"
+"\n"
+"Îã:\n"
+" tar -cf archive.tar foo bar # ¥Õ¥¡¥¤¥ë foo ¤È bar ¤«¤é archive.tar ºîÀ®\n"
+" tar -tvf archive.tar # archive.tar Æâ¤ÎÁ´¥Õ¥¡¥¤¥ë¤ò¾Ü¤·¤¯°ìÍ÷ɽ¼¨\n"
+" tar -xf archive.tar # archive.tar ¤«¤éÁ´¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤¹\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"--suffix ¤ä SIMPLE_BACKUP_SUFFIX ¤Ç»ØÄꤵ¤ì¤Ê¤¤¸Â¤ê, ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÀÜÈø¼­¤Ï\n"
+" `~' ¤Ç¤¹. ¤Þ¤¿, ¥Ð¡¼¥¸¥ç¥ó´ÉÍý¤Ï --backup ¤ä VERSION_CONTROL ¤Ë¼¡¤Î¤è¤¦¤Ê\n"
+"Ãͤò»ØÄꤹ¤ë¤³¤È¤ÇÀßÄê¤Ç¤­¤Þ¤¹.\n"
+"\n"
+" none, off ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤é¤Ê¤¤\n"
+" t, numbered ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ËÈÖ¹æ¤ò¤Õ¤ë\n"
+" nil, existing Èֹ椬¤Õ¤é¤ì¤¿¥Ð¥Ã¥¯¥¢¥Ã¥×¤¬¤¢¤ì¤ÐÈÖ¹æ¤ò¤Õ¤ê,\n"
+" ¤½¤¦¤Ç¤Ê¤±¤ì¤Ðñ¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ë\n"
+" never, simple ¾ï¤Ëñ½ã¤Ê¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ë\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "¼çÁàºî¥â¡¼¥É:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤ÎÆâÍƤò°ìÍ÷ɽ¼¨"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤«¤é¥Õ¥¡¥¤¥ë¤òÃê½Ð"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "¿·¤·¤¤¥¢¡¼¥«¥¤¥Ö¤òºîÀ®"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤È¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤È¤Î°ã¤¤¤ò¸«ÉÕ¤±¤ë"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤ÎËöÈø¤Ë¥Õ¥¡¥¤¥ë¤òÄɲÃ"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "¥¢¡¼¥«¥¤¥ÖÆâ¤Ë¤¢¤ë¥Õ¥¡¥¤¥ë¤è¤ê¿·¤·¤¤¥Õ¥¡¥¤¥ë¤Î¤ß¤òÄɲÃ"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤Ë tar ¥Õ¥¡¥¤¥ë¤òÄɲÃ"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤«¤éºï½ü (¼§µ¤¥Æ¡¼¥×¾å¤Ç¤Ï¥À¥á!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤Î¥Ü¥ê¥å¡¼¥à¥é¥Ù¥ë¤ò¥Æ¥¹¥È¤·¤Æ½ªÎ»"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Áàºî¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ëÉղõ¡Ç½:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "¤Þ¤Ð¤é¤Ë¸ºß¤¹¤ë¥Õ¥¡¥¤¥ë¤ò¸ú²ÌŪ¤Ë½èÍý"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "MAJOR[.MINOR]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr "¤Þ¤Ð¤é (sparse) ·Á¼°¤Î¥Ð¡¼¥¸¥ç¥ó¤òÀßÄê (--sparse ¤Î°ÕÌ£¤ò´Þ¤à)"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "¸Å¤¤ GNU ·Á¼°¤Î¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½èÍý"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "FILE"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "¿·¤·¤¤ GNU ·Á¼°¤Î¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½èÍý"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "Æɤ߹þ¤á¤Ê¤¤¥Õ¥¡¥¤¥ë¾å¤ËÈó¥¼¥í¤Î¾õÂ֤Ǹºß¤·¤Þ¤»¤ó"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "NUMBER"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"¥¢¡¼¥«¥¤¥ÖÃæ¤Î³Æ¥Õ¥¡¥¤¥ë¤Î NUMBERÈÖÌܤθºß¤Î¤ß½èÍý. ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥µ¥Ö¥³¥Þ"
+"¥ó¥É --delete, --diff, --extract ¤Þ¤¿¤Ï --list ¤Î¤¦¤Á¤Î 1¤Ä¤ÈÁȤ߹ç¤ï¤»¤Æ³î¤Ä"
+"¥Õ¥¡¥¤¥ë°ìÍ÷¤¬¥³¥Þ¥ó¥É¥é¥¤¥ó¤« -T ¥ª¥×¥·¥ç¥ó·Ðͳ¤Î¤É¤Á¤é¤«¤Ç»ØÄꤵ¤ì¤¿¾ì¹ç¤Î"
+"¤ßÍ­¸ú. NUMBER ¤Ïɸ½à¤Ç 1."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤Ï¸¡º÷²Äǽ"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "À©¸æ¤ò¾å½ñ¤­:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤ò½ñ¤­½Ð¤·¤¿¸å¤Ë¸¡¾Ú"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "¥Õ¥¡¥¤¥ë¤ò¥¢¡¼¥«¥¤¥Ö¤Ë²Ã¤¨¤¿¸å¤Çºï½ü"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "¼è¤ê½Ð¤¹ºÝ¤Ë´û¸¤Î¥Õ¥¡¥¤¥ë¤òÃÖ¤­´¹¤¨¤Ê¤¤"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "¥¢¡¼¥«¥¤¥Ö¥³¥Ô¡¼¤è¤ê¿·¤·¤¤´û¸¥Õ¥¡¥¤¥ë¤òÃÖ¤­´¹¤¨¤Ê¤¤"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "¼è¤ê½Ð¤¹ºÝ¤Ë´û¸¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤­"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "³Æ¡¹¤Î¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤·¤Æ¾å½ñ¤­¤¹¤ëÁ°¤Ëºï½ü"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ò¼è¤ê½Ð¤¹Á°¤Ë³¬Áؤò¶õ¤Ë"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "´û¸¥Ç¥£¥ì¥¯¥È¥ê¤Î¥á¥¿¥Ç¡¼¥¿¤òÊݸ"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "¼è¤ê½Ð¤¹ºÝ¤Ë´û¸¥Ç¥£¥ì¥¯¥È¥ê¤Î¥á¥¿¥Ç¡¼¥¿¤ò¾å½ñ¤­ (ɸ½à)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "½ÐÎÏ¥¹¥È¥ê¡¼¥à¤òÁªÂò"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤·¤Æɸ½à½ÐÎϤ˽ÐÎÏ"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "COMMAND"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤·¤ÆÊÌ¤Î¥×¥í¥°¥é¥à¤Ë½ÐÎÏ"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "»Ò¥×¥í¥»¥¹¤Î½ªÎ»¥³¡¼¥É¤ò̵»ë"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "»Ò¥×¥í¥»¥¹¤ÎÈó¥¼¥í½ªÎ»¥³¡¼¥É¤ò¥¨¥é¡¼¤È¤·¤Æ½èÍý"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "¥Õ¥¡¥¤¥ë°À­¤Î½èÍý"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "²Ã¤¨¤¿¥Õ¥¡¥¤¥ë¤Î½êÍ­¼Ô¤ò NAME ¤ËÊѹ¹"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "²Ã¤¨¤¿¥Õ¥¡¥¤¥ë¤Î¥°¥ë¡¼¥×¤ò NAME ¤ËÊѹ¹"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATE-OR-FILE"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "DATE-OR-FILE ¤«¤éÄɲåե¡¥¤¥ë¤Î mtime ¤òÀßÄê"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "CHANGES"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "²Ã¤¨¤¿¥Õ¥¡¥¤¥ë¤Î (¥·¥ó¥Ü¥ê¥Ã¥¯) ¥â¡¼¥É¤ò CHANGES ¤ËÊѹ¹"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "METHOD"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"ºÇ½ª¥¢¥¯¥»¥¹»þ¹ï¤ò, Æɤ߹þ¤ß¸å¤ËÉü¸µ¤¹¤ë (METHOD='replace'; ɸ½à) ¤«ºÇ½é¤ËÀß"
+"Äꤷ¤Ê¤¤ (METHOD='system') ¤«¤Î¤É¤Á¤é¤«¤ÎÊýË¡¤Ç¥À¥ó¥×¥Õ¥¡¥¤¥ë¾å¤Ç°Ý»ý"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤ò¼è¤ê½Ð¤µ¤Ê¤¤"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "Ʊ¤¸½êÍ­¼Ô¤Î¤Þ¤Þ¤Ç¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤·¤Æ¤ß¤ë"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "¤¢¤Ê¤¿¼«¿È¤Î¥Õ¥¡¥¤¥ë¤È¤·¤Æ¼è¤ê½Ð¤¹"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "¥æ¡¼¥¶Ì¾/¥°¥ë¡¼¥×̾¤È¤·¤Æ¾ï¤Ë¿ô»ú¤ò»È¤¦"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr "¥Õ¥¡¥¤¥ë°À­¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤òÃê½Ð (superuser ¤Ç¤Ïɸ½à)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"¥¢¡¼¥«¥¤¥Ö¤«¤é°À­¤òÃê½Ð¤¹¤ëºÝ¤Ë¥æ¡¼¥¶¤Î umask ¤òŬÍÑ (°ìÈ̥桼¥¶¤Ç¤Ïɸ½à)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "¥¢¡¼¥«¥¤¥Ö¤È¥Þ¥Ã¥Á¤µ¤»¤ë¤¿¤á¤Ë¼è¤ê½Ð¤¹Ì¾Á°¤òʤÓÂؤ¨"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "-p ¤È -s ¤ÎξÊý¤ò»ØÄꤷ¤¿¤â¤Î¤ÈƱ¤¸"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"Ãê½Ð¤¬½ªÎ»¤¹¤ë¤Þ¤ÇÃê½Ð¤µ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê¤ÎºÇ½ª¹¹¿·»þ¹ï¤È°À­¤ÎÀßÄê¤òÃ٤餻¤ë"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "--delay-directory-restore ¥ª¥×¥·¥ç¥ó¤Î¸ú²Ì¤ò¼è¤ê¾Ã¤·"
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "¥Ç¥Ð¥¤¥¹¤ÎÁªÂò¤ÈÀÚÂØ:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARCHIVE"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "¥¢¡¼¥«¥¤¥Ö¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥Ð¥¤¥¹ ARCHIVE ¤ò»ÈÍÑ"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "¥¢¡¼¥«¥¤¥Ö¥Õ¥¡¥¤¥ë¤Ï¥³¥í¥ó¤ò´Þ¤ó¤Ç¤¤¤Æ¤â¥í¡¼¥«¥ë"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "»ØÄꤵ¤ì¤¿ rmt COMMAND ¤ò rmt ¤ÎÂå¤ï¤ê¤Ë»ÈÍÑ"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "rsh ¤ÎÂå¤ï¤ê¤Ë COMMAND ¤ò»ÈÍÑ"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "¥É¥é¥¤¥Ö¤ÈÌ©ÅÙ¤ò»ØÄê"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "¥Þ¥ë¥Á¥Ü¥ê¥å¡¼¥à¤Î¥¢¡¼¥«¥¤¥Ö¤òºîÀ®/°ìÍ÷/Ãê½Ð"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "NUMBER x 1024 ¥Ð¥¤¥È¤ò½ñ¤­½Ð¤·¤¿¸å¤Ç¥Æ¡¼¥×¤òÊѹ¹"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "³Æ¡¹¤Î¥Æ¡¼¥×¤ÎºÇ¸å¤Ç¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô (-M ɬ¿Ü)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "FILE Ãæ¤Î¥Ü¥ê¥å¡¼¥àÈÖ¹æ¤ò»ÈÍÑ/¹¹¿·"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "¥Ç¥Ð¥¤¥¹¥Ö¥í¥Ã¥­¥ó¥°:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOCKS"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "¥ì¥³¡¼¥É¤¢¤¿¤ê BLOCKS x 512 ¥Ð¥¤¥È"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "¥ì¥³¡¼¥É¤¢¤¿¤ê NUMBER ¥Ð¥¤¥È. 512 ¤ÎÇÜ¿ô"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "¥¢¡¼¥«¥¤¥ÖÃæ¤Î¥¼¥í¥Ö¥í¥Ã¥¯ (¤Ä¤Þ¤ê EOF) ¤ò̵»ë"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "Æɤ߽Ф·¤¿¤è¤¦¤ËºÆ¥Ö¥í¥Ã¥¯ (4.2BSD ¥Ñ¥¤¥×ÍÑ)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "¥¢¡¼¥«¥¤¥Ö·Á¼°¤ÎÁªÂò"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMAT"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "»ØÄꤵ¤ì¤¿·Á¼°¤Î¥¢¡¼¥«¥¤¥Ö¤òºîÀ®"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "FORMAT ¤Ï¼¡¤Î¤¦¤Á¤Î 1¤Ä:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "¸Å¤¤ V7 tar ·Á¼°"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "GNU tar 1.12 °ÊÁ°¤Î·Á¼°"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU tar 1.13.x ·Á¼°"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "POSIX 1003.1-1988 (ustar) ·Á¼°"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "POSIX 1003.1-2001 (pax) ·Á¼°"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "pax ¤ÈƱ¤¸"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "--format=v7 ¤ÈƱ¤¸"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "--format=posix ¤ÈƱ¤¸"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "keyword[[:]=value][,keyword[[:]=value]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "pax ¥­¡¼¥ï¡¼¥É¤òÀ©¸æ"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TEXT"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"¥Ü¥ê¥å¡¼¥à̾ TEXT ¤Î¥¢¡¼¥«¥¤¥Ö¤òºîÀ®. °ìÍ÷/Ãê½Ð»þ¤Ë TEXT ¤ò¥Ü¥ê¥å¡¼¥à̾¤ËÂФ¹"
+"¤ëÃê½Ð¥Ñ¥¿¡¼¥ó¤Ë»ÈÍÑ"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "bzip2 ·Ðͳ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò¥Õ¥£¥ë¥¿"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "gzip ·Ðͳ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò¥Õ¥£¥ë¥¿"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "compress ·Ðͳ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò¥Õ¥£¥ë¥¿"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "PROG ·Ðͳ¤Ç¥Õ¥£¥ë¥¿ (-d ¤ò¼õ¤±ÉÕ¤±¤ëɬÍפ¢¤ê)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "¥í¡¼¥«¥ë¥Õ¥¡¥¤¥ëÁªÂò:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"»ØÄꤵ¤ì¤¿ FILE ¤ò¥¢¡¼¥«¥¤¥Ö¤ËÄɲà (¥À¥Ã¥·¥å ' ¤Ç»Ï¤Þ¤ë¥Õ¥¡¥¤¥ë̾¤Î¾ì¹ç¤ËÊØ"
+"Íø)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "DIR"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê DIR ¤Ø°ÜÆ°"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "Ãê½Ð¤Þ¤¿¤ÏºîÀ®¤¹¤ë̾Á°¤ò¥Õ¥¡¥¤¥ë FILE ¤«¤é¼èÆÀ"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T ¤¬ null ¤Ç½ª¤ï¤ë̾Á°¤òÆɤ߹þ¤ß, -C ¤ò̵¸ú¤Ë"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr "-T ¤ÇÆɤ߹þ¤ó¤À¥Õ¥¡¥¤¥ë̾¤ò°úÍѽªÎ»¤¹¤ë (ɸ½à)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "-T ¤ÇÆɤ߹þ¤ó¤¿¥Õ¥¡¥¤¥ë̾¤ò°úÍѽªÎ»¤·¤Ê¤¤"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "PATTERN"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "PATTERN ¤Ë°ìÃפ¹¤ë¥Õ¥¡¥¤¥ë¤ò½ü³°"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "FILE ¤ËÎóµó¤µ¤ì¤¿¥Ñ¥¿¡¼¥ó¤ò½ü³°"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "¥­¥ã¥Ã¥·¥å¥¿¥°¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü³°"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "FILE ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü³°"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "FILE ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü³°"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "FILE ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü³°"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "FILE ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü³°"
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr "FILE ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü³°"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ò¼«Æ°Åª¤Ë²¼¤Ã¤Æ¤¤¤«¤Ê¤¤"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "¥¢¡¼¥«¥¤¥ÖºîÀ®»þ¤Ë¥í¡¼¥«¥ë¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤Ë¸ÂÄê"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ò½ç·«¤ê¤Ë²¼¤Ã¤Æ¤¤¤¯ (default)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "¥Õ¥¡¥¤¥ë̾¤«¤éÀèƬ¤Î `/' ¤ò¼è¤ê½ü¤«¤Ê¤¤"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr "¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯¤ò¤¿¤É¤ë; ¤½¤ì¤é¤¬»Ø¤¹¥Õ¥¡¥¤¥ë¤ò¥¢¡¼¥«¥¤¥Ö¤·¤Æ¥À¥ó¥×"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "MEMBER-NAME"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "¥¢¡¼¥«¥¤¥ÖÃæ¤Î¥á¥ó¥Ð¡¼ MEMBER-NAME ¤Ç³«»Ï"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "DATE-OR-FILE ¤è¤ë¿·¤·¤¤¥Õ¥¡¥¤¥ë¤Î¤ß¤ò³ÊǼ"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATE"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "¥Ç¡¼¥¿¤¬Êѹ¹¤µ¤ì¤¿»þ¤À¤±ÆüÉÕ¤ª¤è¤Ó»þ¹ï¤òÈæ³Ó"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "CONTROL"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "ºï½üÁ°¤Ë¥Ð¡¼¥¸¥ç¥ó´ÉÍý¤ò CONTROL ¤Ë¤·¤Æ¥Ð¥Ã¥¯¥¢¥Ã¥×"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "STRING"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"ºï½üÁ°¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×, Ä̾ï¤ÎÀÜÈø¼­ (´Ä¶­ÊÑ¿ô SIMPLE_BACKUP_SUFFIX ¤¬Ì¤ÀßÄê¤Ê"
+"¤é '~') ¤ò¾å½ñ¤­"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "¥Õ¥¡¥¤¥ë̾ÊÑ´¹:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "Ãê½Ð»þ¤Ë¥Õ¥¡¥¤¥ë̾¤«¤éÀèƬ¤Î NUMER ¸Ä¤Î¥³¥ó¥Ý¥Í¥ó¥È¤ò½üµî"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "EXPRESSION"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr "¥Õ¥¡¥¤¥ë̾¤ÎÊÑ´¹¤Ë sed ¤ÎÃÖ´¹ EXPRESSION ¤ò»ÈÍÑ"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr "¥Õ¥¡¥¤¥ë̾°ìÃ×¥ª¥×¥·¥ç¥ó (½ü³°/Êñ´Þ¤Îξ¥Ñ¥¿¡¼¥ó¤ËºîÍÑ):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "Âçʸ»ú¾®Ê¸»ú¤ò̵»ë"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤È¥Ñ¥¿¡¼¥ó¤¬°ìÃ×"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "Ǥ°Õ¤Î `/' °Ê¹ß¤Ë¥Ñ¥¿¡¼¥ó¤¬°ìÃ× (ɸ½à¤Ç½ü³°)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "Âçʸ»ú¾®Ê¸»ú¤ò¹Íθ¤·¤Æ°ìÃ× (ɸ½à)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍÑ (ɸ½à¤Ç½ü³°)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "Ãà¸ìŪʸ»úÎó°ìÃ×"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "¥ï¥¤¥ë¥É¥«¡¼¥É¤¬ `/' ¤Ë°ìÃפ·¤Ê¤¤"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "¥ï¥¤¥ë¥É¥«¡¼¥É¤¬ `/' ¤Ë°ìÃ× (ɸ½à¤Ç½ü³°)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "¾ðÊó:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "½èÍý¤µ¤ì¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë¤Î°ìÍ÷¤ò¾éŤËɽ¼¨"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]NUMBER"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "NUMBER (ɸ½à 10) ÈÖÌܤε­Ï¿¤´¤È¤Ë¿ÊĽ¥á¥Ã¥»¡¼¥¸¤òɽ¼¨"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "Á´¤Æ¤Î¥ê¥ó¥¯¤¬¥À¥ó¥×¤µ¤ì¤Ê¤¤¾ì¹ç¥á¥Ã¥»¡¼¥¸¤òɽ¼¨"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "SIGNAL"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"¥¢¡¼¥«¥¤¥Ö¤Î½èÍý¸å¤ËÁí¥Ð¥¤¥È¿ô¤òɽ¼¨. °ú¿ô¤¬¤¢¤ì¤Ð - ¤³¤Î SIGNAL ¤¬È¯¤»¤é¤ì¤ë"
+"»þ¤ËÁí¥Ð¥¤¥È¿ô¤òɽ¼¨. µö²Ä¤µ¤ì¤¿ SIGNAL ¤Ï: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 "
+"¤ª¤è¤Ó SIGUSR2. SIG ÀÜƬ¼­¤¬¤Ê¤¤Ì¾Á°¤Ç¤â²Ä"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "¥Õ¥¡¥¤¥ë¤Î¹¹¿·ÆüÉÕ¤ò UTC ¤Çɽ¼¨"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "¾éĹ½ÐÎϤò FILE ¤ËÁ÷¿®"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "¥¢¡¼¥«¥¤¥ÖÆâ¤Î¥Ö¥í¥Ã¥¯¿ô¤ò³Æ¡¹¥á¥Ã¥»¡¼¥¸ÉÕ¤­¤Çɽ¼¨"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "Á´¤Æ¤ÎÆ°ºî¤ò³Îǧ"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "tar ¤Îµ¬ÄêÃͤòɽ¼¨"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr "°ìÍ÷¤äÃê½Ð»þ¤Ë, ¸¡º÷´ð½à¤Ë°ìÃפ·¤Ê¤¤¥Ç¥£¥ì¥¯¥È¥ê¤ò³Æ¡¹°ìÍ÷ɽ¼¨"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "ÊÖ´Ô¸å¤Ë¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤Ï¥¢¡¼¥«¥¤¥Ö̾¤òɽ¼¨"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "STYLE"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr "̾Á°°úÍÑ·Á¼°¤òÀßÄê. Í­¸ú¤Ê STYLE Ãͤϲ¼µ­»²¾È."
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "¹¹¤Ë STRING ¤«¤éʸ»ú¤ò°úÍÑ"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "STRING ¤«¤é¤Îʸ»ú°úÍѤò̵¸ú¤Ë"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "¸ß´¹¥ª¥×¥·¥ç¥ó:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr "ºîÀ®»þ¤Ï --old-archive ¤ÈƱ¤¸. Ãê½Ð»þ¤Ï --no-same-owner ¤ÈƱ¤¸"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "¤½¤Î¾¥ª¥×¥·¥ç¥ó:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "ÀøºßŪ¤Ë³²¤Ë¤Ê¤ë¥ª¥×¥·¥ç¥ó¤Î»ÈÍѤò̵¸ú¤Ë"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "`-Acdtrux' ¥ª¥×¥·¥ç¥ó¤Î¤¦¤Á 2¤Ä°Ê¾å»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó."
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "°µ½Ì¥ª¥×¥·¥ç¥ó¤¬¿©¤¤°ã¤Ã¤Æ¤¤¤Þ¤¹"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "̤ÃΤΥ·¥°¥Ê¥ë̾: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "ÆüÉÕ¥µ¥ó¥×¥ë¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "̤ÃΤÎÆüÉÕ¥Õ¥©¡¼¥Þ¥Ã¥È¤Î %2$s Âå¤ï¤ê¤Ë %1$s ¤È¤·¤Þ¤¹"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "¥ª¥×¥·¥ç¥ó %s: `%s' ¤ò %s ¤È¤·¤Æ°·¤¦"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: ¥Õ¥¡¥¤¥ë°ìÍ÷¤Ï´û¤ËÆɤ߹þ¤ßºÑ¤ß"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: Æɤ߹þ¤Þ¤ì¤¿¥Õ¥¡¥¤¥ë̾¤Ë¥Ì¥ëʸ»ú"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "--quoting-style ¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ëÍ­¸ú¤Ê°ú¿ô¤Ï:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"¡Ö¤³¤Î¡×tar ¤Îµ¬ÄêÃÍ:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "̵¸ú¤Ê¥Ö¥í¥Ã¥­¥ó¥°°ø»Ò"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "·Ù¹ð: -I ¥ª¥×¥·¥ç¥ó¤Ï¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó -- ¿ʬ -j ¤« -T ¤Ê¤Î¤Ç¤Ï?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "̵¸ú¤Ê¥Æ¡¼¥×¤ÎŤµ"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "1¤Ä°Ê¾å¤ÎÉßµï¤È¤Ê¤ëÆüÉÕ"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "̵¸ú¤Ê¤Þ¤Ð¤é (sparse) ¥Ð¡¼¥¸¥ç¥óÃÍ"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' ¤Ï¤³¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "--checkpoint ÃͤÏÀ°¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: ̵¸ú¤Ê¥°¥ë¡¼¥×"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥â¡¼¥É¤Ï̵¸ú¤Ç¤¹"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "̵¸ú¤Ê¿ô"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "̵¸ú¤Ê½êÍ­¼Ô"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "̵¸ú¤Êµ­Ï¿¥µ¥¤¥º"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "µ­Ï¿¥µ¥¤¥º¤Ï %d ¤ÎÇÜ¿ô¤Ç¤Ê¤±¤ì¤Ð¤¤¤±¤Þ¤»¤ó"
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "̵¸ú¤Ê¥¨¥ì¥á¥ó¥È¿ô"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "--to-command ¥ª¥×¥·¥ç¥ó¤Ï 1¤Ä¤À¤±µö²Ä"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "ÉÔÀµ·Á¼°¤ÎÌ©ÅÙ°ú¿ô: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "̤ÃΤÎÌ©ÅÙ: `%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "¥ª¥×¥·¥ç¥ó `-[0-7][lmh]' ¤Ï¡Ö¤³¤Î¡×tar ¤Ç¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[¥Õ¥¡¥¤¥ë]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "¸Å¤¤¥ª¥×¥·¥ç¥ó `%c' ¤Ï°ú¿ô¤òɬÍפȤ·¤Þ¤¹"
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence ¤Ï¥Õ¥¡¥¤¥ë°ìÍ÷¤¬¤Ê¤±¤ì¤Ð̵°ÕÌ£"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence ¤ÏÍ׵ᤵ¤ì¤¿Áàºî¥â¡¼¥É¤Ç¤Ï»È¤¨¤Þ¤»¤ó"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "ʬ³ä·¿¤Î¥¢¡¼¥«¥¤¥Ö¥Õ¥¡¥¤¥ë¤Ë¤Ï `-M' ¥ª¥×¥·¥ç¥ó¤¬É¬ÍפǤ¹"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "--listed-incremental ¤È --newer ¤È¤ò·ë¹ç¤Ç¤­¤Þ¤»¤ó"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: ¥Ü¥ê¥å¡¼¥à¥é¥Ù¥ë¤¬Ä¹¤¹¤®¤Þ¤¹ (%lu ¥Ð¥¤¥ÈÀ©¸Â)"
+msgstr[1] "%s: ¥Ü¥ê¥å¡¼¥à¥é¥Ù¥ë¤¬Ä¹¤¹¤®¤Þ¤¹ (%lu ¥Ð¥¤¥ÈÀ©¸Â)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "¥Þ¥ë¥Á¥Ü¥ê¥å¡¼¥à¥¢¡¼¥«¥¤¥Ö¤ò³Îǧ¤Ç¤­¤Þ¤»¤ó"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "°µ½Ì¤µ¤ì¤¿¥¢¡¼¥«¥¤¥Ö¤Ï³Îǧ¤Ç¤­¤Þ¤»¤ó"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "¥Þ¥ë¥Á¥Ü¥ê¥å¡¼¥à¤Ë°µ½Ì¤µ¤ì¤¿¥¢¡¼¥«¥¤¥Ö¤Ï»È¤¨¤Þ¤»¤ó"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "°µ½Ì¤µ¤ì¤¿¥¢¡¼¥«¥¤¥Ö¤ÏÏ¢·ë¤Ç¤­¤Þ¤»¤ó"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option ¤Ï POSIX ¥¢¡¼¥«¥¤¥Ö¤Ç¤Î¤ß»È¤¨¤Þ¤¹"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "¶õ¤Î¥¢¡¼¥«¥¤¥ÖºîÀ®¤Ï¤´ÍƼϴꤤ¤Þ¤¹"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "¥ª¥×¥·¥ç¥ó `-Aru' ¤È `-f -' ¤È¤ÏÁêÍƤì¤Þ¤»¤ó"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "¥ª¥×¥·¥ç¥ó `-Acdtrux' ¤Î¤¦¤Á¡¢¤¤¤º¤ì¤«¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "½èÍýÃæ¤Ë¥¨¥é¡¼¤¬µ¯¤­¤Þ¤·¤¿¤¬¡¢ºÇ¸å¤Þ¤Ç½èÍý¤·¤Æ¤«¤é¥¨¥é¡¼½ªÎ»¤µ¤»¤Þ¤·¤¿"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: ¥Õ¥¡¥¤¥ë¤¬ %s ¥Ð¥¤¥È¾®¤µ¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹"
+msgstr[1] "%s: ¥Õ¥¡¥¤¥ë¤¬ %s ¥Ð¥¤¥È¾®¤µ¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "¥­¡¼¥ï¡¼¥É %s ¤Ï̤ÃΤޤ¿¤Ï̤¼ÂÁõ"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "¥Ñ¥¿¡¼¥ó %s ¤Ï»È¤¨¤Þ¤»¤ó"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "¥­¡¼¥ï¡¼¥É %s ¤Ïʤ¤»¤Þ¤»¤ó"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "ÉÔÀµ·Á¼°¤Î³ÈÄ¥¥Ø¥Ã¥À: Ťµ¤Î»ØÄ꤬¤¢¤ê¤Þ¤»¤ó"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "³ÈÄ¥¥Ø¥Ã¥ÀĹ¤Ïµö²Ä¤µ¤ì¤¿Èϰϳ°¤Ç¤¹"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "³ÈÄ¥¥Ø¥Ã¥ÀĹ %*s ¤ÏÈϰϳ°¤Ç¤¹"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "ÉÔÀµ·Á¼°¤Î³ÈÄ¥¥Ø¥Ã¥À: Ťµ¤Î¸å¤Ë¥Ö¥é¥ó¥¯¤¬¤¢¤ê¤Þ¤»¤ó"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "ÉÔÀµ·Á¼°¤Î³ÈÄ¥¥Ø¥Ã¥À: = (¥¤¥³¡¼¥ë) µ­¹æ¤¬¤¢¤ê¤Þ¤»¤ó"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "ÉÔÀµ·Á¼°¤Î³ÈÄ¥¥Ø¥Ã¥À: ²þ¹Ô¤¬¤¢¤ê¤Þ¤»¤ó"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "̤ÃΤγÈÄ¥¥Ø¥Ã¥À¥­¡¼¥ï¡¼¥É `%s' ¤ò̵»ë"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr "À¸À®¤µ¤ì¤¿¥­¡¼¥ï¡¼¥É¤ÈÃͤΥڥ¢¤¬Ä¹²á¤®¤Þ¤¹ (¥­¡¼¥ï¡¼¥É=%s, Ťµ=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "³ÈÄ¥¥Ø¥Ã¥À %s=%s ¤Ï %s..%s ¤ÎÈÏ°ÏÆâ¤Ë¤¢¤ê¤Þ¤»¤ó"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "ÉÔÀµ·Á¼°¤Î³ÈÄ¥¥Ø¥Ã¥À: %s=%s ¤ÏÉÔÀµ"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "ÉÔÀµ·Á¼°¤Î³ÈÄ¥¥Ø¥Ã¥À: %s=%s ¤Ï;ʬ"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "ÉÔÀµ·Á¼°¤Î³ÈÄ¥¥Ø¥Ã¥À: %s ¤Ï̵¸ú: ͽ´ü¤»¤Ì¶èÀÚ¤êʸ»ú %c"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "ÉÔÀµ·Á¼°¤Î³ÈÄ¥¥Ø¥Ã¥À: %s ¤Ï̵¸ú: ´ñ¿ôÃÍ"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile ¤Ï GNU paxutils ¥Æ¥¹¥È¥»¥Ã¥È¤ËÂФ·¤Æ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤òÁàºî¤·¤Þ¤¹.\n"
+"¥ª¥×¥·¥ç¥ó¤Ï:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "¥Õ¥¡¥¤¥ëºîÀ®¥ª¥×¥·¥ç¥ó:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "SIZE"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "»ØÄꤵ¤ì¤¿ SIZE ¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "ɸ½à½ÐÎϤÎÂå¤ï¤ê¤Ë¥Õ¥¡¥¤¥ë NAME ¤Ë½ÐÎÏ"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "FILE ¤«¤é¥Õ¥¡¥¤¥ë̾¤òÆɤ߹þ¤ß"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T ¤Ï null ¤Ç½ª¤ï¤ë̾Á°¤òÆɤ߹þ¤ß¤Þ¤¹"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+"»ØÄꤵ¤ì¤¿ PATTERN ¤Ç¥Õ¥¡¥¤¥ë¤òËä¤á¤Þ¤¹. PATTERN ¤Ï 'default' ¤Þ¤¿¤Ï 'zeros'"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "¤Þ¤Ð¤é¤Ê (sparse) ¥Õ¥¡¥¤¥ë¤Î¥Ö¥í¥Ã¥¯¥µ¥¤¥º"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+"¤Þ¤Ð¤é¤Ê (sparse) ¥Õ¥¡¥¤¥ë¤òÀ¸À®. »Ä¤ê¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥Õ¥¡¥¤¥ë¥Þ¥Ã¥×¤ò»ØÄê."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr "¥ª¥Õ¥»¥Ã¥È"
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr "¥Ç¡¼¥¿¤ò½ñ¤­½Ð¤¹Á°¤Ë»ØÄꤵ¤ì¤¿¥ª¥Õ¥»¥Ã¥È¤Þ¤Ç¸¡º÷"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "¥Õ¥¡¥¤¥ëÅý·×¥ª¥×¥·¥ç¥ó:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr "³Æ¡¹¤Î»ØÄê¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ struct stat ¤ÎÆâÍƤòɽ¼¨. ɸ½à FORMAT ¤Ï: "
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Ʊ»þ¼Â¹Ô¥ª¥×¥·¥ç¥ó:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"»ØÄꤵ¤ì¤¿ COMMAND ¤ò¼Â¹Ô. --checkpoint ¤ª¤è¤Ó --cut, --append, --touch ¤ÎÃæ"
+"¤Î 1¤Ä¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¤È¤è¤¤"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr "¥Á¥§¥Ã¥¯¥Ý¥¤¥ó¥È NUMBER Åþã»þ¤Ë»ØÄꤵ¤ì¤¿¥¢¥¯¥·¥ç¥ó (²¼µ­»²¾È) ¤ò¼Â¹Ô"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "¼¡¤Î --touch ¥ª¥×¥·¥ç¥ó¤ÇÆüÉÕ¤òÀßÄê"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "¼Â¹Ô¤µ¤ì¤¿¥Á¥§¥Ã¥¯¥Ý¥¤¥ó¥È¤È COMMAND ¤Î½ªÎ»¥¹¥Æ¡¼¥¿¥¹¤òɽ¼¨"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Ʊ»þ¼Â¹Ô¥¢¥¯¥·¥ç¥ó. ¤³¤ì¤é¤Ï --checkpoint option ¤Ç»ØÄꤵ¤ì¤¿¥Á¥§¥Ã¥¯¥Ý¥¤¥ó¥È"
+"ÈÖ¹æ¤ËÅþ㤷¤¿¤È¤­¤Ë¼Â¹Ô¤µ¤ì¤ë."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"FILE ¤ò --length ¥ª¥×¥·¥ç¥ó (¤Þ¤¿¤Ï»ØÄ꤬¤Ê¤±¤ì¤Ð 0) ¤Ç»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤ËÀÚ¤ê"
+"¼Î¤Æ"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr "FILE ¤Ë SIZE ¥Ð¥¤¥ÈÄɵ­. SIZE ¤ÏÁ°¤Î --length ¥ª¥×¥·¥ç¥ó¤Ç»ØÄê."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "FILE ¤ÎºÇ½ª¥¢¥¯¥»¥¹»þ¹ï¤ÈºÇ½ª¹¹¿·»þ¹ï¤ò¹¹¿·"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "COMMAND ¤ò¼Â¹Ô"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "̵¸ú¤Ê¥µ¥¤¥º: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Èֹ椬µö²Ä¤µ¤ì¤¿Èϰϳ°: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Éé¤Î¥µ¥¤¥º: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "stat(%s) ¼ºÇÔ"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "`%s' ¤Î¶á¤¯¤Ç¿ô»ú¤ò¹½Ê¸Ê¬ÀÏ»þ¤Ë¥¨¥é¡¼"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "̤ÃΤÎÆüÉÕ·Á¼°"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARGS...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "`%s' ¤ò³«¤±¤Þ¤»¤ó"
+
+#: tests/genfile.c:426
+#, c-format
+msgid "cannot seek: %s"
+msgstr "¸¡º÷¤Ç¤­¤Þ¤»¤ó: %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "¥Õ¥¡¥¤¥ë̾¤¬¥Ì¥ëʸ»ú¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"¤Þ¤Ð¤é¤Ê (sparse) ¥Õ¥¡¥¤¥ë¤òɸ½à½ÐÎϤ˽ñ¤­½Ð¤»¤Þ¤»¤ó. --file ¥ª¥×¥·¥ç¥ó¤ò»ÈÍÑ"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "ÉÔÀµ¤Ê¥Þ¥¹¥¯ (`%s' ¤Ë¶á¤¤)"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "̤ÃΤΥե£¡¼¥ë¥É `%s'"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "`%s' ¤Ë»þ¹ï¤òÀßÄê¤Ç¤­¤Þ¤»¤ó"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "¥³¥Þ¥ó¥É¤¬Àµ¾ï½ªÎ»\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "¥³¥Þ¥ó¥É¤¬¥¹¥Æ¡¼¥¿¥¹ %d ¤Ç¼ºÇÔ\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "¥³¥Þ¥ó¥É¤¬¥·¥°¥Ê¥ë %d ¤Ç½ªÎ»\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "¥³¥Þ¥ó¥É¤¬¥·¥°¥Ê¥ë %d ¤ÇÄä»ß\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "¥³¥Þ¥ó¥É¤¬¥³¥¢¤ò¥À¥ó¥×\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "¥³¥Þ¥ó¥É¤¬½ªÎ»\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "--stat ¤Ë¤Ï¥Õ¥¡¥¤¥ë̾¤¬É¬Í×"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "°ú¿ô¤¬Â¿¤¹¤®¤Þ¤¹"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: %s ¥Ð¥¤¥ÈÌܤÇÆɤ߹þ¤ß¥¨¥é¡¼ (%lu ¥Ð¥¤¥ÈÆɤ߹þ¤ßÃæ)"
+#~ msgstr[1] "%s: %s ¥Ð¥¤¥ÈÌܤÇÆɤ߹þ¤ß¥¨¥é¡¼ (%lu ¥Ð¥¤¥ÈÆɤ߹þ¤ßÃæ)"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--ÀÚ¤ê¹ï¤Þ¤ì¤¿¥Õ¥¡¥¤¥ë̾--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "ÀÚ¤êʬ¤±¤é¤ì¤¿Ì¾Á°¤Ëͽ´ü¤»¤Ì EOF ¤¬¤¢¤ê¤Þ¤¹"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "̾Á°¤ò %s ¤«¤é %s ¤ËÊѹ¹"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: %s ¤Ë¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s ¤«¤é %s ¤Ø¤Î¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "ÀÚ¤êʬ¤é¤ì¤¿¤â¤Î¤ò¸µ¤ËÌ᤹¥³¥Þ¥ó¥É %s ¤¬Ê¬¤«¤ê¤Þ¤»¤ó"
diff --git a/po/ko.gmo b/po/ko.gmo
new file mode 100644
index 0000000..593e54c
--- /dev/null
+++ b/po/ko.gmo
Binary files differ
diff --git a/po/ko.po b/po/ko.po
new file mode 100644
index 0000000..b089cc6
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,3015 @@
+# Korean messages for GNU tar
+# Copyright (C) 1996 Free Software Foundation, Inc.
+# Bang Jun-Young <bangjy@nownuri.net>, 1996-1997.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU tar 1.12\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 1997-05-30 22:55+0900\n"
+"Last-Translator: Bang Jun-Young <bangjy@nownuri.net>\n"
+"Language-Team: Korean <ko@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=EUC-KR\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: lib/argmatch.c:134
+#, fuzzy, c-format
+msgid "invalid argument %s for %s"
+msgstr "ºÎÀûÀýÇÑ ³¯Â¥ Çü½Ä `%s'"
+
+#: lib/argmatch.c:135
+#, fuzzy, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "¸ðÈ£ÇÑ ÆÐÅÏ `%s'"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr ""
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"»ç¿ë¹ý: %s [¿É¼Ç]...\n"
+"\n"
+
+#
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "´õ ¸¹Àº Á¤º¸¸¦ º¸·Á¸é `%s --help' ÇϽʽÿÀ.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "¾Ë ¼ö ¾ø´Â ½Ã½ºÅÛ ¿À·ù"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr ""
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, fuzzy, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù."
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, fuzzy, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù."
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, fuzzy, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù."
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr ""
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr ""
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù."
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, fuzzy, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù."
+
+#: lib/human.c:477
+msgid "block size"
+msgstr ""
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+#, fuzzy
+msgid "memory exhausted"
+msgstr "¸Þ¸ð¸®°¡ ¹Ù´Ú³²"
+
+#
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, fuzzy, c-format
+msgid "%s: Cannot %s"
+msgstr "%s¸¦ statÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr ""
+
+#: lib/paxerror.c:93
+#, fuzzy, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: ¸ðµå¸¦ %0.4o·Î ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#: lib/paxerror.c:101
+#, fuzzy, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: ¼ÒÀ¯ÀÚ¸¦ uid %d, gid %d·Î ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: lib/paxerror.c:127
+#, fuzzy, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "¸µÅ© %s¸¦ ÀÐÀ» ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%ld ¹ÙÀÌƮ°¿¡¼­ Àб⠿À·ù, %d ¹ÙÀÌÆ® ÀÐÀ½, ÆÄÀÏ %s"
+msgstr[1] "%ld ¹ÙÀÌƮ°¿¡¼­ Àб⠿À·ù, %d ¹ÙÀÌÆ® ÀÐÀ½, ÆÄÀÏ %s"
+
+#
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%ld ¹ÙÀÌƮ°¿¡¼­ Àб⠿À·ù, %d ¹ÙÀÌÆ® ÀÐÀ½, ÆÄÀÏ %s"
+msgstr[1] "%ld ¹ÙÀÌƮ°¿¡¼­ Àб⠿À·ù, %d ¹ÙÀÌÆ® ÀÐÀ½, ÆÄÀÏ %s"
+
+#
+#: lib/paxerror.c:259
+#, fuzzy, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s¿¡ ¾µ ¼ö ¾ø½À´Ï´Ù"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr ""
+
+#: lib/paxerror.c:284
+#, fuzzy, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: `%s'¿¡ ´ëÇÑ ±âÈ£¸µÅ©¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: %d ¹ÙÀÌÆ®(%d ¹ÙÀÌÆ® Áß)¸¸ ½è½À´Ï´Ù"
+msgstr[1] "%s: %d ¹ÙÀÌÆ®(%d ¹ÙÀÌÆ® Áß)¸¸ ½è½À´Ï´Ù"
+
+#
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Àý´ë ¸µÅ©µé¿¡¼­ ¾Õ¿¡ ºÙÀº `/'¸¦ Á¦°ÅÇÔ"
+
+#
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Àý´ë ¸µÅ©µé¿¡¼­ ¾Õ¿¡ ºÙÀº `/'¸¦ Á¦°ÅÇÔ"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr ""
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr ""
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr ""
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: ¾µ ¼ö ¾ø´Â ¼­ºñ½º"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "Ç¥ÁØÀÔ·Â"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "Ç¥ÁØÃâ·Â"
+
+#
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "¿ø°Ý ¼ÐÀ» ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: ¹öÆÛ °ø°£À» ÇÒ´çÇÒ ¼ö ¾ø½À´Ï´Ù\n"
+
+#
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "¹öÆÛ °ø°£À» ÇÒ´çÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "´õ ¸¹Àº Á¤º¸¸¦ º¸·Á¸é `%s --help' ÇϽʽÿÀ.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"<tar-bugs@gnu.ai.mit.edu>·Î ¹ö±×¸¦ º¸°íÇØ ÁֽʽÿÀ.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr ""
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr ""
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr ""
+
+#
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: À߸øµÈ eof\n"
+
+#
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "À߸øµÈ ÆÄÀÏ ³¡"
+
+#
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "¾µ¸ð¾ø´Â ¸í·É"
+
+#
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "ÃÑ ¾²¿©Áø ¹ÙÀÌÆ®: "
+
+#
+#: src/buffer.c:333 src/buffer.c:347
+#, fuzzy
+msgid "Total bytes read"
+msgstr "ÃÑ ¾²¿©Áø ¹ÙÀÌÆ®: "
+
+#
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "ÃÑ ¾²¿©Áø ¹ÙÀÌÆ®: "
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr ""
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "record_size·Î ºÎÀûÀýÇÑ °ª"
+
+#
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "¾ÆÄ«À̺ê À̸§ÀÌ ÁÖ¾îÁöÁö ¾Ê¾Ò½À´Ï´Ù"
+
+#
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ç¥ÁØÀÔ/Ãâ·Â ¾ÆÄ«À̺긦 °ËÁõÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "¾ÐÃàµÈ ¾ÆÄ«À̺긦 °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "°Ë»çÁöÁ¡ %d¸¦ ¾¸"
+
+#
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "°Ë»çÁöÁ¡ %d¸¦ ÀÐÀ½"
+
+#
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Å×ÀÌÇÁÀÇ ½ÃÀÛ ºÎºÐ¿¡¼­ Áö±Ý Á¾·áÇÔ"
+
+#
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "¿À·ù°¡ ³Ê¹« ¸¹¾Æ¼­ Á¾·áÇÕ´Ï´Ù"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "·¹ÄÚµå Å©±â = %d ºí·°"
+msgstr[1] "·¹ÄÚµå Å©±â = %d ºí·°"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr ""
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr ""
+
+#
+#: src/buffer.c:929
+#, fuzzy, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "º¼·ý #%d(%s¸¦ À§ÇÑ)¸¦ ÁغñÇÏ°í ¸®ÅÏÀ» Ä¡¼¼¿ä: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "»ç¿ëÀÚÀÇ ÀÀ´äÀÌ ÇÊ¿äÇÑ °÷¿¡ EOF°¡ ÀÖÀ½"
+
+#
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "°æ°í: ¾ÆÄ«À̺갡 ºÒ¿ÏÀüÇÕ´Ï´Ù"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [À̸§] ´ÙÀ½(°ú ±× ÀÌÈÄÀÇ) º¼·ý¿¡ ´ëÇÑ »õ ÆÄÀÏ À̸§À» ÁöÁ¤ÇÕ´Ï´Ù\n"
+" q tar¸¦ Áß´ÜÇÕ´Ï´Ù\n"
+" ! ¼­ºê¼ÐÀ» ½ÇÇàÇÕ´Ï´Ù\n"
+" ? ÀÌ ¸ñ·ÏÀ» ÀμâÇÕ´Ï´Ù\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "»õ º¼·ýÀÌ ¾Æ´Ô; Á¾·á.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr ""
+
+#
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "ÀÌ°ÍÀº tar ¾ÆÄ«À̺êó·³ º¸ÀÌÁö ¾Ê½À´Ï´Ù"
+
+#
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s´Â ÀÌ º¼·ý¿¡ ¿¬¼ÓµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù"
+
+#
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s´Â ÀÌ º¼·ý¿¡ ¿¬¼ÓµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù"
+
+#
+#: src/buffer.c:1237
+#, fuzzy, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s´Â À߸øµÈ Å©±âÀÔ´Ï´Ù (%ld != %ld + %ld)"
+
+#
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "ÀÌ º¼·ýÀº ¼ø¼­¸¦ ¹þ¾î³µ½À´Ï´Ù"
+
+#: src/buffer.c:1293
+#, fuzzy, c-format
+msgid "Archive not labeled to match %s"
+msgstr "`%s'¿Í ÀÏÄ¡Çϵµ·Ï ¶óº§ÀÌ ºÙÁö ¾ÊÀº ¾ÆÄ«À̺ê"
+
+#: src/buffer.c:1296
+#, fuzzy, c-format
+msgid "Volume %s does not match %s"
+msgstr "º¼·ý `%s'°¡ `%s'¿Í ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "%d ¹ÙÀÌÆ®(%ld ¹ÙÀÌÆ® Áß)¸¸ ÀÐÀ» ¼ö ÀÖ½À´Ï´Ù"
+msgstr[1] "%d ¹ÙÀÌÆ®(%ld ¹ÙÀÌÆ® Áß)¸¸ ÀÐÀ» ¼ö ÀÖ½À´Ï´Ù"
+
+#: src/compare.c:106 src/compare.c:388
+#, fuzzy
+msgid "Contents differ"
+msgstr "¸ðµå°¡ ´Ù¸¨´Ï´Ù"
+
+#
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "¾ÆÄ«À̺꿡 ¿¹±âÄ¡ ¾ÊÀº EOF"
+
+#
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+#, fuzzy
+msgid "File type differs"
+msgstr "Å©±â°¡ ´Ù¸¨´Ï´Ù"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "¸ðµå°¡ ´Ù¸¨´Ï´Ù"
+
+#
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "uid°¡ ´Ù¸¨´Ï´Ù"
+
+#
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "gid°¡ ´Ù¸¨´Ï´Ù"
+
+#
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "º¯°æ ½Ã°¢ÀÌ ´Ù¸¨´Ï´Ù"
+
+#
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Å©±â°¡ ´Ù¸¨´Ï´Ù"
+
+#
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "%s¿¡ ¿¬°áµÇÁö ¾ÊÀ½"
+
+#
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "±âÈ£¸µÅ©°¡ ´Ù¸¨´Ï´Ù"
+
+#
+#: src/compare.c:322
+#, fuzzy
+msgid "Device number differs"
+msgstr "ÀåÄ¡ ¹øÈ£°¡ ¹Ù²î¾úÀ½"
+
+#
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "°ËÁõ "
+
+#
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: ¾Ë ¼ö ¾ø´Â ÆÄÀÏ Å¸ÀÔ; ÆÄÀÏÀÌ ¹«½ÃµÊ"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "°ËÁõ ½ÇÆÐ: %d°³ÀÇ ºÎÀûÀýÇÑ Çì´õ°¡ °ËÃâµÊ"
+msgstr[1] "°ËÁõ ½ÇÆÐ: %d°³ÀÇ ºÎÀûÀýÇÑ Çì´õ°¡ °ËÃâµÊ"
+
+#
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s´Â ¾ÆÄ«À̺êÀÔ´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr ""
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr ""
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr ""
+
+#
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: º¯°æµÇÁö ¾Ê¾Ò½À´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+
+#
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: º¯°æµÇÁö ¾Ê¾Ò½À´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½"
+
+#
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: ÆÄÀÏÀÌ %d ¹ÙÀÌÆ® ÁÙ¾îµë, (¿Í¿ì!)"
+msgstr[1] "%s: ÆÄÀÏÀÌ %d ¹ÙÀÌÆ® ÁÙ¾îµë, (¿Í¿ì!)"
+
+#
+#: src/create.c:1176
+#, fuzzy, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: ´Ù¸¥ ÆÄÀϽýºÅÛ »ó¿¡ ÀÖÀ½; ´ýÇÁµÇÁö ¾ÊÀ½"
+
+#
+#: src/create.c:1217 src/create.c:1228
+#, fuzzy
+msgid "contents not dumped"
+msgstr " (ÄÚ¾î Ãâ·ÂµÊ)"
+
+#
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: ¾Ë ¼ö ¾ø´Â ÆÄÀÏ Å¸ÀÔ; ÆÄÀÏÀÌ ¹«½ÃµÊ"
+
+#
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " %s·Î ¸µÅ©\n"
+
+#
+#: src/create.c:1529
+#, fuzzy, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: º¯°æµÇÁö ¾Ê¾Ò½À´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½"
+
+#
+#: src/create.c:1537
+#, fuzzy, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s´Â ¾ÆÄ«À̺êÀÔ´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr ""
+
+#
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s´Â ¾ÆÄ«À̺êÀÔ´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr ""
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr ""
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr ""
+
+#
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "´ÙÀ½ Çì´õ·Î °Ç³Ê ¶Ü"
+
+#
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "¾ÆÄ«À̺꿡¼­ ºñÇì´õ ºÎºÐÀ» Á¦°ÅÇÔ"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr ""
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr ""
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "¿¬¼ÓµÇ¾î ÀÖ´Â ÆÄÀÏÀ» ÀÏ¹Ý ÆÄÀÏ·Î ÃßÃâÇÔ"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "±âÈ£ ¸µÅ©¸¦ ÇÏµå ¸µÅ©·Î ÃßÃâÇÏ°í ÀÖ½À´Ï´Ù"
+
+#
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "%s¸¦ Àд Áß\n"
+
+#: src/extract.c:1146
+#, fuzzy, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "`%s'¸¦ ÃßÃâÇÒ ¼ö ¾ø½À´Ï´Ù -- ÀÌ ÆÄÀÏÀº ´Ù¸¥ º¼·ý¿¡ ¿¬¼ÓµÇ¾î ÀÖ½À´Ï´Ù"
+
+#
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "¾ÆÄ«À̺ê ÆÄÀÏ¿¡ ¿¹±âÄ¡ ¾ÊÀº EOF"
+
+#
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: ¾Ë ¼ö ¾ø´Â ÆÄÀÏ Å¸ÀÔ; ÆÄÀÏÀÌ ¹«½ÃµÊ"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: ÀÌ ÆÄÀÏÀ» ¹é¾÷ÇÒ ¼ö ¾ø¾ú½À´Ï´Ù"
+
+#
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s¸¦ %s·Î À̸§À» ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr ""
+
+#
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s µð·ºÅ丮´Â À̸§ÀÌ ¹Ù²î¾ú½À´Ï´Ù"
+
+#
+#: src/incremen.c:270
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s µð·ºÅ丮´Â À̸§ÀÌ ¹Ù²î¾ú½À´Ï´Ù"
+
+#
+#: src/incremen.c:311
+#, fuzzy, c-format
+msgid "%s: Directory is new"
+msgstr "%s´Â »õ µð·ºÅ丮ÀÔ´Ï´Ù"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr ""
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "¿É¼Ç¿¡ ºÎÀûÀýÇÑ ¸ðµå°¡ ÁÖ¾îÁü"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr ""
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr ""
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "%s¿¡¼­ Àб⠿À·ù"
+
+#
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "¾ÆÄ«À̺ê ÆÄÀÏ¿¡ ¿¹±âÄ¡ ¾ÊÀº EOF"
+
+#
+#: src/incremen.c:872 src/incremen.c:912
+#, fuzzy
+msgid "Unexpected field value in snapshot file"
+msgstr "¾ÆÄ«À̺ê ÆÄÀÏ¿¡ ¿¹±âÄ¡ ¾ÊÀº EOF"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "%s·Î µð·ºÅ丮¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr ""
+
+#
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: %s¸¦ Áö¿ò\n"
+
+#
+#: src/incremen.c:1418
+#, fuzzy, c-format
+msgid "%s: Cannot remove"
+msgstr "%s¸¦ Áö¿ï ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: src/list.c:113
+#, fuzzy, c-format
+msgid "%s: Omitting"
+msgstr "%s¸¦ »ý·«"
+
+#: src/list.c:131
+#, fuzzy, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "ºí·° %10ld: ** NUL·Î µÈ ºí·° **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, fuzzy, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "ºí·° %10ld: ** ÆÄÀÏÀÇ ³¡ **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, fuzzy, c-format
+msgid "block %s: "
+msgstr "ºí·° %10ld: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr ""
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr ""
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+
+#
+#: src/list.c:794
+#, fuzzy, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "ÀÌ º¼·ýÀº ¼ø¼­¸¦ ¹þ¾î³µ½À´Ï´Ù"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr ""
+
+#
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " %s·Î ¸µÅ©\n"
+
+#
+#: src/list.c:1225
+#, fuzzy, c-format
+msgid " unknown file type %s\n"
+msgstr " ¾Ë ¼ö ¾ø´Â ÆÄÀÏ Å¸ÀÔ `%c'\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--º¼·ý Çì´õ--\n"
+
+#
+#: src/list.c:1259
+#, fuzzy, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--%ld ¹ÙÀÌÆ® °¿¡ °è¼ÓµÊ--\n"
+
+#
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "µð·ºÅ丮¸¦ ¸¸µå´Â Áß:"
+
+#
+#: src/misc.c:456
+#, fuzzy, c-format
+msgid "Renaming %s to %s\n"
+msgstr "%s¸¦ %s·Î À̸§ ¹Ù²Þ"
+
+#
+#: src/misc.c:465 src/misc.c:483
+#, fuzzy, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s¸¦ %s·Î À̸§À» ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: src/misc.c:488
+#, fuzzy, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "%s¸¦ %s·Î À̸§ ¹Ù²Þ"
+
+#
+#: src/misc.c:615
+#, fuzzy
+msgid "Cannot save working directory"
+msgstr "%s·Î µð·ºÅ丮¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: src/misc.c:621
+#, fuzzy
+msgid "Cannot change working directory"
+msgstr "%s·Î µð·ºÅ丮¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr ""
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr ""
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: ¾ÆÄ«À̺꿡 ¾øÀ½"
+
+#
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: ¾ÆÄ«À̺꿡 ¾øÀ½"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "`-%s'°ú `-%s' ¿É¼ÇÀº ¸ðµÎ Ç¥ÁØ ÀÔ·ÂÀÌ ÇÊ¿äÇÕ´Ï´Ù"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "ºÎÀûÀýÇÑ ³¯Â¥ Çü½Ä `%s'"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr ""
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "¾ÆÄ«À̺꿡 ¿¹±âÄ¡ ¾ÊÀº EOF"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#
+#: src/tar.c:420
+#, fuzzy
+msgid "remove files after adding them to the archive"
+msgstr "¾ÆÄ«À̺꿡 ÀÖ´Â À̸§µé¿¡¼­ µå¶óÀ̺ê ÁöÁ¤¹®À» Á¦°ÅÇÔ"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr ""
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "´ÙÁß-º¼·ý ¾ÆÄ«À̺긦 °ËÁõÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Ç¥ÁØÀԷ¿¡ ´ëÇÑ ¾ÆÄ«À̺ê"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr ""
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr ""
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "%s·Î µð·ºÅ丮¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Àý´ë ¸µÅ©µé¿¡¼­ ¾Õ¿¡ ºÙÀº `/'¸¦ Á¦°ÅÇÔ"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "º¼·ý `%s'°¡ `%s'¿Í ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#
+#: src/tar.c:703
+#, fuzzy
+msgid "ask for confirmation for every action"
+msgstr "»ç¿ëÀÚÀÇ È®ÀÎÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "`-Acdtrux' ¿É¼Ç Áß Çϳª ÀÌ»óÀ» ÁöÁ¤ÇÏ¸é ¾È µË´Ï´Ù"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Çò°¥¸®´Â ¾ÐÃà ¿É¼Ç"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr "¾Ë ¼ö ¾ø´Â ÆÐÅÏ `%s'"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr ""
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr ""
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr ""
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr ""
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr ""
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr ""
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr ""
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "¿É¼Ç¿¡ ºÎÀûÀýÇÑ ¸ðµå°¡ ÁÖ¾îÁü"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr ""
+
+#: src/tar.c:1671
+#, fuzzy
+msgid "Invalid owner"
+msgstr "¿É¼Ç¿¡ ºÎÀûÀýÇÑ ¼ÒÀ¯ÀÚ°¡ ÁÖ¾îÁü"
+
+#: src/tar.c:1705
+#, fuzzy
+msgid "Invalid record size"
+msgstr "record_size·Î ºÎÀûÀýÇÑ °ª"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "·¹ÄÚµå Å©±â´Â %dÀÇ ¹è¼ö°¡ µÇ¾î¾ß ÇÕ´Ï´Ù."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr ""
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "¾Ë ¼ö ¾ø´Â ÆÐÅÏ `%s'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "`-[0-7][lmh]' ¿É¼ÇÀº ÀÌ tar¿¡¼± Áö¿øµÇÁö ¾Ê½À´Ï´Ù"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "´ÙÁß ¾ÆÄ«À̺ê ÆÄÀÏÀº `-M' ¿É¼ÇÀÌ ÇÊ¿äÇÕ´Ï´Ù"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr ""
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] ""
+msgstr[1] ""
+
+#
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "´ÙÁß-º¼·ý ¾ÆÄ«À̺긦 °ËÁõÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "¾ÐÃàµÈ ¾ÆÄ«À̺긦 °ËÁõÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "¾ÐÃàµÈ ´ÙÁß-º¼·ý ¾ÆÄ«À̺긦 »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "¾ÐÃàµÈ ¾ÆÄ«À̺긦 °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr ""
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "`-Aru' ¿É¼ÇÀº `-f -'°ú µ¿½Ã¿¡ ¾µ ¼ö ¾ø½À´Ï´Ù"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "`-Acdtrux' ¿É¼Çµé Áß Çϳª¸¦ ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr ""
+
+#
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: ÆÄÀÏÀÌ %d ¹ÙÀÌÆ® ÁÙ¾îµë, (¿Í¿ì!)"
+msgstr[1] "%s: ÆÄÀÏÀÌ %d ¹ÙÀÌÆ® ÁÙ¾îµë, (¿Í¿ì!)"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr ""
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr ""
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "GNU tar ½ÃÇè µµ±¸¿ë µ¥ÀÌÅÍ ÆÄÀÏÀ» »ý¼ºÇÕ´Ï´Ù.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Çò°¥¸®´Â ¾ÐÃà ¿É¼Ç"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr ""
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+#, fuzzy
+msgid "Update the access and modification times of FILE"
+msgstr "%s: Á¢±Ù ½Ã°¢°ú ¼öÁ¤ ½Ã°¢À» ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "ºÎÀûÀýÇÑ ³¯Â¥ Çü½Ä `%s'"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr ""
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "¾Ë ¼ö ¾ø´Â ½Ã½ºÅÛ ¿À·ù"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "%s¸¦ ¿­ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s¸¦ ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr "¾Ë ¼ö ¾ø´Â ÆÐÅÏ `%s'"
+
+#
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s¸¦ statÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr ""
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr ""
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close file #%d"
+#~ msgstr "ÆÄÀÏ #%d¸¦ ´ÝÀ» ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Cannot close descriptor %d"
+#~ msgstr "±â¼úÀÚ %d¸¦ ´ÝÀ» ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "Cannot properly duplicate %s"
+#~ msgstr "%s¸¦ Á¦´ë·Î º¹»çÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "¾ÐÃàµÈ ¾ÆÄ«À̺곪 ¿ø°Ý ¾ÆÄ«À̺긦 »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "Cannot open pipe"
+#~ msgstr "ÆÄÀÌÇÁ¸¦ ¿­ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Cannot fork"
+#~ msgstr "forkÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (ÀÚ½Ä)"
+
+#
+#~ msgid "(child) Pipe to stdin"
+#~ msgstr "(ÀÚ½Ä) Ç¥ÁØÀԷ¿¡ ´ëÇÑ ÆÄÀÌÇÁ"
+
+#
+#~ msgid "Cannot open archive %s"
+#~ msgstr "%s ¾ÆÄ«À̺긦 ¿­ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Archive to stdout"
+#~ msgstr "Ç¥ÁØÃâ·Â¿¡ ´ëÇÑ ¾ÆÄ«À̺ê"
+
+#
+#~ msgid "Child cannot fork"
+#~ msgstr "ÀÚ½ÄÀº forkÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "((child)) Pipe to stdout"
+#~ msgstr "((ÀÚ½Ä)) Ç¥ÁØÃâ·Â¿¡ ´ëÇÑ ÆÄÀÌÇÁ"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (¼ÕÀÚ)"
+
+#~ msgid "(grandchild) Pipe to stdin"
+#~ msgstr "(¼ÕÀÚ) Ç¥ÁØÀԷ¿¡ ´ëÇÑ ÆÄÀÌÇÁ"
+
+#
+#~ msgid "Cannot read from compression program"
+#~ msgstr "¾ÐÃà ÇÁ·Î±×·¥À¸·ÎºÎÅÍ ÀоîµéÀÏ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "(child) Pipe to stdout"
+#~ msgstr "(ÀÚ½Ä) Ç¥ÁØÃâ·Â¿¡ ´ëÇÑ ÆÄÀÌÇÁ"
+
+#
+#~ msgid "((child)) Pipe to stdin"
+#~ msgstr "((ÀÚ½Ä)) Ç¥ÁØÀԷ¿¡ ´ëÇÑ ÆÄÀÌÇÁ"
+
+#~ msgid "(grandchild) Pipe to stdout"
+#~ msgstr "(¼ÕÀÚ) Ç¥ÁØÃâ·Â¿¡ ´ëÇÑ ÆÄÀÌÇÁ"
+
+#~ msgid "Cannot write to compression program"
+#~ msgstr "¾ÐÃà ÇÁ·Î±×·¥¿¡ ¾µ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Could not allocate memory for blocking factor %d"
+#~ msgstr "ºí·° °è¼ö %d¿¡ ´ëÀÀÇÏ´Â ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Only wrote %u of %u bytes to %s"
+#~ msgstr "%u ¹ÙÀÌÆ®(%u ¹ÙÀÌÆ® Áß)¸¸ %s¿¡ ½è½À´Ï´Ù"
+
+#
+#~ msgid "WARNING: No volume header"
+#~ msgstr "°æ°í: º¼·ý Çì´õ ¾øÀ½"
+
+#
+#~ msgid "Archive %s EOF not on block boundary"
+#~ msgstr "ºí·° °æ°è°¡ ¾Æ´Ñ ºÎºÐ¿¡¼­ ¾ÆÄ«À̺ê %sÀÇ EOF °ËÃâ"
+
+#
+#~ msgid "Only read %d bytes from archive %s"
+#~ msgstr "%d ¹ÙÀÌÆ®¸¸ ¾ÆÄ«À̺ê %s¿¡¼­ Àоú½À´Ï´Ù"
+
+#
+#~ msgid "WARNING: Cannot close %s (%d, %d)"
+#~ msgstr "°æ°í: %s¸¦ ´ÝÀ» ¼ö ¾ø½À´Ï´Ù (%d, %d)"
+
+#
+#~ msgid "Child died with signal %d%s"
+#~ msgstr "ÀÚ½ÄÀÌ ½ÅÈ£ %d%s¿Í ÇÔ²² Á×¾úÀ½"
+
+#
+#~ msgid "Child returned status %d"
+#~ msgstr "ÀÚ½ÄÀÌ »óÅ %d¸¦ µÇµ¹·Á ÁÖ¾ú½À´Ï´Ù"
+
+#
+#~ msgid "Cannot fork!"
+#~ msgstr "forkÇÒ ¼ö ¾ø½À´Ï´Ù!"
+
+#
+#~ msgid "Cannot exec a shell %s"
+#~ msgstr "%s ¼ÐÀ» ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "Removing leading `/' from absolute path names in the archive"
+#~ msgstr "¾ÆÄ«ÀÌºê ¾È¿¡ ÀÖ´Â Àý´ë °æ·Î¸í¿¡¼­ ¾Õ¿¡ ºÙÀº `/'¸¦ Á¦°ÅÇÔ"
+
+#
+#~ msgid "Wrote %ld of %ld bytes to file %s"
+#~ msgstr "%ld ¹ÙÀÌÆ®(%ld ¹ÙÀÌÆ® Áß)¸¦ ÆÄÀÏ %s¿¡ ½è½À´Ï´Ù"
+
+#
+#~ msgid "Amount actually written is (I hope) %d.\n"
+#~ msgstr "½ÇÁ¦·Î ¾²¿©Áø ¾çÀº (¹Ù¶ó°Ç´ë) %dÀÔ´Ï´Ù.\n"
+
+#
+#~ msgid "Cannot add file %s"
+#~ msgstr "ÆÄÀÏ %s¸¦ Ãß°¡ÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Cannot add directory %s"
+#~ msgstr "%s µð·ºÅ丮¸¦ Ãß°¡ÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Cannot open directory %s"
+#~ msgstr "%s µð·ºÅ丮¸¦ ¿­ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "File name %s%s too long"
+#~ msgstr "ÆÄÀÏ À̸§ %s%s´Â ³Ê¹« ±é´Ï´Ù"
+
+#
+#~ msgid "Could not allocate memory for diff buffer of %d bytes"
+#~ msgstr "%d ¹ÙÀÌÆ®ÀÇ diff ¹öÆÛ¿¡ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Cannot read %s"
+#~ msgstr "%s¸¦ ÀÐÀ» ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Data differs"
+#~ msgstr "ÀÚ·á°¡ ´Ù¸¨´Ï´Ù"
+
+#
+#~ msgid "File does not exist"
+#~ msgstr "ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù"
+
+#
+#~ msgid "Not a regular file"
+#~ msgstr "ÀϹÝÀûÀÎ ÆÄÀÏÀÌ ¾Æ´Ô"
+
+#
+#~ msgid "Error while closing %s"
+#~ msgstr "%s¸¦ ´Ý´Â µ¿¾È ¿À·ù ¹ß»ý"
+
+#
+#~ msgid "Does not exist"
+#~ msgstr "°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù"
+
+#
+#~ msgid "No such file or directory"
+#~ msgstr "±×·± ÆÄÀÏÀ̳ª µð·ºÅ丮°¡ ¾øÀ½"
+
+#
+#~ msgid "Mode or device-type changed"
+#~ msgstr "¸ðµå ¶Ç´Â ÀåÄ¡ ŸÀÔÀÌ º¯°æµÊ"
+
+#
+#~ msgid "No longer a directory"
+#~ msgstr "´õ ÀÌ»ó µð·ºÅ丮°¡ ¾Æ´Ô"
+
+#
+#~ msgid "Cannot open file %s"
+#~ msgstr "%s ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#, fuzzy
+#~ msgid "Cannot seek to %ld in file %s"
+#~ msgstr "ÆÄÀÏ %sÀÇ %ld±îÁö Ž»öÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Could not rewind archive file for verify"
+#~ msgstr "°ËÁõÀ» À§ÇØ ¾ÆÄ«À̺ê ÆÄÀÏÀ» µÇ°¨À» ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Could not re-position archive file"
+#~ msgstr "¾ÆÄ«À̺ê ÆÄÀÏÀ» ÀçÀ§Ä¡½Ãų ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "%s: Cannot lchown to uid %d gid %d"
+#~ msgstr "%s: ¼ÒÀ¯ÀÚ¸¦ uid %d gid %d·Î ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "%s: Cannot chown to uid %d gid %d"
+#~ msgstr "%s: ¼ÒÀ¯ÀÚ¸¦ uid %d gid %d·Î ¹Ù²Ù¾ú½À´Ï´Ù"
+
+#~ msgid "%s: Could not write to file"
+#~ msgstr "%s: ÆÄÀÏ¿¡ ¾µ ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "%s: Could not create file"
+#~ msgstr "%s: ÆÄÀÏÀ» ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "%s: Error while closing"
+#~ msgstr "%s: ´Ý´Â µ¿¾È ¿À·ù ¹ß»ý"
+
+#~ msgid "%s: Could not link to `%s'"
+#~ msgstr "%s: `%s'¿¡ ¸µÅ©ÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "%s: Could not make node"
+#~ msgstr "%s: ³ëµå¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "%s: Could not make fifo"
+#~ msgstr "%s: fifo¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "%s: Could not create directory"
+#~ msgstr "%s: µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Added write and execute permission to directory %s"
+#~ msgstr "%s µð·ºÅ丮¿¡ ¾²±â¿Í ½ÇÇà ±ÇÇÑÀ» ºÎ°¡Çß½À´Ï´Ù"
+
+#
+#~ msgid "Visible long name error"
+#~ msgstr "°¡½ÃÀûÀÎ ±ä À̸§ ¿À·ù"
+
+#
+#~ msgid "Could not get current directory"
+#~ msgstr "ÇöÀç µð·ºÅ丮¸¦ ¾Ë ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Could not get current directory: %s"
+#~ msgstr "ÇöÀç µð·ºÅ丮¸¦ ¾Ë ¼ö ¾ø½À´Ï´Ù: %s"
+
+#
+#~ msgid "File name %s/%s too long"
+#~ msgstr "ÆÄÀÏ À̸§ %s/%s´Â ³Ê¹« ±é´Ï´Ù"
+
+#
+#~ msgid "Cannot chdir to %s"
+#~ msgstr "%s·Î µð·ºÅ丮¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Error while deleting %s"
+#~ msgstr "%s¸¦ Áö¿ì´Â µ¿¾È ¿À·ù ¹ß»ý"
+
+#
+#~ msgid "Hmm, this doesn't look like a tar archive"
+#~ msgstr "Èì, ÀÌ°ÍÀº tar ¾ÆÄ«À̺êó·³ º¸ÀÌÁö ¾Ê´Â±º¿ä"
+
+#
+#~ msgid "Skipping to next file header"
+#~ msgstr "´ÙÀ½ ÆÄÀÏ Çì´õ·Î °Ç³Ê ¶Ü"
+
+#
+#~ msgid "EOF in archive file"
+#~ msgstr "¾ÆÄ«À̺ê ÆÄÀÏ¿¡ EOF"
+
+#
+#~ msgid "Only wrote %ld of %ld bytes to file %s"
+#~ msgstr "%ld ¹ÙÀÌÆ®(%ld ¹ÙÀÌÆ® Áß)¸¸ ÆÄÀÏ %s¿¡ ½è½À´Ï´Ù"
+
+#
+#~ msgid "Visible longname error"
+#~ msgstr "°¡½ÃÀûÀÎ ±äÀ̸§ ¿À·ù"
+
+#
+#~ msgid "Cannot symlink %s to %s"
+#~ msgstr "%s¸¦ %s·Î ±âÈ£¸µÅ©ÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s¿¡¼­ %s·Î ±âÈ£¸µÅ©µÇ¾úÀ½"
+
+#
+#~ msgid "Missing file name after -C"
+#~ msgstr "-C µÚ¿¡ ÆÄÀÏ À̸§ÀÌ ºüÁ³À½"
+
+#
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: ¾µ¸ð¾ø´Â ¸í·É %c\n"
+
+#
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [OPTION]... [FILE]...\n"
+#~ msgstr ""
+#~ "\n"
+#~ "»ç¿ë¹ý: %s [¿É¼Ç]... [ÆÄÀÏ]...\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ÁÖ¿ä µ¿ÀÛ ¸ðµå:\n"
+#~ " -t, --list ¾ÆÄ«À̺êÀÇ ³»¿ë¹°À» Ãâ·ÂÇÕ´Ï´Ù\n"
+#~ " -x, --extract, --get ¾ÆÄ«À̺꿡¼­ ÆÄÀÏÀ» ÃßÃâÇÕ´Ï´Ù\n"
+#~ " -c, --create »õ·Î¿î ¾ÆÄ«À̺긦 ¸¸µì´Ï´Ù\n"
+#~ " -d, --diff, --compare ¾ÆÄ«À̺ê¿Í ÆÄÀÏ ½Ã½ºÅÛ°£ÀÇ Â÷ÀÌÁ¡À» ºñ±³ÇÕ´Ï´Ù\n"
+#~ " -r, --append ¾ÆÄ«ÀÌºê ³¡¿¡ ÆÄÀÏÀ» Ãß°¡ÇÕ´Ï´Ù\n"
+#~ " -u, --update ¾ÆÄ«ÀÌºê ¾ÈÀÇ °Íº¸´Ù »õ·Î¿î ÆÄÀϸ¸ Ãß°¡ÇÕ´Ï´Ù\n"
+#~ " -A, --catenate ¾ÆÄ«À̺꿡 tar ÆÄÀÏÀ» Ãß°¡ÇÕ´Ï´Ù\n"
+#~ " --concatenate -A¿Í °°À½\n"
+#~ " --delete ¾ÆÄ«À̺ê·ÎºÎÅÍ Á¦°ÅÇÕ´Ï´Ù (ÀÚ±â Å×ÀÌÇÁ¿¡¼± ¾È"
+#~ "µÊ!)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't overwrite existing files when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "µ¿ÀÛ º¯°æÀÚ:\n"
+#~ " -W, --verify ¾ÆÄ«À̺긦 ±â·ÏÇÑ ´ÙÀ½ °ËÁõÇϵµ·Ï ÇÕ´Ï´Ù\n"
+#~ " --remove-files ¾ÆÄ«À̺꿡 ÆÄÀÏÀ» Ãß°¡ÇÑ ´ÙÀ½ Áö¿ó´Ï´Ù\n"
+#~ " -k, --keep-old-files ÃßÃâÇÒ ¶§ ÀÌ¹Ì Á¸ÀçÇÏ´Â ÆÄÀÏÀ» µ¤¾î¾²Áö ¾Ê½À"
+#~ "´Ï´Ù\n"
+#~ " -U, --unlink-first ÃßÃâÇϱ⿡ ¾Õ¼­ ´ë»ó ÆÄÀÏÀ» Áö¿ó´Ï´Ù\n"
+#~ " --recursive-unlink µð·ºÅ丮¸¦ ÃßÃâÇϱ⿡ ¾Õ¼­ ±× ü°è¸¦ ºñ¿ó´Ï"
+#~ "´Ù\n"
+#~ " -S, --sparse ½ºÆĽº ÆÄÀÏÀ» È¿À²ÀûÀ¸·Î ó¸®ÇÕ´Ï´Ù\n"
+#~ " -O, --to-stdout Ç¥ÁØ Ãâ·ÂÀ¸·Î ÆÄÀÏÀ» ÃßÃâÇÕ´Ï´Ù\n"
+#~ " -G, --incremental ¿À·¡µÈ GNU Çü½ÄÀÇ Á¡ÁøÀû ¹é¾÷ ÆÄÀÏÀ» ó¸®ÇÕ´Ï"
+#~ "´Ù\n"
+#~ " -g, --listed-incremental »õ·Î¿î GNU Çü½ÄÀÇ Á¡ÁøÀû ¹é¾÷ ÆÄÀÏÀ» ó¸®ÇÕ´Ï"
+#~ "´Ù\n"
+#~ " --ignore-failed-read ÀÐÀ» ¼ö ¾ø´Â ÆÄÀÏ¿¡ ´ëÇØ ¿µ ¾Æ´Ñ °ªÀ¸·Î Á¾·á"
+#~ "ÇÏÁö\n"
+#~ " ¾Ê½À´Ï´Ù\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ÀåÄ¡ ¼±Åðú Àüȯ:\n"
+#~ " -f, --file=ARCHIVE ¾ÆÄ«À̺ê ÆÄÀÏ ¶Ç´Â ARCHIVE ÀåÄ¡¸¦ »ç¿ëÇÕ"
+#~ "´Ï´Ù\n"
+#~ " --force-local À̸§¿¡ ÄÝ·ÐÀÌ ÀÖ´Â ¾ÆÄ«À̺ê ÆÄÀϵµ Áö¿ª "
+#~ "ÆÄÀÏ·Î\n"
+#~ " ÀνÄÇÕ´Ï´Ù\n"
+#~ " --rsh-command=COMMAND rsh ´ë½Å ¿ø°Ý COMMAND¸¦ »ç¿ëÇÕ´Ï´Ù\n"
+#~ " -[0-7][lmh] µå¶óÀ̺ê¿Í ±â·Ï ¹Ðµµ¸¦ ÁöÁ¤ÇÕ´Ï´Ù\n"
+#~ " -M, --multi-volume ´ÙÁß º¼·ý ¾ÆÄ«À̺긦 »ý¼º/Ãâ·Â/ÃßÃâÇÕ´Ï"
+#~ "´Ù\n"
+#~ " -L, --tape-length=NUM NUM x 1024 ¹ÙÀÌÆ®¸¦ ¾´ µÚ¿¡ Å×ÀÌÇÁ¸¦ ¹Ù²ß"
+#~ "´Ï´Ù\n"
+#~ " -F, --info-script=FILE °¢ Å×ÀÌÇÁÀÇ ³¡¿¡¼­ ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÕ´Ï"
+#~ "´Ù\n"
+#~ " (-MÀ» Æ÷ÇÔÇÔ)\n"
+#~ " --new-volume-script=FILE -F FILE°ú °°À½\n"
+#~ " --volno-file=FILE FILE ¾È¿¡ ÀÖ´Â º¼·ý ¹øÈ£¸¦ »ç¿ë/°»½ÅÇÕ´Ï"
+#~ "´Ù\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ÀåÄ¡ ºí·° ¼³Á¤:\n"
+#~ " -b, --blocking-factor=BLOCK ·¹ÄÚµå´ç BLOCK x 512 ¹ÙÀÌÆ®\n"
+#~ " --record-size=SIZE ·¹ÄÚµå´ç SIZE ¹ÙÀÌÆ®, 512ÀÇ ¹è¼ö\n"
+#~ " -i, --ignore-zeros ¾ÆÄ«À̺꿡¼­ ¿µÀ¸·Î µÈ ºí·°À» ¹«½ÃÇÕ´Ï"
+#~ "´Ù\n"
+#~ " (EOF¸¦ ÀǹÌÇÔ)\n"
+#~ " -B, --read-full-records ÀÐÀº °ÍÀ» Àçºí·°È­ÇÕ´Ï´Ù (4.2BSD ÆÄÀÌÇÁ¿ë"
+#~ "À¸·Î)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX conformant archive\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "¾ÆÄ«À̺ê Çü½Ä ¼±ÅÃ:\n"
+#~ " -V, --label=NAME º¼·ý¸íÀÌ NAMEÀÎ ¾ÆÄ«À̺긦 ¸¸µì´Ï´Ù\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability V7 Çü½ÄÀÇ ¾ÆÄ«À̺긦 ¾¹´Ï´Ù\n"
+#~ " --posix POSIX¸¦ µû¸£´Â ¾ÆÄ«À̺긦 ¾¹´Ï´Ù\n"
+#~ " -z, --gzip, --ungzip ¾ÆÄ«À̺긦 gzip¿¡ ¿©°úÇÕ´Ï´Ù\n"
+#~ " -Z, --compress, --uncompress ¾ÆÄ«À̺긦 compress¿¡ ¿©°úÇÕ´Ï´Ù\n"
+#~ " --use-compress-program=PROG PROG(-d¸¦ ÀνÄÇØ¾ß ÇÔ)¿¡ ¿©°úÇÕ´Ï´Ù\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATE DATE ÀÌÈÄÀÇ ÆÄÀϵ鸸 ÀúÀåÇÕ´Ï´Ù\n"
+#~ " --newer-mtime µ¥ÀÌÅÍ°¡ ¹Ù²î¾úÀ» ¶§¸¸ ³¯Â¥¿Í ½Ã°£À» ºñ±³ÇÕ"
+#~ "´Ï´Ù\n"
+#~ " --after-date=DATE -N°ú °°À½\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Á¤º¸ Ãâ·Â¿¡ °üÇÑ ¿É¼Ç:\n"
+#~ " --help ÀÌ µµ¿ò¸»À» ÀμâÇÏ°í ³¡³À´Ï´Ù\n"
+#~ " --version tar ÇÁ·Î±×·¥ÀÇ ¹öÀü ¹øÈ£¸¦ ÀμâÇÏ°í ³¡³À´Ï´Ù\n"
+#~ " -v, --verbose 󸮵Ǵ ÆÄÀÏÀ» ¼ø¼­´ë·Î Ãâ·ÂÇÕ´Ï´Ù\n"
+#~ " --checkpoint ¾ÆÄ«À̺긦 ÀÐÀ» µ¿¾È µð·ºÅ丮 À̸§À» ÀμâÇÕ´Ï´Ù\n"
+#~ " --totals ¾ÆÄ«À̺긦 ¸¸µé µ¿¾È ¾²¿©Áø ÃÑ ¹ÙÀÌÆ® ¼ö¸¦ ÀμâÇÕ"
+#~ "´Ï´Ù\n"
+#~ " -R, --block-number °¢ ¸Þ½ÃÁö¸¶´Ù ¾ÆÄ«À̺곻ÀÇ ºí·° ¹øÈ£¸¦ Ç¥½ÃÇÕ´Ï"
+#~ "´Ù\n"
+#~ " -w, --interactive ¸ðµç Çൿ¿¡ ´ëÇØ È®ÀÎÀ» ¿ä±¸ÇÕ´Ï´Ù\n"
+#~ " --confirmation -w¿Í °°À½\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; and FILE may be a file\n"
+#~ "or a device. *This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar´Â `--posix' ¾ÆÄ«À̺긦 Àаųª ¸¸µé¾î ³¾ ¼ö ¾ø½À´Ï´Ù. ¸¸¾à\n"
+#~ "POSIXLY_CORRECT°¡ ȯ°æ¿¡¼­ ¼³Á¤µÇ¾î ÀÖ´Ù¸é, GNU È®ÀåÀº `--posix'À» ÅëÇØ\n"
+#~ "ºñÈ°¼ºÈ­µË´Ï´Ù. POSIX Áö¿øÀº °Ü¿ì ºÎºÐÀûÀ¸·Î¸¸ ±¸ÇöµÇ¾úÀ¸¹Ç·Î ¾ÆÁ÷ ½Å·Ú\n"
+#~ "ÇÏÁö´Â ¸¶½Ê½Ã¿À. ARCHIVE´Â FILE, HOST:FILE, ¶Ç´Â USER@HOST:FILEÀÌ µÉ ¼ö\n"
+#~ "ÀÖÀ¸¸ç, ¿©±â¼­ FILEÀº ÆÄÀÏÀ̳ª ÀåÄ¡°¡ µÉ ¼ö ÀÖ½À´Ï´Ù. ÀÌ `tar'ÀÇ\n"
+#~ "³»Á¤°ªÀº `-f%s -b%d'ÀÔ´Ï´Ù.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "--blocking-factor¿¡ Æ÷ÇÔµÇ¾î ¾µ¸ð¾ø°Ô µÈ ¿É¼Ç"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "--block-factor·Î ´ëüµÇ¾î ¾µ¸ð¾ø°Ô µÈ ¿É¼Ç À̸§"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "--read-full-records·Î ´ëüµÇ¾î ¾µ¸ð¾ø°Ô µÈ ¿É¼Ç À̸§"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "--touch·Î ´ëüµÇ¾î ¾µ¸ð¾ø°Ô µÈ ¿É¼Ç À̸§"
+
+#~ msgid "Conflicting archive format options"
+#~ msgstr "Çò°¥¸®´Â ¾ÆÄ«À̺ê Çü½Ä ¿É¼Ç"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "--absolute-names·Î ´ëüµÇ¾î ¾µ¸ð¾ø°Ô µÈ ¿É¼Ç À̸§"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "--block-number·Î ´ëüµÇ¾î ¾µ¸ð¾ø°Ô µÈ ¿É¼Ç À̸§"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "--backupÀ¸·Î ´ëüµÇ¾î ¾µ¸ð¾ø°Ô µÈ ¿É¼Ç À̸§"
+
+#~ msgid "Invalid group given on option"
+#~ msgstr "¿É¼Ç¿¡ ºÎÀûÀýÇÑ ±×·ìÀÌ ÁÖ¾îÁü"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, "
+#~ "Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ÀúÀÛ±Ç (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Written by John Gilmore and Jay Fenlason.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "John Gilmore¿Í Jay FenlasonÀÌ ¸¸µé¾ú½À´Ï´Ù.\n"
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "±ä ¿É¼Ç¿¡ ºÎ°¡µÇ´Â Àμö°¡ ÀÖÀ» ¶§, ÀÌ´Â µ¿ÀÏÇÑ ÀǹÌÀÇ ÂªÀº ¿É¼Ç¿¡µµ\n"
+#~ "Àû¿ëµË´Ï´Ù.\n"
+#~ "\n"
+#~ " -l, --file-length=±æÀÌ »ý¼ºµÇ´Â ÆÄÀÏÀÇ ±æÀÌ\n"
+#~ " -p, --pattern=ÆÐÅÏ ÆÐÅÏÀº `default'³ª `zeros'ÀÔ´Ï´Ù\n"
+#~ " --help ÀÌ µµ¿ò¸»À» º¸¿©ÁÖ°í ¸¶Ä¨´Ï´Ù\n"
+#~ " --version ¹öÀü Á¤º¸¸¦ Ãâ·ÂÇÏ°í ¸¶Ä¨´Ï´Ù\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ÀúÀÛ±Ç (C) 1995, 1996, 1997 Free Software Foundation, Inc.\n"
+
+# fake msgid -ke-
+#~ msgid ""
+#~ "\n"
+#~ "Written by Fran,cois Pinard <pinard@iro.umontreal.ca>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Fran,cois Pinard <pinard@iro.umontreal.ca>°¡ ¸¸µé¾ú½À´Ï´Ù.\n"
diff --git a/po/ky.gmo b/po/ky.gmo
new file mode 100644
index 0000000..c10daab
--- /dev/null
+++ b/po/ky.gmo
Binary files differ
diff --git a/po/ky.po b/po/ky.po
new file mode 100644
index 0000000..1833175
--- /dev/null
+++ b/po/ky.po
@@ -0,0 +1,2629 @@
+# Translation of tar-1.15.1 messages to Kirghiz/Kyrgyz
+# Copyright (C) 2006 Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# Azilet Beishenaliev <aziletb@gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.15.91\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-08-09 18:50+0200\n"
+"Last-Translator: Azilet Beishenaliev <aziletb@gmail.com>\n"
+"Language-Team: Kirghiz <translation-team-ky@lists.sourceforge.net>\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-Poedit-Language: Kyrgyz\n"
+"X-Poedit-Country: KYRGYZSTAN\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "%2$s үчүн %1$s аргументи жарабайт"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "%2$s үчүн %1$s аргументи так ÑмеÑ"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Жарактуу аргументтер мындай:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: %s, %s'тен кичине же барабар"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: ARGP_HELP_FMT параметринин мааниÑи болуш керек"
+
+# положительный кыргызча кандайле?
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: ARGP_HELP_FMT параметринин мааниÑи оң болуш керек"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: ARGP_HELP_FMT параметри белгиÑиз"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "ARGP_HELP_FMT параметри бузук: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Толук жазылган опциÑларда колдонулган аргументтер ÑөзÑүз түрдө же тилекке "
+"жараша жазылÑа, кыÑка жазылган опциÑлар менен да ÑөзÑүз түрдө же тилекке "
+"жараша жазылат."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Колдонулушу:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " же: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [ОПЦИЯ...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Толук маалымат үчүн `%s --help' же `%s --usage' деп жазгыла.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Каталарды бул жерге билдиргиле %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "БелгиÑиз ÑиÑтема катаÑÑ‹"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "Бул жардам тизмеÑин көрÑÓ©Ñ‚Ó©Ñ‚"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "Колдонуу жөнүндө кыÑка маалымат көрÑÓ©Ñ‚Ó©Ñ‚"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "ÐТЫ"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "Программага ат кой"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "СЕК"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "СЕК Ñекунда күтүңүз (алдынала - 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "программанын верÑиÑÑын көрÑÓ©Ñ‚Ó©Ñ‚"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(ПРОГРÐММÐДРКÐТÐ) ВерÑиÑÑÑ‹ белгиÑиз!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Ðргументтердин Ñаны көп\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(ПРОГРÐММÐДРКÐТÐ) ÐžÐ¿Ñ†Ð¸Ñ Ð±Ð¸Ð»Ð¸Ð½Ð¸Ñˆ керек болчу!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: `%s' опциÑÑÑ‹ так ÑмеÑ\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: `--%s' опциÑÑÑ‹ менен аргумент колдонулбайт\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: `%c%s' опциÑÑÑ‹ менен аргумент колдонулбайт\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: `%s' опциÑÑÑ‹ менен аргумент болуш керек\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: бул Ð¾Ð¿Ñ†Ð¸Ñ Ñ‚Ò¯ÑˆÒ¯Ð½Ò¯ÐºÑүз `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: бул Ð¾Ð¿Ñ†Ð¸Ñ Ñ‚Ò¯ÑˆÒ¯Ð½Ò¯ÐºÑүз `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: мындай Ð¾Ð¿Ñ†Ð¸Ñ ÐºÐ¾Ð»Ð´Ð¾Ð½ÑƒÐ»Ð±Ð°Ð¹Ñ‚ -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: жаракÑыз Ð¾Ð¿Ñ†Ð¸Ñ -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: бул опциÑнын аргументи болуш керек -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: `-W %s' опциÑÑÑ‹ так ÑмеÑ\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: `-W %s' опциÑÑÑ‹ менен аргумент колдонулбайт\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "бир блоктун көлөмү"
+
+# ПамÑÑ‚Ñ‚Ñ‹ Ñмне дейбиз ÑÑ? ;)
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "ПамÑÑ‚ÑŒ жетпей калды"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: %s кылалбайтат"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: ЭÑкертүү: %s кылалбайтат"
+
+# mode: права доÑтупа, муну укук абалы деп койдум
+# жакшыраак вариант болÑо алмаштырыш керек
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Укук абалын %s түрүнө алмаштыралбай калды"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: ЭÑлик uid = %lu, gid = %lu деп алмашпай койду"
+
+# hard link'ти түз шилтеме дебатам
+# symbolic болÑо Ñимволикалык болот
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: %s'ке түз шилтеме болойтат"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%1$s: %3$lu байт окуу учурунда %2$s адреÑинде ката байт окуду"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] ""
+"%1$s: ЭÑкертүү: %3$lu байт окуу учурунда %2$s адреÑинде ката байт окуду"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: %s орунуна баралбай жатат"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: ЭÑкертүү: %s орунуна баралбай жатат"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: %s'ке Ñимволикалык шилтеме жаÑалбайтат"
+
+# %s: жалпы %2$lu байттан %1$lu байт гана жазылды
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%1$s: жалпы %3$lu байттан %2$lu байт гана жазылды"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Мүчө аттарынын башындагы `%s' алынып Ñалды"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Түз шилтемелер көрÑөтүп турган файлдардын башындагы `%s' алынып Ñалды"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Бош болгон мүчө аттын ордуна `.' коюлду"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "„"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "“"
+
+# Ооба/ооба
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[оО]"
+
+# жок/Жок
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[жЖ]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: ÑÐµÑ€Ð²Ð¸Ñ Ð¶Ð¾Ðº"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "ÐлыÑтагы команда процеÑÑору иштетилген жок"
+
+# Input string дегендин ордуна жакшы нерÑе билÑеңер алмаштырÑаңар болот
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Жазылгандар өтө узун"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Ðомердин жазууÑунда ката бар"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Буфер үчүн жер алыналган жок\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr " Буфер үчүн жер алыналган жок"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Толук маалымат үчүн `%s --help' деп жазгыла.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Колдонулушу: %s [ОПЦИЯ]\n"
+"Башка процеÑÑтен командалрды алып \"магниттик лентада Ñактоочту\" колдон.\n"
+"\n"
+" --version ВерÑÐ¸Ñ Ð¼Ð°Ð°Ð»Ñ‹Ð¼Ð°Ñ‚Ñ‹Ð½ көрÑÓ©Ñ‚.\n"
+" --help Бул маалыматты көрÑÓ©Ñ‚.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Каталарды бул жерге билдиргиле <%s>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Издөө даражаÑÑ‹ туура ÑмеÑ"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Издөө даражаÑÑ‹ диапазондун тышында"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Издөө жолу диапазондун тышында"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Файлдын Ñоңу Ñрте келди\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Файлдын Ñоңу Ñрте келди"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Туура ÑÐ¼ÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Жазылган жалпы байт"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Ðлынган жалпы байт"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Өчүрүлгөн жалпы байт: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(канал)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "record_size мааниÑи жарабайт"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Ðрхивдин аты берилген жок"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ðрхивдин stdin/stdout текшерүүÑÒ¯ болбой жатат"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Ðрхив кыÑыштырылган абалда. %s опциÑÑын колдонгула"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "КыÑыштырылган архивдерди жаңырталбай калды"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Жазууну текшерүү жери: %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Окуунун текшерүү жери: %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Лентанын башына келди, иш бүттү"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Өтө көп ката бар, иш бүттү"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Ðрхивде түз жайлашпаган блок бар (%lu байт)"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Маалыматтын көлөмү = %lu блок"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Ðрхивдеги файл өчпөй калды; архив ачылбаÑа -i деп колдонгула"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek маалыматтын чегинде токтогон жок"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: жаракÑыз том номери бар"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Томдун номери батпай калды"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "%2$s үчүн %1$d-томду даÑрдап Enter'ди баÑыңыз: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Колдонуучудан жооп күтүбатканда файлдын Ñоңу келип калды"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ЭСКЕРТҮҮ: Ðрхив толук ÑмеÑ"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n аты\tЭмики (жана андан кийинки) томдорго жаңы ат жазыңыз\n"
+" q\t\ttar программаÑынын ишин бүтүр\n"
+"y же Ввод\t\tИшти улант\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Команда ÑтрокаÑын ач\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Бул тизмени жаз\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Жаңы том жок; иш бүттү.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Файлдын аты берилген жок. Кайра жазып көргүлө.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Туура ÑÐ¼ÐµÑ Ð²Ð²Ð¾Ð´. Жардам үчүн ? жазгыла.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "%s командаÑÑ‹ аткарылбай калды"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Бул tar-архиви ÑÐ¼ÐµÑ Ð¾ÐºÑˆÐ¾Ð¹Ñ‚"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s бул томдо уланÑа керек: башкы-маалыматта аты кыÑкартылыптыр"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s мунун бул томдо уландыÑÑ‹ жок"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s көлөмү туура ÑÐ¼ÐµÑ (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Бул том иретте ÑмеÑ"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Ðрхивдин тамгаÑÑ‹ %s менен келишпей жатат"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "%s тому %s менен келишпей жатат"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: файлдын аты көп-томдук GNU башкы-маалымат үчүн Ó©Ñ‚Ó© узун, кыÑкартылды"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "%2$lu байттан %1$lu гана окулду"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Мазмундары окшобойт"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Ðрхивде күтүлбөгөн жерде файлдын Ñоңу бар"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Файл түрү окшошпойт"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Укук абалдары окшошпойт"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid окшошпойт"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid окшошпойт"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Ðлмаштыруу убактылары окшошпойт"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Көлөмү окшошпойт"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "%s жака шилтенген ÑмеÑ"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Символикалык шилтеме окшошпойт"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "ÐÑпап номери окшошпойт"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Текшерүү "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: `%c' файл түрү бүлгиÑиз, жөнөкөй файл катары Ñалыштырды"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Ðрхивдин ичинде префикÑтери алынган файл аттары бар."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Текшерүү учурунда алгачкы файлдар табылбай калышы мүмкүн."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "ТЕКШЕРҮҮ КÐТÐСЫ: %d жаракÑыз башкы маалымат табылды"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: мунун ичинде кÑш-папка деген Ñ‚Ñг бар; кошулбайт"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "%s мааниÑи %s диапазонунун тышында %s..%s; ордуна %s коюлат"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "%s мааниÑи %s диапазонунун тышында %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Ð¢ÐµÑ€Ñ Ñегиздик ÑиÑтемаÑында башкы маалыматтар даÑрдалууда"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: файлдын аты Ó©Ñ‚Ó© узун (ÑÒ£ көп %d болот); кошулбайт"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: файлдын аты өтө узун (бөлүнбөйт); кошулбайт"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: шилтеменин аты өтө узун; кошулбайт"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Файл %s байтка азайды; нөлдөр менен толтурулат"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: файл башка файл-ÑиÑтемаÑында; кошулбайт"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Файлдын түрү белгиÑиз; файл каралбайт"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "%s жака шилтемелер жок.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: файл алмашкан жок; кошулбайт"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: файл архив Ñкен; кошулбайт"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Файл окулганча өчүрүлүп кетти"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: мунун ичинде кÑш-папка деген Ñ‚Ñг бар; кошулбайт"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: файлды окуу учурунда файл алмашты"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: Ñокет каралбайт"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: door каралбайт"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Эмики башкы-маалыматка өттү"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Ðрхивде башкы-маалымат болбогондор өчүрүлөт"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: %s убакыт тамгаÑÑ‹ Ó©Ñ‚Ó© ÑÑки"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: %s убакыт тамгаÑÑ‹ %s Ñек. келечекте"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Папка ачыбатканда күтүлбөгөн нерÑелер болду"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Папканын ÑтатуÑу билинелектен мурун аты алмашып кетти"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Удаа болгон файлдар жөнөкөй файл катары чыгарылып жатат"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Символикалык шилтемелерди түз шилтеме катары чыгарууга аракет кылынат"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "%s жактан окуп жатат\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Чыгарылган жок -- файл башка томдон уланып келиптир"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Башкы-маалымат узун"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: `%c' файл түрү бүлгиÑиз, жөнөкөй файл катары чыгарылды"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Ðзыркы %s жаңыраак же бирдей"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Бул файлдын резерв копиÑÑÑ‹ алыналбай калды"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s файлы %s деп алмаштыралбай калды"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Оңолбогон ката: иш бүттү "
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Папканын ÑÑки аты %s Ñле"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Папка алмаштырылды"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Папка жаңы"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "ЖаракÑыз убакыт тамгаÑÑ‹"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Ðлмашуу убагы туура ÑÐ¼ÐµÑ (Ñекундалары)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Ðлмашуу убагы туура ÑÐ¼ÐµÑ (нано-Ñекундалары)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "ÐÑпаптын номери жаракÑыз "
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Inode номери жаракÑыз"
+
+# фиелд, ÑнÑпшот дегендер кандай болот?
+#: src/incremen.c:856 src/incremen.c:893
+#, fuzzy
+msgid "Field too long while reading snapshot file"
+msgstr "СнÑпшот файлды алыбатканда ката бар"
+
+# фиелд кандай болот?
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "СнÑпшот файлда белгиÑиз нерÑе(фиелд) бар"
+
+# фиелд кандай болот?
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "СнÑпшот файлда белгиÑиз нерÑе(фиелд) бар"
+
+# фиелд кандай болот?
+#: src/incremen.c:872 src/incremen.c:912
+#, fuzzy
+msgid "Unexpected field value in snapshot file"
+msgstr "СнÑпшот файлда белгиÑиз нерÑе(фиелд) бар"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "ЗапиÑьтерди бөлүүчү Ñимвол жок"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Файлдын форматы туура ÑмеÑ"
+
+#: src/incremen.c:1080
+#, fuzzy, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "Форматтын бул верÑиÑÑын ишке алалбайт: %d"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "Кошулуучу папка бузук: '%c' күтүлгөн бирок %#3o келди"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Кошулуучу папка бузук: 'X' копиÑлары бар"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Кошулуучу папка бузук: 'R' менен берилген ат бош"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Кошулуучу папка бузук: 'T'дан мурун 'R' жок"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Кошулуучу папка бузук: 'T' менен берилген ат бош"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr "Кошулуучу папка бузук: '%c' күтүлгөн бирок датанын Ñоңу келди"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "Кошулуучу папка бузук: 'X' Ñч колдонулган жок"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "%s шаблонун колдонуп убактылуу жаңы папка ачылган жок"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Папка өчүрүлгөн жок: stat иштебей койду"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: бул папка башка аÑпапта жайгашкан: өчүрүлбөйт"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: %s өчүрүлүп жатат\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Өчүрүлбөй жатат"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Муну аттады"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "блок %s: ** нөлдөр болгон блок **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "%s болгон жерде нөлдүк блок бар"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "блок %s: ** Файлдын Ñоңу **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "блок %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Башкы-маалыматта Ñан түрүндө %s болотурган жерде бош жерлер бар"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Ðрхивдин Ñегиздик ÑиÑтемадагы мааниÑи болгон %.*s %s диапазонунун тышында; "
+"Ñкилик ÑиÑтемадагы терÑи алынды"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr ""
+"Ðрхивдин Ñегиздик ÑиÑтемадагы мааниÑи болгон %.*s %s диапазонунун тышында"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Ðрхивде ÑÑки түрдөгү base-64 башкы-маалымат бар"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Ðрхивдеги base-64 түрүндөгү %s Ñөзү %s диапазонунун тышында"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Ðрхивдин base-256 мааниÑи %s диапазонунун тышында"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr ""
+"Ðрхивдин ичинде %.*s бар, алардын ордунда Ñан түрүндө %s болушу керек Ñле"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Ðрхивдин %s мааниÑи %s түрүнүн %s..%s диапазонунда ÑмеÑ"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " %s жака шилтеме\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " белгиÑиз файл түрү %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Узун шилтеме--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Узун ат--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Томдун башкы-маалыматы--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--%s-байттан баштап уланды--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Жаңы папка ачылыбатат:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "%s'тин атын %s деп алмаштырды\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: ÐÑ‚Ñ‹ %s деп алмаштыралбай калды"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "%s'тин атын кайра %s деп алмаштырды\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Учурдагы папка Ñакталбайтат"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Учурдагы папка алмаштырылбайтат"
+
+# оруÑчада дочерный процеÑÑ, бир процеÑÑ Ó©Ð· ичинен жаңы бир
+# процеÑÑ Ð¶Ð°Ñ€Ð°Ñ‚ÐºÐ°Ð½Ð´Ð° ошол чайлд процеÑÑ Ð±Ð¾Ð»Ð¾Ñ‚. Биз Ñмне дейбиз?
+# Мен туулган процеÑÑ Ð´ÐµÐ¹Ð¼.
+#: src/misc.c:711
+msgid "child process"
+msgstr "туулган процеÑÑ"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "процеÑÑ-аралык канал"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Файлдын аттарында уйкаштарды издөө үчүн колдонулган тамгалар бар."
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+"Уйкаштарды издөө үчүн --wildcards опциÑÑын колдонуңуз, же --no-wildcards"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "опциÑÑÑ‹ менен бул ÑÑкертүүнү көрÑÓ©Ñ‚Ð¿Ó©Ñ ÐºÑ‹Ð»."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Ðрхивде табылган жок"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Керектүү нерÑелер архивде табылган жок"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "`-%s' жана `-%s' опциÑларына Ñтандарт кирүү(input) керек"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Ðрхивдин форматы жарабайт"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Бул форматтагы архив үчүн жарабаган GNU өзгөчөлүктөрү Ñуралууда"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Ковычкалардын түрү белгиÑиз - `%s'. Тизмени көрүүгө `%s --quoting-"
+"style=help' жазгыла."
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU `tar' командаÑÑ‹ бир нече файлды бир магниттик лентага Ñактайт же диÑкте "
+"архив түрүнө айландырат, жана ошол архивден файлдарды кайра өзү-өзүнчө "
+"чыгарууга колдонулат.\n"
+"\n"
+"МиÑал үчүн:\n"
+" tar -cf archive.tar foo bar # foo жана bar деген файлдардан archive.tar "
+"деген архив жаÑайт.\n"
+" tar -tvf archive.tar # ÐÑ‚Ñ‹ archive.tar болгон архивдин ичиндеги "
+"баардык файлдарды толук маалыматы менен тизмелейт.\n"
+" tar -xf archive.tar # ÐÑ‚Ñ‹ archive.tar болгон архивдин ичиндеги "
+"баардык файлдарды чыгарат.\n"
+"\vКопиÑÑын Ñактаганда `~' ÑуфикÑи кошулат, бул --suffix же "
+"SIMPLE_BACKUP_SUFFIX менен алмаштырылат.\n"
+"ВерÑиÑлардын контролу --backup же VERSION_CONTROL менен баштатылат, бул "
+"варианттар бар:\n"
+"\n"
+" none, off Ñч качан копиÑлар Ñакталбайт\n"
+" t, numbered копиÑлар номердүү болуп Ñакталат\n"
+" nil, existing номердүү копиÑлар бар болÑо номердүү, болбоÑо жөнөкөй "
+"метод\n"
+" never, simple ар дайым жөнөкөй копиÑлар Ñакталат\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"GNU `tar' командаÑÑ‹ бир нече файлды бир магниттик лентага Ñактайт же диÑкте "
+"архив түрүнө айландырат, жана ошол архивден файлдарды кайра өзү-өзүнчө "
+"чыгарууга колдонулат.\n"
+"\n"
+"МиÑал үчүн:\n"
+" tar -cf archive.tar foo bar # foo жана bar деген файлдардан archive.tar "
+"деген архив жаÑайт.\n"
+" tar -tvf archive.tar # ÐÑ‚Ñ‹ archive.tar болгон архивдин ичиндеги "
+"баардык файлдарды толук маалыматы менен тизмелейт.\n"
+" tar -xf archive.tar # ÐÑ‚Ñ‹ archive.tar болгон архивдин ичиндеги "
+"баардык файлдарды чыгарат.\n"
+"\vКопиÑÑын Ñактаганда `~' ÑуфикÑи кошулат, бул --suffix же "
+"SIMPLE_BACKUP_SUFFIX менен алмаштырылат.\n"
+"ВерÑиÑлардын контролу --backup же VERSION_CONTROL менен баштатылат, бул "
+"варианттар бар:\n"
+"\n"
+" none, off Ñч качан копиÑлар Ñакталбайт\n"
+" t, numbered копиÑлар номердүү болуп Ñакталат\n"
+" nil, existing номердүү копиÑлар бар болÑо номердүү, болбоÑо жөнөкөй "
+"метод\n"
+" never, simple ар дайым жөнөкөй копиÑлар Ñакталат\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Ðегизги иштөө абалы:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "архивдин ичиндеги файлдарды тизмелейт"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "архивден файлдарды чыгарат"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "жаңы архив жаратат"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "архив менен файл ÑиÑтема айырмаларын табат"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "файлдарды архивдин аÑгына кошот"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "архивдин ичиндегилерден жаңы болгон файлдарды гана кошот"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "tar файлын архивге кошот"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "архивден өчүрөт (магниттик ленталарда жарабайт!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "архивдик томдун атын текшерет анан бүтүрөт"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Иштөөнүн модификаторлору:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "кеңири жайлашкан файлдарды Ñфектүү түрдө колго ал"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "ÑÑки GNU форматындагы резервдөө методун колго ал"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "ФÐЙЛ"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "жаңы GNU форматындагы резервдөө методун колго ал"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "окулбаган файлдар келгенде нөл болбогон ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¼ÐµÐ½ÐµÐ½ ишти бүтүрбө"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "N"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"архивдеги ар бир файлдын N-чи копиÑÑын гана ишке алат. Бул Ð¾Ð¿Ñ†Ð¸Ñ --delete, --"
+"diff, --extract же --list опциÑлардын бирөөÑÒ¯ менен кошо жазылганда жана "
+"файлдардын аттары команда ÑтрокаÑында же -T опциÑÑÑ‹ менен берилгенде гана "
+"жарактуу болот. N-дин мааниÑи алдынала 1ге барабар."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "Ðрхивдин ичиндегилерди издеÑе болот"
+
+#: src/tar.c:415
+#, fuzzy
+msgid "Overwrite control:"
+msgstr "Контролдоонун алмаштыр:\n"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "архивди Ñактагандан кийин текшерүүгө аракет кылат"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "файлдарды архивге кошулгандан кийин өчүрөт"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "файлдарды чыгаруу учурунда мурун бар болгон файлдардын ордуна көчүрбө"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "мурун бар болгон файл архивдеги копиÑÑындан жаңы болÑо аны алмаштырба"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "чыгаруу учурунда мурун бар болгон файлдардын ордуна көчүрөт"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "бар болгон файлдын ордуна көчүрүүдөн мурун ал файлды өчүрөт"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "папканы чыгарардан мурун баардык иерархиÑларды өчүрөт"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "мурун бар болгон папкалардын мета-каÑиеттерин корго"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"чыгаруу учурунда бар болгон папкалардын мета-даталардын Ò¯Ñтүнө жазылат "
+"(алдынала тандалат)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Чыгаруу() жолун танда:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "файлдарды Ñтандарт чыгарууга (output) жөнөт"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "КОМÐÐДÐ"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+"архивден чыккан файлдарды канал(pipe) жолу менен башка программага жөнөтөт"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "туулган процеÑÑтердин бүтүрүү кодторуна караба"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "туулган процеÑÑтердин нөл болбогон бүтүрүү кодторун ката деп ишке ал"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Файлдын өзгөчөлүктөрүн колго алууда:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "кошулган файлдардын ÑÑÑин ÐТЫ деп кой"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "кошулган файлдардын группаÑын ÐТЫ деп кой"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "ДÐТÐ-ЖЕ-ФÐЙЛ"
+
+#: src/tar.c:461
+#, fuzzy
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "ДÐТÐ-ЖЕ-ФÐЙЛ'дан жаңы болгон файлдарды гана Ñакта"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "УКУК"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "кошулган файлдардын укук абалын УКУК деп кой"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "МЕТОД"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"кошулган файлдардын колдонуу убакыттарын Ñакта; окугандан кийинки убактарын "
+"Ñакта (МЕТОД='replace'; алдынала тандалат) же колдонуу убакыттарын "
+"алмашырбай туруп Ñактап кал (МЕТОД='system')"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "файлдын алмаштыруу убактын чыгарбайт"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "ÑÑÑин ошол бойдон калтырып файлдарды чыгарууга аракет кылат"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "файлдарды өзүңдүкү катары чыгарат"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "ÑÑÑи/группа аттарын ардайым номерлер менен көрÑÓ©Ñ‚Ó©Ñ‚"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+"файлдын урукÑат маалыматын да чыгар (Ñуперколдонуучуга алдынала тандалат)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"архивден урукÑат маалыматын чыгарыбатканда колдонуучунун umask'ын колдон "
+"(жөн колдонуучуларга алдынала тандлат)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "чыгатурган файлдарды архивдегидей кылып Ñортто"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "-p жана -s менен бирдей"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"чыгарылган папкалардын колдонуу убакыттарын жана урукÑаттарын чыгаруу иши "
+"бүткөндөн кийин коёт"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "--delay-directory-restore опциÑÑынын Ñффектин токтотот"
+
+#: src/tar.c:497
+#, fuzzy
+msgid "Device selection and switching:"
+msgstr "ÐÑпапты тандоо жана ага Ó©Ñ‚Ò¯Ò¯:\n"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ÐРХИВ"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "ÐРХИВ деген архивдик файлды же аÑпапты колдонот"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "архивдик файлда Ñки точка болушуна карабаÑтан ал локалдуу"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "rmt'нин ордуна КОМÐÐДРколдонулат"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "rsh'тын ордуна КОМÐÐДРколдонулат"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "драйв жана анын тыгыздыгын белгиле"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "көп томдуу архивди жарат/тизмеле/чыгар"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "N x 1024 байт жазгандан кийин лентаны алмаштыр"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "ар лентанын аÑгында Ñкриптти иштет (-M опциÑÑÑ‹ колдонулат)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "ФÐЙЛ файлынын ичиндеги том номерин колдон/жаңырт"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "ÐÑпаптын блоктолушу:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "БЛОК"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "ар маалыматка БЛОК x 512 байт түшөт"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "ÐÑ€ маалыматка N байт түшөт, 512 көбөйтүндүÑÒ¯"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "архивдеги нөлдүү блокторду өтүп кетет (EOF жөнүндө)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "окубатканда кайрадан блокторго бөлүп чык (4.2BSD каналдары үчүн)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Ðрхивдин форматын тандоо:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "ФОРМÐТ"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "тандалган форматта архив жаратат"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "ФОРМÐТ булардан бирөө болот:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "ÑÑки V7 tar форматы"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "tar <= 1.12 верÑиÑÑында болгондой GNU форматы"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU tar 1.13.x форматы"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "POSIX 1003.1-1988 (ustar) форматы"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "POSIX 1003.1-2001 (pax) форматы"
+
+# pax деген gid,atime ÑиÑктуу нерÑелер
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "pax менен бирдей"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "--format=v7 менен бирдей"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "--format=posix менен бирдей"
+
+# keyword Ñмне болот?
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "keyword[[:]=мааниÑи][,keyword[[:]=мааниÑи]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "контролдоо үчүн pax ачкыч Ñөздөрү"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "ТЕКСТ"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"том аты ТЕКСТ болгон архив жарат; тизмелөө/чыгаруу учурунда, ТЕКСТ дегенди "
+"том атынын глоб шаблону катары колдон"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "архивди bzip2 менен ишке ал"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "архивди gzip менен ишке ал"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "архивди compress менен ишке ал"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "ПРОГ"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "ПРОГ менен ишке ал (-d опциÑÑÑ‹ болушу керек)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Локалдуу файлдарды тандоо:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr "ФÐЙЛды архивге кош (файлдын аты тире менен баштаган учурда пайдалуу)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "ПÐПКÐ"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "ПÐПКРпапкаÑына Ó©Ñ‚"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "чыгарылатурган же жаңы ачылатурган файлдарды ÐТЫ деген файлдан кара"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T опциÑÑÑ‹ нөл менен бүткөн аттарды окуйт, -C опциÑÑÑ‹ өчүрүлөт"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+"-T менен алынган файлдардын аттарындагы ковычкалар өчүрүлөт (алдынала "
+"тандалат)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "-T менен алынган файлдардын аттарындагы ковычкалар калаберет"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "ШÐБЛОÐ"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "ШÐБЛОРменен уйкаш файлдар ишке алынбайт"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "ФÐЙЛда тизмеленген шаблондор менен уйкаш файлдар ишке алынбайт"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "кÑш Ñ‚Ñги болгон папкалар ишке алынбайт"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "кÑш Ñ‚Ñги болгон папкалар ишке алынбайт"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "кÑш Ñ‚Ñги болгон папкалар ишке алынбайт"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "кÑш Ñ‚Ñги болгон папкалар ишке алынбайт"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "кÑш Ñ‚Ñги болгон папкалар ишке алынбайт"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "кÑш Ñ‚Ñги болгон папкалар ишке алынбайт"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "папкалардын тереңине кирип кетүүнү токтот"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "архивди жаÑабатканда локалдуу файл ÑиÑтемаÑында кал"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "папкалардын тереңине кирет (алдынала тандалган)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "файл аттарынын башындагы '/'терди өчүрбө"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+"Ñимволикалык шилтемелерге барат; алар көрÑөткөн файлдарды архивге кошот"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "МҮЧӨÐÒ®Ð-ÐТЫ"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "архивдеги МҮЧӨÐÒ®Ð-ÐТЫ мүчөÑүнөн башта"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "ДÐТÐ-ЖЕ-ФÐЙЛ'дан жаңы болгон файлдарды гана Ñакта"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "ДÐТÐ"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "датаÑÑ‹ алмашканда гана дата жана убактыÑын Ñалыштыр"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "CONTROL"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "өчүрөрдөн мурун копиÑÑын Ñактап кал, CONTROL верÑиÑÑын танда"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "STRING"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"өчүрөрдөн мурун копиÑÑын Ñактап калат, жалпы колдонулган ÑÑƒÑ„Ð¸ÐºÑ ÐºÐ¾ÑˆÑƒÐ»Ð°Ñ‚ (бул "
+"ÑÑƒÑ„Ð¸ÐºÑ SIMPLE_BACKUP_SUFFIX жолу менен алмаштырылбаган болÑо '~' болот)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Файлдын атынын алмашуулары:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "чыгаруу учурунда файл аттарынын башындагы N компонентти алып Ñалат"
+
+# выражение кыргызча кандай? СҮЙЛӨМ башка жерде да бар
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "СҮЙЛӨМ"
+
+# СҮЙЛӨМ башка жерде да бар
+#: src/tar.c:655
+#, fuzzy
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr "Файлдардын атын алмаштыруу үчүн sed СҮЙЛӨМүн колдонот"
+
+# inclusion, exclusion - Kyrgyz equiv?
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr "Файлдын атын уйкаштыруу опциÑлары (бардык шаблондорго тиешелүү):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "тамгалардын чоң-кичинеÑине каралбайт"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "шаблондор файлдын атынын башталышы менен уйкаштырылат"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+"шаблондор `/' Ñимволунан кийин келген ар жерде уйкашына каралат (алдынала "
+"тандалган)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "уйкаштырууда тамгалардын чоң-кичинеÑине каралат (алдынала тандалган)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "шаблондор колдонулат (иштен алынбаган файлдарга алдынала тандалат)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "кандай жазылÑа ошондой колдонулат"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "шаблондор `/' Ñимволун издебейт"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "шаблондор `/' Ñимволун издейт (алдынала тандалган)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Маалыматтандыруу:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "ишке алынган файлдарды кеңири маалыматы менен тизмеле"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]N"
+
+# Ушу 'record' Ñөзүнө жакшы котормо табалбай койдум
+# 'маалымат' деп жазыбаттым Ñле, бул жерде келишпей калаткен
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "ар N запиÑьтен кийин маалымат берип турат (алдынала 10 болот)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "баардык шилтемелер кошулбай калÑа билдирүү жазып чыгар"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "СИГÐÐЛ"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"архивди колдонгондон кийин жалпы байт көлөмүн жазат; аргументи бар болÑо - "
+"бул СИГÐÐЛ келгенде байт көлөмүн жазат; Колдонулган Ñигналдар мындай: "
+"SIGHUP, SIGQUIT, SIGINT, SIGUSR1 жана SIGUSR2; SIG префикÑи жазылбаган "
+"аттарын да колдонÑо болот."
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "файлды алмаштыруу датаÑын UTC түрүндө көрÑÓ©Ñ‚"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "чыккан кеңири маалыматты ФÐЙЛ файлына жибер"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "ар билдирүүдө архивдин ичиндеги блок номерин көрÑÓ©Ñ‚"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "ар ишти аткарууга макулдук Ñурап тур"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "tar'да алдынала коюлган опциÑларды көрÑÓ©Ñ‚Ó©Ñ‚"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"тизмелөө же чыгаруу учурунда издөө критериÑÑына жатпаган папкаларды да "
+"тизмелейт"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "алмаштыруудан кийин файлдын же архивдин аттарын көрÑÓ©Ñ‚Ó©Ñ‚"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "СТИЛЬ"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+"аттарга ковычка кошуу Ñтилин тандаңыз; жарактуу СТИЛЬ түрдөрү төмөндө "
+"көрÑөтүлөт."
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "STRING ичинде болгон тамгаларга кошумча ковычка кошот"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "STRING ичинде болгон тамгаларга ковычка кошпойт"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Келишүү опциÑлары:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"жаңы архив жаÑабатканда --old-archive менен бирдей; чыгарыбатканда --no-same-"
+"owner менен бирдей"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Башка опциÑлар:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "зыÑндуу көрүнгөн опциÑларды колдонууга тыюуу Ñалат"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "`-Acdtrux' опциÑларынан бирөөнү гана колдоно алаÑыңар"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Бирбирине келишпеген кыÑыштыруу опциÑлары берилди"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Сигналдын аты белгиÑиз: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Датанын шаблон файлы табылган жок"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "БелгиÑиз %1$s дата форматынын ордуна %2$s коюлат"
+
+#: src/tar.c:961
+#, fuzzy, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "`%s' датаÑын %s деп алды"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: файл тизмеÑи окулган"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: алынган файлдын атында бош тамгалар бар"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "--quoting-style опциÑÑÑ‹ үчүн мындай аргументтер бар:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Бул* tar алдынала мындай иштетилет:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Блок көлөмү жаракÑыз"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "ЭÑкертүү: -I опциÑÑÑ‹ иштетилбейт; балким -j же -T дегиңиз келди Ñле?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Лентанын узундугу жаракÑыз"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Бирден көп ченемдөөчү дата бар"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "Бул платформада --atime-preserve='system' опциÑÑÑ‹ иштебейт"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "--checkpoint опциÑÑына жазылган аргумент Ñан ÑмеÑ"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: ЖаракÑыз группа"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "ОпциÑда жарабаган укук абалы берилди"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Жарабаган номер"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "ЭÑÑи жарабайт"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Маалымат көлөмү жарабайт"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Маалыматтын көлөмү %d көбөйтүндүÑÒ¯ болушу керек."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Элементтердин Ñаны жарабайт"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "--to-command опциÑÑÑ‹ бир Ñле жолу жазылыш керек"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Тыгыздык аргументи туура ÑмеÑ: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "ТүшүнүкÑүз тыгыздык: `%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "*Бул* tar `-[0-7][lmh]' опциÑларын иштетпейт"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[ФÐЙЛ]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "ЭÑки болгон `%c' опциÑÑына параметр керек."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "Файл тизмеÑи болбоÑо --occurrence дегендин мааниÑи болбойт"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "Колдонулган иштетүү абалда --occurrence колдонулбайт"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Бир нече архив файлы болÑо `-M' опциÑÑÑ‹ колдонулушу керек"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "--listed-incremental менен --newer чогу колдонулбайт"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Томдун тамгаÑÑ‹ Ó©Ñ‚Ó© узун (ÑÒ£ көп %lu байт боло алат)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Көп-томдуу архивдерди текшералбай калды"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "КыÑыштырылган архивдерди текшералбай калды"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Көп-томдуу кыÑыштырылган архивдерди колдоналбай калды"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "КыÑыштырылган архивдер кошулалбайт"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option POSIX архивдеринде гана колдонула алат"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Бош архив жаратуудан уÑлып баш тартып жатат"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "`-Aru' опциÑлары `-f -' менен келишпейт"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "`-Acdtrux' опциÑларынан бирөөнү тандап колдонуңуз"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Ката үчүн ишти бүтүрүү, мурунку каталардан улам кеч аткарылды"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Файл %s байтка азайды"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "%s Ñөзү белигÑиз же азырынча киргизилген ÑмеÑ"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "%s шаблону колдонулбайт"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "%s ачкыч Ñөзү алмаштырылбайт"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Кеңейтилген башкы-маалымат бузук: узундук жок"
+
+#: src/xheader.c:506
+#, fuzzy
+msgid "Extended header length is out of allowed range"
+msgstr "Кеңейтилген башкы-маалыматтын узундугу - %*s - диапазондун тышында"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Кеңейтилген башкы-маалыматтын узундугу - %*s - диапазондун тышында"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+"Кеңейтилген башкы-маалымат бузук: узундуктан кийин бош жер (пробел) жок"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Кеңейтилген башкы-маалымат бузук: барабар Ñимволу жок"
+
+# newline Ñмне болот?
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Кеңейтилген башкы-маалымат бузук: жаңы Ñап жок"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "Кеңейтилген башкы-маалыматта белгиÑиз `%s' Ñөзү каралбайт"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "%s=%s түрүндөгү кеңейтилген башкы-маалымат %s..%s диапазондун тышында"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Кеңейтилген башкы-маалымат бузук: %s=%s туура ÑмеÑ"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Кеңейтилген башкы-маалымат бузук: %s=%s ашыкча көп"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+"Кеңейтилген башкы-маалымат бузук: туура ÑÐ¼ÐµÑ %s: күтүлбөгөн жерде бул - %c - "
+"бөлүүчү Ñимвол бар"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Кеңейтилген башкы-маалымат бузук: туура ÑÐ¼ÐµÑ %s: так Ñанда маани бар"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile, GNU paxutils пакетинин дата файлдарын ишке алат.\n"
+"ОПЦИЯЛÐР мындай:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Жаңы файл ачуу опциÑлары:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "КӨЛӨМ"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "КөÑөтүлгөн КӨЛӨМдө жаңы файл ач"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "Стандарт чыгарууга жазбай, ÐТЫ деген файлга жаз"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Файлдын аттарын ФÐЙЛдан ал"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T опциÑÑÑ‹ бош/нөл (null) менен бүткөн аттарды окуйт"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+"Файлды тандалган ШÐБЛОРменен толтурат. ШÐБЛОР'default' же 'zeros' болот"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Кеңири жайлашкан файлдын блок көлөмү"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+"Файлды кеңири жайлаштыр. Кийинки команда Ñтрокаларында файлдын картаÑÑ‹ бар."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "архивди Ñактагандан кийин текшерүүгө аракет кылат"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Файлдын ÑтатиÑтикаÑынын опциÑлары:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"Ðлынган ар бир файл үчүн struct stat курамын көрÑÓ©Ñ‚Ó©Ñ‚. Ðлдынала тандалган "
+"ФОРМÐТ мындай: "
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Синхрондуу иштетүүнүн опциÑлары:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"Жазылган КОМÐÐДÐны иштет. Бул --checkpoint жана --cut, --append, --touch "
+"бирөөÑÒ¯ менен колдонулганда пайдалуу"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr "N текшерүү жерине жеткенде буларды (төмөндү карагыла) аткар"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Эмики --touch опциÑÑÑ‹ үчүн дата жазгыла"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "Өтүлгөн текшерүү жердерди жана КОМÐÐДÐнын бүтүрүү ÑтатуÑун көрÑÓ©Ñ‚Ó©Ñ‚"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Синхрондуу аткаруу иштери. Булар --checkpoint опциÑÑÑ‹ менен берилгенн "
+"текшерүү жерине жеткенде аткарылат."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"ФÐЙЛды --length опциÑÑÑ‹ менен берилген көлөмгө кыÑкартат (берилбеген болÑо 0 "
+"болот)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr "ФÐЙЛга КӨЛӨМ байт кошот. КӨЛӨМ --length опциÑÑÑ‹ менен берилет."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "ФÐЙЛдын колдонуу жана алмашуу убакыттарын жаңылайт."
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "Бул команданы иштеткиле - КОМÐÐДÐ"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "ЖаракÑыз көлөм: %s"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Inode номери диапазондун тышында"
+
+#: tests/genfile.c:247
+#, fuzzy, c-format
+msgid "Negative size: %s"
+msgstr "ЖаракÑыз көлөм: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "stat(%s) аткарылбай калды"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "`%s' жанындагы Ñанды окубатканда ката чыкты"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Датанын форматы түшүнүкÑүз"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ÐРГУМЕÐТТЕР...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "`%s' ачылбай жатат"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: %s орунуна баралбай жатат"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "файлдын атында бош тамга бар"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"кеңири(чоң) файлдарды Ñтандарт чыгарууга жибералбайт, --file опциÑÑын "
+"колдонуңуз"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "туура ÑÐ¼ÐµÑ Ð¼Ð°Ñка (`%s' жанында)"
+
+# фиелд деген кандай болот?
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "БелгиÑиз `%s'"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "`%s'ке убакыт аталган жок"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Команда толук аткарылды\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Команда %d ÑтатуÑу менен аткарылбай калды\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Команда %d Ñигналы менен жабылды\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Команда %d Ñигналы менен токтотулду\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Команда core dump менен бүттү\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Команда жабылды\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "--stat опциÑÑÑ‹ менен файл аттары жазылыш керек"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "аргументтердин Ñаны көп"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: %s-байтта окуу катаÑÑ‹ чыкты, %lu байт гана окуйт"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Убакыт тамгаÑÑ‹ диапазондун тышында"
+
+#~ msgid "Modification time (seconds) out of range"
+#~ msgstr "Ðлмашуу убагы (Ñекундалары) диапазондун тышында"
+
+#~ msgid "Modification time (nanoseconds) out of range"
+#~ msgstr "Ðлмашуу убагы (нано-Ñекундалар) диапазондун тышында"
+
+#~ msgid "Device number out of range"
+#~ msgstr "ÐÑпаптын номери диапазондун тышында"
+
+#~ msgid "Error reading time stamp"
+#~ msgstr "Убакыт тамгаÑын окубатканда ката чыкты"
+
+#~ msgid "Unexpected EOF"
+#~ msgstr "Күтүлбөгөн жерде файлдын Ñоңу бар"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Файлдардын аттары толук ÑÐ¼ÐµÑ Ð¶Ðµ бузук--\n"
+
+# Ушу манглед деген жакпай калды
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "ÐÑ‚Ñ‹ бузук файлдарда күтүлбөгөн жерде файлдын Ñоңу бар"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "%s'тин аты %s деп алмаштырылды"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: %s'ка Ñимволикалык шилтеме болбойтат"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s Ñимволикалык шилтеме катары %s'ке байланыштырылды"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "%s түшүнүкÑүз бузуку команда"
+
+#~ msgid "same as -N"
+#~ msgstr "-N менен бирдей"
+
+#~ msgid ""
+#~ "creating multi-volume archives in posix format requires using --tape-"
+#~ "length (-L) option"
+#~ msgstr ""
+#~ "posix форматында көп томдуу архив ачууга --tape-length (-L) опциÑÑÑ‹ болуш "
+#~ "керек"
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: %c командаÑÑ‹ туура ÑмеÑ\n"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "-C опциÑÑындан кийин файлдын аты жок"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "ишке алынбаган файл шаблондору жөнөкөй Ñөздөр болот"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr ""
+#~ "ишке алынбаган файл шаблондорунда маÑкалар колдонулат (алдынала тандалган)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "архив жаÑабатканда жалпы Ñакталган байт көлөмүн жазып чыгар"
+
+#~ msgid ""
+#~ "When creating archive in verbose mode, list member names as stored in the "
+#~ "archive"
+#~ msgstr ""
+#~ "Толук маалымат көрÑөтүлүп архив жаÑалыбатканда мүчө аттарын архивде "
+#~ "Ñакталган ирети менен көрÑÓ©Ñ‚Ó©Ñ‚"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "Кийинки верÑиÑларда -l опциÑÑынын ÑемантикаÑÑ‹ алмаштырылат."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Ðндан көрө --one-file-system опциÑÑын колдонуңуз."
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Бул программа тиешелүү закондор назарында ГÐРÐÐТИЯСЫЗ келет.\n"
+#~ "Сиз бул программаны GNU General Public License шарттары менен кошо\n"
+#~ "кеңири тараталаÑыз; толук маалымат үчүн COPYING деген файлды окуңуз."
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ЭСКЕРТҮҮ: Томдун башкы маалыматы жок"
+
+#~ msgid "Visible long name error"
+#~ msgstr "ÐÑ‚Ñ‹ көрүнөр түрдө узун - ката"
+
+#~ msgid "Visible longname error"
+#~ msgstr "ÐÑ‚Ñ‹ көрүнөр түрдө узун - ката"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "кошулган файлдардын акыркы жолу колдонуу убактын алмаштырбайт"
+
+#~ msgid "extract permissions information"
+#~ msgstr "укук маалыматын чыгарат"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "укук маалыматын чыгарбайт"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "ÐТТÐРДЫÐ-ФÐЙЛЫ"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr ""
+#~ "Ñимволикалык шилтемелердин ордуна алар көрÑөтүп турган файлдарды кошот"
+
+#~ msgid "Print license and exit"
+#~ msgstr "ЛицензиÑны көрÑөтүп tar'дын ишин бүтүр"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Жон Гилмор (J.Gilmore) жана ЖÑй ФÑнлаÑондун (J.Fenlason) аракеттерине\n"
+#~ "таÑнат. Ðвторлордун толук тизмеÑин AUTHORS файлынан көрө алаÑыңар.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " GNU tar - бул Ñркин программа камÑыздооÑу; Ñиз муну Free Software\n"
+#~ " Foundation тарабынан чыгарылган GNU General Public License шарттары\n"
+#~ " менен кеңири таратып жана/же алмаштыра алаÑыздар; лицензиÑнын 2-чи\n"
+#~ " верÑиÑÑÑ‹ же (Ñиздин оюңузга жараша) кийинки верÑиÑлары жарактуу.\n"
+#~ "\n"
+#~ " GNU tar Ñлге пайдалуу болÑун деген ой менен таратылат, бирок Ñч "
+#~ "кандай\n"
+#~ " ГÐРÐÐТИЯСЫ ЖОК; керек болÑо ойлонгондой СÐТУУГРЖÐРÐКТУУ же\n"
+#~ " БИР ÐœÐКСÐТТЫ ÐТКÐРУУЧУ деген гарантиÑÑÑ‹ да жок.\n"
+#~ " Толук маалымат үчүн GNU General Public License документин караңыз.\n"
+#~ "\n"
+#~ " Сизге GNU tar менен бирге GNU General Public License копиÑÑÑ‹ да "
+#~ "келиши\n"
+#~ " керек; Ñгер жок болÑо бул адреÑке билдирип коюңуз: Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "ЭÑкертүү: -y опциÑÑÑ‹ иштетилбейт; балким -j дегиңиз келди Ñле?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Стандарт чыгарууга жазыбатканда ката чыкты"
diff --git a/po/ms.gmo b/po/ms.gmo
new file mode 100644
index 0000000..17fbec1
--- /dev/null
+++ b/po/ms.gmo
Binary files differ
diff --git a/po/ms.po b/po/ms.po
new file mode 100644
index 0000000..ec3cd94
--- /dev/null
+++ b/po/ms.po
@@ -0,0 +1,2558 @@
+# tar : Perisian membina arkib fail
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Hasbullah Bin Pit <sebol@ikhlas.com>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.13.25\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2002-11-23 02:38+0800\n"
+"Last-Translator: Hasbullah Bin Pit <sebol@ikhlas.com>\n"
+"Language-Team: Malay <translation-team-ms@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "hujah tidak sah %s bagi %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "hujah kabur %s bagi %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Hujah sah adalah:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Pengunaan : %s [OPSYEN]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Cuba '%s --help' untuk maklumat lanjut.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+"Lapor pepijat ke <bug-tar@gnu.org>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Ralat sistem tidak diketahui"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: opsyen `%s' memerlukan hujah\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: opsyen `%s' adalah kabur\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: opsyen `--%s' tidak mengizinkan hujah\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: opsyen %c%s' tidak mengizinkan hujah\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: opsyen `%s' memerlukan hujah\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opsyen tidak dikenali `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opsyen tidak dikenali '%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opsyen salah -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opsyen tidak sah -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opsyen memerlukan hujah -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: opsyen `-W %s' adalah kabur\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: opsyen `-W %s' tidak mengizinkan hujah\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "saiz blok"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "memori keletihan"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Tak dapat %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Amaran: Tak dapat %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Tak dapat menukar mod ke %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Tak dapat menukar pemilikan ke uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Tak dapat memaut keras ke %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: ralat pembacaan pada byte %s, membaca %lu byte"
+msgstr[1] "%s: ralat pembacaan pada byte %s, membaca %lu byte"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Amaran: Ralat pembacaan pada byte %s, membaca %lu byte"
+msgstr[1] "%s: Amaran: Ralat pembacaan pada byte %s, membaca %lu byte"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Tak dapat rayau ke %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Amaran: tidak dapat rayau ke %s "
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Tak dapat mencipta symlink ke %s"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Ditulis hanya %lu drpd %lu byte"
+msgstr[1] "%s: Ditulis hanya %lu drpd %lu byte"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Membuang awalan `%.*s' drpd nama ahli"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Membuang awalan `%.*s' drpd nama ahli"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "Membuang awalan `%.*s' drpd nama ahli"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+# ui/galeon.glade.h:3
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Tiada servis"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Tak boleh laksanakan shell jauh"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: tak dapat memperuntukkan ruang penimbal\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Tak dapat memperuntukkan ruang penimbal"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Cuba '%s --help' untuk maklumat lanjut.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Penggunaan: %s [OPSYEN]\n"
+"Manupulasi pemacu pita, menerima arahan drpd proses jauh.\n"
+"\n"
+" --version Output maklumat versi.\n"
+" --help Output bantuan ini.\n"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Lapor pepijat ke <bug-tar@gnu.org>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Offset rayauan diluar julat"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Offset rayauan diluar julat"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Hala rayauan diluar julat"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: eof tak matang\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Akhir fail tak matang"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Arahan sampah"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Jumlah byte ditulis: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Jumlah byte ditulis: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(paip)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Nilai tidak sah bagi record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Tiada nama arkib diberi"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Tak dapat menentusahkan arkib stdin/stdout"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Tak dapat mengemaskini arkib termampat"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Menulis titiksemak %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Membaca titiksemak %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Pada permulaan pita, keluar sekarang"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Terlalu banyak ralat, keluar"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Blok tidak dijajar (%lu byte) pada arkib"
+msgstr[1] "Blok tidak dijajar (%lu byte) pada arkib"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Saiz rekod = %lu blok"
+msgstr[1] "Saiz rekod = %lu blok"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "tak dapat backspace fail arkib; ia mungkin tak boleh dibaca tanpa -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: mengandungi nombor volum yg tidak sah"
+
+#: src/buffer.c:914
+#, fuzzy
+msgid "Volume number overflow"
+msgstr "Nombor volum melimpah"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Menyedia volum #%d bagi %s dan tekan return: "
+
+# libgnomeui/gnome-app-helper.c:127
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF dimana maklumbalas pengguna dijangka"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "AMARAN: Arkib tidak lengkap"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [nama] Beri nama fail baru bagi volum berikutnya\n"
+" q Batal tar\n"
+" ! Spawn subshell\n"
+" ? Cetak senarai ini\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Tiada volum baru; keluar.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "Arahan '%s' gagal"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Ia nampaknya bukan seperti arkib tar"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s tidak bersambung pada volum ini"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s tidak bersambung pada volum ini"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s adalah salah saiz (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Volum ini tidak dalam turutan"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arkib tidak dilabelkan supaya memadan %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Volum %s tidak sepadan %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Hanya boleh membaca %lu drpd %lu byte"
+msgstr[1] "Hanya boleh membaca %lu drpd %lu byte"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Kandungan berlainan"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "EOF tanpa diduga pada arkib"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Jenis fail berbeza"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Mod berbeza"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid berbeza"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid berbeza"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Masa mod berbeza"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Saiz berbeza"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Tidak dipautkan ke %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symlink berbeza"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Nombor beranti berbeza"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Tentusah"
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Jenis fail tak dikenali '%c', berlainan dengan fail normal"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "GAGAL TENTUSAH: %d pengepala tak sah dikesan"
+msgstr[1] "GAGAL TENTUSAH: %d pengepala tak sah dikesan"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: fail adalah arkib; tidak dilonggokkan"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "nilai %s diluar julat %s %s..%s; menggantikan %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "nilai %s diluar julat %s %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Menjana pengepala oktal negatif"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: fail tidak berubah; tidak dilonggokkan"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: fail tidak berubah; tidak dilonggokkan"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: fail tidak berubah; tidak dilonggokkan"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Fail mengucup sebanyak %s byte; pad dengan sifar"
+msgstr[1] "%s: Fail mengucup sebanyak %s byte; pad dengan sifar"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: fail adalah pada sistemfail lain; tidak dilonggokkan"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Jenis fail tak dikenali; fail diabaikan"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr "Pautan ke %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: fail tidak berubah; tidak dilonggokkan"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: fail adalah arkib; tidak dilonggokkan"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Fail dibuang sebelum kami membacanya"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: fail adalah arkib; tidak dilonggokkan"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: fail berubah bila kami membacanya"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: soket diabaikan"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: pintu diabaikan"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Melangkah ke pengepala berikut"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Memadam bukan-pengepala drpd arkib"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: setem masa %s adalah %lu pada masa akan datang"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Ketidakkonsistenan luar dugaan bila membuat direktori"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Direktori ditukarnama sebelum statusnya boleh diekstrak"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Mengekstrak fail bersambung sebagai fail biasa"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Cuba mengekstrak pautan simbolik sebagai pautan keras"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Membaca %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Tak dapat ekstrak -- fail bersambung dari volum lain"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Penghujungan tanpa diduga data imej PNM"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Jenis fail tak dikenali '%c', diekstrak sebagai fail biasa"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Tak dapat backup fail ini"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Tak dapat menukarnama ke %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Ralat adalah tidak boleh dipulihkan: keluar sekarang"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Direktori telah ditukarnama"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Direktori telah ditukarnama"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Direktori adalah baru"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Setem masa tidak sah"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Mod tidak sah diberi pada opsyen"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Nombor peranti tidak sah"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Nombot inod tidak sah"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "EOF tanpa diduga pada arkib"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Tak dapat memperuntukkan memori bagi faktor pemblokan %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: fail adalah pada sistemfail lain; tidak dilonggokkan"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Memadam %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: tak dapat buang"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr ""
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** Blok TIADA **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok %s: ** Akhir Fail **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Pengepala kosong dimana nilai %s numerik dijangka"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr "Nilai oktal arkib %.*s diluar julat %s; anggap kedua-dua pelengkap"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Nilai oktal arkib %.*s diluar julat %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr ""
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Rentetan %s base-64 ditandatangani arkibadalah diluar julat %s "
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Nilai base-256 arkub adalah diluar julat %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arkib mengandungi %.*s dimana nilai %s numerik dijangka"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Nilai %s arkib adalah dijuar julat %s %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr "Pautan ke %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr "jenis fail tak diketahui %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Pengepala Volum--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Bersambung pada byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Mencipta direktori:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Menukarnama %s ke %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Tak dapat menukarnama ke %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Menukarnama %s kembali ke %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Tak dapat simpan direktori kerja"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Tak dapat tukar direktori kerja"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "proses anak"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "saluran antaraproses"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Tak dijumpai pada arkib"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Tak dijumpai pada arkib"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Opsyen `-%s' dan `-%s' kedua-duanya memerlukan input piawai"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Kumpulan tidak sah"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr ""
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Penggunaan: %s [OPSYEN]... [FAIL]...\n"
+"\n"
+"Contoh:\n"
+" %s -cf arkib.tar foo bar # Cipta arkib.tar drpd fail foo dan bar.\n"
+" %s -tvf arkib.tar # Senarai semua fail pada arkib secara "
+"verbose.\n"
+" %s -xf arkib.tar # Ekstrak semua fail drpd arkib.tar.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "EOF tanpa diduga pada arkib"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Ralat ketika menulis ke output piawai"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Tak dapat menentusah arkib multi-volume"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "opsyen format arkib konflik"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s: fail adalah arkib; tidak dilonggokkan"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s: fail adalah arkib; tidak dilonggokkan"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Tak dapat tukar direktori kerja"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Membuang awalan `%.*s' drpd nama ahli"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Volum %s tidak sepadan %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Anda tak boleh nyatakan lebih drpd satu opsyen `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Opsyen mampatan konflik"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr "jenis fail tak diketahui %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Fail tarikh tidak dijumpai"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Mengganti %s bagi format tarikh tak diketahui %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: fail adalah arkib; tidak dilonggokkan"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Faktor pemblokan tidak sah"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Amaran: opsyen -I tidak disokong; mungkin and amaksudkan -j atau -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "panjang pita tidak sah"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr ""
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Kumpulan tidak sah"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Mod tidak sah diberi pada opsyen"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "Nombot inod tidak sah"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Pemilik tidak sah"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Saiz rekod tidak sah"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Saiz rekod mesti dalam gandaan %d."
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "panjang pita tidak sah"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr ""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Opsyen `-[0-7][lmh]' tak disokong oleh tar *ini*"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "OPsyen lama `%c' memerlukan hujah."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Fail akrib beraneka memerlukan opsyen `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Tak boleh gabung --listed-incremental dengan --newer"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Label volum adalah terlalu panjang (had adalah %lu byte)"
+msgstr[1] "%s: Label volum adalah terlalu panjang (had adalah %lu byte)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Tak dapat menentusah arkib multi-volume"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Tak dapat menentusahkan arkib termampat"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Tak dapat menggunakan arkib multi-volume termampat"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Tak dapat mengemaskini arkib termampat"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Secara dayus enggan mencipta arkib kosong"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Opsyen `-Aru' tak serasi dengan `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Anda mesti nyatakan satu drpd opsyen `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Ralat keluar dilewatkan drpd ralat terdahulu"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Fail mengecil sebanyak %s byte"
+msgstr[1] "%s: Fail mengecil sebanyak %s byte"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Rentetan %s base-64 ditandatangani arkibadalah diluar julat %s "
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Nilai %s arkib adalah dijuar julat %s %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Menjana fail data untuk suit ujian GNU tar.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Opsyen mampatan konflik"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Ralat ketika menulis ke output piawai"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Setem masa tidak sah"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Nombor inod diluar julat"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Ralat sistem tidak diketahui"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Tak dapat rayau ke %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr "jenis fail tak diketahui %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Tak dapat rayau ke %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Anak mati dengan isyarat %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "Nama fail modul"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close"
+#~ msgstr "Tak dapat tutup"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Tak dapat dup"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Tak dapat mengguna arkib dimampat atau jauh"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (anak)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (cucu)"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "AMARAN: Tiada pengepala volum"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Anak mengembalikan status %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Nama ahli mengandungi '..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: nama ahli mengandungi `..'"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Ralat nama panjang boleh tampak"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Setem masa diluar julat"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Nombor peranti diluar julat"
+
+#, fuzzy
+#~ msgid "Visible longname error"
+#~ msgstr "Ralat nama panjang tampak"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "%s ditukarnama ke %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Tak dapat symlink ke %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s disymlink ke %s"
+
+#, fuzzy
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Pengkodan tidak diketahui: %s"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Kehilangan nama fail selepas -C"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Program ini datang TANPA WARANTI, ke tahap yang diizinkan oleh undang-"
+#~ "undang\n"
+#~ "Anda boleh mengagihkan ia dibawah syarat Lesen Awam Umum GNU;\n"
+#~ "lihat fail bernama COPYING untuk maklumat lanjut"
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Arahan Sampah %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU tar menyimpan banyak fail bersama ke satu pita atak arkib cakera, "
+#~ "dan\n"
+#~ " boleh memulihkan fail secara individu daripada arkib.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Jika opsyen panjang menunjukkan hujah adalah mandatori, maka ianya "
+#~ "mandatori\n"
+#~ "bagi opsyen pendek juga. Sama juga dengan hujah opsyenal.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Mod operasi utama:\n"
+#~ " -t, --list senarai kandungan drpd satu arkib\n"
+#~ " -x, --extract, --get ekstrak fail drpd satu arkib\n"
+#~ " -c, --create cipta arkib baru\n"
+#~ " -d, --diff, --compare cari perbezaan antara arkib dan sistem fail\n"
+#~ " -r, --append tambah fail ke hujung arkib\n"
+#~ " -u, --update hanya tambah fail lebih baru drpd salinan dlm "
+#~ "arkib\n"
+#~ " -A, --catenate tambah fail tar ke arkib\n"
+#~ " --concatenate sama seperti -A\n"
+#~ " --delete padam drpd arkib (bukan pada pita magnetik!)\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=KAWALAN] backup sebelum buang, pilih versi kawalan\n"
+#~ " --suffix=SUFFIKS backup sebelum buang, tindih suffiks "
+#~ "biasa\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Output bermaklumat:\n"
+#~ " --help cetak bantuan ini, kemudian keluar\n"
+#~ " --version cetak nombor versi program tar, kemudian keluar\n"
+#~ " -v, --verbose senarai fail diproses verbosely\n"
+#~ " --checkpoint cetak nama direktori bila membaca arkib\n"
+#~ " --totals cetak jumlah byte ditulis bila mencipta arkib\n"
+#~ " -R, --block-number papar nombor blok di dalam arkib dengan setiap "
+#~ "mesej\n"
+#~ " -w, --interactive tanya kepastian untuk setipa aksi\n"
+#~ " --confirmation sama seperti -w\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Opsyen ditelan zaman, kini menggunakan --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Opsyen ditelan zaman diganti dengan --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Nama opsyen ditelan zaman diganti dengan --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Nama opsyen ditelan zaman diganti dengan --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Opsyen ditelan zaman diganti dengan --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Opsyen ditelan zaman diganti dengan --block-number"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Amaran: opsyen -y tidak disokong; mungkin anda maksudkan -j?"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Nama opsyen ditelan zaman diganti dengan --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Ditulis oleh John Gilmore dan Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Jika opsyen panjang memapar hujah sebagai mandatori, maka ianya "
+#~ "mandatori\n"
+#~ " bagi opsyen pendek yg setara juga\n"
+#~ "\n"
+#~ " -l, --file-length=PANJANG PANJANG bagi fail dijana\n"
+#~ " -p, --pattern=CORAK CORAK adalah `default' atau `zeros'\n"
+#~ " --help papar bantuan ini dan keluar\n"
+#~ " --version output maklumat versi dan keluar\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Ditulis oleh F. Pinard."
diff --git a/po/nb.gmo b/po/nb.gmo
new file mode 100644
index 0000000..226ddb4
--- /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..1e72102
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,3006 @@
+# Norwegian messages for GNU tar. (bokmål dialect)
+# Copyright (C) 1996 Free Software Foundation, Inc.
+# Karl Anders Øygard <Karl.Oygard@fou.telenor.no>, 1996.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU tar 1.12\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 1997-06-05 19:39 MET DST\n"
+"Last-Translator: Espen Skjelnes Johnsen <espejohn@sn.no>\n"
+"Language-Team: Norwegian-bokmål <no@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: lib/argmatch.c:134
+#, fuzzy, c-format
+msgid "invalid argument %s for %s"
+msgstr "Ugyldig datoformat «%s»"
+
+#: lib/argmatch.c:135
+#, fuzzy, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "Tvetydig mønster «%s»"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr ""
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Bruk: %s [FLAGG]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Tast «%s --help» for mer informasjon.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Unkjent systemfeil"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr ""
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, fuzzy, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, fuzzy, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, fuzzy, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr ""
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr ""
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, fuzzy, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/human.c:477
+msgid "block size"
+msgstr ""
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+#, fuzzy
+msgid "memory exhausted"
+msgstr "Minne oppbrukt"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, fuzzy, c-format
+msgid "%s: Cannot %s"
+msgstr "Kan ikke utføre «stat» på filen %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr ""
+
+#: lib/paxerror.c:93
+#, fuzzy, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Kan ikke endre modus til %0.4o"
+
+#: lib/paxerror.c:101
+#, fuzzy, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Kan ikke endre eier til uid %d, gid %d"
+
+#: lib/paxerror.c:127
+#, fuzzy, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "Kan ikke lese link %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "Lesefeil ved byte %ld under lesing av %d bytes i fil %s"
+msgstr[1] "Lesefeil ved byte %ld under lesing av %d bytes i fil %s"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "Lesefeil ved byte %ld under lesing av %d bytes i fil %s"
+msgstr[1] "Lesefeil ved byte %ld under lesing av %d bytes i fil %s"
+
+#: lib/paxerror.c:259
+#, fuzzy, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "Kan ikke skrive til %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr ""
+
+#: lib/paxerror.c:284
+#, fuzzy, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Kunne ikke lage symbolisk link til «%s»"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Kunne bare skrive %d av %d bytes'"
+msgstr[1] "%s: Kunne bare skrive %d av %d bytes'"
+
+#
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Tar bort ledende «/» fra absolutte linker"
+
+#
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Tar bort ledende «/» fra absolutte linker"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr ""
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr ""
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr ""
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Tjenesten er ikke tilgjengelig"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Kan ikke eksekvere \"remote shell\""
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Kan ikke allokere buffer\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Kan ikke allokere plass til buffer"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Tast «%s --help» for mer informasjon.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter feil til <tar-bugs@gnu.ai.mit.edu>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr ""
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr ""
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr ""
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: For tidlig filslutt\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "For tidlig filslutt"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Ugyldig kommando"
+
+#
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Totalt antall bytes skrevet: "
+
+#
+#: src/buffer.c:333 src/buffer.c:347
+#, fuzzy
+msgid "Total bytes read"
+msgstr "Totalt antall bytes skrevet: "
+
+#
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Totalt antall bytes skrevet: "
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr ""
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Ugyldig verdi for record_size"
+
+#
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Arkivnavn er ikke oppgitt"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Kan ikke verifisere stdin/stdout-arkiv"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Kan ikke oppdatere komprimerte arkiver"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Skriver kontrollpunkt %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Leser kontrollpunkt %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "På begynnelsen av båndet, avslutter nå"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "For mange feil, avslutter"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Blokkstørrelse = %d enheter"
+msgstr[1] "Blokkstørrelse = %d enheter"
+
+#: src/buffer.c:791
+#, fuzzy
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Kunne ikke gå tilbake i arkivfilen. Den kan være uleselig uten -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr ""
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr ""
+
+#: src/buffer.c:929
+#, fuzzy, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "\aGjør klar volum nummer %d for %s og trykk return: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF der svar fra bruker var forventet"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ADVARSEL: Arkivet er ufullstendig"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [navn] Gi et filnavn for neste (og etterfølgende) volum(er)\n"
+" q Avbryt tar\n"
+" ! Start et shell\n"
+" ? Skriv denne listen\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Ikke nytt volum; avslutter.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr ""
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Dette ser ikke ut som et tar-arkiv"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s fortsetter ikke i dette volumet"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s fortsetter ikke i dette volumet"
+
+#: src/buffer.c:1237
+#, fuzzy, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s har feil størrelse (%ld != %ld + %ld)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Dette volumet kommer ute av rekkefølge"
+
+#: src/buffer.c:1293
+#, fuzzy, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arkivet er ikke navngitt for å passe med «%s»"
+
+#: src/buffer.c:1296
+#, fuzzy, c-format
+msgid "Volume %s does not match %s"
+msgstr "Volumet «%s» stemmer ikke overens med «%s»"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Kunne bare lese %d av %ld bytes"
+msgstr[1] "Kunne bare lese %d av %ld bytes"
+
+#: src/compare.c:106 src/compare.c:388
+#, fuzzy
+msgid "Contents differ"
+msgstr "Modus er ulik"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Uventet filslutt i arkivet"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+#, fuzzy
+msgid "File type differs"
+msgstr "Størrelse er ulik"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Modus er ulik"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid er ulik"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid er ulik"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Modifiseringstid er ulik"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Størrelse er ulik"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ikke linket til %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symbolsk link er ulik"
+
+#: src/compare.c:322
+#, fuzzy
+msgid "Device number differs"
+msgstr "Enhetsnummer er endret"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verifisering "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "Ukjent filtype «%c» for %s, diffet som en vanlig fil"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "VERIFIKASJONSFEIL: %d ukjente arkivhoder funnet"
+msgstr[1] "VERIFIKASJONSFEIL: %d ukjente arkivhoder funnet"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s er arkivet; ikke lagret"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr ""
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr ""
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr ""
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: er uendret; ikke lagret"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: er uendret; ikke lagret"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "Filen %s krympet med %d bytes, fyller ut med nuller"
+msgstr[1] "Filen %s krympet med %d bytes, fyller ut med nuller"
+
+#: src/create.c:1176
+#, fuzzy, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: På et annet filesystem. Ikke lagret"
+
+#: src/create.c:1217 src/create.c:1228
+#, fuzzy
+msgid "contents not dumped"
+msgstr " (minnet lagret)"
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Ukjent filtype; filen ble ignorert"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " link til %s\n"
+
+#: src/create.c:1529
+#, fuzzy, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: er uendret; ikke lagret"
+
+#: src/create.c:1537
+#, fuzzy, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s er arkivet; ikke lagret"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr ""
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s er arkivet; ikke lagret"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr ""
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr ""
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr ""
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Hopper til neste startseksjon"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Tar bort ikke-hodedata fra arkivet"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr ""
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr ""
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Ekstraherer sammenhengende filer som vanlige filer"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Forsøker å ekstrahere symbolske linker som harde linker"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Leser %s\n"
+
+#: src/extract.c:1146
+#, fuzzy, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "Kan ikke ekstrahere «%s» -- filen fortsetter fra et tidligere volum"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Uventet filslutt i arkivfilen"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "Ukjent filtype «%c» for %s, ekstrahert som en vanlig fil"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Kunne ikke lage sikkerhetskopi av denne filen"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Kan ikke endre navn på %s til %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr ""
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "Filkatalogen %s har endret navn"
+
+#: src/incremen.c:270
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed"
+msgstr "Filkatalogen %s har endret navn"
+
+#: src/incremen.c:311
+#, fuzzy, c-format
+msgid "%s: Directory is new"
+msgstr "Filkatalogen %s er ny"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr ""
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Ugyldig modus gitt i flagg"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr ""
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr ""
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "Lesefeil på %s"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Uventet filslutt i arkivfilen"
+
+#: src/incremen.c:872 src/incremen.c:912
+#, fuzzy
+msgid "Unexpected field value in snapshot file"
+msgstr "Uventet filslutt i arkivfilen"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Kan ikke gå til filkatalogen %s"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr ""
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Sletter %s\n"
+
+#: src/incremen.c:1418
+#, fuzzy, c-format
+msgid "%s: Cannot remove"
+msgstr "Kan ikke slette %s"
+
+#: src/list.c:113
+#, fuzzy, c-format
+msgid "%s: Omitting"
+msgstr "Utelater %s"
+
+#: src/list.c:131
+#, fuzzy, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blokk %10ld: ** Blokk med NUL-er **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, fuzzy, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blokk %10ld: ** Slutt på fil **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, fuzzy, c-format
+msgid "block %s: "
+msgstr "blokk %10ld: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr ""
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr ""
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+
+#: src/list.c:794
+#, fuzzy, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Dette volumet kommer ute av rekkefølge"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr ""
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " link til %s\n"
+
+#: src/list.c:1225
+#, fuzzy, c-format
+msgid " unknown file type %s\n"
+msgstr " ukjent filtype «%c»\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Volumhode--\n"
+
+#: src/list.c:1259
+#, fuzzy, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Fortsetter ved byte %ld--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Lager filkatalog:"
+
+#: src/misc.c:456
+#, fuzzy, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Endret navn på %s til %s"
+
+#: src/misc.c:465 src/misc.c:483
+#, fuzzy, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "Kan ikke endre navn på %s til %s"
+
+#: src/misc.c:488
+#, fuzzy, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Endret navn på %s til %s"
+
+#: src/misc.c:615
+#, fuzzy
+msgid "Cannot save working directory"
+msgstr "Kan ikke gå til filkatalogen %s"
+
+#: src/misc.c:621
+#, fuzzy
+msgid "Cannot change working directory"
+msgstr "Kan ikke gå til filkatalogen %s"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr ""
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr ""
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Finnes ikke i arkivet"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Finnes ikke i arkivet"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Flaggene «-%s» and «-%s» vil begge ta standard inn"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "Ugyldig datoformat «%s»"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU-funksjoner forsøkt på inkompatibelt arkiv-format"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+"Suffikset for sikkerhetskopiering er «~», med mindre det er satt med --"
+"suffix\n"
+"eller SIMPLE_BACKUP_SUFFIX. Versjonskontroll kan settes med --backup eller\n"
+"VERSION_CONTROL. Gyldige verdier er:\n"
+"\n"
+" t, numbered lag nummererte sikkerhetskopier\n"
+" nil, existing nummererte, dersom nummererte sikkerhetskopier "
+"eksisterer,\n"
+" ellers enkle\n"
+" never, simple lag enkle sikkerhetskopier\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Uventet filslutt i arkivet"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+#, fuzzy
+msgid "remove files after adding them to the archive"
+msgstr "Tar bort enhetsnavn fra navn i arkivet"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr ""
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Kan ikke verifisere arkiv som går over flere volum"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Arkivér til stdin"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr ""
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr ""
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Kan ikke gå til filkatalogen %s"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Tar bort ledende «/» fra absolutte linker"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Volumet «%s» stemmer ikke overens med «%s»"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+#, fuzzy
+msgid "ask for confirmation for every action"
+msgstr "Kan ikke lese bekreftelse fra brukeren"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Du kan ikke angi mer enn ett av «-Acdtrux»-flaggene"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Konflikt i kompresjonsflagg"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr "Ukjent mønster «%s»"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr ""
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr ""
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr ""
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr ""
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr ""
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Mer enn én grense-dato"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr ""
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Ugyldig modus gitt i flagg"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr ""
+
+#: src/tar.c:1671
+#, fuzzy
+msgid "Invalid owner"
+msgstr "Ugyldig eier gitt i flagg"
+
+#: src/tar.c:1705
+#, fuzzy
+msgid "Invalid record size"
+msgstr "Ugyldig verdi for record_size"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Blokkstørrelse må være delbart på %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr ""
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Ukjent mønster «%s»"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Flaggene «-[0-7][lmh]» støttes ikke av *denne* implementasjonen av tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Ved flere arkivfiler behøves «-M»-flagget"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr ""
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Kan ikke verifisere arkiv som går over flere volum"
+
+#
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Kan ikke verifisere komprimerte arkiver"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Kan ikke bruke komprimerte arkiv som går over flere volum"
+
+#
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Kan ikke oppdatere komprimerte arkiver"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "For feig til å lage et tomt arkiv"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Flaggene «-Aru» er inkompatible med «-f -»"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Du må angi ett av «-Acdtrux»-flaggene"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Utsatt feil-avslutning for tidligere feil"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Filen krympet med %d bytes, (øh!)"
+msgstr[1] "%s: Filen krympet med %d bytes, (øh!)"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr ""
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr ""
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Genrerer datafiler for GNU tar testpakke.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Konflikt i kompresjonsflagg"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr ""
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+#, fuzzy
+msgid "Update the access and modification times of FILE"
+msgstr "%s: Kunne ikke endre aksess- og modifiseringstider"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Ugyldig datoformat «%s»"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr ""
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Unkjent systemfeil"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "Kan ikke åpne %s"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "Kan ikke eksekvere %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr "Ukjent mønster «%s»"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "Kan ikke gjøre «stat» på %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr ""
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Ødelagte filnavn--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close file #%d"
+#~ msgstr "Kan ikke lukke fil #%d"
+
+#~ msgid "Cannot close descriptor %d"
+#~ msgstr "Kan ikke lukke fildeskriptor %d"
+
+#~ msgid "Cannot properly duplicate %s"
+#~ msgstr "Kan ikke duplisere %s"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Kan ikke bruke komprimerte arkiver eller arkiver på en annen maskin"
+
+#~ msgid "Cannot open pipe"
+#~ msgstr "Kan ikke lage en pipe"
+
+#~ msgid "Cannot fork"
+#~ msgstr "Kan ikke lage ny prosess med «fork»"
+
+#
+#~ msgid "tar (child)"
+#~ msgstr "tar (barn)"
+
+#~ msgid "(child) Pipe to stdin"
+#~ msgstr "(barn) Pipe til stdin"
+
+#~ msgid "Cannot open archive %s"
+#~ msgstr "Kan ikke åpne arkivet %s"
+
+#~ msgid "Archive to stdout"
+#~ msgstr "Arkivér til stdout"
+
+#~ msgid "Child cannot fork"
+#~ msgstr "Barnet kan ikke gjøre «fork»"
+
+#~ msgid "((child)) Pipe to stdout"
+#~ msgstr "((barn)) Pipe til stdout"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (barnebarn)"
+
+#~ msgid "(grandchild) Pipe to stdin"
+#~ msgstr "(barnebarn) Pipe til stdin"
+
+#~ msgid "Cannot read from compression program"
+#~ msgstr "Kan ikke lese fra komprimeringsprogrammet"
+
+#~ msgid "(child) Pipe to stdout"
+#~ msgstr "(barn) Pipe til stdout"
+
+#~ msgid "((child)) Pipe to stdin"
+#~ msgstr "((barn)) Pipe til stdin"
+
+#~ msgid "(grandchild) Pipe to stdout"
+#~ msgstr "(barnebarn) Pipe til stdout"
+
+#~ msgid "Cannot write to compression program"
+#~ msgstr "Kan ikke skrive til komprimeringsprogrammet"
+
+#~ msgid "Write to compression program short %d bytes"
+#~ msgstr "Skrev %d bytes for lite til komprimeringsprogrammet"
+
+#~ msgid "Could not allocate memory for blocking factor %d"
+#~ msgstr "Kunne ikke allokere minne for blokk-faktor %d"
+
+#~ msgid "Only wrote %u of %u bytes to %s"
+#~ msgstr "Skrev bare %u av %u bytes til %s"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ADVARSEL: Manglende volumhode"
+
+#~ msgid "Archive %s EOF not on block boundary"
+#~ msgstr "Arkiv %s sluttet ikke ved en blokkgrense"
+
+#~ msgid "Only read %d bytes from archive %s"
+#~ msgstr "Leste bare %d bytes fra arkivet %s"
+
+#~ msgid "WARNING: Cannot close %s (%d, %d)"
+#~ msgstr "ADVARSEL: Kan ikke lukke %s (%d, %d)"
+
+#~ msgid "Child died with signal %d%s"
+#~ msgstr "Barnet døde med signal %d%s"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Barnet avsluttet med status %d"
+
+#~ msgid "Cannot fork!"
+#~ msgstr "Kan ikke lage ny prosess med «fork»!"
+
+#~ msgid "Cannot exec a shell %s"
+#~ msgstr "Kan ikke eksekvere et shell %s"
+
+#
+#~ msgid "Removing leading `/' from absolute path names in the archive"
+#~ msgstr "Tar bort ledende «/» fra absolutte filnavn i arkivet"
+
+#~ msgid "Wrote %ld of %ld bytes to file %s"
+#~ msgstr "Skrev %ld av %ld bytes til fil %s"
+
+#~ msgid "Read error at byte %ld, reading %d bytes, in file %s"
+#~ msgstr "Lesefeil ved byte %ld ved lesing av %d bytes fra fil %s"
+
+#~ msgid "Amount actually written is (I hope) %d.\n"
+#~ msgstr "Faktisk skrevet mengde er %d (håper jeg).\n"
+
+#~ msgid "Cannot add file %s"
+#~ msgstr "Kan ikke legge til fil %s"
+
+#~ msgid "Cannot add directory %s"
+#~ msgstr "Kan ikke legge til filkatalogen %s"
+
+#~ msgid "Cannot open directory %s"
+#~ msgstr "Kan ikke åpne filkatalogen %s"
+
+#~ msgid "File name %s%s too long"
+#~ msgstr "Filnavnet %s%s er for langt"
+
+#~ msgid "Could not allocate memory for diff buffer of %d bytes"
+#~ msgstr "Kunne ikke allokere minne for diff-buffer på %d bytes"
+
+#~ msgid "Cannot read %s"
+#~ msgstr "Kan ikke lese %s"
+
+#~ msgid "Data differs"
+#~ msgstr "Data er ulike"
+
+#~ msgid "File does not exist"
+#~ msgstr "Filen eksisterer ikke"
+
+#~ msgid "Not a regular file"
+#~ msgstr "Ikke en vanlig fil"
+
+#~ msgid "Error while closing %s"
+#~ msgstr "Feil ved lukking av %s"
+
+#~ msgid "Does not exist"
+#~ msgstr "Eksisterer ikke"
+
+#~ msgid "No such file or directory"
+#~ msgstr "Fil eller filkatalog finnes ikke"
+
+#~ msgid "Mode or device-type changed"
+#~ msgstr "Modus eller enhetstype er endret"
+
+#~ msgid "No longer a directory"
+#~ msgstr "Ikke lenger en filkatalog"
+
+#~ msgid "Cannot open file %s"
+#~ msgstr "Kan ikke åpne filen %s"
+
+#~ msgid "Cannot seek to %ld in file %s"
+#~ msgstr "Kan ikke søke til posisjon %ld i filen %s"
+
+#~ msgid "Could not rewind archive file for verify"
+#~ msgstr "Kunne ikke gå til begynnelsen av arkivfilen for verifisering"
+
+#~ msgid "Could not re-position archive file"
+#~ msgstr "Kunne ikke endre posisjon i arkivfilen"
+
+#~ msgid "%s: Cannot lchown to uid %d gid %d"
+#~ msgstr "%s: Kan ikke endre eier til uid %d gid %d med lchown()"
+
+#~ msgid "%s: Cannot chown to uid %d gid %d"
+#~ msgstr "%s: Kan ikke endre eier til uid %d gid %d med chown()"
+
+#~ msgid "%s: Could not write to file"
+#~ msgstr "%s: Kunne ikke skrive til filen"
+
+#~ msgid "%s: Could not create file"
+#~ msgstr "%s: Kunne ikke lage fil"
+
+#~ msgid "%d at %d\n"
+#~ msgstr "%d ved %d\n"
+
+#~ msgid "%s: Error while closing"
+#~ msgstr "%s: Feil under lukking"
+
+#~ msgid "%s: Could not link to `%s'"
+#~ msgstr "%s: Kunne ikke lage link til «%s»"
+
+#~ msgid "%s: Could not make node"
+#~ msgstr "%s: Kunne ikke lage node"
+
+#~ msgid "%s: Could not make fifo"
+#~ msgstr "%s: Kunne ikke lage fifo"
+
+#~ msgid "%s: Could not create directory"
+#~ msgstr "%s: Kunne ikke lage filkatalog"
+
+#~ msgid "Added write and execute permission to directory %s"
+#~ msgstr "Satte skrive- og eksekveringsrettigheter for filkatalog %s"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Feil på et langt navn"
+
+#~ msgid "Could not get current directory"
+#~ msgstr "Kunne ikke finne navnet på aktiv filkatalog"
+
+#~ msgid "Could not get current directory: %s"
+#~ msgstr "Kunne ikke finne navnet på aktiv filkatalog: %s"
+
+#~ msgid "File name %s/%s too long"
+#~ msgstr "Filnavnet %s/%s er for langt"
+
+#~ msgid "Cannot chdir to %s"
+#~ msgstr "Kan ikke gå til filkatalogen %s"
+
+#~ msgid "Error while deleting %s"
+#~ msgstr "Feil ved sletting av %s"
+
+#~ msgid "Hmm, this doesn't look like a tar archive"
+#~ msgstr "Hmm, dette ser ikke ut som et tar-arkiv"
+
+#~ msgid "Skipping to next file header"
+#~ msgstr "Hopper til neste filhode"
+
+#~ msgid "EOF in archive file"
+#~ msgstr "Filslutt i arkivfilen"
+
+#~ msgid "Only wrote %ld of %ld bytes to file %s"
+#~ msgstr "Skrev bare %ld av %ld bytes til filen %s"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Feil på et langt navn"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Uventet filslutt i ødelagte navn"
+
+#~ msgid "Cannot symlink %s to %s"
+#~ msgstr "Kan ikke lage en symbolisk link fra %s til %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s symbolsk linket til %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Ukjent kommando %s ved rekonstruering av navn"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Mangler filnavn etter -C"
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Ugyldig kommando %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU «tar» lagrer mange filer i ett arkiv, og kan hente ut enkeltstående\n"
+#~ "filer fra arkivet.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [OPTION]... [FILE]...\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Bruk: %s [FLAGG]... [FIL]...\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Dersom et langt flagg har et obligatorisk argument, er argumentet også\n"
+#~ "obligatorisk for det korte flagget. Tilsvarende gjelder dersom "
+#~ "argumentet\n"
+#~ "kan sløyfes.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Hovedoperasjonsmodi:\n"
+#~ " -t, --list list innholdet av arkivet\n"
+#~ " -x, --extract, --get ekstrahér filer fra arkivet\n"
+#~ " -c, --create lage et nytt arkiv\n"
+#~ " -d, --diff, --compare vise forskjeller mellom arkivet og filsystemet\n"
+#~ " -r, --append legg til filer på slutten av arkivet\n"
+#~ " -u, --update legg til bare filer som er nyere enn de i "
+#~ "arkivet\n"
+#~ " -A, --catenate legg en arkivfil sammen med arkivet\n"
+#~ " --concatenate samme som -A\n"
+#~ " --delete slett fra arkivet (ikke for arkiv på bånd!)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't overwrite existing files when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Flagg for operasjonsmodi:\n"
+#~ " -W, --verify forsøk å verifisere arkivet etter å ha laget "
+#~ "det\n"
+#~ " --remove-files slett filer etter å ha lagt dem til arkivet\n"
+#~ " -k, --keep-old-files ikke overskriv eksisterende filer\n"
+#~ " -U, --unlink-first slett alle filer før ekstrahering til dem\n"
+#~ " --recursive-unlink tøm filkataloger før ekstrahering\n"
+#~ " -S, --sparse håndtér filer med hull mer effektivt\n"
+#~ " -O, --to-stdout ekstrahér filer til stdout\n"
+#~ " -G, --incremental bruk det gamle GNU formatet for "
+#~ "inkrementell\n"
+#~ " sikkerhetskopiering\n"
+#~ " -g, --listed-incremental bruk det nye GNU-formatet for inkrementell\n"
+#~ " sikkerhetskopiering\n"
+#~ " --ignore-failed-read ignorér feil under lesing av filer\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract all protection information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Håndtering av filattributter:\n"
+#~ " --owner=NAVN bruk NAVN som eier for nye filer\n"
+#~ " --gruppe=NAVN bruk NAVN som gruppe for nye filer\n"
+#~ " --mode=OKTAL bruk OKTAL som modus for nye filer\n"
+#~ " --atime-preserve ikke endre aksesstider på lagrede filer\n"
+#~ " -m, --modification-time ikke ekstrahér modifiseringstiden\n"
+#~ " --same-owner forsøk å ekstrahere filer med samme eier\n"
+#~ " --numeric-owner bruk nummer for bruker/gruppe-navn\n"
+#~ " -p, --same-permissions forsøk å ekstrahere filer med samme\n"
+#~ " filbeskyttelse\n"
+#~ " --preserve-permissions samme som -p\n"
+#~ " -s, --same-order sorter navn som skal ekstraheres slik at\n"
+#~ " de passer med arkivet\n"
+#~ " --preserve-order samme som -s\n"
+#~ " --preserve samme som både -p og -s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Enhetsvalg og enhetsskifte:\n"
+#~ " -f, --file=ARKIV bruk arkivfil eller enhet ARKIV\n"
+#~ " --force-local arkivfil er lokal selv om den har et "
+#~ "kolon\n"
+#~ " --rsh-command=KOMMANDO bruk KOMMANDO i stedet for rsh\n"
+#~ " -[0-7][lmh] angi enhet og tetthet\n"
+#~ " -M, --multi-volume behandle arkivet som et flervolumsarkiv\n"
+#~ " -L, --tape-length=NUMMER bytt bånd etter at NUMMER x 1024 bytes "
+#~ "er\n"
+#~ " skrevet\n"
+#~ " -F, --info-script=FIL kjør kommandofil FIL ved slutten av "
+#~ "hvert\n"
+#~ " bånd (setter -M automatisk)\n"
+#~ " --new-volume-script=FIL samme som -F FIL\n"
+#~ " --volno-file=FIL bruk/oppdater volumnummeret i FIL\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Blokkhåndtering:\n"
+#~ " -b, --blocking-factor=ENHETER sett blokkstørrelse ENHETER x 512 bytes\n"
+#~ " --record-size=STØRRELSE STØRRELSE bytes per enhet (delbart på "
+#~ "512)\n"
+#~ " -i, --ignore-zeros ignorér blokker som inneholder nuller\n"
+#~ " (betyr filslutt)\n"
+#~ " -B, --read-full-records blokk om ved lesing (for 4.2BSD pipes)\n"
+
+#
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX conformant archive\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Valg av arkivformat:\n"
+#~ " -V, --label=NAVN lag et arkiv med volumnavn NAVN\n"
+#~ " MØNSTER filer som skal tas med ved listing "
+#~ "eller\n"
+#~ " ekstrahering (tillatt med "
+#~ "jokertegn)\n"
+#~ " -o, --old-archive, --portability lag et arkiv i V7 format\n"
+#~ " --posix lag et POSIX-konformt arkiv\n"
+#~ " -z, --gzip, --ungzip send arkivet gjennom gzip\n"
+#~ " -Z, --compress, --uncompress send arkivet gjennom compress\n"
+#~ " --use-compress-program=PROG send arkivet gjennom PROG (må forstå "
+#~ "-d)\n"
+
+#
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a globbing "
+#~ "PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude globbing patterns listed in FILE\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Valg av lokale filer:\n"
+#~ " -C, --directory=KATALOG endre filkatalog til KATALOG\n"
+#~ " -T, --files-from=FIL hent navn for ekstrahering eller "
+#~ "arkivering\n"
+#~ "\t\t\t fra filen FIL\n"
+#~ " --null -T leser null-terminerte navn, tillater "
+#~ "ikke -C\n"
+#~ " --exclude=MØNSTER ta ikke med filer (tillatt med jokertegn)\n"
+#~ " -X, --exclude-from=FIL ta ikke med filer navngitte i filen FIL\n"
+#~ " (tillatt med jokertegn)\n"
+#~ " -P, --absolute-names ta ikke bort ledende «/» fra filnavn\n"
+#~ " -h, --dereference arkivér det symboliske linker peker på\n"
+#~ " --no-recurse ta ikke med filer i underkataloger\n"
+#~ " -l, --one-file-system ta ikke med filer fra andre filsystemer\n"
+#~ " -K, --starting-file=NAVN begynn med filen NAVN i arkivet\n"
+
+#
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATO arkivér bare filer som er nyere enn DATO\n"
+#~ " --newer-mtime sammenlign tidsstempel bare når data er "
+#~ "endret\n"
+#~ " --after-date=DATO samme som -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removel, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=KONTROLL] lag sikkerhetskopi før sletting, med\n"
+#~ " versjonskontroll\n"
+#~ " --suffix=SUFFIKS lag sikkerhetskopi før sletting, med\n"
+#~ " overstyring av det vanlige suffikset\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Utskrift av informasjon:\n"
+#~ " --help vis denne hjelpeteksten og avslutt\n"
+#~ " --version vis programversjon og avslutt\n"
+#~ " -v, --verbose vis hver fil som behandles\n"
+#~ " --checkpoint vis filkatalognavn når arkivet leses\n"
+#~ " --totals vis totalt antall bytes skrevet\n"
+#~ " -R, --block-number vis enhetsnummer i arkivet sammen med alle "
+#~ "meldinger\n"
+#~ " -w, --interactive spør etter bekreftelse for hver operasjon\n"
+#~ " --confirmation samme som -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; and FILE may be a file\n"
+#~ "or a device. *This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar kan hverken lese eller skrive «--posix»-arkiver. Dersom\n"
+#~ "miljøvariabelen POSIXLY_CORRECT er satt, er GNU-funksjoner ikke tillatt\n"
+#~ "sammen med «--posix». Støtte for POSIX er bare delvis implementert, så\n"
+#~ "stol ikke på den ennå.\n"
+#~ "ARKIV kan være FIL, MASKIN:FIL eller BRUKER@MASKIN:FIL; og FIL kan være "
+#~ "en\n"
+#~ "fil eller en enhet. *Denne* versjonen av tar har «-f%s -b%d» som "
+#~ "forvalg.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Utdatert flagg, nå implisert av --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Utdatert flagg skiftet ut med --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Utdatert flagg skiftet ut med --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Utdatert flagg skiftet ut med --touch"
+
+#~ msgid "Conflicting archive format options"
+#~ msgstr "Konflikt i flaggene for arkiv-format"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Utdatert flagg skiftet ut med --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Utdatert flagg skiftet ut med --block-number"
+
+#
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Utdatert flagg skiftet ut med --backup"
+
+#~ msgid "Invalid group given on option"
+#~ msgstr "Ugyldig gruppe gitt i flagg"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, "
+#~ "Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, "
+#~ "Inc.\n"
+
+#~ msgid ""
+#~ "This is free software; see the source for copying conditions. There is "
+#~ "NO\n"
+#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR "
+#~ "PURPOSE.\n"
+#~ msgstr ""
+#~ "Dette er fri programvare. Se kildekoden for kopieringsbetingelser.\n"
+#~ "Programvaren har ingen garanti, ikke en gang for SALGBARHET eller "
+#~ "EGNETHET\n"
+#~ "TIL NOEN SPESIELL OPPGAVE.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Written by John Gilmore and Jay Fenlason.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Skrevet av John Gilmore and Jay Fenlason.\n"
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Obligatoriske argumenter for lange flagg er obligatoriske også for korte "
+#~ "flagg.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGDE lengde av generert fil\n"
+#~ " -p, --pattern=MØNSTER gyldige mønster er «default» eller «zeros»\n"
+#~ " --help vis denne hjelpeteksten og avslutt\n"
+#~ " --version vis programversjon og avslutt\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Written by François Pinard <pinard@iro.umontreal.ca>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Skrevet av François Pinard <pinard@iro.umontreal.ca>\n"
diff --git a/po/nl.gmo b/po/nl.gmo
new file mode 100644
index 0000000..4d91328
--- /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..addbdca
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,2428 @@
+# Translation of tar-1.16.1 to Dutch.
+# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+# Elros Cyriatan <cyriatan@fastmail.fm>, 2004.
+# Benno Schulenberg <benno@nietvergeten.nl>, 2005, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.16.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-12-10 13:20+0100\n"
+"Last-Translator: Benno Schulenberg <benno@nietvergeten.nl>\n"
+"Language-Team: Dutch <vertaling@vrijschrift.org>\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: KBabel 1.11.4\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "ongeldig argument %s van %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argument %s van %s is niet eenduidig"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Geldige argumenten zijn:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: waarde %s is kleiner dan of gelijk aan %s"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: Parameter van ARGP_HELP_FMT vereist een waarde"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: Parameter van ARGP_HELP_FMT moet positief zijn"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Onbekende parameter van ARGP_HELP_FMT"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Rommel in ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+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."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Gebruik: "
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " of: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [OPTIE]..."
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Probeer '%s --help' of '%s --usage' voor meer informatie.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"Rapporteer fouten in het programma aan %s,\n"
+"en fouten in de vertaling aan <vertaling@vrijschrift.org>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Onbekende systeemfout"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "deze hulptekst tonen"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "een kort gebruiksbericht tonen"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NAAM"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "de programmanaam instellen"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SECONDEN"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "dit aantal seconden pauzeren (standaard 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "programmaversie tonen"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "**Interne programmafout**: geen versie bekend!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Te veel argumenten\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "**Interne programmafout**: optie had herkend moeten worden!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: optie '%s' is niet eenduidig\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: optie '--%s' staat geen argument toe\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: optie '%c%s' staat geen argument toe\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: optie '%s' vereist een argument\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: onbekende optie '--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: onbekende optie '%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ongeldige optie -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ongeldige optie -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: optie vereist een argument -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: optie '-W %s' is niet eenduidig\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: optie '-W %s' staat geen argument toe\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "blokgrootte"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "onvoldoende geheugen"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Functie %s() is mislukt"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Waarschuwing: functie %s() is mislukt"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Kan modus niet wijzigen naar %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Kan de eigenaar niet wijzigen naar UID %lu, GID %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Kan niet hard-koppelen naar %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Leesfout op byte %s, tijdens lezen van %lu byte"
+msgstr[1] "%s: Leesfout op byte %s, tijdens lezen van %lu bytes"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Waarschuwing: leesfout op byte %s, tijdens lezen van %lu byte"
+msgstr[1] "%s: Waarschuwing: leesfout op byte %s, tijdens lezen van %lu bytes"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Kan in bestand niet naar %s springen"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Waarschuwing: kan in bestand niet naar %s springen"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Kan geen symbolische koppeling maken naar %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Slechts %lu van %lu byte geschreven"
+msgstr[1] "%s: Slechts %lu van %lu bytes geschreven"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Leidende '%s' wordt uit lidnamen verwijderd"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Leidende '%s' wordt uit harde-koppelingsdoelen verwijderd"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Een lege lidnaam wordt door een '.' vervangen"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Een leeg harde-koppelingsdoel wordt door een '.' vervangen"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "'"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[jJ]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Dienst is niet beschikbaar"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "standaardinvoer"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "standaarduitvoer"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Kan gindse shell niet uitvoeren"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Invoertekenreeks is te lang"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Syntaxfout in getal"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Kan geen bufferruimte reserveren\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Kan geen bufferruimte reserveren"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Probeer '%s --help' voor meer informatie.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Gebruik: %s [OPTIE]\n"
+"Een magneetband manipuleren, en opdrachten accepteren van een ander proces.\n"
+"\n"
+" --version programmaversie tonen\n"
+" --help deze hulptekst tonen\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporteer fouten in het programma aan <%s>,\n"
+"en gebreken in de vertaling aan <vertaling@vrijschift.org>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Sprongpositiefout"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Sprongpositie valt buiten bereik"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Sprongrichting valt buiten bereik"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Voortijdig einde van bestand\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Voortijdig einde van bestand"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Ongeldige opdracht"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Totaal aantal geschreven bytes"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Totaal aantal gelezen bytes"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Totaal aantal verwijderde bytes: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(pijp)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Ongeldige waarde voor recordgrootte"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Geen archiefnaam opgegeven"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Kan archieven op standaardinvoer of -uitvoer niet verifiëren"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Archief is gecomprimeerd. Gebruik optie '%s'."
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Kan ingepakte archieven niet bijwerken"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Schrijfcontrolepunt %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Leescontrolepunt %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Aan het begin van de band -- tar sluit nu af."
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Te veel fouten -- tar sluit nu af."
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Niet-uitgelijnd blok (%lu byte) in archief"
+msgstr[1] "Niet-uitgelijnd blok (%lu bytes) in archief"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Recordgrootte = %lu blok"
+msgstr[1] "Recordgrootte = %lu blokken"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Kan niet terugzoeken in archiefbestand; het kan onleesbaar zijn zonder -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek() is niet gestopt op een recordgrens"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: bevat een ongeldig deelnummer"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Deelnummer-overloop"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Zet deel #%d voor %s klaar en druk op Enter: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "een lege tekst, terwijl gebruikersinvoer werd verwacht"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "WAARSCHUWING: Archief is onvolledig"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n naam een nieuwe bestandsnaam opgeven voor het volgende deel en de\n"
+" daarop volgende delen\n"
+" q tar afbreken\n"
+" y of Enter doorgaan\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! een subshell starten\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? dit lijstje tonen\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Geen nieuw deel -- tar sluit af.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Geen bestandsnaam opgegeven. Probeer het nog eens.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Ongeldige invoer. Typ ? voor hulp.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "Opdracht %s is mislukt"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Dit ziet er niet uit als een tar-archief"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s gaat mogelijk verder in dit deel: de kop bevat een afgekapte naam"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s gaat niet verder in dit deel"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s heeft een verkeerde grootte (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Dit deel valt buiten de reeks"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Archief is niet gemerkt als overeenkomend met %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Deel %s komt niet overeen met %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: bestandsnaam is te lang om opgeslagen te worden in een GNU-meerdelenkop; "
+"afgekapt"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Kon slechts %lu van %lu byte lezen"
+msgstr[1] "Kon slechts %lu van %lu bytes lezen"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Inhouden verschillen"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Onverwacht einde-van-bestand in archief"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Bestandssoort verschilt"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Modus verschilt"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "UID verschilt"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "GID verschilt"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Wijzigingstijd verschilt"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Grootte verschilt"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Niet gekoppeld aan %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symbolische koppeling verschilt"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Apparaatnummer verschilt"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verifiëren "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Onbekende bestandssoort '%c'; gedifft als gewoon bestand"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Archief bevat bestandsnamen waarvan de prefixen verwijderd zijn."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Een verificatie kan mogelijk de originele bestanden niet vinden."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "Verificatie is MISLUKT: %d ongeldige kop gevonden"
+msgstr[1] "Verificatie is MISLUKT: %d ongeldige koppen gevonden"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: map bevat cache-markering %s; niet gearchiveerd"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "waarde %s valt buiten bereik voor %s (%s..%s); wordt vervangen door %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "waarde %s valt buiten bereik voor %s (%s..%s)"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Er worden negatieve octale koppen gemaakt"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: bestandsnaam is te lang (max %d); niet gearchiveerd"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+"%s: bestandsnaam is te lang (kan niet worden gesplitst); niet gearchiveerd"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: koppelingsnaam is te lang; niet gearchiveerd"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Bestand is gekrompen met %s byte; aangevuld met nullen"
+msgstr[1] "%s: Bestand is gekrompen met %s bytes; aangevuld met nullen"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: bestand staat op een ander bestandssysteem; niet gearchiveerd"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Onbekende bestandssoort; bestand genegeerd"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "Ontbrekende koppelingen naar %s.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: bestand is ongewijzigd; niet gearchiveerd"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: bestand is het archief zelf; niet gearchiveerd"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Bestand werd verwijderd voordat het gelezen kon worden"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: map bevat een cache-markering; niet gearchiveerd"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: bestand is gewijzigd tijdens het lezen"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: socket genegeerd"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: deur genegeerd"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Alles tot aan volgende kop wordt overgeslagen"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Niet-kop wordt uit archief verwijderd"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: onwaarschijnlijk oude tijdsstempel %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: tijdsstempel %s ligt %s seconden in de toekomst"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Onverwachte inconsistentie bij maken van map"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Map werd hernoemd voordat de status ervan kon worden bepaald"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Aaneengesloten bestanden worden uitgepakt als gewone bestanden"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr ""
+"Poging om symbolische koppelingen als harde koppelingen uit te pakken..."
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Lezen van %s...\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Kan niet uitpakken -- bestand gaat door in een ander deel"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Onverwachte lange-naamkop"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Onbekende bestandssoort '%c'; uitgepakt als gewoon bestand"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Huidige %s is nieuwer of even oud"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Kan geen reservekopie van dit bestand maken"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Kan %s niet tot %s hernoemen"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Fout is niet herstelbaar -- tar sluit nu af."
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Map is hernoemd van %s"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Map is hernoemd"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Map is nieuw"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Ongeldig tijdsstempel"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Ongeldige wijzigingstijd (seconden)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Ongeldige wijzigingstijd (nanoseconden)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Ongeldig apparaatnummer"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Ongeldig inode-nummer"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Veld is te lang, tijdens lezen van snapshot-bestand"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Leesfout tijdens lezen van snapshot-bestand"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Onverwacht einde-van-bestand in snapshot-bestand"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Onverwachte veldwaarde in snapshot-bestand"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Ontbrekende record-afsluiting"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Onjuiste incrementele bestandsindeling"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+"Niet-ondersteunde versie (%<PRIuMAX>) van incrementele bestandsindeling"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "Onjuiste archiveringsmap: '%c' werd verwacht maar %#3o gevonden"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Onjuiste archiveringsmap: 'X' staat er dubbel"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Onjuiste archiveringsmap: lege naam in 'R'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Onjuiste archiveringsmap: 'T' werd niet voorafgegaan door 'R'"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Onjuiste archiveringsmap: lege naam in 'T'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+"Onjuiste archiveringsmap: '%c' werd verwacht, maar de gegevens houden op"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "Onjuiste archiveringsmap: 'X' is nergens gebruikt"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Kan met sjabloon %s geen tijdelijke map aanmaken"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Map wordt niet leeggemaakt: kan de status ervan niet bepalen"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: Map staat op een ander bestandssysteem; niet leeggemaakt"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Verwijderen van %s...\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Kan niet verwijderen"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Overgeslagen"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** Blok van NUL-tekens **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Een los blok met nullen op %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok %s: ** Einde-bestand **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Witruimte in kop waar numerieke waarde voor %s werd verwacht"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Octaalwaarde %.*s in archief valt buiten bereik voor %s; 2-complement wordt "
+"aangenomen"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Octaalwaarde %.*s in archief valt buiten bereik voor %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Archief bevat ouderwetse grondtal-64 koppen"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Tekenreeks %s (met grondtal-64-met-teken) valt buiten bereik voor %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Grondtal-256 waarde in archief valt buiten bereik voor %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Archief bevat %.*s waar numerieke waarde voor %s werd verwacht"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Waarde %s in archief valt buiten bereik voor %s (%s..%s)"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " koppeling naar %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " onbekende bestandssoort %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Lange koppeling--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Lange naam--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Deelkop--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Verder bij byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Aanmaken van map:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Hernoemen van %s tot %s...\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Kan niet tot %s hernoemen"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Hernoemen van %s terug tot %s...\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Kan werkmap niet opslaan"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Kan werkmap niet wijzigen"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "kindproces"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "interproces-kanaal"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Bestandsnamen bevatten jokertekens. Gebruik '--wildcards'"
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr "om patroonovereenkomsten in te schakelen,"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "of '-no-wildcards' om deze melding te onderdrukken."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Komt niet voor in archief"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Is vereist maar komt niet voor in archief"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Opties '-%s' en '-%s' willen beide standaardinvoer gebruiken"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Ongeldige archiefindeling"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU-functies gevraagd bij een incompatibele archiefindeling"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Onbekende aanhalingsstijl '%s'. Probeer '%s --quoting-style=help' voor een "
+"overzicht."
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU 'tar' bewaart veel bestanden samen op een enkele magneetband of in een "
+"enkel schijfarchief, en kan individuele bestanden uit het archief "
+"herstellen.\n"
+"\n"
+"Voorbeelden:\n"
+" tar -cf archief.tar foo bar # Bestand archief.tar aanmaken van foo en "
+"bar.\n"
+" tar -tvf archief.tar # Alle bestanden in archief.tar opsommen.\n"
+" tar -xf archief.tar # Alle bestanden van archief.tar uitpakken.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Het reservekopie-achtervoegsel is '~', tenzij anders ingesteld met\n"
+"'--suffix' of met omgevingsvariabele SIMPLE_BACKUP_SUFFIX.\n"
+"Het versiebeheer kan worden ingesteld met '--backup' of met\n"
+"omgevingsvariabele VERSION_CONTROL; mogelijke waarden zijn:\n"
+"\n"
+" none, off nooit reservekopieën maken\n"
+" t, numbered genummerde reservekopieën maken\n"
+" nil, existing genummerd als ze al bestaan, anders simpel\n"
+" never, simple altijd simpele reservekopieën maken\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Hoofdbewerkingen:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "de inhoud van een archief opsommen"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "bestanden uit een archief uitpakken"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "een nieuw archief aanmaken"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "verschillen tussen archief en bestandssyteem vinden"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "bestanden aan het eind van een archief toevoegen"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+"alleen bestanden toevoegen die nieuwer zijn dan hun versie in het archief"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "tar-bestanden aan een archief toevoegen"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "uit het archief verwijderen (niet gebruiken bij magneetbanden!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "label van archiefdeel controleren en stoppen"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Werkingsaanpassers:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "luchtige bestanden efficiënt verwerken"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "HOOFD[.SUB]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr "versie van te gebruiken luchtige indeling (impliceert '--sparse')"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "oude GNU-indeling van incrementele reservekopie verwerken"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "BESTAND"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "nieuwe GNU-indeling van incrementele reservekopie verwerken"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "niet afsluiten met een foutcode bij onleesbare bestanden"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "AANTAL"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"alleen het AANTALste voorkomen van elk bestand in het archief verwerken; "
+"deze optie is alleen geldig samen met een van de subopdrachten --delete, --"
+"diff, --extract of --list, en wanneer een lijst van bestanden gegeven is op "
+"de opdrachtregel of via de optie -T; AANTAL is standaard 1"
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "archief is doorzoekbaar"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "Overschrijvingsopties:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "het archief na het schrijven proberen te verifiëren"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "bestanden na hun toevoeging aan het archief verwijderen"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "bij het uitpakken bestaande bestanden niet vervangen"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"bestaande bestanden die nieuwer zijn dan die in het archief niet vervangen"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "bestaande bestanden bij het uitpakken overschrijven"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "elk bestand verwijderen alvorens eroverheen uit te pakken"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "bestaande mappen leegmaken alvorens eroverheen uit te pakken"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "metagegevens van bestaande mappen behouden"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"de metagegevens van bestaande mappen bij het uitpakken overschrijven "
+"(standaard)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Selecteren van uitvoerkanaal:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "bestanden uitpakken naar standaarduitvoer"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "OPDRACHT"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "uitgepakte bestanden via pijp naar gegeven programma sluizen"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "afsluitwaardes van kindprocessen negeren"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "afsluitwaardes van kindprocessen die niet nul zijn als fout behandelen"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Behandeling van bestandskenmerken:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "toegevoegde bestanden krijgen NAAM als eigenaar"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "toegevoegde bestanden krijgen NAAM als groep"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATUM-OF-BESTAND"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+"wijzigingstijd zetten van bestanden die wegens DATUM-OF-BESTAND toegevoegd "
+"zijn"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "WIJZIGINGEN"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "toegevoegde bestanden krijgen (symbolische) WIJZIGINGEN in hun modus"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "MANIER"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"toegangstijdsstempels van gearchiveerde bestanden behouden: door het "
+"herstellen van de tijdsstempels na het lezen (MANIER='replace'; standaard), "
+"of door de tijdsstempels met rust te laten (MANIER='system')"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "bestandswijzigingstijden niet uitpakken"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "bestanden proberen uit te pakken met gelijkblijvende eigenaar"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "bestanden uitpakken als uzelf"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "altijd getallen gebruiken voor gebruikers- en groepsnamen"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr "bestandspermissies ook uitpakken (standaard voor root)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"de umask van de gebruiker toepassen bij het uitpakken van bestandspermissies "
+"(standaard voor gewone gebruikers)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+"uit te pakken namen sorteren zodanig dat ze overeenkomen met de volgorde in "
+"het archief"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "hetzelfde als -p en -s samen"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"het zetten van permissies en tijdsstempels van mappen uitstellen tot het "
+"einde van het uitpakken"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "het effect van de optie --delay-directory-restore ongedaan maken"
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Apparaatselectie en -wisseling:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARCHIEF"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "archiefbestand of apparaat ARCHIEF gebruiken"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "archiefbestand is lokaal, zelfs als het een dubbele punt bevat"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "deze OPDRACHT gebruiken in plaats van rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "deze OPDRACHT gebruiken in plaats van rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "schijf en dichtheid opgeven"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "meerdelig archief aanmaken/opsommen/uitpakken"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "band wisselen na schrijven van AANTAL x 1024 bytes"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "script uitvoeren aan einde van elke band (impliceert -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "het nummer van het deel in BESTAND gebruiken/bijwerken"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Blokverwerking:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOKKEN"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLOKKEN x 512 bytes per record"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "AANTAL bytes per record (een veelvoud van 512)"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "blokken met nullen in archief negeren (betekenen einde-van-bestand)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "doorgaan met lezen tot blok compleet is (voor 4.2BSD-pijpen)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Archiefindelingskeuze:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "INDELING"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "een archief maken in de gekozen indeling"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "INDELING is een van de volgende:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "oude V7 tar-indeling"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "GNU-indeling van tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU-indeling van tar 1.13.x"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "POSIX 1003.1-1988 (ustar-indeling)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "POSIX 1003.1-2001 (pax-indeling)"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "hetzelfde als pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "hetzelfde als --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "hetzelfde als --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "sleutelwoord[[:]=waarde][,sleutelwoord[[:]=waarde]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "het aangeven van pax-sleutelwoorden"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TEKST"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"een archief met deelnaam TEKST maken; bij opsommen/uitpakken TEKST als "
+"zoekpatroon voor de deelnaam gebruiken"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "het archief door bzip2 filteren"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "het archief door gzip filteren"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "het archief door compress filteren"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "het archief door PROG filteren (moet -d accepteren)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Lokale bestandskeuze:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"het gegeven BESTAND aan het archief toevoegen (handig als de naam begint met "
+"een '-')"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "MAP"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "naar MAP gaan"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "namen van in of uit te pakken bestanden uit BESTAND halen"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T leest met NUL afgesloten namen, -C uitzetten"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+"aanhalingstekens verwijderen rond bestandsnamen gelezen met -T (standaard)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "aanhalingstekens niet verwijderen rond bestandsnamen gelezen met -T"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "PATROON"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "bestanden uitsluiten, gegeven als een PATROON"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "uitsluitingspatronen staan opgesomd in BESTAND"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "mappen met een cache-markering uitsluiten"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "mappen die BESTAND bevatten uitsluiten"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "mappen die BESTAND bevatten uitsluiten"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "mappen die BESTAND bevatten uitsluiten"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "mappen die BESTAND bevatten uitsluiten"
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr "mappen die BESTAND bevatten uitsluiten"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "niet automatisch afdalen in mappen"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "in het lokale bestandssysteem blijven bij maken van archief"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "recursief in mappen afdalen (standaard)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "leidende '/' niet uit bestandsnamen verwijderen"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+"symbolische koppelingen volgen; de bestanden waar ze naar verwijzen "
+"archiveren"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "LIDNAAM"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "beginnen bij lid LIDNAAM in het archief"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "alleen bestanden opslaan die nieuwer zijn dan DATUM-OF-BESTAND"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATUM"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "datum en tijd alleen vergelijken wanneer gegevens veranderd zijn"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "MANIER"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "voor verwijdering een reservekopie maken, op de aangegeven MANIER"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "TEKENREEKS"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"voor verwijdering een reservekopie maken, met TEKENREEKS als achtervoegsel "
+"(in plaats van '~', die standaard is tenzij door omgevingsvariable "
+"SIMPLE_BACKUP_SUFFIX veranderd)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Bestandsnaam-transformaties:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "dit AANTAL leidende componenten uit bestandsnamen verwijderen"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "EXPRESSIE"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+"deze vervangings-EXPRESSIE gebruiken om bestandsnamen met 'sed' te "
+"transformeren"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr "Bestandsnaamselectie-opties (voor zowel in- als uitsluitingspatronen)"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "verschil tussen hoofd- en kleine letters negeren"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "patronen komen overeen met begin van bestandsnaam"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+"patronen komen overeen met alles na een '/' (is standaard bij uitsluiting)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "hoofdlettergevoelige vergelijking (standaard)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "jokertekens gebruiken (is standaard bij uitsluiting)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "exacte tekenreeksvergelijking"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "jokertekens komen niet overeen met '/'"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "jokertekens komen overeen met '/' (is standaard bij uitsluiting)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Informatieve uitvoer:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "de verwerkte bestanden opsommen"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]AANTAL"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "voortgangsberichten tonen voor elk AANTALste record (standaard 10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "een bericht tonen als niet alle links gearchiveerd werden"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "SIGNAAL"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"na verwerking van het archief het totaal aantal bytes printen; als een "
+"argument gegeven is, dan het totaal aantal bytes printen als dit SIGNAAL "
+"ontvangen wordt; mogelijke signalen zijn: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 "
+"en SIGUSR2; de namen zonder het voorvoegsel SIG worden ook geaccepteerd"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "bestandswijzigingstijden in UTC tonen"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "breedsprakige uitvoer naar BESTAND sturen"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "blokgetal binnen archief tonen bij elk bericht"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "bij elke actie om toestemming vragen"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "standaardinstellingen van tar tonen"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"bij opsommen of uitpakken: elke map opsommen die niet aan zoekcriteria "
+"voldoet"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "bestands- of archiefnamen na transformatie tonen"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "STIJL"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+"aanhalingsstijl voor namen instellen (zie verderop voor geldige waarden van "
+"STIJL)"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "ook de tekens in TEKENREEKS aanhalen"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "de tekens in TEKENREEKS niet aanhalen"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Compatibiliteitsopties:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"bij aanmaken hetzelfde als --old-archive; bij uitpakken hetzelfde als --no-"
+"same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Andere opties:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "gebruik van mogelijk gevaarlijke opties of opdrachten uitschakelen"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Slechts één van de opties 'Acdtrux' is mogelijk"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Conflicterende compressie-opties"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Onbekende signaalnaam: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Voorbeeldbestand voor tijdsstempel niet gevonden"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Onbekende datumopmaak %2$s wordt vervangen door %1$s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Optie %s: datum '%s' wordt begrepen als %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: bestandenlijst is al gelezen"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: gelezen bestandsnaam bevat een NUL-teken"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "Geldige argumenten van --quoting-style zijn:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Deze* tar gebruikt de volgende standaardwaarden:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Ongeldige blokindeling"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Waarschuwing: optie -I is niet mogelijk; bedoelt u misschien -j of -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Ongeldige bandlengte"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Meerdere drempeldata"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "Ongeldig versienummer voor luchtige indeling"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' is op dit platform niet mogelijk"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "waarde van --checkpoint is geen geheel getal"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Ongeldige groep"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Ongeldige modus gegeven bij optie"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Ongeldig nummer"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Ongeldige eigenaar"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Ongeldige recordgrootte"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Recordgrootte moet een veelvoud zijn van %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Ongeldig aantal elementen"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "Slechts één optie --to-command is toegestaan"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Ongeldig dichtheidsargument: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Onbekende dichtheid: '%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Opties '-[0-7][lmh]' worden niet ondersteund door *deze* tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[BESTAND]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Oude optie '%c' vereist een argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "'--occurrence' betekent niets zonder een bestandenlijst"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "'--occurrence' kan niet worden gebruikt in de gevraagde werkingsmodus"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Voor meerdere archiefbestanden is de optie '-M' vereist"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Kan '--listed-incremental' niet met '--newer' combineren"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Deellabel is te lang (grens is %lu byte)"
+msgstr[1] "%s: Deellabel is te lang (grens is %lu bytes)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Kan meerdelige archieven niet verifiëren"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Kan ingepakte archieven niet verifiëren"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Kan geen meerdelige ingepakte archieven gebruiken"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Kan ingepakte archieven niet samenvoegen"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "optie '--pax' kan alleen worden gebruikt bij POSIX-archieven"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Een geheel leeg archief wordt niet aangemaakt"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Opties '-Aru' gaan niet samen met '-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "U dient een van de opties '-Acdtrux' op te geven"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Uitgestelde afbreking na eerdere fouten"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Bestand is gekrompen met %s byte"
+msgstr[1] "%s: Bestand is gekrompen met %s bytes"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Sleutelwoord %s is onbekend of nog niet geïmplementeerd"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Patroon %s kan niet worden gebruikt"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Sleutelwoord %s kan niet worden overstegen"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Onjuiste uitgebreide kop: ontbrekende lengte"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "Lengte van uitgebreide kop valt buiten bereik"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Lengte %*s van uitgebreide kop valt buiten bereik"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "Onjuiste uitgebreide kop: ontbrekende witruimte na de lengte"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Onjuiste uitgebreide kop: ontbrekend isgelijkteken"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Onjuiste uitgebreide kop: ontbrekend regeleinde"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "Genegeerd: onbekend sleutelwoord '%s' in uitgebreide kop"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+"Aangemaakt paar van sleutelwoord en waarde is te lang (sleutelwoord=%s, "
+"lengte=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr ""
+"Waarde %2$s in uitgebreide kop valt buiten bereik voor %1$s (%3$s..%4$s)"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Onjuiste uitgebreide kop: ongeldige %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Onjuiste uitgebreide kop: overtollige %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "Onjuiste uitgebreide kop: ongeldige %s: onverwacht scheidingsteken %c"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Onjuiste uitgebreide kop: ongeldige %s: oneven aantal waarden"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile manipuleert gegevensbestanden voor de testreeksen van GNU paxutils.\n"
+"OPTIES zijn:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Bestandsaanmaak-opties:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "GROOTTE"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "een bestand van de gegeven GROOTTE aanmaken"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "naar het bestand NAAM schrijven i.p.v. naar standaarduitvoer"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "bestandsnamen uit BESTAND lezen"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T leest met NUL afgesloten namen"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+"het bestand met het gegeven PATROON vullen; PATROON is 'default' (standaard) "
+"of 'zeros' (nullen)"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "blokgrootte voor luchtig bestand"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+"luchtig bestand genereren; de rest van de opdrachtregel specificeert de "
+"indeling"
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr "POSITIE"
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr "naar deze positie springen alvorens met schrijven te beginnen"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Bestandsstatistieken-opties:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"voor elk gegeven bestand de inhoud van de 'struct stat' printen; de "
+"standaard INDELING is:"
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Synchrone-uitvoer-opties:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"gegeven OPDRACHT uitvoeren; dit is nuttig bij '--checkpoint' samen met één "
+"van '--cut', '--append' of '--touch'"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+"de gegeven actie uitvoeren (zie verderop) bij bereiken van het AANTALste "
+"controlepunt "
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "de datum voor de volgende '--touch'"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "de uitgevoerde controlepunten en de afsluitwaarde van OPDRACHT tonen"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Synchroon uit te voeren acties. Deze worden uitgevoerd bij het bereiken van "
+"het controlepunt opgegeven met de optie '--checkpoint'."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"BESTAND afkappen tot de grootte opgegeven met een voorafgaande optie '--"
+"length' (of 0 als niet gegeven)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+"BESTAND met GROOTTE aantal bytes vergroten; deze GROOTTE is met een "
+"voorafgaande optie '--length' opgegeven"
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "de toegangs- en wijzigingstijdsstempels van BESTAND bijwerken"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "OPDRACHT uitvoeren"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Ongeldige grootte: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Getal valt buiten toegestaan bereik: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Negatieve grootte: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "Kan status van %s niet bepalen"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Fout tijdens getalontleding, nabij '%s'"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Onbekende datumopmaak"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARGUMENTEN]..."
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "Kan '%s' niet openen"
+
+#: tests/genfile.c:426
+#, c-format
+msgid "cannot seek: %s"
+msgstr "kan niet springen: %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "Bestandsnaam bevat een NUL-teken"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"Kan geen luchtige bestanden genereren op standaarduitvoer; gebruik de optie "
+"'--file'"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "Onjuist masker (nabij '%s')"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "Onbekend veld '%s'"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "Kan tijdsstempel van '%s' niet zetten"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Opdracht is succesvol afgesloten\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Opdracht is mislukt met afsluitwaarde %d\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Opdracht afgebroken door signaal %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Opdracht gestopt door signaal %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Opdracht resulteerde in een core-dump\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Opdracht afgebroken\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "'--stat' vereist bestandsnamen"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "Te veel argumenten"
diff --git a/po/no.gmo b/po/no.gmo
new file mode 100644
index 0000000..f4f477c
--- /dev/null
+++ b/po/no.gmo
Binary files differ
diff --git a/po/no.po b/po/no.po
new file mode 100644
index 0000000..0c185f2
--- /dev/null
+++ b/po/no.po
@@ -0,0 +1,3008 @@
+# Norwegian messages for GNU tar. (bokmål dialect)
+# Copyright (C) 1996 Free Software Foundation, Inc.
+# Karl Anders Øygard <Karl.Oygard@fou.telenor.no>, 1996.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU tar 1.12\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 1997-06-05 19:39 MET DST\n"
+"Last-Translator: Espen Skjelnes Johnsen <espejohn@sn.no>\n"
+"Language-Team: Norwegian-bokmål <no@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: lib/argmatch.c:134
+#, fuzzy, c-format
+msgid "invalid argument %s for %s"
+msgstr "Ugyldig datoformat «%s»"
+
+#: lib/argmatch.c:135
+#, fuzzy, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "Tvetydig mønster «%s»"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr ""
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Bruk: %s [FLAGG]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Tast «%s --help» for mer informasjon.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+"Rapporter feil til <tar-bugs@gnu.ai.mit.edu>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Unkjent systemfeil"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, fuzzy, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, fuzzy, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, fuzzy, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr ""
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr ""
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, fuzzy, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: lib/human.c:477
+msgid "block size"
+msgstr ""
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+#, fuzzy
+msgid "memory exhausted"
+msgstr "Minne oppbrukt"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, fuzzy, c-format
+msgid "%s: Cannot %s"
+msgstr "Kan ikke utføre «stat» på filen %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr ""
+
+#: lib/paxerror.c:93
+#, fuzzy, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Kan ikke endre modus til %0.4o"
+
+#: lib/paxerror.c:101
+#, fuzzy, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Kan ikke endre eier til uid %d, gid %d"
+
+#: lib/paxerror.c:127
+#, fuzzy, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Kunne ikke lage link til «%s»"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "Lesefeil ved byte %ld ved lesing av %d bytes fra fil %s"
+msgstr[1] "Lesefeil ved byte %ld ved lesing av %d bytes fra fil %s"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "Lesefeil ved byte %ld ved lesing av %d bytes fra fil %s"
+msgstr[1] "Lesefeil ved byte %ld ved lesing av %d bytes fra fil %s"
+
+#: lib/paxerror.c:259
+#, fuzzy, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "Kan ikke skrive til %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr ""
+
+#: lib/paxerror.c:284
+#, fuzzy, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Kunne ikke lage symbolisk link til «%s»"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Kunne bare skrive %d av %d bytes'"
+msgstr[1] "%s: Kunne bare skrive %d av %d bytes'"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Tar bort ledende «/» fra absolutte linker"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Tar bort ledende «/» fra absolutte linker"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "Tar bort ledende «/» fra absolutte linker"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr ""
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr ""
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Tjenesten er ikke tilgjengelig"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Kan ikke eksekvere \"remote shell\""
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Kan ikke allokere buffer\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Kan ikke allokere plass til buffer"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Tast «%s --help» for mer informasjon.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter feil til <tar-bugs@gnu.ai.mit.edu>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr ""
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr ""
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr ""
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: For tidlig filslutt\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "For tidlig filslutt"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Ugyldig kommando"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Totalt antall bytes skrevet: "
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Totalt antall bytes skrevet: "
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr ""
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Ugyldig verdi for record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Arkivnavn er ikke oppgitt"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Kan ikke verifisere stdin/stdout-arkiv"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Kan ikke oppdatere komprimerte arkiver"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Skriver kontrollpunkt %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Leser kontrollpunkt %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "På begynnelsen av båndet, avslutter nå"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "For mange feil, avslutter"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Blokkstørrelse = %d enheter"
+msgstr[1] "Blokkstørrelse = %d enheter"
+
+#: src/buffer.c:791
+#, fuzzy
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Kunne ikke gå tilbake i arkivfilen. Den kan være uleselig uten -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr ""
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr ""
+
+#: src/buffer.c:929
+#, fuzzy, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "\aGjør klar volum nummer %d for %s og trykk return: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF der svar fra bruker var forventet"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ADVARSEL: Arkivet er ufullstendig"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [navn] Gi et filnavn for neste (og etterfølgende) volum(er)\n"
+" q Avbryt tar\n"
+" ! Start et shell\n"
+" ? Skriv denne listen\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Ikke nytt volum; avslutter.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr ""
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Dette ser ikke ut som et tar-arkiv"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s fortsetter ikke i dette volumet"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s fortsetter ikke i dette volumet"
+
+#: src/buffer.c:1237
+#, fuzzy, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s har feil størrelse (%ld != %ld + %ld)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Dette volumet kommer ute av rekkefølge"
+
+#: src/buffer.c:1293
+#, fuzzy, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arkivet er ikke navngitt for å passe med «%s»"
+
+#: src/buffer.c:1296
+#, fuzzy, c-format
+msgid "Volume %s does not match %s"
+msgstr "Volumet «%s» stemmer ikke overens med «%s»"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Kunne bare lese %d av %ld bytes"
+msgstr[1] "Kunne bare lese %d av %ld bytes"
+
+#: src/compare.c:106 src/compare.c:388
+#, fuzzy
+msgid "Contents differ"
+msgstr "Modus er ulik"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Uventet filslutt i arkivet"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+#, fuzzy
+msgid "File type differs"
+msgstr "Størrelse er ulik"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Modus er ulik"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid er ulik"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid er ulik"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Modifiseringstid er ulik"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Størrelse er ulik"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ikke linket til %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symbolsk link er ulik"
+
+#: src/compare.c:322
+#, fuzzy
+msgid "Device number differs"
+msgstr "Enhetsnummer er endret"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verifisering "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "Ukjent filtype «%c» for %s, diffet som en vanlig fil"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "VERIFIKASJONSFEIL: %d ukjente arkivhoder funnet"
+msgstr[1] "VERIFIKASJONSFEIL: %d ukjente arkivhoder funnet"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s er arkivet; ikke lagret"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr ""
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr ""
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr ""
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: er uendret; ikke lagret"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: er uendret; ikke lagret"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: er uendret; ikke lagret"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "Filen %s krympet med %d bytes, fyller ut med nuller"
+msgstr[1] "Filen %s krympet med %d bytes, fyller ut med nuller"
+
+#: src/create.c:1176
+#, fuzzy, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: På et annet filesystem. Ikke lagret"
+
+#: src/create.c:1217 src/create.c:1228
+#, fuzzy
+msgid "contents not dumped"
+msgstr " (minnet lagret)"
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Ukjent filtype; filen ble ignorert"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " link til %s\n"
+
+#: src/create.c:1529
+#, fuzzy, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: er uendret; ikke lagret"
+
+#: src/create.c:1537
+#, fuzzy, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s er arkivet; ikke lagret"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr ""
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s er arkivet; ikke lagret"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr ""
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr ""
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr ""
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Hopper til neste startseksjon"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Tar bort ikke-hodedata fra arkivet"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr ""
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr ""
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Ekstraherer sammenhengende filer som vanlige filer"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Forsøker å ekstrahere symbolske linker som harde linker"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Leser %s\n"
+
+#: src/extract.c:1146
+#, fuzzy, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "Kan ikke ekstrahere «%s» -- filen fortsetter fra et tidligere volum"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Uventet filslutt i arkivfilen"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "Ukjent filtype «%c» for %s, ekstrahert som en vanlig fil"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Kunne ikke lage sikkerhetskopi av denne filen"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Kan ikke endre navn på %s til %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr ""
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "Filkatalogen %s har endret navn"
+
+#: src/incremen.c:270
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed"
+msgstr "Filkatalogen %s har endret navn"
+
+#: src/incremen.c:311
+#, fuzzy, c-format
+msgid "%s: Directory is new"
+msgstr "Filkatalogen %s er ny"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr ""
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Ugyldig modus gitt i flagg"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr ""
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr ""
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "Lesefeil på %s"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Uventet filslutt i arkivfilen"
+
+#: src/incremen.c:872 src/incremen.c:912
+#, fuzzy
+msgid "Unexpected field value in snapshot file"
+msgstr "Uventet filslutt i arkivfilen"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Kunne ikke allokere minne for blokk-faktor %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: På et annet filesystem. Ikke lagret"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Sletter %s\n"
+
+#: src/incremen.c:1418
+#, fuzzy, c-format
+msgid "%s: Cannot remove"
+msgstr "Kan ikke slette %s"
+
+#: src/list.c:113
+#, fuzzy, c-format
+msgid "%s: Omitting"
+msgstr "Utelater %s"
+
+#: src/list.c:131
+#, fuzzy, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blokk %10ld: ** Blokk med NUL-er **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, fuzzy, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blokk %10ld: ** Slutt på fil **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, fuzzy, c-format
+msgid "block %s: "
+msgstr "blokk %10ld: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr ""
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr ""
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+
+#: src/list.c:794
+#, fuzzy, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Dette volumet kommer ute av rekkefølge"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr ""
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " link til %s\n"
+
+#: src/list.c:1225
+#, fuzzy, c-format
+msgid " unknown file type %s\n"
+msgstr " ukjent filtype «%c»\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Volumhode--\n"
+
+#: src/list.c:1259
+#, fuzzy, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Fortsetter ved byte %ld--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Lager filkatalog:"
+
+#: src/misc.c:456
+#, fuzzy, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Endret navn på %s til %s"
+
+#: src/misc.c:465 src/misc.c:483
+#, fuzzy, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "Kan ikke endre navn på %s til %s"
+
+#: src/misc.c:488
+#, fuzzy, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Endret navn på %s til %s"
+
+#: src/misc.c:615
+#, fuzzy
+msgid "Cannot save working directory"
+msgstr "Kan ikke gå til filkatalogen %s"
+
+#: src/misc.c:621
+#, fuzzy
+msgid "Cannot change working directory"
+msgstr "Kan ikke gå til filkatalogen %s"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr ""
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr ""
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Finnes ikke i arkivet"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Finnes ikke i arkivet"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Flaggene «-%s» and «-%s» vil begge ta standard inn"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "Konflikt i flaggene for arkiv-format"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU-funksjoner forsøkt på inkompatibelt arkiv-format"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+"Suffikset for sikkerhetskopiering er «~», med mindre det er satt med --"
+"suffix\n"
+"eller SIMPLE_BACKUP_SUFFIX. Versjonskontroll kan settes med --backup eller\n"
+"VERSION_CONTROL. Gyldige verdier er:\n"
+"\n"
+" t, numbered lag nummererte sikkerhetskopier\n"
+" nil, existing nummererte, dersom nummererte sikkerhetskopier "
+"eksisterer,\n"
+" ellers enkle\n"
+" never, simple lag enkle sikkerhetskopier\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Uventet filslutt i arkivet"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+#, fuzzy
+msgid "remove files after adding them to the archive"
+msgstr "Tar bort enhetsnavn fra navn i arkivet"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr ""
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Kan ikke verifisere arkiv som går over flere volum"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Arkivér til stdin"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s er arkivet; ikke lagret"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s er arkivet; ikke lagret"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Kan ikke gå til filkatalogen %s"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Tar bort ledende «/» fra absolutte linker"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Volumet «%s» stemmer ikke overens med «%s»"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+#, fuzzy
+msgid "ask for confirmation for every action"
+msgstr "Kan ikke lese bekreftelse fra brukeren"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Du kan ikke angi mer enn ett av «-Acdtrux»-flaggene"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Konflikt i kompresjonsflagg"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " ukjent filtype «%c»\n"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr ""
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr ""
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s er arkivet; ikke lagret"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr ""
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr ""
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Mer enn én grense-dato"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr ""
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Ugyldig modus gitt i flagg"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "Ugyldig eier gitt i flagg"
+
+#: src/tar.c:1671
+#, fuzzy
+msgid "Invalid owner"
+msgstr "Ugyldig eier gitt i flagg"
+
+#: src/tar.c:1705
+#, fuzzy
+msgid "Invalid record size"
+msgstr "Ugyldig verdi for record_size"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Blokkstørrelse må være delbart på %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr ""
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Ukjent mønster «%s»"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Flaggene «-[0-7][lmh]» støttes ikke av *denne* implementasjonen av tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Gammelt flagg «%c» behøver et argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Ved flere arkivfiler behøves «-M»-flagget"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr ""
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Kan ikke verifisere arkiv som går over flere volum"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Kan ikke verifisere komprimerte arkiver"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Kan ikke bruke komprimerte arkiv som går over flere volum"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Kan ikke oppdatere komprimerte arkiver"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "For feig til å lage et tomt arkiv"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Flaggene «-Aru» er inkompatible med «-f -»"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Du må angi ett av «-Acdtrux»-flaggene"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Utsatt feil-avslutning for tidligere feil"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Filen krympet med %d bytes, (øh!)"
+msgstr[1] "%s: Filen krympet med %d bytes, (øh!)"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr ""
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr ""
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Genrerer datafiler for GNU tar testpakke.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Konflikt i kompresjonsflagg"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr ""
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+#, fuzzy
+msgid "Update the access and modification times of FILE"
+msgstr "%s: Kunne ikke endre aksess- og modifiseringstider"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Ugyldig verdi for record_size"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Enhetsnummer er endret"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Unkjent systemfeil"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "Kan ikke åpne %s"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "Kan ikke eksekvere %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr "Ukjent mønster «%s»"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "Kan ikke gjøre «stat» på %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Barnet døde med signal %d%s"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Ødelagte filnavn--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Cannot close"
+#~ msgstr "Kan ikke lukke fil #%d"
+
+#, fuzzy
+#~ msgid "Cannot dup"
+#~ msgstr "Kan ikke lese %s"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Kan ikke bruke komprimerte arkiver eller arkiver på en annen maskin"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (barn)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (barnebarn)"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ADVARSEL: Manglende volumhode"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Barnet avsluttet med status %d"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Feil på et langt navn"
+
+#, fuzzy
+#~ msgid "Time stamp out of range"
+#~ msgstr "Dette volumet kommer ute av rekkefølge"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Feil på et langt navn"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Uventet filslutt i ødelagte navn"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Endret navn på %s til %s"
+
+#, fuzzy
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "Kan ikke lage en symbolisk link fra %s til %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s symbolsk linket til %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Ukjent kommando %s ved rekonstruering av navn"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Mangler filnavn etter -C"
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Ugyldig kommando %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU «tar» lagrer mange filer i ett arkiv, og kan hente ut enkeltstående\n"
+#~ "filer fra arkivet.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Dersom et langt flagg har et obligatorisk argument, er argumentet også\n"
+#~ "obligatorisk for det korte flagget. Tilsvarende gjelder dersom "
+#~ "argumentet\n"
+#~ "kan sløyfes.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Hovedoperasjonsmodi:\n"
+#~ " -t, --list list innholdet av arkivet\n"
+#~ " -x, --extract, --get ekstrahér filer fra arkivet\n"
+#~ " -c, --create lage et nytt arkiv\n"
+#~ " -d, --diff, --compare vise forskjeller mellom arkivet og filsystemet\n"
+#~ " -r, --append legg til filer på slutten av arkivet\n"
+#~ " -u, --update legg til bare filer som er nyere enn de i "
+#~ "arkivet\n"
+#~ " -A, --catenate legg en arkivfil sammen med arkivet\n"
+#~ " --concatenate samme som -A\n"
+#~ " --delete slett fra arkivet (ikke for arkiv på bånd!)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Flagg for operasjonsmodi:\n"
+#~ " -W, --verify forsøk å verifisere arkivet etter å ha laget "
+#~ "det\n"
+#~ " --remove-files slett filer etter å ha lagt dem til arkivet\n"
+#~ " -k, --keep-old-files ikke overskriv eksisterende filer\n"
+#~ " -U, --unlink-first slett alle filer før ekstrahering til dem\n"
+#~ " --recursive-unlink tøm filkataloger før ekstrahering\n"
+#~ " -S, --sparse håndtér filer med hull mer effektivt\n"
+#~ " -O, --to-stdout ekstrahér filer til stdout\n"
+#~ " -G, --incremental bruk det gamle GNU formatet for "
+#~ "inkrementell\n"
+#~ " sikkerhetskopiering\n"
+#~ " -g, --listed-incremental bruk det nye GNU-formatet for inkrementell\n"
+#~ " sikkerhetskopiering\n"
+#~ " --ignore-failed-read ignorér feil under lesing av filer\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Håndtering av filattributter:\n"
+#~ " --owner=NAVN bruk NAVN som eier for nye filer\n"
+#~ " --gruppe=NAVN bruk NAVN som gruppe for nye filer\n"
+#~ " --mode=OKTAL bruk OKTAL som modus for nye filer\n"
+#~ " --atime-preserve ikke endre aksesstider på lagrede filer\n"
+#~ " -m, --modification-time ikke ekstrahér modifiseringstiden\n"
+#~ " --same-owner forsøk å ekstrahere filer med samme eier\n"
+#~ " --numeric-owner bruk nummer for bruker/gruppe-navn\n"
+#~ " -p, --same-permissions forsøk å ekstrahere filer med samme\n"
+#~ " filbeskyttelse\n"
+#~ " --preserve-permissions samme som -p\n"
+#~ " -s, --same-order sorter navn som skal ekstraheres slik at\n"
+#~ " de passer med arkivet\n"
+#~ " --preserve-order samme som -s\n"
+#~ " --preserve samme som både -p og -s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Enhetsvalg og enhetsskifte:\n"
+#~ " -f, --file=ARKIV bruk arkivfil eller enhet ARKIV\n"
+#~ " --force-local arkivfil er lokal selv om den har et "
+#~ "kolon\n"
+#~ " --rsh-command=KOMMANDO bruk KOMMANDO i stedet for rsh\n"
+#~ " -[0-7][lmh] angi enhet og tetthet\n"
+#~ " -M, --multi-volume behandle arkivet som et flervolumsarkiv\n"
+#~ " -L, --tape-length=NUMMER bytt bånd etter at NUMMER x 1024 bytes "
+#~ "er\n"
+#~ " skrevet\n"
+#~ " -F, --info-script=FIL kjør kommandofil FIL ved slutten av "
+#~ "hvert\n"
+#~ " bånd (setter -M automatisk)\n"
+#~ " --new-volume-script=FIL samme som -F FIL\n"
+#~ " --volno-file=FIL bruk/oppdater volumnummeret i FIL\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Blokkhåndtering:\n"
+#~ " -b, --blocking-factor=ENHETER sett blokkstørrelse ENHETER x 512 bytes\n"
+#~ " --record-size=STØRRELSE STØRRELSE bytes per enhet (delbart på "
+#~ "512)\n"
+#~ " -i, --ignore-zeros ignorér blokker som inneholder nuller\n"
+#~ " (betyr filslutt)\n"
+#~ " -B, --read-full-records blokk om ved lesing (for 4.2BSD pipes)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Valg av arkivformat:\n"
+#~ " -V, --label=NAVN lag et arkiv med volumnavn NAVN\n"
+#~ " MØNSTER filer som skal tas med ved listing "
+#~ "eller\n"
+#~ " ekstrahering (tillatt med "
+#~ "jokertegn)\n"
+#~ " -o, --old-archive, --portability lag et arkiv i V7 format\n"
+#~ " --posix lag et POSIX-konformt arkiv\n"
+#~ " -z, --gzip, --ungzip send arkivet gjennom gzip\n"
+#~ " -Z, --compress, --uncompress send arkivet gjennom compress\n"
+#~ " --use-compress-program=PROG send arkivet gjennom PROG (må forstå "
+#~ "-d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a globbing "
+#~ "PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude globbing patterns listed in FILE\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Valg av lokale filer:\n"
+#~ " -C, --directory=KATALOG endre filkatalog til KATALOG\n"
+#~ " -T, --files-from=FIL hent navn for ekstrahering eller "
+#~ "arkivering\n"
+#~ "\t\t\t fra filen FIL\n"
+#~ " --null -T leser null-terminerte navn, tillater "
+#~ "ikke -C\n"
+#~ " --exclude=MØNSTER ta ikke med filer (tillatt med jokertegn)\n"
+#~ " -X, --exclude-from=FIL ta ikke med filer navngitte i filen FIL\n"
+#~ " (tillatt med jokertegn)\n"
+#~ " -P, --absolute-names ta ikke bort ledende «/» fra filnavn\n"
+#~ " -h, --dereference arkivér det symboliske linker peker på\n"
+#~ " --no-recurse ta ikke med filer i underkataloger\n"
+#~ " -l, --one-file-system ta ikke med filer fra andre filsystemer\n"
+#~ " -K, --starting-file=NAVN begynn med filen NAVN i arkivet\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATO arkivér bare filer som er nyere enn DATO\n"
+#~ " --newer-mtime sammenlign tidsstempel bare når data er "
+#~ "endret\n"
+#~ " --after-date=DATO samme som -N\n"
+
+#, fuzzy
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=KONTROLL] lag sikkerhetskopi før sletting, med\n"
+#~ " versjonskontroll\n"
+#~ " --suffix=SUFFIKS lag sikkerhetskopi før sletting, med\n"
+#~ " overstyring av det vanlige suffikset\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Utskrift av informasjon:\n"
+#~ " --help vis denne hjelpeteksten og avslutt\n"
+#~ " --version vis programversjon og avslutt\n"
+#~ " -v, --verbose vis hver fil som behandles\n"
+#~ " --checkpoint vis filkatalognavn når arkivet leses\n"
+#~ " --totals vis totalt antall bytes skrevet\n"
+#~ " -R, --block-number vis enhetsnummer i arkivet sammen med alle "
+#~ "meldinger\n"
+#~ " -w, --interactive spør etter bekreftelse for hver operasjon\n"
+#~ " --confirmation samme som -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; and FILE may be a file\n"
+#~ "or a device. *This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar kan hverken lese eller skrive «--posix»-arkiver. Dersom\n"
+#~ "miljøvariabelen POSIXLY_CORRECT er satt, er GNU-funksjoner ikke tillatt\n"
+#~ "sammen med «--posix». Støtte for POSIX er bare delvis implementert, så\n"
+#~ "stol ikke på den ennå.\n"
+#~ "ARKIV kan være FIL, MASKIN:FIL eller BRUKER@MASKIN:FIL; og FIL kan være "
+#~ "en\n"
+#~ "fil eller en enhet. *Denne* versjonen av tar har «-f%s -b%d» som "
+#~ "forvalg.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Utdatert flagg, nå implisert av --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Utdatert flagg skiftet ut med --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Utdatert flagg skiftet ut med --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Utdatert flagg skiftet ut med --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Utdatert flagg skiftet ut med --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Utdatert flagg skiftet ut med --block-number"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Utdatert flagg skiftet ut med --backup"
+
+#, fuzzy
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr ""
+#~ "\n"
+#~ "Skrevet av John Gilmore and Jay Fenlason.\n"
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Obligatoriske argumenter for lange flagg er obligatoriske også for korte "
+#~ "flagg.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGDE lengde av generert fil\n"
+#~ " -p, --pattern=MØNSTER gyldige mønster er «default» eller «zeros»\n"
+#~ " --help vis denne hjelpeteksten og avslutt\n"
+#~ " --version vis programversjon og avslutt\n"
+
+#~ msgid "Ambiguous pattern `%s'"
+#~ msgstr "Tvetydig mønster «%s»"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.\n"
+
+#~ msgid ""
+#~ "This is free software; see the source for copying conditions. There is "
+#~ "NO\n"
+#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR "
+#~ "PURPOSE.\n"
+#~ msgstr ""
+#~ "Dette er fri programvare. Se kildekoden for kopieringsbetingelser.\n"
+#~ "Programvaren har ingen garanti, ikke en gang for SALGBARHET eller "
+#~ "EGNETHET\n"
+#~ "TIL NOEN SPESIELL OPPGAVE.\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Written by Fran,cois Pinard <pinard@iro.umontreal.ca>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Skrevet av François Pinard <pinard@iro.umontreal.ca>\n"
+
+#~ msgid "Cannot close descriptor %d"
+#~ msgstr "Kan ikke lukke fildeskriptor %d"
+
+#~ msgid "Cannot properly duplicate %s"
+#~ msgstr "Kan ikke duplisere %s"
+
+#~ msgid "Cannot open pipe"
+#~ msgstr "Kan ikke lage en pipe"
+
+#~ msgid "Cannot fork"
+#~ msgstr "Kan ikke lage ny prosess med «fork»"
+
+#~ msgid "(child) Pipe to stdin"
+#~ msgstr "(barn) Pipe til stdin"
+
+#~ msgid "Cannot open archive %s"
+#~ msgstr "Kan ikke åpne arkivet %s"
+
+#~ msgid "Archive to stdout"
+#~ msgstr "Arkivér til stdout"
+
+#~ msgid "Child cannot fork"
+#~ msgstr "Barnet kan ikke gjøre «fork»"
+
+#~ msgid "((child)) Pipe to stdout"
+#~ msgstr "((barn)) Pipe til stdout"
+
+#~ msgid "(grandchild) Pipe to stdin"
+#~ msgstr "(barnebarn) Pipe til stdin"
+
+#~ msgid "Cannot read from compression program"
+#~ msgstr "Kan ikke lese fra komprimeringsprogrammet"
+
+#~ msgid "(child) Pipe to stdout"
+#~ msgstr "(barn) Pipe til stdout"
+
+#~ msgid "((child)) Pipe to stdin"
+#~ msgstr "((barn)) Pipe til stdin"
+
+#~ msgid "(grandchild) Pipe to stdout"
+#~ msgstr "(barnebarn) Pipe til stdout"
+
+#~ msgid "Cannot write to compression program"
+#~ msgstr "Kan ikke skrive til komprimeringsprogrammet"
+
+#~ msgid "Write to compression program short %d bytes"
+#~ msgstr "Skrev %d bytes for lite til komprimeringsprogrammet"
+
+#~ msgid "Only wrote %u of %u bytes to %s"
+#~ msgstr "Skrev bare %u av %u bytes til %s"
+
+#~ msgid "Archive %s EOF not on block boundary"
+#~ msgstr "Arkiv %s sluttet ikke ved en blokkgrense"
+
+#~ msgid "Only read %d bytes from archive %s"
+#~ msgstr "Leste bare %d bytes fra arkivet %s"
+
+#~ msgid "WARNING: Cannot close %s (%d, %d)"
+#~ msgstr "ADVARSEL: Kan ikke lukke %s (%d, %d)"
+
+#~ msgid "Cannot fork!"
+#~ msgstr "Kan ikke lage ny prosess med «fork»!"
+
+#~ msgid "Cannot exec a shell %s"
+#~ msgstr "Kan ikke eksekvere et shell %s"
+
+#~ msgid "Removing leading `/' from absolute path names in the archive"
+#~ msgstr "Tar bort ledende «/» fra absolutte filnavn i arkivet"
+
+#~ msgid "Wrote %ld of %ld bytes to file %s"
+#~ msgstr "Skrev %ld av %ld bytes til fil %s"
+
+#~ msgid "Amount actually written is (I hope) %d.\n"
+#~ msgstr "Faktisk skrevet mengde er %d (håper jeg).\n"
+
+#~ msgid "Cannot add file %s"
+#~ msgstr "Kan ikke legge til fil %s"
+
+#~ msgid "Cannot add directory %s"
+#~ msgstr "Kan ikke legge til filkatalogen %s"
+
+#~ msgid "Cannot open directory %s"
+#~ msgstr "Kan ikke åpne filkatalogen %s"
+
+#~ msgid "File name %s%s too long"
+#~ msgstr "Filnavnet %s%s er for langt"
+
+#~ msgid "Could not allocate memory for diff buffer of %d bytes"
+#~ msgstr "Kunne ikke allokere minne for diff-buffer på %d bytes"
+
+#~ msgid "Data differs"
+#~ msgstr "Data er ulike"
+
+#~ msgid "File does not exist"
+#~ msgstr "Filen eksisterer ikke"
+
+#~ msgid "Not a regular file"
+#~ msgstr "Ikke en vanlig fil"
+
+#~ msgid "Error while closing %s"
+#~ msgstr "Feil ved lukking av %s"
+
+#~ msgid "Does not exist"
+#~ msgstr "Eksisterer ikke"
+
+#~ msgid "No such file or directory"
+#~ msgstr "Fil eller filkatalog finnes ikke"
+
+#~ msgid "Cannot read link %s"
+#~ msgstr "Kan ikke lese link %s"
+
+#~ msgid "Mode or device-type changed"
+#~ msgstr "Modus eller enhetstype er endret"
+
+#~ msgid "No longer a directory"
+#~ msgstr "Ikke lenger en filkatalog"
+
+#~ msgid "Cannot open file %s"
+#~ msgstr "Kan ikke åpne filen %s"
+
+#~ msgid "Cannot seek to %ld in file %s"
+#~ msgstr "Kan ikke søke til posisjon %ld i filen %s"
+
+#~ msgid "Could not rewind archive file for verify"
+#~ msgstr "Kunne ikke gå til begynnelsen av arkivfilen for verifisering"
+
+#~ msgid "Could not re-position archive file"
+#~ msgstr "Kunne ikke endre posisjon i arkivfilen"
+
+#~ msgid "%s: Cannot lchown to uid %d gid %d"
+#~ msgstr "%s: Kan ikke endre eier til uid %d gid %d med lchown()"
+
+#~ msgid "%s: Cannot chown to uid %d gid %d"
+#~ msgstr "%s: Kan ikke endre eier til uid %d gid %d med chown()"
+
+#~ msgid "%s: Could not write to file"
+#~ msgstr "%s: Kunne ikke skrive til filen"
+
+#~ msgid "%s: Could not create file"
+#~ msgstr "%s: Kunne ikke lage fil"
+
+#~ msgid "%d at %d\n"
+#~ msgstr "%d ved %d\n"
+
+#~ msgid "%s: Error while closing"
+#~ msgstr "%s: Feil under lukking"
+
+#~ msgid "%s: Could not make node"
+#~ msgstr "%s: Kunne ikke lage node"
+
+#~ msgid "%s: Could not make fifo"
+#~ msgstr "%s: Kunne ikke lage fifo"
+
+#~ msgid "%s: Could not create directory"
+#~ msgstr "%s: Kunne ikke lage filkatalog"
+
+#~ msgid "Added write and execute permission to directory %s"
+#~ msgstr "Satte skrive- og eksekveringsrettigheter for filkatalog %s"
+
+#~ msgid "Could not get current directory"
+#~ msgstr "Kunne ikke finne navnet på aktiv filkatalog"
+
+#~ msgid "Could not get current directory: %s"
+#~ msgstr "Kunne ikke finne navnet på aktiv filkatalog: %s"
+
+#~ msgid "File name %s/%s too long"
+#~ msgstr "Filnavnet %s/%s er for langt"
+
+#~ msgid "Cannot chdir to %s"
+#~ msgstr "Kan ikke gå til filkatalogen %s"
+
+#~ msgid "Error while deleting %s"
+#~ msgstr "Feil ved sletting av %s"
+
+#~ msgid "Hmm, this doesn't look like a tar archive"
+#~ msgstr "Hmm, dette ser ikke ut som et tar-arkiv"
+
+#~ msgid "Skipping to next file header"
+#~ msgstr "Hopper til neste filhode"
+
+#~ msgid "EOF in archive file"
+#~ msgstr "Filslutt i arkivfilen"
+
+#~ msgid "Only wrote %ld of %ld bytes to file %s"
+#~ msgstr "Skrev bare %ld av %ld bytes til filen %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [OPTION]... [FILE]...\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Bruk: %s [FLAGG]... [FIL]...\n"
+
+#~ msgid "Invalid group given on option"
+#~ msgstr "Ugyldig gruppe gitt i flagg"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, "
+#~ "Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, "
+#~ "Inc.\n"
+
+#~ msgid "Read error at byte %ld reading %d bytes in file %s"
+#~ msgstr "Lesefeil ved byte %ld under lesing av %d bytes i fil %s"
diff --git a/po/pl.gmo b/po/pl.gmo
new file mode 100644
index 0000000..9af7668
--- /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..ee8870f
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,2582 @@
+# Polish translation of GNU tar
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2004, 2006 Free Software Foundation, Inc.
+# Rafa³ Maszkowski <rzm@icm.edu.pl>, 1996-1997, 2000-2001, 2003-200, 2006.
+# Thanks to Jakub Bogusz for remarks and corrections, 2003, 2004
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.16.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-12-09 19:00+0100\n"
+"Last-Translator: Rafa³ Maszkowski <rzm@icm.edu.pl>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8-bit\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/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "b³êdny argument %s opcji %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "niejednoznaczny argument %s opcji %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Prawid³owe argumenty to:"
+
+#: lib/argp-help.c:148
+#, 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"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: Parametr ARGP_HELP_FMT wymaga podania warto¶ci"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: Parametr ARGP_HELP_FMT musi byæ dodatni"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Nieznany parametr ARGP_HELP_FMT"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "¦mieci w ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+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 opcji d³ugich s± równie¿ "
+"obowi±zkowe lub opcjonalne równie¿ dla odpowiadaj±cych im opcji krótkich."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Sk³adnia:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " albo: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr "[OPCJE...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "U¿yj `%s --help' albo `%s --usage' ¿eby otrzymaæ wiêcej informacji\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Raporty o b³êdach nale¿y wysy³aæ do %s .\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Nieznany b³±d systemu"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "wy¶wietlenie tego opisu"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "krótka informacja o opcjach"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NAZWA"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "ustawienie nazwy programu"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SEK"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "poczekaj SEK sekund (domy¶lnie 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "informacja o wersji programu"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(B£¡D PROGRAMU) Nieznana wersja!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Za du¿o argumentów\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(B£¡D PROGRAMU) Opcja powinna by³a byæ rozpoznana!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: opcja ~%s' jest niejednoznaczna\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: opcja `--%s' nie mo¿e mieæ argumentu\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: opcja `%c%s' nie mo¿e mieæ argumentu\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: opcja `%s' wymaga argumentu\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: nierozpoznana opcja `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: nierozpoznana opcja `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: nielegalna opcja -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: b³êdna opcja -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opcja wymaga argumentu -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: opcja `-W %s' jest niejednoznaczna\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: opcja `-W %s' nie mo¿e mieæ argumentu\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "rozmiar bloku"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "brak pamiêci"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Nie mo¿na %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Uwaga: Nie mo¿na %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Nie mo¿na zmieniæ uprawnieñ na %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Nie mo¿na zmieniæ w³a¶ciciela na uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Nie mo¿na utworzyæ ³±cza do %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: B³±d czytania, bajt %s, przy czytaniu %lu bajtu"
+msgstr[1] "%s: B³±d czytania, bajt %s, przy czytaniu %lu bajtów"
+msgstr[2] "%s: B³±d czytania, bajt %s, przy czytaniu %lu bajtów"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Uwaga: B³±d czytania, bajt %s, przy czytaniu %lu bajtu"
+msgstr[1] "%s: Uwaga: B³±d czytania, bajt %s, przy czytaniu %lu bajtów"
+msgstr[2] "%s: Uwaga: B³±d czytania, bajt %s, przy czytaniu %lu bajtów"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Nie mo¿na ustawiæ pozycji %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Uwaga: Nie mo¿na ustawiæ wska¼nika na %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Nie mo¿na by³o utworzyæ ³±cza symbolicznego do %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Mo¿na by³o zapisaæ tylko %lu z %lu bajtu"
+msgstr[1] "%s: Mo¿na by³o zapisaæ tylko %lu z %lu bajtów"
+msgstr[2] "%s: Mo¿na by³o zapisaæ tylko %lu z %lu bajtów"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Usuniêcie pocz±tkowego `%s' z nazw plików"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr ""
+"Usuniêcie pocz±tkowego `%s' z nazw plików wskazywanych przez ³±cza zwyk³e"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Podstawienie `.' zamiast pustej nazwy"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Podstawienie `.' zamiast pustej nazwy wskazywanej przez ³±cze zwyk³e"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[yYtT]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Us³uga niedostêpna"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Nie mo¿na uruchomiæ zdalnego shella"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Za d³ugi napis na wej¶ciu"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "B³±d syntaktyczny w liczbie"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Nie mo¿na przydzieliæ miejsca na bufor\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Nie mo¿na przydzieliæ miejsca na bufor"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Spróbuj `%s --help' ¿eby otrzymaæ wiêcej informacji\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Sk³adnia: %s [OPCJA]\n"
+"Manipulacja napêdem ta¶mowym, przyjmowanie komend od zdalnych procesów.\n"
+"\n"
+" --version Wypisanie informacji o wersji.\n"
+" --help Pokazanie informacji o opcjach.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Raporty o b³êdach nale¿y wysy³aæ do %s .\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "B³±d pozycji w pliku"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Pozycja w pliku poza zakresem"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Sposób ustawiania pozycji w pliku spoza zakresu"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Przedwczesny EOF\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Przedwczesny koniec pliku"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Bezsensowna komenda"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Licza zapisanych bajtów"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Liczba przeczytanych bajtów"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Liczba skasowanych bajtów: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(pipe)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "B³êdna warto¶æ record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Nie podana nazwa archiwum"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Nie mo¿na zweryfikowaæ archiwum z/do stdin/stdout"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Archiwum jest skompresowane. Nale¿y u¿yæ opcji %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Nie mo¿na uaktualniæ archiwum skompresowanego"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Punkt kontrolny zapisu %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Punkt kontrolny czytania %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Na pocz±tku ta¶my, teraz koñczê"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Za du¿o b³êdów, koñczê"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Nierówny blok (%lu bajt) w archiwum"
+msgstr[1] "Nierówny blok (%lu bajty) w archiwum"
+msgstr[2] "Nierówny blok (%lu bajtów) w archiwum"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Rozmiar rekordu = %lu blok"
+msgstr[1] "Rozmiar rekordu = %lu bloki"
+msgstr[2] "Rozmiar rekordu = %lu bloków"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Nie mo¿na siê cofn±æ w pliku archiwum; mo¿e nie byæ czytelny bez -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek nie zatrzyma³ siê na granicy rekordów"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: zawiera b³êdny numer czê¶ci"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Przepe³nienie numeru czê¶ci"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Przygotuj czê¶æ numer %d dla %s i naci¶nij return: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF kiedy by³a oczekiwana odpowied¼ u¿ytkownika"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "UWAGA: Archiwum jest niekompletne"
+
+# rare case when `for parts' translates into `czê¶ci' for both sing. and plural in Polish - rzm
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n nazwa Podanie nowej nazwê dla nastêpnej (i kolejnych) czê¶ci\n"
+" q Zakoñczenie programu tar\n"
+" y albo Enter Kontynuacja\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Uruchomienie pow³oki\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Wypisanie tej listy\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Brak nowej czê¶ci; zakoñczenie pracy.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Brak nazwy pliku. Spróbuj jeszcze raz.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+"B³êdne dane wej¶ciowe. Wci¶nij ? ¿eby przeczytaæ informacje pomocnicze\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "%s polecenie zwróci³o b³±d"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "To nie wygl±da jak archiwum tar"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"%s prawdopodobnie jest kontynuowany w tej czê¶ci: nag³ówek zawiera skrócon± "
+"nazwê"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s nie jest kontynuowany w tej czê¶ci"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s to z³y rozmiar (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Ta czê¶æ nie jest kolejn±"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Etykieta archiwum nie pasuje do %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Czê¶æ %s nie pasuje do %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: nazwa pliku jest za d³uga do zapisania w nag³ówku wieloczê¶ciowego "
+"archiwum GNU, zostanie skrócona"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Mo¿na by³o przeczytaæ tylko %lu z %lu bajtu"
+msgstr[1] "Mo¿na by³o przeczytaæ tylko %lu z %lu bajtów"
+msgstr[2] "Mo¿na by³o przeczytaæ tylko %lu z %lu bajtów"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Zawarto¶ci siê ró¿ni±"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Nieoczekiwany EOF w archiwum"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Ró¿ne typy plików"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Uprawnienia siê ró¿ni±"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid siê ró¿ni"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid siê ró¿ni"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Czas modyfikacji siê ró¿ni"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Rozmiar siê ró¿ni"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Nie do³±czony do %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "£±cze symboliczne siê ró¿ni"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Ró¿ni± siê numery urz±dzeñ"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Sprawdzanie "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Nieznany typ pliku `%c' porównywany jako zwyk³y plik"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Archiwum zawiera nazwy plików bez pocz±tkowych elementów ¶cie¿ek."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Podczas weryfikacji mog± nie byæ znalezione pliki lokalne"
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "B£¡D WERYFIKACJI: wykryto %d b³êdny nag³ówek"
+msgstr[1] "B£¡D WERYFIKACJI: wykryto %d b³êdne nag³ówki"
+msgstr[2] "B£¡D WERYFIKACJI: wykryto %d b³êdnych nag³ówków"
+
+# what's dump here? - rzm
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: zawiera znacznik katalogu pamiêci podrêcznej %s; nie zapisujê"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "warto¶æ %s z %s poza zakresem %s..%s; podstawione %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "warto¶æ %s z %s poza zakresem %s..%s"
+
+# hm? - rzm
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Tworzenie ujemnych nag³ówków ósemkowych"
+
+# what's dump here? - rzm
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: nazwa pliku jest za d³uga (do %d); nie zapisujê"
+
+# what's dump here? - rzm
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: nazwa pliku jest za d³uga (nie mo¿e byæ podzielona); nie zapisujê"
+
+# what's dump here? - rzm
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: nazwa ³±cza jest za d³uga; nie zapisujê"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Plik skurczy³ siê o %s bajt; jest dope³niany zerami"
+msgstr[1] "%s: Plik skurczy³ siê o %s bajty; jest dope³niany zerami"
+msgstr[2] "%s: Plik skurczy³ siê o %s bajtów; jest dope³niany zerami"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: plik w innym systemie plików; bez zapisu"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Nieznany typ pliku; plik zignorowany"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "Brakuj±ce ³±cza do %s.\n"
+
+# what's dump here? - rzm
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: plik jest niezmieniony; nie zapisujê"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: plik jest w tym archiwum; nie zapisujê"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Plik usuniêty zanim zosta³ przeczytany"
+
+# what's dump here? - rzm
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: zawiera znacznik katalogu pamiêci podrêcznej; nie zapisujê"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: plik zmieni³ siê w trakcie czytania"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: zignorowane gniazdo z nazw±"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: zignorowany plik door"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Przeskoczenie do nastêpnego nag³ówka"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Kasowanie z archiwum nie-nag³ówka"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: niemo¿liwie stara data %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: znacznik czasowy %s jest przesuniêty o %s s w przysz³o¶æ"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Nieoczekiwana niespójno¶æ przy zak³adaniu katalogu"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Katalog zmieni³ nazwê zanim mo¿na by³o odtworzyæ jego status"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Odtwarzanie plików ci±g³ych (nie sparse) jako zwyk³ych"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Próba odtworzenia ³±cza symbolicznego jako zwyk³ego"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Czytam %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Nie mo¿na odtworzyæ -- plik jest kontynuowany z innej czê¶ci"
+
+# ? - rzm
+# jw -pk
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Niespodziewany nag³ówek z d³ug± nazw±"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Nieznany typ pliku `%c', odtworzony jako plik zwyk³y"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Aktualny %s jest nowszy albo w tym samym wieku"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Nie mo¿na by³o zrobiæ kopii zapasowej tego pliku"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Nie mo¿na przemianowaæ %s na %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "B³±d nie do naprawienia: koniec"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Nazwa katalogu zosta³a zmieniona z %s"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Nazwa katalogu zosta³a zmieniona"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Katalog jest nowy"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "B³êdny czas pliku"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "B³êdny czas modyfikacji (sekundy)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "B³êdny czas modyfikacji (nanosekundy)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "B³êdny numer urz±dzenia"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "B³êdny numer inodu"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Nieoczekiwany EOF w archiwum"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Brakuj±ce zakoñczenie rekordu"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "B³êdna specyfikacja gêsto¶ci: '%s'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "B³êdna specyfikacja gêsto¶ci: '%s'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr ""
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Bez skasowania katalogu: nie mo¿na odczytaæ stanu"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: katalog na innym urz±dzeniu: bez skasowania"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Usuniêcie %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Nie mo¿na usun±æ"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Pominiêty"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** Blok zer **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Samotny blok zerowy przy %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok: %s: ** Koniec pliku **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Odstêpy w nag³ówku zamiast spodziewanej warto¶ci numerycznej %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Warto¶æ ósemkowa %.*s w archiwum jest spoza zakresu %s; bêdzie traktowana "
+"jak uzupe³nienie dwójkowe"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Warto¶æ ósemkowa %.*s w archiwum jest spoza zakresu %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Archiwum zawiera przestarza³e nag³ówki base64"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "W archiwum jest ³añcuch base64 %s spoza zakresu %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Warto¶æ base256 w archiwum jest spoza zakresu %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Archiwum zawiera %.*s tam gdzie oczekiwana by³a liczba %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Warto¶æ %s w archiwum jest spoza zakresu %s %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " ³±cze do %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " nieznany typ pliku %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--D³ugie ³±cze--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--D³uga nazwa--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Nag³ówek czê¶ci--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Kontynuacja od bajtu %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Tworzony jest katalog:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Nazwa %s zmieniona na %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Nie mo¿na przemianowaæ na %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Nazwa zmieniona z %s z powrotem na %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Nie mo¿na zapisaæ bie¿±cego katalogu"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Nie mo¿na zmieniæ katalogu"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "proces potomny"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "kana³ miêdzy procesami"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Porównywanie wzorców z nazwami plików. Proszê"
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+"u¿yæ --wildcards aby w³±czyæ porównywanie wzorców albo --no-wildcards ¿eby"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "wy³±czyæ to ostrze¿enie"
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Nie znalaz³em w archiwum"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Brak podanego wyst±pienia pliku w archiwum"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Opcje `-%s' i `-%s' obie chc± dostêpu do standardowego wej¶cia"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: B³êdny format archiwum"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Próba u¿ycia rozszerzeñ GNU z niekompatybilnym formatem archiwum"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"`tar' GNU zapisuje wiele plików razem na na jednej ta¶mie lub archiwum "
+"dyskowym i mo¿e odzyskaæ poszczególne pliki z archiwum.\n"
+"\n"
+"Przyk³ady:\n"
+" tar -cf archive.tar foo bar # utworzenie archive.tar z plików foo i bar.\n"
+" tar -tvf archive.tar # wypisanie szczegó³owe plików w archive."
+"tar.\n"
+" tar -xf archive.tar # rozpakowanie plików z archive.tar.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Przyrostek kopii zapasowej to `~', je¿eli nie zosta³ zmieniony przez --"
+"suffix\n"
+"lub SIMPLE_BACKUP_SUFFIX. Sposób zarz±dzania wersjami mo¿e byæ zmieniony "
+"przez\n"
+"--backup lub VERSION_CONTROL, mo¿liwe warto¶ci:\n"
+"\n"
+" none, off bez kopii zapasowych\n"
+" t, numbered zrobienie numerowanych kopii zapasowych\n"
+" nil, existing numerowane je¿eli takie ju¿ s±, w przeciwnym wypadku "
+"proste\n"
+" never, simple proste kopie zapasowe\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Podstawowe tryby dzia³ania:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "wypisanie zawarto¶ci archiwum"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "rozpakowanie plików z archiwum"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "utworzenie nowego archiwum"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "sprawdzenie ró¿nic miêdzy archiwum i plikami na dysku"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "do³±czenie plików na koñcu archiwum"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "do³±czenie tylko plików nowszych ni¿ kopie w archiwum"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "do³±czenie plików tar do archiwum"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "skasowanie plików z archiwum (nie na ta¶mie!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Modyfikatory dzia³ania:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "efektywne przetwarzanie plików rzadkich"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "backup przyrostowy w starym formacie GNU"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "PLIK"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "backup przyrostowy w nowym formacie GNU"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "bez zakoñczenia b³êdem je¿eli niedostêpne pliki"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "LICZBA"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"przetwarzanie tylko co LICZBA wyst±pienie ka¿dego pliku w archiwum. Opcja "
+"dzia³a tylko razem z --delete, --diff, --extract albo --list oraz gdy lista "
+"plików jest podana w linii poleceñ albo przez opcjê -T. LICZBA domy¶lnie "
+"wynosi 1."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "archiwum o swobodnym dostêpie"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "próba weryfikacji archiwum po zapisaniu"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "usuniêcie plików po dodaniu do archiwum"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "bez zamazania istniej±cych plików rozpakowanymi"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"bez zastêpowania istniej±cych plików, które s± nowsze ni¿ ich kopie w "
+"archiwum"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "nadpisywanie istniej±cych plików"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "usuniêcie ka¿dego pliku przed zamazaniem go rozpakowanym plikiem"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "opró¿nianie starych katalogów przed rozpakowaniem kopii z archiwum"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "zachowanie metadanych istniej±cych katalogów"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"nadpisywanie metadanych istniej±cych katalogów przy rozpakowywaniu "
+"(domyslnie)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "rozpakowanie plików na standardowe wyj¶cie"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "POLECENIE"
+
+#: src/tar.c:445
+#, fuzzy
+msgid "pipe extracted files to another program"
+msgstr "rozpakowanie plików na standardowe wyj¶cie"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Przetwarzanie atrybutów plików:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "nadanie w³a¶ciciela NAZWA dodanym plikom"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "nadanie grupy NAZWA dodanym plikom"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATA_ALBO_PLIK"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "ustawianie czasu modyfikacji dodanych plików z DATA_ALBO_PLIK"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "ZMIANY"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "ZMIANA uprawnieñ dodanych plików (podanych symbolicznie)"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "bez odtworzenia czasu modyfikacji rozpakowanego pliku"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "staranie siê o odtworzenie w³a¶cicieli plików"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "rozpakowanie plików jako w³asno¶ci rozpakowuj±cego"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "u¿ywanie numerów, nie nazw u¿ytkowników/grup"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "pliki do rozpakowania posortowane jak w archiwum"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "to samo co równocze¶nie -p i -s"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Wybór i prze³±czanie urz±dzeñ:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARCHIWUM"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "u¿ycie pliku lub urz±dzenia ARCHIWUM"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "plik archiwum lokalny, nawet je¿eli ma dwukropek"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "u¿yj POLECENIA zamiast /etc/rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "u¿yj POLECENIA zamiast rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "podanie napêdu i gêsto¶ci"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "tworzenie/wypisanie/rozpakowanie archiwum wieloczê¶ciowego"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "zmiana ta¶my po zapisaniu LICZBA x 1024 bajtów"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "uruchomienie skryptu na koñcu ta¶my (w³±cza -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "u¿ycie/uaktualnienie numeru czê¶ci w PLIKU"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Parametry bloków:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOKI"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLOKI x 512 bajtów na rekord"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "LICZBA bajtów w rekordzie, wielokrotno¶æ 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "ignorowanie wyzerowanych bloków w archiwum (oznacza EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "podzielenie na bloki przy odczycie (dla pipe 4.2BSD)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Wybór formatu archiwum:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMAT"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "utworzenie archiwum w danym formacie."
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "FORMAT mo¿e byæ jednym z nastêpuj±cych:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "stary format tara z V7"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "format GNU dla tara <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "format tara GNU 1.13"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "format POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "format POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "to samo co pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "to samo co --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "to samo co --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "s³owo_kluczowe[[:]=warto¶æ][,s³owo_kluczowe[[:]=warto¶æ]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "ustawianie s³ów kluczowych formatu pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TEKST"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"utworzenie archiwum z nazw± wolumenu TEKST. Przy wypisywaniu/rozpakowaniu "
+"TEKST bêdzie u¿yty jako wzorzec dopasowania dla nazwy"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "filtrowanie archiwum przez bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "filtrowanie archiwum przez gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "filtrowanie archiwum przez compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROGRAM"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "filtrowanie przez PROGRAM (akceptuj±cy -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Wybór plików lokalnych:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "KATALOG"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "przej¶cie do KATALOGU"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "nazwy plików do rozpakowania lub spakowania z PLIKU"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T czyta nazwy zakoñczone zerem, wy³±cz -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "WZORZEC"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "wykluczenie nazw pasuj±cych do WZORCA"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "wykluczenie nazw pasuj±cych do wzorców w PLIKU"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "wykluczenie katalogów zawieraj±cych znacznik pamiêci podrêcznej"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "wykluczenie katalogów zawieraj±cych PLIK"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "wykluczenie katalogów zawieraj±cych PLIK"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "wykluczenie katalogów zawieraj±cych PLIK"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "wykluczenie katalogów zawieraj±cych PLIK"
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr "wykluczenie katalogów zawieraj±cych PLIK"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "bez automatycznego zag³êbiania siê w katalogi"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "pozostanie w jednym systemie plików"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "zag³êbianie siê w podkatalogi (domy¶lnie)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "bez usuwania pocz±tkowego `/' z nazw plików"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "NAZWA-PLIKU"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "zaczêcie od pliku NAZWA-PLIKU w archiwum"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "zapisanie tylko plików nowszych ni¿ DATA albo data PLIKU"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATA"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "porównywanie daty i czasu tylko dla zmienionych danych"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "TRYB"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "kopia zapasowa przed usuniêciem, wybranie TRYBU zarz±dzania wersjami"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "NAPIS"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"kopia zapasowa przed usuniêciem, zmiana domy¶lnego przyrostka ('~', je¿eli "
+"nie zmieniony przez zmienn± ¶rodowiska SIMPLE_BACKUP_SUFFIX)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Zmiany nazwy plików:"
+
+#: src/tar.c:652
+#, fuzzy
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+"uciêcie przed rozpakowaniem LICZBA pocz±tkowych elementów ¶cie¿ki z nazw "
+"plików"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "WYRA¯ENIE"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+#, fuzzy
+msgid "ignore case"
+msgstr "wykluczanie traktuje tak samo ma³e i wielkie litery"
+
+#: src/tar.c:665
+#, fuzzy
+msgid "patterns match file name start"
+msgstr "wykluczane nazwy porównywane od pocz±tków nazw plików"
+
+#: src/tar.c:667
+#, fuzzy
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "wzorce wykluczania odnosz± siê do nazw po ka¿dym / (domy¶lnie)"
+
+#: src/tar.c:669
+#, fuzzy
+msgid "case sensitive matching (default)"
+msgstr "wykluczanie odró¿nia ma³e i wielkie litery (domy¶lnie)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "u¿ywanie wildcards (domy¶lnie dla wykluczania)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "dos³owne porównywanie napisów"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "wildcards nie s± porównywane z `/'"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "wildcards s± porównywane z '/' (domy¶lnie dla wykluczania)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Informacje:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "wypisywanie szczegó³ów o przetwarzanych plikach"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]ILE"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+"wypisywanie co ILE rekordów informacji o przetwarzaniu (domyslnie co 10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "wypisanie komunikatu je¿eli nie wszytkie ³±cza zosta³y zapisane"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "SYGNA£"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "wypisanie dat modyfikacji plików w UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "zapisanie dok³adnych informacji w PLIKU"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "pokazanie przy ka¿dym komunikacie numeru bloku w archiwum"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "proszenie o potwierdzenie ka¿dego dzia³ania"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "wypisanie domy¶lnych ustawieñ tar-a"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"wypisywanie ka¿dego katalogu nie pasuj±cego do kryteriów szukania przy "
+"wypisywaniu albo rozpakowywaniu archiwum"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "pokazanie nazw plików albo archiwów po przeszkta³ceniu"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "STYL"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+"ustawienie stylu ujmowania nazw w cudzys³owy; poni¿ej dozwolone warto¶ci "
+"STYLU"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Opcje kompatybilno¶ci:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"przy tworzeniu: to samo co --old-archive przy odtwarzaniu: to co --no-same-"
+"owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Inne opcje:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "wy³±czenie u¿ywania potencjalnie szkodliwych opcji"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Nie mo¿na podaæ wiêcej ni¿ jednej opcji z `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Niezgodne opcje kompresji"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Nieznana nazwa sygna³u: %s"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Nie znaleziono pliku maj±cego datê graniczn±"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Postawienie %s w miejscu nieznanego formatu daty %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Opcja %s: Potraktowanie daty `%s' jako %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: lista plików ju¿ przeczytana"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Ten* tar ma domy¶lne parametry:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "B³êdny wspó³czynnik ³±czenia w bloki"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Uwaga: opcja -I nie jest u¿ywana, mo¿e chodzi o -j albo -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "B³êdna d³ugo¶æ ta¶my"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Wiêcej ni¿ jedna data graniczna"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: b³êdna grupa"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "B³êdne uprawnienia podane w opcji"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "B³êdny numer"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "B³êdny w³a¶ciciel"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "B³êdna wielko¶æ rekordu"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Rozmiar rekordu musi byæ wielokrotno¶ci± %d"
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "B³êdna ilo¶æ elementów"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "B³êdna specyfikacja gêsto¶ci: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Nieznana gêsto¶æ: `%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Opcje `-[0-7][lmh]' nie s± u¿ywane w *tym* tarze"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[PLIK]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Stara opcja `%c' wymaga argumentu."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence nie ma znaczenia bez listy plików"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence nie mo¿e byæ u¿yte w tym trybie"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Archiwum sk³adaj±ce siê z wielu plików wymaga opcji `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Nie mo¿na po³±czyæ --listed-incremental z --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Za d³uga etykieta czê¶ci (mo¿e mieæ do %lu bajtu)"
+msgstr[1] "%s: Za d³uga etykieta czê¶ci (mo¿e mieæ do %lu bajtów)"
+msgstr[2] "%s: Za d³uga etykieta czê¶ci (mo¿e mieæ do %lu bajtów)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Nie mo¿na zweryfikowaæ archiwum wieloczê¶ciowego"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Nie mo¿na zweryfikowaæ archiwum skompresowanego"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Nie mo¿na u¿ywaæ wieloczê¶ciowego archiwum skompresowanego"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Nie mo¿na po³±czyæ skompresowanych archiwów"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option mo¿e byæ u¿yta tylko przy archiwach POSIX-owych"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Tchórzliwie odmawiam utworzenia pustego archiwum"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Opcje `-Aru' s± niekompatybilne z `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Musisz podaæ jedn± z opcji `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Zakoñczenie z b³êdem z powodu uprzednich b³êdów"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Plik skurczy³ siê o %s bajt"
+msgstr[1] "%s: Plik skurczy³ siê o %s bajty"
+msgstr[2] "%s: Plik skurczy³ siê o %s bajtów"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "S³owo kluczowe %s jest nieznane albo jeszcze nie zaimplementowane"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Nie mo¿e byæ u¿yty wzorzec %s"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "S³owo kluczowe %s nie mo¿e byæ zast±pione"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "B³êdny nag³ówek rozszerzony: brakuje d³ugo¶ci"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "D³ugo¶æ nag³ówka rozszerzonego jest poza dozwolonym zakresem"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "D³ugo¶c nag³ówka rozszerzonego %*s jest poza zakresem"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "B³êdny nag³ówek rozszerzony: brakuje odstêpu po d³ugo¶ci"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "B³êdny nag³ówek rozszerzony: brakuje znaku równo¶ci"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "B³êdny nag³ówek rozszerzony: brakuje znaku mowej linii"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "Zignorowane nieznane s³owo kluczowe nag³ówka rozszerzonego `%s'"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+"Wygenerowana para s³owo kluczowe/warto¶æ jest za d³uga (s³owo kluczowe=%s, "
+"d³ugo¶æ=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Nag³ówek rozszerzony - %s=%s jest poza zakresem %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "B³êdny nag³ówek rozszerzony: b³êdny %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "B³êdny nag³ówek rozszerzony: nadmiarowe %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "B³êdny nag³ówek rozszerzony: b³êdny %s: niespodziewany ogranicznik %c"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "B³êdny nag³ówek rozszerzony: b³êdny %s: nieparzysta liczba warto¶ci"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Opcje tworzenia plików:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "ROZMIAR"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Utworzenie pliku o podanym ROZMIARZE"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "Pisanie na pliku NAZWA zamiast na standardowe wyj¶cie"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Czytanie nazw plików z PLIKU"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T czyta nazwy zakoñczone zerem"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr "Wype³nienie pliku podanym WZORCEM. WZORZEC to 'default' albo 'zeros'"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Rozmiar bloku pliku rzadkiego"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr "Utworzenie pliku rzadkiego. Reszta argumentów okre¶la mapê pliku."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr "POZYCJA"
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr "Ustawienie pozycji zapisu przez zapisem danych"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Opcje statystyki plików"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "Wykonanie POLECENIA"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "B³êdny rozmiar: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Liczba spoza dozwolonego zakresu: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Ujemny rozmiar: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "b³±d stat(%s)"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "B³±d przetwarzania liczby blisko `%s'"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Nieznany format daty"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARGUMENTY...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "nie mo¿na otworzyæ `%s'"
+
+#: tests/genfile.c:426
+#, c-format
+msgid "cannot seek: %s"
+msgstr "nie mo¿na ustawiæ pozycji: %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "nazwa pliku zawiera znak NUL"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"nie mo¿na utworzyæ pliku rzadkiego na standardowym wyj¶ciu, u¿yj opcji --file"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr " Nieznane pole `%s'"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "nie mo¿na ustawiæ czasu na `%s'"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Polecenie zakoñczy³o siê poprawnie\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr ""
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Polecenie zosta³o zakoñczone sygna³em %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Polecenie zosta³o zatrzymane sygna³em %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Polecenie zakoñczone\n"
+
+# what is 'mangled'? - rzm
+# chyba raczej "pomieszane, poprzekrêcane" ?
+# w man, info i docach nie ma ani s³owa o tym - pk
+# chyba base64 itp. - rzm
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "--stat wymaga podania nazwy pliku"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "za du¿o argumentów"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: B³±d czytania, bajt %s, przy czytaniu %lu bajtu"
+#~ msgstr[1] "%s: B³±d czytania, bajt %s, przy czytaniu %lu bajtów"
+#~ msgstr[2] "%s: B³±d czytania, bajt %s, przy czytaniu %lu bajtów"
+
+# what is 'mangled'? - rzm
+# chyba raczej "pomieszane, poprzekrêcane" ?
+# w man, info i docach nie ma ani s³owa o tym - pk
+# chyba base64 itp. - rzm
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Kodowane nazwy plików--\n"
+
+# ? - rzm
+# jw -pk
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Niespodziewany EOF w kodowanych nazwach"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Zmiana nazwy %s na %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Nie mo¿na utworzyæ ³±cza symbolicznego do %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Utworzone ³±cze symboliczne %s do %s"
+
+# ? - rzm
+# tu by pasowa³o "porz±dkuj±ca" albo co¶ w tym stylu -pk
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Nieznana komenda rozkodowuj±ca nazwy %s"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Czas spoza zakresu"
+
+#~ msgid "Modification time (seconds) out of range"
+#~ msgstr "Czas modyfikacji (sekundy) poza zakresem"
+
+#~ msgid "Modification time (nanoseconds) out of range"
+#~ msgstr "Czas modyfikacji (nanosekundy) poza zakresem"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Numer urz±dzenia spoza zakresu"
+
+#~ msgid "Error reading time stamp"
+#~ msgstr "B³±d czytania znacznika czasu"
+
+#~ msgid "Unexpected EOF"
+#~ msgstr "Nieoczekiwany EOF"
+
+#~ msgid "same as -N"
+#~ msgstr "to samo co -N"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Ten program ten jest rozprowadzany BEZ GWARANCJI, w granicach "
+#~ "dozwolonych\n"
+#~ "przez prawo. Mo¿na go rozpowszechniaæ na zasadach Powszechnej Licencji\n"
+#~ "Publicznej GNU. Szczegó³y w pliku COPYING."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Bezsensowna komenda %c\n"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "UWAGA: Brak etykiety czê¶ci"
+
+# ? - rzm
+#~ msgid "Visible long name error"
+#~ msgstr "B³±d d³ugiej nazwy"
+
+# ? - rzm
+#~ msgid "Visible longname error"
+#~ msgstr "B³±d d³ugiej nazwy"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Brakuj±ca nazwa pliku po -C"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "bez zmiany czasu dostêpu pakowanych plików"
+
+#~ msgid "extract permissions information"
+#~ msgstr "u¿ycie informacji o uprawnieniach"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "bez u¿ycia informacji o uprawnieniach"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "PLIK-Z-NAZWAMI"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "wzorce wykluczania s± prostymi ci±gami znaków"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "pakowanie plików zamiast wskazuj±cych na nie ³±cz symbolicznych"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "wzorce wykluczania u¿ywaj± ? i * (domyslnie)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "wypisanie ilo¶ci bajtów zapisanych przy tworzeniu archiwum"
+
+#~ msgid "Print license and exit"
+#~ msgstr "Wypisanie tre¶ci licencji i zakoñczenie"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Oparte na pracy Johna Gilmore'a i Jaya Fenlasona. Kompletny spis\n"
+#~ "autorów znajduje siê w pliku AUTHORS.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Tar GNU to wolne oprogramowanie; mo¿na je rozprowadzaæ i/lub "
+#~ "modyfikowaæ\n"
+#~ " przestrzegaj±c warunków Powszechnej Licencji Publicznej GNU (General\n"
+#~ " Public Licence) opublikowanej przez Free Software Foundation, w wersji "
+#~ "2\n"
+#~ " lub (do wyboru) dowolnej pó¼niejszej.\n"
+#~ "\n"
+#~ " Tar GNU jest rozpowszechniany z nadziej±, ¿e bêdzie u¿yteczny, ale "
+#~ "BEZ\n"
+#~ " ¯ADNEJ GWARANCJI, w tym równie¿ gwarancji PRZYDATNO¦CI DO SPRZEDA¯Y "
+#~ "LUB DO\n"
+#~ " KONKRETNYCH CELÓW. Wiêcej szczegó³ów w Powszechnej Licencji "
+#~ "Publicznej\n"
+#~ " GNU.\n"
+#~ "\n"
+#~ " Kopia Powszechnej Licencji Publicznej GNU powinna byæ dostarczona "
+#~ "wraz\n"
+#~ " z tym programem. Je¶li nie, mo¿na napisaæ do Free Software "
+#~ "Foundation,\n"
+#~ " Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+#~ "\n"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "Znaczenie opcji -l zmieni siê w przysz³ych wersjach."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Proszê u¿ywaæ zamiast niej opcji --one-file-system ."
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Uwaga: opcja -y nie jest u¿ywana, mo¿e chodzi o -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "B³±d pisania na standardowe wyj¶cie"
diff --git a/po/pt.gmo b/po/pt.gmo
new file mode 100644
index 0000000..cd709e4
--- /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..d9a07a3
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,3168 @@
+# Portuguese translation of the "tar" messages
+# Copyright (1995) Free Software Foundation, Inc.
+# António José Coutinho <ajc@di.uminho.pt>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.11.9\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 1996-04-20 21:50\n"
+"Last-Translator: António José Coutinho <ajc@di.uminho.pt>\n"
+"Language-Team: Portuguese <pt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: lib/argmatch.c:134
+#, fuzzy, c-format
+msgid "invalid argument %s for %s"
+msgstr "Formato de data inválido \"%s\""
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr ""
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr ""
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+#, fuzzy
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Os argumentos obrigatórios ou opcionais para as opções longas também\n"
+"são obrigatórios ou opcionais para as correspondentes opções curtas.\n"
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Forma de usar: %s [OPÇÃO]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Para mais informação, tente \"%s --help\".\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Erro desconhecido, do sistema"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr ""
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, fuzzy, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "A antiga opção `%c' exige um argumento."
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, fuzzy, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "A antiga opção `%c' exige um argumento."
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, fuzzy, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "A antiga opção `%c' exige um argumento."
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr ""
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr ""
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "A antiga opção `%c' exige um argumento."
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, fuzzy, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "A antiga opção `%c' exige um argumento."
+
+#: lib/human.c:477
+msgid "block size"
+msgstr ""
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr ""
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, fuzzy, c-format
+msgid "%s: Cannot %s"
+msgstr "Não se consegue duplicar %s com \"dup\""
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr ""
+
+#: lib/paxerror.c:93
+#, fuzzy, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Não se pode mudar para o modo para %0.4o"
+
+#: lib/paxerror.c:101
+#, fuzzy, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Não se pode mudar o dono (owner) para \"uid\" %d, \"gid\" %d"
+
+#: lib/paxerror.c:127
+#, fuzzy, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "Não se consegue ler a ligação (\"link\") %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] ""
+"Erro de leitura no \"byte\" %ld, durante a leitura de %d \"bytes\" do "
+"ficheiro %s"
+msgstr[1] ""
+"Erro de leitura no \"byte\" %ld, durante a leitura de %d \"bytes\" do "
+"ficheiro %s"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] ""
+"Erro de leitura no \"byte\" %ld, durante a leitura de %d \"bytes\" do "
+"ficheiro %s"
+msgstr[1] ""
+"Erro de leitura no \"byte\" %ld, durante a leitura de %d \"bytes\" do "
+"ficheiro %s"
+
+#: lib/paxerror.c:259
+#, fuzzy, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "Não se consegue escrever em %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr ""
+
+#: lib/paxerror.c:284
+#, fuzzy, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Não se conseguiu criar uma ligação simbólica (link) para `%s'"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Apenas se conseguiu escrever %d de um total de %d bytes"
+msgstr[1] "%s: Apenas se conseguiu escrever %d de um total de %d bytes"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Retira-se \"/\" das ligações (\"links\") absolutas "
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Retira-se \"/\" das ligações (\"links\") absolutas "
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr ""
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr ""
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr ""
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Serviço indisponível"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr ""
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr ""
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Não se consegue executar uma \"shell\" remota"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Não se consegue reservar espaço temporário (\"buffers\")\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Não se consegue reservar espaço temporário (\"buffer\")"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Para mais informação, tente \"%s --help\".\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr ""
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr ""
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr ""
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Fim de ficheiro prematuro\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Fim-de-ficheiro prematuro"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Comando desconhecido"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Número total de de \"bytes\" escritos: %d\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+#, fuzzy
+msgid "Total bytes read"
+msgstr "Número total de de \"bytes\" escritos: %d\n"
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Número total de de \"bytes\" escritos: %d\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr ""
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Valor inválido para tamanho de registo (record_size)"
+
+#: src/buffer.c:452
+#, fuzzy
+msgid "No archive name given"
+msgstr "Não deram nome de arquivo, que fazer?"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Não se pode de verificar arquivos stdin ou stdout"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+#, fuzzy
+msgid "Cannot update compressed archives"
+msgstr "Não se pode actualizar o verificar um arquivo comprimido"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Escreve-se o ponto de verificação %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Leu-se o ponto de verificação %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "No princípio da fita, pára-se imediatamente"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Erros de mais: termina-se"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Tamanho de bloco (blocksize) = blocos de %d"
+msgstr[1] "Tamanho de bloco (blocksize) = blocos de %d"
+
+#: src/buffer.c:791
+#, fuzzy
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Não se conseguiu recuar o arquivo; pode ser ilegível sem -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr ""
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr ""
+
+#: src/buffer.c:929
+#, fuzzy, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "\aPreparar o volume no. %d para %s e premir \"Return\": "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr ""
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ATENÇÃO: O arquivo está incompleto"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [nome] Dar um novo nome para o próximo (e seguintes) volume(s)\n"
+" q Cancelar o tar\n"
+" ! Criar uma \"sub-shell\" (interpretador de comandos)\n"
+" ? Escrever esta lista\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Não há novo volume; termina-se. \n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr ""
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Isto não se parece a um arquivo \"tar\""
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s não tem continuidade neste volume"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s não tem continuidade neste volume"
+
+#: src/buffer.c:1237
+#, fuzzy, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s não é a dimensão correcta (%ld != %ld + %ld)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Este volume está fora da sequência"
+
+#: src/buffer.c:1293
+#, fuzzy, c-format
+msgid "Archive not labeled to match %s"
+msgstr "O arquivo não tem etiqueta e não condiz com %s"
+
+#: src/buffer.c:1296
+#, fuzzy, c-format
+msgid "Volume %s does not match %s"
+msgstr "O volume não condiz! %s!=%s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "%s: Só se pôde ler %d de um total de %ld \"bytes\"\n"
+msgstr[1] "%s: Só se pôde ler %d de um total de %ld \"bytes\"\n"
+
+#: src/compare.c:106 src/compare.c:388
+#, fuzzy
+msgid "Contents differ"
+msgstr "Tempo de modificação"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Fim de ficheiro inesperado no arquivo"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+#, fuzzy
+msgid "File type differs"
+msgstr "%s: Ligação (\"link\") simbólica é diferente\n"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr ""
+
+#: src/compare.c:206
+#, fuzzy
+msgid "Uid differs"
+msgstr "%s: %s diferente\n"
+
+#: src/compare.c:208
+#, fuzzy
+msgid "Gid differs"
+msgstr "%s: %s diferente\n"
+
+#: src/compare.c:212
+#, fuzzy
+msgid "Mod time differs"
+msgstr "Tempo de modificação"
+
+#: src/compare.c:216 src/compare.c:420
+#, fuzzy
+msgid "Size differs"
+msgstr "%s: Ligação (\"link\") simbólica é diferente\n"
+
+#: src/compare.c:270
+#, fuzzy, c-format
+msgid "Not linked to %s"
+msgstr "%s: Não está ligado a %s\n"
+
+#: src/compare.c:293
+#, fuzzy
+msgid "Symlink differs"
+msgstr "%s: Ligação (\"link\") simbólica é diferente\n"
+
+#: src/compare.c:322
+#, fuzzy
+msgid "Device number differs"
+msgstr "%s: Os números do periférico mudaram\n"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verificação"
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr ""
+"Tipo de ficheiro \"%c\" desconhecido para %s; comparado como um ficheiro "
+"normal"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "ERRO DE VERIFICAÇÃO: Encontraram-se %d cabeçalhos inválidos"
+msgstr[1] "ERRO DE VERIFICAÇÃO: Encontraram-se %d cabeçalhos inválidos"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s é o arquivo; não será arquivado"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr ""
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr ""
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr ""
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: não foi modificado; não será arquivado"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: não foi modificado; não será arquivado"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "O ficheiro %s diminuiu em %d \"bytes\", será completado com zeros"
+msgstr[1] "O ficheiro %s diminuiu em %d \"bytes\", será completado com zeros"
+
+#: src/create.c:1176
+#, fuzzy, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: Está num outro sistema de ficheiros; não será arquivado"
+
+#: src/create.c:1217 src/create.c:1228
+#, fuzzy
+msgid "contents not dumped"
+msgstr " (imagem da memória despejada \"core dumped\")"
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Tipo de ficheiro desconhecido; ficheiro ignorado"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " ligação para %s\n"
+
+#: src/create.c:1529
+#, fuzzy, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: não foi modificado; não será arquivado"
+
+#: src/create.c:1537
+#, fuzzy, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s é o arquivo; não será arquivado"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr ""
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s é o arquivo; não será arquivado"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr ""
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr ""
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr ""
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Salta para próximo cabeçalho"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Apaga-se do arquivo um não-cabeçalho"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr ""
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr ""
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Estão-se a extrair ficheiros contíguos como sendo ficheiros normais"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr ""
+"Está-se a tentar extrair ligações simbólicas (sym. links) como ligações "
+"físicas (hard links)"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Leitura de %s\n"
+
+#: src/extract.c:1146
+#, fuzzy, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr ""
+"Não se pode extraír `%s' -- é a continuação de um ficheiro de outro volume"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Fim de ficheiro inesperado no ficheiro de arquivo"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr ""
+"Tipo \"%c\" do ficheiro \"%s\" desconhecido; extrai-se como um ficheiro "
+"normal"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr ""
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Não se consegue mudar o nome de %s para %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr ""
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "Mudou-se o nome do directoria %s"
+
+#: src/incremen.c:270
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed"
+msgstr "Mudou-se o nome do directoria %s"
+
+#: src/incremen.c:311
+#, fuzzy, c-format
+msgid "%s: Directory is new"
+msgstr "O directoria %s é novo"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr ""
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr ""
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr ""
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr ""
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "Erro de leitura sobre %s"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Fim de ficheiro inesperado no ficheiro de arquivo"
+
+#: src/incremen.c:872 src/incremen.c:912
+#, fuzzy
+msgid "Unexpected field value in snapshot file"
+msgstr "Fim de ficheiro inesperado no ficheiro de arquivo"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Não se pode mudar para a directoria %s"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr ""
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Apaga-se %s\n"
+
+#: src/incremen.c:1418
+#, fuzzy, c-format
+msgid "%s: Cannot remove"
+msgstr "Não se consegue apagar %s"
+
+#: src/list.c:113
+#, fuzzy, c-format
+msgid "%s: Omitting"
+msgstr "Omite-se %s"
+
+#: src/list.c:131
+#, fuzzy, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "bloco %10ld: ** Bloco de NULs **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, fuzzy, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "bloco %10ld: ** Fim-de-ficheiro **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, fuzzy, c-format
+msgid "block %s: "
+msgstr "bloco %10ld: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr ""
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr ""
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+
+#: src/list.c:794
+#, fuzzy, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Este volume está fora da sequência"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr ""
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " ligação para %s\n"
+
+#: src/list.c:1225
+#, fuzzy, c-format
+msgid " unknown file type %s\n"
+msgstr " tipo de ficheiro desconhecido \"%c\"\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Cabeçalho de volume--\n"
+
+#: src/list.c:1259
+#, fuzzy, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Continua no \"byte\" %ld--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Criação de directoria::"
+
+#: src/misc.c:456
+#, fuzzy, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Mudou-se o nome %s para %s"
+
+#: src/misc.c:465 src/misc.c:483
+#, fuzzy, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "Não se consegue mudar o nome de %s para %s"
+
+#: src/misc.c:488
+#, fuzzy, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Mudou-se o nome %s para %s"
+
+#: src/misc.c:615
+#, fuzzy
+msgid "Cannot save working directory"
+msgstr "Não se pode mudar para a directoria %s"
+
+#: src/misc.c:621
+#, fuzzy
+msgid "Cannot change working directory"
+msgstr "Não se pode mudar para a directoria %s"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr ""
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr ""
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Não foi encontrado no arquivo"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Não foi encontrado no arquivo"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Ambas as opções `-%s' e `-%s' precisam do \"standard input\""
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "Formato de data inválido \"%s\""
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr ""
+"Estão-se a querer propriedades GNU num arquivo com formato incompatível"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Fim de ficheiro inesperado no arquivo"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+#, fuzzy
+msgid "remove files after adding them to the archive"
+msgstr "Retira-se a especificação do \"drive\" aos nomes no arquivo"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr ""
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Não se pode verificar arquivos multi-volume"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Arquivo para stdin"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr ""
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr ""
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Não se pode mudar para a directoria %s"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Retira-se \"/\" das ligações (\"links\") absolutas "
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr ""
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+#, fuzzy
+msgid "ask for confirmation for every action"
+msgstr "Não se consegue obter confirmação, do utilizador"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Não se pode especificar mais do que uma das opções \"-Acdtrux\""
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Há conflitos entre as opções de compressão"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr "Opção \"%c\" desconhecida"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr ""
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr ""
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr ""
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr ""
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr ""
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr ""
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr ""
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr ""
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr ""
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr ""
+
+#: src/tar.c:1705
+#, fuzzy
+msgid "Invalid record size"
+msgstr "Valor inválido para tamanho de registo (record_size)"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "O tamanho dos registos tem que ser múltiplo de %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr ""
+
+#: src/tar.c:1765
+#, fuzzy
+msgid "Only one --to-command option allowed"
+msgstr "Só se permite uma opção de compressão"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Opção \"%c\" desconhecida"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "As opções \"-[0-7][lmh]\" não são suportadas por *este* tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "A antiga opção `%c' exige um argumento."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Para usar vários arquivos é necessária a opção \"-M\""
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr ""
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Não se pode verificar arquivos multi-volume"
+
+#: src/tar.c:2177
+#, fuzzy
+msgid "Cannot verify compressed archives"
+msgstr "Não se pode actualizar o verificar um arquivo comprimido"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Não se pode de usar arquivos multi-volume comprimidos"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Não se pode actualizar o verificar um arquivo comprimido"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Recusa-se, covardemente, a criar um arquivo vazio"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "As opções \"-Aru\" são imcompatíveis com \"-f -\""
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Tem que se especificar uma das opções \"-Acdtrux\""
+
+#: src/tar.c:2385
+#, fuzzy, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Erro só assinalado no fim da execução"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: O ficheiro diminui em %d bytes, (desgraça!)"
+msgstr[1] "%s: O ficheiro diminui em %d bytes, (desgraça!)"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr ""
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr ""
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Há conflitos entre as opções de compressão"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr ""
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+#, fuzzy
+msgid "Update the access and modification times of FILE"
+msgstr "Não se conseguiu modificar os tempos de acesso e modificação de %s"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Formato de data inválido \"%s\""
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr ""
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Erro desconhecido, do sistema"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "Não se consegue abrir %s"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "Não se consegue executar %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr "Opção \"%c\" desconhecida"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "Não se consegue executar \"stat\" para o ficheiro %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr ""
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Nomes de ficheiros truncados--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close file #%d"
+#~ msgstr "Não se consegue fechar o ficheiro #%d"
+
+#~ msgid "Cannot close descriptor %d"
+#~ msgstr "Não se consegue fechar o ficheiro de descritor %d"
+
+#, fuzzy
+#~ msgid "Cannot properly duplicate %s"
+#~ msgstr "Não se consegue redireccionar %s"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Não se pode usar arquivos comprimidos ou remotos"
+
+#~ msgid "Cannot open pipe"
+#~ msgstr "Não se consegue abrir \"pipe\""
+
+#~ msgid "Cannot fork"
+#~ msgstr "Não se consegue criar processo ( \"fork\" )"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (filho)"
+
+#~ msgid "(child) Pipe to stdin"
+#~ msgstr "(filho) \"pipe\" para \"stdin\""
+
+#~ msgid "Cannot open archive %s"
+#~ msgstr "Não se consegue abrir o arquivo %s"
+
+#~ msgid "Archive to stdout"
+#~ msgstr "Arquivo para stdout"
+
+#~ msgid "Child cannot fork"
+#~ msgstr "Processo filho não consegue executar \"fork\""
+
+#~ msgid "((child)) Pipe to stdout"
+#~ msgstr "((filho)) \"pipe\" para \"stdout\""
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (neto)"
+
+#~ msgid "(grandchild) Pipe to stdin"
+#~ msgstr "(neto) \"Pipe\" para \"stdout\""
+
+#~ msgid "Cannot read from compression program"
+#~ msgstr "Não se consegue ler do programa de compressão"
+
+#~ msgid "(child) Pipe to stdout"
+#~ msgstr "(filho) \"pipe\" para \"stdout\""
+
+#~ msgid "((child)) Pipe to stdin"
+#~ msgstr "((filho)) \"pipe\" para \"stdin\""
+
+#~ msgid "(grandchild) Pipe to stdout"
+#~ msgstr "(neto) \"Pipe\" para \"stdout\""
+
+#~ msgid "Cannot write to compression program"
+#~ msgstr "Não se consegue escrever para o programa de compressão"
+
+#~ msgid "Write to compression program short %d bytes"
+#~ msgstr "Faltam %d bytes no que se escreveu para o programa de compressão"
+
+#~ msgid "Could not allocate memory for blocking factor %d"
+#~ msgstr "Não se conseguiu reservar memória para um factor de bloco %d"
+
+#~ msgid "Only wrote %u of %u bytes to %s"
+#~ msgstr "Só se escreveram %u \"bytes\" de um total de %u em %s"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ATENÇÃO: Não há cabeçalho de volume"
+
+#~ msgid "Archive %s EOF not on block boundary"
+#~ msgstr ""
+#~ "O fim-de-ficheiro do arquivo %s não se encontra na fronteira de um bloco"
+
+#~ msgid "Only read %d bytes from archive %s"
+#~ msgstr "Só se leram %d \"bytes\" do arquivo %s"
+
+#~ msgid "WARNING: Cannot close %s (%d, %d)"
+#~ msgstr "ATENÇÃO: Não se consegue fechar %s (%d, %d)"
+
+#~ msgid "Child died with signal %d%s"
+#~ msgstr "Processo filho morreu com o sinal %d%s"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Processo filho terminou com estado %d"
+
+#~ msgid "Cannot fork!"
+#~ msgstr "Não se consegue criar processo! ( \"fork\" )"
+
+#~ msgid "Cannot exec a shell %s"
+#~ msgstr "Não se consegue executar uma \"shell\" %s"
+
+#, fuzzy
+#~ msgid "Removing leading `/' from absolute path names in the archive"
+#~ msgstr "Retira-se / dos caminhos dos ficheiros (path names), no arquivo"
+
+#~ msgid "Wrote %ld of %ld bytes to file %s"
+#~ msgstr "Escreveram-se %ld \"bytes\" de um total de %ld, no ficheiro %s"
+
+#~ msgid "Read error at byte %ld, reading %d bytes, in file %s"
+#~ msgstr ""
+#~ "Erro de leitura no \"byte\" %ld, durante a leitura de %d \"bytes\" do "
+#~ "ficheiro %s"
+
+#~ msgid "Amount actually written is (I hope) %d.\n"
+#~ msgstr "A quantidade realmente escrita é %d (esperemos!).\n"
+
+#~ msgid "Cannot add file %s"
+#~ msgstr "Não é possível acrescentar o ficheiro %s"
+
+#, fuzzy
+#~ msgid "Cannot add directory %s"
+#~ msgstr "Não se consegue abrir a directoria %s"
+
+#~ msgid "Cannot open directory %s"
+#~ msgstr "Não se consegue abrir a directoria %s"
+
+#~ msgid "File name %s%s too long"
+#~ msgstr "Nome de ficheiro %s%s longo demais"
+
+#~ msgid "Could not allocate memory for diff buffer of %d bytes"
+#~ msgstr ""
+#~ "Não se conseguiu reservar memória para um \"buffer\" de comparação, de %d "
+#~ "\"bytes\""
+
+#~ msgid "Cannot read %s"
+#~ msgstr "Não se consegue ler %s"
+
+#, fuzzy
+#~ msgid "Data differs"
+#~ msgstr "%s: Os dados são diferentes\n"
+
+#, fuzzy
+#~ msgid "File does not exist"
+#~ msgstr "%s: Não existe\n"
+
+#, fuzzy
+#~ msgid "Not a regular file"
+#~ msgstr "%s: Não é um ficheiro normal\n"
+
+#~ msgid "Error while closing %s"
+#~ msgstr "Erro durante o fecho de %s"
+
+#, fuzzy
+#~ msgid "Does not exist"
+#~ msgstr "%s: Não existe\n"
+
+#, fuzzy
+#~ msgid "No such file or directory"
+#~ msgstr "%s: Ficheiro, ou directoria, não existe\n"
+
+#, fuzzy
+#~ msgid "Mode or device-type changed"
+#~ msgstr "%s: O modo ou o tipo de periférico mudou\n"
+
+#, fuzzy
+#~ msgid "No longer a directory"
+#~ msgstr "%s: Já não é uma directoria\n"
+
+#~ msgid "Cannot open file %s"
+#~ msgstr "Não se consegue abrir o ficheiro %s"
+
+#~ msgid "Cannot seek to %ld in file %s"
+#~ msgstr "Não se consegue mudar (\"seek\") para a posição %ld do ficheiro %s"
+
+#~ msgid "Could not rewind archive file for verify"
+#~ msgstr "Não se conseguiu rebobinar o arquivo para verificação"
+
+#~ msgid "Could not re-position archive file"
+#~ msgstr "Não se conseguiu reposicionar o ficheiro arquivo"
+
+#~ msgid "%s: Could not change access and modification times"
+#~ msgstr "%s: Não se conseguiu mudar os tempos de acesso e modificação"
+
+#, fuzzy
+#~ msgid "%s: Cannot lchown to uid %d gid %d"
+#~ msgstr "%s: Não se pode fazer \"chown\" para \"uid\" %d \"gid\" %d"
+
+#~ msgid "%s: Cannot chown to uid %d gid %d"
+#~ msgstr "%s: Não se pode fazer \"chown\" para \"uid\" %d \"gid\" %d"
+
+#~ msgid "%s: Could not write to file"
+#~ msgstr "%s: Não se conseguiu escrever para o ficheiro"
+
+#~ msgid "%s: Could not create file"
+#~ msgstr "%s: Não foi possível criar o ficheiro"
+
+#~ msgid "%d at %d\n"
+#~ msgstr "%d em %d\n"
+
+#~ msgid "%s: Error while closing"
+#~ msgstr "%s: Erro ao fechar"
+
+#~ msgid "%s: Could not link to `%s'"
+#~ msgstr "%s: Não se pôde fazer ligação (link) para `%s'"
+
+#~ msgid "%s: Could not make node"
+#~ msgstr "%s: Não se pôde criar um nodo"
+
+#~ msgid "%s: Could not make fifo"
+#~ msgstr "%s: Não se pôde criar um \"fifo\""
+
+#~ msgid "%s: Could not create directory"
+#~ msgstr "%s: Não se pôde criar uma directoria"
+
+#~ msgid "Added write and execute permission to directory %s"
+#~ msgstr "Acrescentaram-se permissões de escrita e de leitura à directoria %s"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Erro evidente num nome longo"
+
+#~ msgid "Cannot stat %s"
+#~ msgstr "Não se consegue executar \"stat\" para %s"
+
+#~ msgid "Could not get current directory"
+#~ msgstr "Não se conseguiu determinar a directoria corrente"
+
+#~ msgid "Could not get current directory: %s"
+#~ msgstr "Não se conseguiu determinar a directoria corrente: %s"
+
+#, fuzzy
+#~ msgid "File name %s/%s too long"
+#~ msgstr "Nome de ficheiro %s%s longo demais"
+
+#~ msgid "Cannot chdir to %s"
+#~ msgstr "Não se pode mudar para a directoria %s"
+
+#~ msgid "Error while deleting %s"
+#~ msgstr "Erro quando se apagava %s"
+
+#~ msgid "Hmm, this doesn't look like a tar archive"
+#~ msgstr "Pois é..., isto não parece ser um arquivo \"tar\""
+
+#~ msgid "Skipping to next file header"
+#~ msgstr "Salta para o próximo cabeçalho de ficheiro"
+
+#~ msgid "EOF in archive file"
+#~ msgstr "Fim-de-ficheiro no arquivo"
+
+#~ msgid "Only wrote %ld of %ld bytes to file %s"
+#~ msgstr "Só se escreveram %ld \"bytes\" de um total de %ld no ficheiro %s"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Erro evidente num nome longo"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Fim de ficheiro inesperado nos nomes truncados"
+
+#~ msgid "Cannot symlink %s to %s"
+#~ msgstr "Não se pode criar uma ligação (\"link\") simbólica de %s para %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s ligado simbolicamente a %s (\"link\")"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Comando desconhecido \"%s\" para decifrar os nomes truncados"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Falta um nome de ficheiro após \"-C\""
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Comando \"%c\" não faz sentido\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [OPTION]... [FILE]...\n"
+#~ msgstr "Utilização: %s [OPÇÃO]... [FICHEIRO]...\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Principal modo de funcionamento:\n"
+#~ " -t, --list inventário do arquivo\n"
+#~ " -x, --extract, --get extrair ficheiros do arquivo\n"
+#~ " -c, --create criar um novo arquivo\n"
+#~ " -d, --diff, --compare comparar o arquivo com os actuais ficheiros \n"
+#~ " -r, --append acrescentar os ficheiros no fim do arquivo\n"
+#~ " -u, --update só acrescentar os ficheiros mais novos do que "
+#~ "as versões presentes no arquivo\n"
+#~ " -A, --catenate juntar outros arquivos \"tar\" ao arquivo\n"
+#~ " --concatenate o mesmo que \"-A\"\n"
+#~ " --delete apagar no arquivo (excepto para fitas "
+#~ "magnéticas!)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't overwrite existing files when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modificadores do modo de funcionamento:\n"
+#~ " -W, --verify tentar verificar o arquivo depois de o "
+#~ "escrever\n"
+#~ " --remove-files apagar os ficheiros depois de serem "
+#~ "guardados no arquivo\n"
+#~ " -k, --keep-old-files na extracção, não destruir nenhum ficheiro\n"
+#~ " -U, --unlink-first remove cada ficheiro antes de extrair para "
+#~ "cima dele\n"
+#~ "\t\t\t (aparecendo duas vezes, até apaga directorias completas\n"
+#~ " -S, --sparse tratar eficientemente ficheiros dispersos \n"
+#~ " (os que têm buracos) \n"
+#~ " -O, --to-stdout extrair os ficheiros para o \"stdout\" \n"
+#~ " -G, --incremental tratar um arquivo no velho formato "
+#~ "incremental GNU\n"
+#~ " -g, --listed-incremental tratar arquivo no novo formato incremental "
+#~ "GNU\n"
+#~ " --ignore-failed-read ignorar os ficheiros que não se consegue "
+#~ "ler.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract all protection information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tratamento dos atributos dos ficheiros:\n"
+#~ " --atime-preserve não alterar as datas de acesso dos "
+#~ "ficheiros\n"
+#~ " -m, --modification-time não extrair a data de modificação dos "
+#~ "ficheiros\n"
+#~ " --same-owner extrair os ficheiros tentando manter o "
+#~ "mesmo \n"
+#~ " dono (owner)\n"
+#~ " --numeric-owner usar sempre números para os nomes de \n"
+#~ " utilizador/grupo \n"
+#~ " -p, --same-permissions na extracção, manter as protecções do "
+#~ "ficheiros\n"
+#~ " --preserve-permissions o mesmo que -p\n"
+#~ " -s, --same-order ordernar os nomes a extrair segundo a sua "
+#~ "ordem\n"
+#~ " no arquivo\n"
+#~ " --preserve-order o mesmo que -s\n"
+#~ " --preserve o mesmo que -p conjugado com -s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Escolha do periférico e mudanças de fita magnética:\n"
+#~ " -f, --file=ARQ tratar o arquivo, ou periférico ARQ\n"
+#~ " --force-local o arquivo é local, mesmo que tenha \":\"\n"
+#~ " --rsh-command=COM usar o comando remoto COM, em vez de \"rsh"
+#~ "\"\n"
+#~ " -[0-7][lmh] escolher o periférico e a densidade\n"
+#~ " -M, --multi-volume tratar arquivos multi-volume\n"
+#~ " -L, --tape-length=NUM tratar NUM x 1024 \"bytes\" por fita "
+#~ "magnética\n"
+#~ " -F, --info-script=FICH executar FICH nas mudanças de fita "
+#~ "magnética\n"
+#~ " (força a escolha de \"-M\")\n"
+#~ " --new-volume-script=FICH o mesmo que \"-F FICH\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Características dos blocos no periférico (device):\n"
+#~ " -b, --blocking-factor=BLOCOS BLOCOS x 512 \"bytes\" por registo\n"
+#~ " --record-size=DIM DIM bytes por registo, múltiplo de 512\n"
+#~ " -i, --ignore-zeros ignorar os blocos constituídos por "
+#~ "zeros\n"
+#~ " (implicam fim-de-ficheiro)\n"
+#~ " -B, --read-full-records dividir a leitura em blocos \n"
+#~ " (para os \"pipes\" 4.2BSD)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX conformant archive\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selecção do formato do arquivo:\n"
+#~ " -V, --label=NOME cria um aruivo com volume de nome "
+#~ "NOME\n"
+#~ " REGEXP ao extrair/listar, o nome é uma "
+#~ "expressão\n"
+#~ " regular\n"
+#~ " -o, --old-archive, --portability escreve um arquivo no formato V7\n"
+#~ " --posix escreve um arquivo conforme com "
+#~ "POSIX\n"
+#~ " -z, --gzip, --ungzip filtra o arquivo através de \"gzip"
+#~ "\"\n"
+#~ " -Z, --compress, --uncompress filtra o arquivo através de "
+#~ "\"compress\"\n"
+#~ " --use-compress-program=PROG filtra o arquivo através de PROG \n"
+#~ "\t\t\t\t (este tem que aceitar -d)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a globbing "
+#~ "PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude globbing patterns listed in FILE\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Selecção local de ficheiros:\n"
+#~ " -C, --directory DIR mudar para a directoria DIR\n"
+#~ " -T, --files-from=NOME obter do ficheiro NOME a lista de ficheiros "
+#~ "a \n"
+#~ " criar ou extrair\n"
+#~ " --null faz com que \"-T\" leia nomes terminados por "
+#~ "NULO,\n"
+#~ " também inibe \"-C\"\n"
+#~ " --exclude=PADRÃO excluir os ficheiros descritos pelo PADRÃO\n"
+#~ " -X, --exclude-from=FICH excluir ficheiros, segundo os padrões "
+#~ "guardados em\n"
+#~ "\t\t\t FICH\n"
+#~ " -P, --absolute-names preservar os \"\\\" iniciais nos nomes dos "
+#~ "ficheiros\n"
+#~ " -h, --dereference usar os próprios ficheiros, em lugar das "
+#~ "ligações\n"
+#~ " simbólicas (symlinks) que os referenciam\n"
+#~ " --no-recurse não descer pela árvore de directorias\n"
+#~ " -l, --one-file-system não sair do sistema local de ficheiros, ao "
+#~ "criar o\n"
+#~ " arquivo\n"
+#~ " -K, --starting-file=NOME começar pelo ficheiro NOME, no arquivo\n"
+
+#, fuzzy
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATA só guardar ficheiros mais recentes do que "
+#~ "DATA\n"
+#~ " --newer-mtime só comparar data e hora quando os dados "
+#~ "mudarem\n"
+#~ " --after-date=DATA o mesmo que \"-N\"\n"
+#~ "),"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Prestação de informações:\n"
+#~ " --help mostrar esta mensagem de ajuda e terminar\n"
+#~ " --version indicar a versão do programa \"tar\" e terminar\n"
+#~ " -v, --verbose escrever a lista dos ficheiros tratados\n"
+#~ " --checkpoint indicar os nomes das directorias durante a "
+#~ "leitura\n"
+#~ " --totals indicar o número de \"bytes\" escritos durante a "
+#~ "criação\n"
+#~ " do arquivo\n"
+#~ " -R, --block-number escrever o número de bloco, dentro do arquivo, \n"
+#~ " em cada mensagem\n"
+#~ " -w, --interactive pedir confirmação para todas as acções\n"
+#~ " --confirmation o mesmo que \"-w\"\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; and FILE may be a file\n"
+#~ "or a device. *This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "O programa tar GNU anterior à versão 1.12 não consegue ler arquivos \"--"
+#~ "posix\".\n"
+#~ "Se a variável POSIXLY_CORRECT estiver definida no ambiente, as extensões "
+#~ "GNU\n"
+#~ "são inibidas com \"--posix\". O suporte para POSIX está apenas "
+#~ "parcialmente \n"
+#~ "implementado, pelo que não se fiem muito nele, por agora.\n"
+#~ "ARQUIVO pode ser FICHEIRO, HOST:FICHEIRO ou UTILIZADOR@HOST:FICHEIRO; e \n"
+#~ "FICHEIRO pode ser um ficheiro ou um periférico.\n"
+#~ "*Este* tar assume, por defeito, \"-f%s -b %d\".\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Opção obsoleta, é agora \"-blocking-factor\" implica-a"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Nome de opção obsoleto, foi substituído por \"--blocking-factor\""
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Nome de opção obsoleto, foi substituído por \"--read-full-records\""
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Nome de opção obsoleto, foi substituído por \"--touch\""
+
+#~ msgid "Conflicting archive format options"
+#~ msgstr "Há conflitos entre as opções de formato do arquivo"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Nome de opção obsoleto, foi substituído por \"--absolute-names\""
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Nome de opção obsoleto, foi substituído por \"--block-number\""
+
+#, fuzzy
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Nome de opção obsoleto, foi substituído por \"--touch\""
+
+#, fuzzy
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Os argumentos obrigatórios para as opções longas também o são para as "
+#~ "curtas.\n"
+#~ "\n"
+#~ " --help mostra esta informação e termina\n"
+#~ " --version identifica a versão e termina\n"
+
+#~ msgid "EOF? What does that mean?"
+#~ msgstr "Fim-de-ficheiro? Que significa isto?"
+
+#~ msgid "Mode"
+#~ msgstr "Modo"
+
+#~ msgid "Uid"
+#~ msgstr "\"Uid\""
+
+#~ msgid "Gid"
+#~ msgstr "\"Gid\""
+
+#~ msgid "Size"
+#~ msgstr "Tamanho"
+
+#~ msgid "Missing filename after -C"
+#~ msgstr "Falta um nome de ficheiro após \"-C\""
+
+#~ msgid "Invalid date format in `-N %s'"
+#~ msgstr "Formato inválido para data em \"-N %s\""
+
+#~ msgid "Bad regular expression: %s"
+#~ msgstr "Expressão regular errada: %s"
+
+#~ msgid "File %s\n"
+#~ msgstr "Ficheiro %s\n"
+
+#~ msgid "Junk files\n"
+#~ msgstr "Ficheiros de lixo\n"
+
+#~ msgid "file %s\n"
+#~ msgstr "ficheiro %s\n"
+
+#~ msgid "Skip %ld\n"
+#~ msgstr "Salta %ld\n"
+
+#~ msgid "Out of first loop\n"
+#~ msgstr "Fora do primeiro ciclo\n"
+
+#~ msgid "Saved %d blocks, need %d more\n"
+#~ msgstr "Guardaram-se %d blocos, ainda são precisos %d\n"
+
+#~ msgid "New record\n"
+#~ msgstr "Novo registo\n"
+
+#~ msgid "Header type %d\n"
+#~ msgstr "Tipo de cabeçalho %d\n"
+
+#~ msgid "File %s "
+#~ msgstr "Ficheiro %s"
+
+#~ msgid "Flush it\n"
+#~ msgstr "Esvazia-o\n"
+
+#~ msgid "Flushing %d blocks from %s\n"
+#~ msgstr "Esvaziam-se %d blocos de %s\n"
+
+#~ msgid "Block: %d <= %d "
+#~ msgstr "Bloco: %d <= %d "
+
+#~ msgid "Block %d left\n"
+#~ msgstr "Deixou-se o bloco %d \n"
+
+#~ msgid "Final %d\n"
+#~ msgstr "Final %d\n"
+
+#~ msgid "Need %d kept_in %d keep %d\n"
+#~ msgstr "Precisa %d mantem dentro %d mantem %d\n"
+
+#~ msgid "Flush...\n"
+#~ msgstr "Esvaziamento...\n"
+
+#~ msgid "Copying %d\n"
+#~ msgstr "Copia de %d\n"
+
+#~ msgid "Now new %d need %d keep %d keep_in %d block %d/%d\n"
+#~ msgstr ""
+#~ "Novos agora %d precisa %d mantem %d mantem dentro %d bloco %d/%d\n"
+#~ "(N.T. Isto também é incompreensível em Inglês)\n"
+
+#~ msgid "Write record\n"
+#~ msgstr "Escreve-se registo\n"
+
+#, fuzzy
+#~ msgid "Fore to %x\n"
+#~ msgstr "Fore to %x\n"
+
+#~ msgid "Write block\n"
+#~ msgstr "Escreve-se o bloco\n"
+
+#~ msgid "Could not make %s"
+#~ msgstr "Não se conseguiu fazer %s"
+
+#~ msgid "Options [0-7][lmh] not supported by *this* tar"
+#~ msgstr "As opções [0-7][lmh] não funcionam neste \"tar\""
+
+#~ msgid "Cannot allocate %d bytes for restore"
+#~ msgstr "Não se consegue reservar %d bytes para a recuperação"
+
+#~ msgid "Saved %d recs, need %d more\n"
+#~ msgstr "Guardaram-se %d registos, ainda são precisos %d\n"
+
+#~ msgid "Could not link %s to %s"
+#~ msgstr "Não se conseguiu ligar %s a %s"
+
+#~ msgid "%c: Argument missing"
+#~ msgstr "%c: Falta argumento"
+
+#~ msgid "Could not create directory %s"
+#~ msgstr "Não se conseguiu criar a directoria %s"
+
+#~ msgid "Cannot change to directory %d"
+#~ msgstr "Não se pode mudar para a directoria %d"
+
+#~ msgid "rec %10ld: "
+#~ msgstr "reg %10ld: "
+
+#~ msgid "Flushing %d recs from %s\n"
+#~ msgstr "Estão-se a esvaziar %d registos de um total de %s\n"
+
+#~ msgid "Multiple archive files requires --multi-volume"
+#~ msgstr "Múltiplos ficheiros de arquivo exigem \"--multi-volume\""
+
+#~ msgid "Cannot change directory to %d"
+#~ msgstr "Não se pode mudar de directoria para %d"
+
+#~ msgid "[child] Pipe to stdin"
+#~ msgstr "[filho] \"Pipe\" para o stdin"
+
+#~ msgid "Cannot change owner of %s to uid %d gid %d"
+#~ msgstr "Não se pode mudar o dono de %s para \"uid\" %d \"gid\" %d"
+
+#~ msgid "Cannot change mode of file %s to %lo"
+#~ msgstr "Não se pode mudar o modo do ficheiro %s para %lo"
+
+#~ msgid "[child] Pipe to stdout"
+#~ msgstr "[filho] \"Pipe\" para o stdout"
+
+#~ msgid "Could not write to file %s"
+#~ msgstr "Não se conseguiu escrever no ficheiro %s"
+
+#~ msgid "Blocksize = %d records"
+#~ msgstr "Tamanho do bloco = %d registos"
+
+#~ msgid "%s: %s: Cannot link to %s, copying instead\n"
+#~ msgstr ""
+#~ "%s: %s: Não é possível fazer ligação para %s, em vez disso, copia-se\n"
+
+#~ msgid "Cannot close a file #%d"
+#~ msgstr "Não se consegue fechar o ficheiro de descritor %d"
+
+#~ msgid "Could not create symlink to %s"
+#~ msgstr "Não se conseguiu criar uma ligação (\"link\") simbólica para %s"
+
+#~ msgid "Now new %d need %d keep %d keep_in %d rec %d/%d\n"
+#~ msgstr ""
+#~ "Now new %d need %d keep %d keep_in %d rec %d/%d\n"
+#~ " (FIXME)"
+
+#~ msgid "Too many args with -T option"
+#~ msgstr "Argumentos demais para a opção \"-T\""
+
+#~ msgid "New block\n"
+#~ msgstr "Novo bloco\n"
+
+#~ msgid "Invalid value for blocksize"
+#~ msgstr "Valor inválido para o tamanho do bloco"
+
+#~ msgid "Cannot chown file %s to uid %d gid %d"
+#~ msgstr "Não se pode mudar o dono de %s para \"uid\" %d \"gid\" %d"
+
+#~ msgid "Cannot open a pipe"
+#~ msgstr "Não se consegue abrir um \"pipe\""
+
+#~ msgid "Could only write %d of %d bytes to file %s"
+#~ msgstr ""
+#~ "Só se conseguiu escrever %d \"bytes\" de um total de %d, no ficheiro %s"
+
+#~ msgid "Could not create file %s"
+#~ msgstr "Não se conseguiu criar o ficheiro %s"
+
+#~ msgid "Cannot keep old files on this system"
+#~ msgstr "Não se consegue manter os ficheiros antigos neste sistema"
+
+#~ msgid ""
+#~ "Skip %ld\n"
+#~ " ##################"
+#~ msgstr "Salta %ld\n"
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
new file mode 100644
index 0000000..30b3a6f
--- /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..90c91e1
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,2844 @@
+# tar: translation to Brazilian Portuguese (pt_BR)
+# Copyright (C) 1995, 2002 Free Software Foundation, Inc.
+# Alexandre Folle de Menezes <afmenez@terra.com.br>, 2002.
+# based on the previous translation to pt_BR (1.13.17) by
+# João Luiz Barbosa Silva <jl@conectiva.com.br>, 1997.
+# based on the translation to Portuguese (pt) by
+# António José Coutinho <ajc@di.uminho.pt>, 1996.
+# Marcus Moreira de Souza <marcusms@frb.br>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.13.25\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2002-11-27 20:30-0300\n"
+"Last-Translator: Alexandre Folle de Menezes <afmenez@terra.com.br>\n"
+"Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argumento %s inválido para %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argumento %s ambíguo para %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Os argumentos válidos são:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Uso: %s [OPÇÃO]...\n"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Tente `%s --help' para mais informações.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+"Informar erros no programa para <bug-tar@gnu.org>.\n"
+"Informar erros na tradução para <afmenez@terra.com.br>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Erro de sistema desconhecido"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: a opção `%s' exige um argumento\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: a opção `%s' é ambígua\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: a opção `--%s' não admite um argumento\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: a opção `%c%s' não admite um argumento\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: a opção `%s' exige um argumento\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opção `--%s' não reconhecida\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opção `%c%s' não reconhecida\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opção ilegal -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opção inválida -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: a opção exige um argumento -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: a opção `-W %s' é ambígua\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: a opção `-W %s' não aceita um argumento\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "tamanho de bloco"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "memória esgotada"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Não é possível %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Atenção: Não é possível %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Impossível mudar modo para %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Impossível alterar dono para uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Impossível fazer link para %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Erro de leitura no byte %s, lendo %lu bytes"
+msgstr[1] "%s: Erro de leitura no byte %s, lendo %lu bytes"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Aviso: Erro de leitura no byte %s, lendo %lu bytes"
+msgstr[1] "%s: Aviso: Erro de leitura no byte %s, lendo %lu bytes"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Impossível saltar para %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Aviso: Não é possível saltar para %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Impossível criar link simbólico para %s"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Gravados apenas %lu de um total de %lu bytes"
+msgstr[1] "%s: Gravados apenas %lu de um total de %lu bytes"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Removendo `%.*s' inicial dos nomes dos membros"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Removendo `%.*s' inicial dos nomes dos membros"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "Removendo `%.*s' inicial dos nomes dos membros"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Serviço não disponível"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "entrada padrão (stdin)"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "saída padrão (stdout)"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Impossível executar um shell remoto"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Impossível alocar espaço para buffer\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Impossível alocar espaço para buffer"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Tente `%s --help' para mais informações.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Uso: %s [OPÇÃO]\n"
+"Manipula uma unidade de fita, aceitando comandos de um processo remoto.\n"
+"\n"
+" --version Mostra informações de versão.\n"
+" --help Mostra esta ajuda.\n"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Informar erros no programa para <bug-tar@gnu.org>.\n"
+"Informar erros na tradução para <afmenez@terra.com.br>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Deslocamento de procura fora de faixa"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Deslocamento de procura fora de faixa"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Direção de procura fora de faixa"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Fim de arquivo prematuro\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Fim de arquivo prematuro"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Comando sem sentido"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Total de bytes escritos: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Total de bytes escritos: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(pipe)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Valor inválido para \"record_size\""
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Nome de arquivo-tar não informado"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr ""
+"Impossível verificar arquivos-tar de entrada/saída padrão (stdin/stdout)"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Impossível atualizar arquivos-tar compactados"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Ponto de verificação de escrita %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Ponto de verificação de leitura %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "No princípio da fita, encerrando agora"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Muitos erros, encerrando"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Bloco desalinhado (%lu bytes) no arquivo-tar"
+msgstr[1] "Bloco desalinhado (%lu bytes) no arquivo-tar"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Tamanho de registro = %lu blocos"
+msgstr[1] "Tamanho de registro = %lu blocos"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Impossível recuar no arquivo-tar; pode estar ilegível sem -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: contém um número de volume inválido"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Sobrecarga de número de volumes"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Prepare o volume #%d para %s e tecle Enter: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Fim-de-arquivo onde era esperado resposta do usuário"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "AVISO: O arquivo-tar está incompleto"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [nome] Dar um novo nome para o próximo volume (e os subseqüentes)\n"
+" q Abortar tar\n"
+" ! Criar um \"sub-shell\"\n"
+" ? Mostra esta lista\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Nenhum volume novo; encerrando.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "comando `%s' falhou"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Este não parece ser um arquivo-tar"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s não continua neste volume"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s não continua neste volume"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s é o tamanho errado (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Este volume está fora de sequência"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "O arquivo-tar não rotulado para casar com %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "O volume %s não casa com %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Só foi possível ler %lu de %lu bytes"
+msgstr[1] "Só foi possível ler %lu de %lu bytes"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "O conteúdo é diferente"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Final-de-arquivo inesperado no arquivo-tar"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "O tipo de arquivo é diferente"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Os modos são diferentes"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Os uid são diferentes"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "os gid são diferentes"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Os horários de modificação são diferentes"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Os tamanhos são diferentes"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Não está \"linkado\" a %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "O (\"Link\") simbólico é diferente"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "O número de dispositivo é diferente"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verificar "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr ""
+"%s: Tipo de arquivo \"%c\" desconhecido, comparado como um arquivo normal"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "ERRO DE VERIFICAÇÃO: detectados %d cabeçalhos inválidos"
+msgstr[1] "ERRO DE VERIFICAÇÃO: detectados %d cabeçalhos inválidos"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: arquivo é o arquivo-tar; não será arquivado"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "valor %s fora da faixa %s: %s..%s; substituindo %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "valor %s fora da faixa %s: %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Gerando cabeçalhos octais negativos"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: arquivo sem alterações; não será arquivado"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: arquivo sem alterações; não será arquivado"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: arquivo sem alterações; não será arquivado"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: o arquivo diminuiu %s bytes; completando com zeros"
+msgstr[1] "%s: o arquivo diminuiu %s bytes; completando com zeros"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: arquivo está em outro sistema de arquivos; não será arquivado"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Tipo de arquivo desconhecido; arquivo ignorado"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " link para %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: arquivo sem alterações; não será arquivado"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: arquivo é o arquivo-tar; não será arquivado"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: arquivo removido antes de ser lido"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: arquivo é o arquivo-tar; não será arquivado"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: arquivo alterado enquanto estava sendo lido"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: \"socket\" ignorado"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: porta ignorada"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Pulando para o próximo cabeçalho"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Removendo um não-cabeçalho do arquivo-tar"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: o carimbo de horário %s está %lu s no futuro"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Inconsistência inesperada ao criar diretório"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Diretório renomeado antes de se poder extrair seu estado"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Extraindo arquivos contíguos como sendo arquivos normais"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Tentativa de extrair \"links\" simbólicos como \"links\" físicos"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Lendo %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Impossível extrair -- arquivo é a continuação de outro volume"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Fim de arquivo inesperado nos nomes cifrados"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Tipo de arquivo '%c' desconhecido; extraindo como arquivo normal"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Impossível fazer backup deste arquivo"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Impossível renomear para %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Erro não é recuperável: saindo agora"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Diretório foi renomeado"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Diretório foi renomeado"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: O diretório é novo"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Carimbo de horário inválido"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Modo inválido informado na opção"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Número de dispositivo inválido"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Número de inode inválido"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Final-de-arquivo inesperado no arquivo-tar"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Impossível alocar memória para um fator de bloco %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: arquivo está em outro sistema de arquivos; não será arquivado"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Removendo %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Impossível remover"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Omitindo"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "bloco %s: ** Bloco de NULs **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "bloco %s: ** Fim-de-arquivo **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "bloco %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Espaço em branco no cabeçalho onde valor numérico `%s' era esperado"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"O valor octal do arquivo-tar %.*s está fora de faixa %s; assumindo "
+"complemento de dois"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "O valor octal do arquivo-tar %.*s está fora de faixa %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "o arquivo-tar contém cabeçalhos base-64 obsoletos"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "A string base-64 assinada do arquivo-tar %s está fora de faixa %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "O valor base-256 de arquivo-tar está fora da faixa %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "O arquivo-tar contém %.*s onde valor numérico %s era esperado"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "o valor do arquivo-tar %s está fora da faixa %s: %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " link para %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " tipo de arquivo \"%s\" desconhecido\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Cabeçalho de volume--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Continua no byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Criando de diretório:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Renomeando %s para %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Impossível renomear para %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Renomeando %s de volta para %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Impossível salvar diretório de trabalho"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Impossível mudar o diretório de trabalho"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "processo filho"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "canal interprocesso"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Não foi encontrado no arquivo-tar"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Não foi encontrado no arquivo-tar"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Ambas as opções `-%s' e `-%s' exigem a entrada padrão"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Grupo inválido"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Desejadas características GNU num arquivo-tar com formato incompatível"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Uso: %s [OPÇÃO]... [ARQUIVO]...\n"
+"\n"
+"Exemplos:\n"
+" %s -cf arquivo.tar foo bar # Cria arquivo.tar através dos arquivos foo e "
+"bar.\n"
+" %s -tvf arquivo.tar # Lista todos os arquivos em arquivo.tar.\n"
+" %s -xf arquivo.tar # Extrai todos os arquivos de arquivo.tar\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+"Sufixo do backup é `~', a menos que usado --suffix ou SIMPLE_BACKUP_SUFFIX.\n"
+"Os controles de versão que podem ser usados com --backup ou "
+"VERSION_CONTROL,\n"
+"são:\n"
+"\n"
+" t, numbered faz backups numerados\n"
+" nil, existing numera se existe backup numerado, se não faz simples\n"
+" never, simple sempre faz backups simples\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Final-de-arquivo inesperado no arquivo-tar"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Erro ao escrever para saída padrão"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Impossível verificar arquivos-tar multi-volume"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Opções de formato do arquivo-tar conflitantes"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s: arquivo é o arquivo-tar; não será arquivado"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s: arquivo é o arquivo-tar; não será arquivado"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Impossível mudar o diretório de trabalho"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Removendo `%.*s' inicial dos nomes dos membros"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "O volume %s não casa com %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Não é possível especificar mais do que uma das opções \"-Acdtrux\""
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Opções de compressão conflitantes"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " tipo de arquivo \"%s\" desconhecido\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Arquivo de datas não encontrado"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Substituindo %s pelo formato de data desconhecido %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: arquivo é o arquivo-tar; não será arquivado"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Fator de blocagem inválido"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Aviso: a opção -I não é suportada; talvez a intenção fosse -j ou -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Tamanho da fita inválido"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Mais do que uma data limite"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Grupo inválido"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Modo inválido informado na opção"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "Número de inode inválido"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Dono inválido"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Tamanho de registro inválido"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "O tamanho dos registros tem que ser múltiplo de %d."
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "Tamanho da fita inválido"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr ""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "As opções \"-[0-7][lmh]\" não são suportadas por *este* tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "A opção antiga `%c' exige um argumento."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Múltiplos arquivos-tar é exigem a opção \"-M\""
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Impossivel combinar --listed-incremental com --newer"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: O rótulo do volume é longo demais (o limite é %lu bytes)"
+msgstr[1] "%s: O rótulo do volume é longo demais (o limite é %lu bytes)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Impossível verificar arquivos-tar multi-volume"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Impossível verificar arquivos-tar compactados"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Impossível usar arquivos-tar compactados multi-volume"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Impossível atualizar arquivos-tar compactados"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Recusando a criar um arquivo-tar vazio"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "As opções `-Aru' são incompatíveis com `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Deve ser especificada uma das opções \"-Acdtrux\""
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Saída por erro atrasada pelos erros anteriores"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: O arquivo encolheu %s bytes"
+msgstr[1] "%s: O arquivo encolheu %s bytes"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "A string base-64 assinada do arquivo-tar %s está fora de faixa %s"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "o valor do arquivo-tar %s está fora da faixa %s: %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Gera arquivos de dados para pacote de testes GNU tar.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Opções de compressão conflitantes"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Erro ao escrever para saída padrão"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Carimbo de horário inválido"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Número do inode fora de faixa"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Erro de sistema desconhecido"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Impossível saltar para %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " tipo de arquivo \"%s\" desconhecido\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Impossível saltar para %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "O processo filho morreu com o sinal %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Nomes de arquivos truncados--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close"
+#~ msgstr "Impossível fechar"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Impossível duplicar (\"dup\")"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Impossível usar arquivos-tar compactados ou remotos"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (filho)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (neto)"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "AVISO: Não há cabeçalho de volume"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "O processo filho retornou estado %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Os nomes dos membros contém `..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: O nome do membro contém `..'"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Erro evidente de nome longo"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Carimbo de horário fora da faixa"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Número do dispositivo fora de faixa"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Erro de nome longo evidente"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Renomeado %s para %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Impossível fazer link simbólico para %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s ligado simbolicamente a %s (\"link\")"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Comando de decifragem \"%s\" desconhecido"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Falta um nome de arquivo após \"-C\""
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Esse programa não possui NENHUMA GARANTIA, até onde permitido pela lei.\n"
+#~ "Pode ser redistribuído sob os termos da Licença Publica Geral GNU;\n"
+#~ "veja o arquivo COPYING para maiores detalhes."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Comando \"%c\" não faz sentido\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "O GNU `tar' salva vários arquivos em um único arquivo-tar em fita ou "
+#~ "disco,\n"
+#~ "e pode restaurar arquivos individualmente.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Se uma opção longa aparece como argumento obrigatório, então também o é "
+#~ "para a\n"
+#~ "opção curta equivalente. Idem para argumentos opcionais.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modo de operação principal:\n"
+#~ " -t, --list lista o conteúdo de um arquivo-tar\n"
+#~ " -x, --extract, --get extrai arquivos do arquivo-tar\n"
+#~ " -c, --create cria um novo arquivo-tar\n"
+#~ " -d, --diff, --compare compara o arquivo-tar com arquivos atuais\n"
+#~ " -r, --append anexa arquivos no fim do arquivo-tar\n"
+#~ " -u, --update atualiza arquivos contidos no arquivo-tar\n"
+#~ " -A, --catenate anexa outros arquivos-tar a um arquivo-tar\n"
+#~ " --concatenate o mesmo que \"-A\"\n"
+#~ " --delete remove do arquivo-tar (exceto para fitas)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modificadores de operação:\n"
+#~ " -W, --verify tenta verificar o arquivo-tar após gravação\n"
+#~ " --remove-files remove arquivos depois de incluí-los no "
+#~ "arquivo-tar\n"
+#~ " -k, --keep-old-files não sobrescreve arquivo existente ao "
+#~ "extrair\n"
+#~ " --overwrite sobrescreve arquivos existentes ao extrair\n"
+#~ " --overwrite-dir sobrescreve dados sobre diretórios ao "
+#~ "extrair\n"
+#~ " -U, --unlink-first remove cada arquivo antes de extraí-lo\n"
+#~ " --recursive-unlink remove hierarquia antes de extrair "
+#~ "diretórios\n"
+#~ " -S, --sparse trata arquivos esparsos eficientemente\n"
+#~ " -O, --to-stdout extrai os arquivos para stdout\n"
+#~ " -G, --incremental trata antigo formato incremental GNU\n"
+#~ " -g, --listed-incremental=ARQUIVO\n"
+#~ " trata novo formato incremental GNU\n"
+#~ " --ignore-failed-read não sai com erro em arquivos ilegíveis.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tratamento dos atributos dos arquivos:\n"
+#~ " --owner=NOME força NOME como dono dos arquivos "
+#~ "adicionados\n"
+#~ " --group=GRUPO força GRUPO como grupo dos arquivos "
+#~ "adicionados\n"
+#~ " --mode=PERM força permissões PERM para arquivos "
+#~ "adicionados\n"
+#~ " --atime-preserve não altera as datas de acesso dos "
+#~ "arquivos\n"
+#~ " -m, --modification-time não extrai a data de modificação dos "
+#~ "arquivos\n"
+#~ " --same-owner extrai os arquivos tentando manter o dono\n"
+#~ " --no-same-owner extrai os arquivos com o usuário atual "
+#~ "como dono\n"
+#~ " --numeric-owner usa sempre números para nomes de usuário e "
+#~ "grupo\n"
+#~ " -p, --same-permissions mantém as permissões dos arquivos na "
+#~ "extração\n"
+#~ " --no-same-permissions não extrai as informações de permissões\n"
+#~ " --preserve-permissions o mesmo que -p\n"
+#~ " -s, --same-order ordena os nomes a extrair segundo a ordem "
+#~ "do arquivo-tar\n"
+#~ " --preserve-order o mesmo que -s\n"
+#~ " --preserve o mesmo que -p e -s juntos\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Escolha e substituição de dispositivo:\n"
+#~ " -f, --file=ARQ usa o arquivo ou dispositivo ARQ\n"
+#~ " --force-local o arquivo é local, mesmo que tenha \":"
+#~ "\"\n"
+#~ " --rsh-command=COM usar o comando remoto COM, em vez de "
+#~ "\"rsh\"\n"
+#~ " -[0-7][lmh] escolher o acionador e a densidade\n"
+#~ " -M, --multi-volume tratar arquivos multi-volume\n"
+#~ " -L, --tape-length=NUM tratar NUM x 1024 \"bytes\" por fita "
+#~ "magnética\n"
+#~ " -F, --info-script=ARQ executar ARQ no final de cada fita "
+#~ "(implica em -M)\n"
+#~ " --new-volume-script=ARQ o mesmo que \"-F ARQ\"\n"
+#~ " --volno-file=ARQ usa/atualiza o número do volume em ARQ\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Blocagem no dispositivo:\n"
+#~ " -b, --blocking-factor=BLOCOS BLOCOS x 512 bytes por registro\n"
+#~ " --record-size=TAM TAM bytes por registro, múltiplo de 512\n"
+#~ " -i, --ignore-zeros ignorar os blocos zerados no arquivo-"
+#~ "tar\n"
+#~ " (significam fim-de-arquivo)\n"
+#~ " -B, --read-full-records dividir leitura em blocos (para pipes "
+#~ "4.2BSD)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Seleção do formato do arquivo-tar:\n"
+#~ " -V, --label=NOME cria um arquivo com nome de volume "
+#~ "NOME\n"
+#~ " REGEXP ao extrair/listar, NOME é expressão "
+#~ "regular\n"
+#~ " -o, --old-archive, --portability gravar um arquivo no-tar formato V7\n"
+#~ " --posix gravar um arquivo-tar conforme com "
+#~ "POSIX\n"
+#~ " -j, --bzip2 filtra o arquivo-tar através do "
+#~ "bzip2\n"
+#~ " -z, --gzip, --ungzip filtra o arquivo-tar através do gzip\n"
+#~ " -Z, --compress, --uncompress filtra o arquivo-tar através do "
+#~ "compress\n"
+#~ " --use-compress-program=PROG filtra através de PROG (precisa "
+#~ "aceitar -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Seleção local de arquivos:\n"
+#~ " -C, --directory DIR mudar para diretório DIR\n"
+#~ " -T, --files-from=NOME obter do arquivo NOME a lista de arquivos a\n"
+#~ " criar ou extrair\n"
+#~ " --null faz com que \"-T\" leia nomes terminados por "
+#~ "NULO,\n"
+#~ " também inibe \"-C\"\n"
+#~ " --exclude=PADRÃO excluir os arquivos descritos pelo PADRÃO\n"
+#~ " -X, --exclude-from=ARQ excluir arquivos, segundo os padrões em ARQ\n"
+#~ " --anchored padrões de exclusão combinam com início do "
+#~ "nome do arquivo (padrão)\n"
+#~ " --no-anchored padrões de exclusão combinam depois de "
+#~ "qualquer /\n"
+#~ " --ignore-case exclusão ignora maiúsculas/minúsculas\n"
+#~ " --no-ignore-case exclusão considera maiúsculas/minúsculas "
+#~ "(padrão)\n"
+#~ " --wildcards padrões de exclusão usam coringas (padrão)\n"
+#~ " --no-wildcards padrões de exclusão são strings simples\n"
+#~ " --wildcards-match-slash coringas dos padrões de exclusão combinam "
+#~ "com '/' (default)\n"
+#~ " --no-wildcards-match-slash coringas dos padrões de exclusão não "
+#~ "combinam com '/'\n"
+#~ " -P, --absolute-names preservar os \"\\\" iniciais nos nomes dos "
+#~ "arquivos\n"
+#~ " -h, --dereference usar os próprios arquivos, em lugar dos "
+#~ "ligações\n"
+#~ " simbólicas (symlinks) que os referenciam\n"
+#~ " --no-recurse não descer pela árvore de diretórios\n"
+#~ " -l, --one-file-system não sair do sistema local de arquivos, ao "
+#~ "criar o\n"
+#~ " arquivo-tar\n"
+#~ " -K, --starting-file=NOME começar pelo arquivo NOME, no arquivo-tar\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATA guardar apenas arquivos mais recentes que "
+#~ "DATA\n"
+#~ " --newer-mtime=DATE comparar apenas data e hora quando os dados "
+#~ "mudarem\n"
+#~ " --after-date=DATA o mesmo que -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=CONTROL] copia antes de remover, possibilita escolha\n"
+#~ " de controle de versão\n"
+#~ " --suffix=SUFIXO copia antes de remover, ignora sufixo usual\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Prestação de informações:\n"
+#~ " --help mostra esta ajuda e sai\n"
+#~ " --version mostra número da versão do programa tar e sai\n"
+#~ " -v, --verbose mostra lista de arquivos processados\n"
+#~ " --checkpoint indica os nomes dos diretórios ao ler o arquivo-"
+#~ "tar\n"
+#~ " --totals indica o total de bytes gravados ao criar o "
+#~ "arquivo-tar\n"
+#~ " -R, --block-number mostra o número de bloco do arquivo-tar, para "
+#~ "cada mensagem\n"
+#~ " -w, --interactive pede confirmação para cada ação\n"
+#~ " --confirmation o mesmo que -w\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "O programa tar GNU não consegue ler arquivos-tar \"--posix\". Se a "
+#~ "variável\n"
+#~ "POSIXLY_CORRECT estiver definida no ambiente, as extensões GNU podem ser\n"
+#~ "inibidas com \"--posix\". O suporte para POSIX está apenas parcialmente\n"
+#~ "implementado, pelo que não se confie muito nele, por enquanto.\n"
+#~ "ARQUIVO-TAR pode ser ARQUIVO, HOST:ARQUIVO ou USUÁRIO@HOST:ARQUIVO; e \n"
+#~ "ARQUIVO pode ser um arquivo ou um dispositivo.\n"
+#~ "*Este* `tar' assume, por default, \"-f%s -b %d\".\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Opção obsoleta, agora subentendida por --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Nome de opção obsoleta substituída por --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Nome de opção obsoleta substituído por --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Nome de opção obsoleta substituído por --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Nome de opção obsoleta substituída por --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Nome de opção obsoleta substituída por --block-number"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Aviso: a opção -y não é suportada; talvez a intenção fosse -j?"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Nome de opção obsoleta substituída por --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Escrito por John Gilmore e Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Os argumentos obrigatórios para as opções longas também são obrigatórios\n"
+#~ "para as opções curtas equivalentes.\n"
+#~ "\n"
+#~ " -l, --file-length=TAM TAManho do arquivo gerando\n"
+#~ " -p, --pattern=PADRÃO PADRÃO é `default' ou `zeros'\n"
+#~ " --help exibe esta ajuda e sai\n"
+#~ " --version exibe informações de versão e sai\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Escrito por François Pinard"
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..7cd0b7e
--- /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..f7615d6
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,2561 @@
+# Mesajele în limba românã pentru GNU tar
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# Laurentiu Buzdugan <lbuz@rolix.org>>, 2005.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.15.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2005-07-15 12:00-0500\n"
+"Last-Translator: Laurentiu Buzdugan <lbuz@rolix.org>\n"
+"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argument invalid %s pentru %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argument ambiguu %s pentru %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Argumente valide sunt:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: parametrul ARGP_HELP_FMT necesitã o valoare"
+
+#: lib/argp-help.c:227
+#, fuzzy, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: parametrul ARGP_HELP_FMT necesitã o valoare"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: parametru ARGP_HELP_FMT necunoscut"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Gunoi în ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+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 "
+"obligatorii sau opþionale ºi pentru opþiunile corespunzãtoare scurte."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Folosire:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " sau: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [OPÞIUNE...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr ""
+"Încercaþi `%s --help' sau `%s --usage' pentru informaþii suplimentare.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Raportaþi bug-uri la %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Eroare sistem necunoscutã"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+#, fuzzy
+msgid "give this help list"
+msgstr "Afiºeazã aceastã listã de ajutor"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+#, fuzzy
+msgid "give a short usage message"
+msgstr "Afiºeazã un scurt mesaj despre folosire"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NUME"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+#, fuzzy
+msgid "print program version"
+msgstr "Afiºeazã versiunea programului"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: opþiunea `%s' necesitã un argument\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: opþiunea `%s' este ambiguã\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: opþiunea `--%s' nu permite un argument\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: opþiunea `%c%s' nu permite un argument\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: opþiunea `%s' necesitã un argument\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opþiunea `--%s' nu este recunoscutã\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opþiunea `%c%s' bu este recunoscutã\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opþiune ilegalã -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opþiune invalidã -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opþiunea necesitã un argument -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: opþiunea `-W %s' este ambiguã\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: opþiunea `-W %s' nu permite un argument\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "dimensiune bloc"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "memorie epuizatã"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Nu pot %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Avertisment: Nu pot %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Nu pot schimba modul ca %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Nu pot schimba proprietatea cãtre uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Nu pot crea hard link cãtre %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Eroare citire la octet %s, citind %lu octet"
+msgstr[1] "%s: Eroare citire la octet %s, citind %lu octeþi"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Avertisment: Eroare citire la octet %s, citind %lu octet"
+msgstr[1] "%s: Avertisment: Eroare citire la octet %s, citind %lu octeþi"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Nu pot cãuta (seek) cãtre %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Avertisment: Nu pot cãuta (seek) cãtre %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Nu pot crea symlink cãtre %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Am scris numai %lu din %lu octet"
+msgstr[1] "%s: Am scris numai %lu din %lu octeþi"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Eliminãm primul `%s' din numele membrilor"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Eliminãm primul `%s' din destinaþiile hard link"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Înlocuiesc `.' pentru nume de membrii goale"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Înlocuiesc `.' pentru destinaþii hard link goale"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Serviciu indisponibil"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Nu pot executa shell remote"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Nu pot aloca spaþiu memorie intermediarã\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Nu pot aloca spaþiu memorie intermediarã"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Încercaþi `%s --help' pentru informaþii suplimentare.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Folosire: %s [OPÞIUNE]\n"
+"Manipuleazã o unitate de bandã, acceptând comenzi de la un proces remote.\n"
+"\n"
+" --version Afiºeazã informaþii versiune.\n"
+" --help Afiºeazã acest mesaj.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Raportaþi bug-uri la <%s>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Decalaj cãutare (seek offset) în afara domeniului"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Decalaj cãutare (seek offset) în afara domeniului"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Direcþie cãutare (seek direction) în afara domeniului"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: eof prematur\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Sfârºit de fiºier prematur"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Comandã gunoi"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Numãr total octeþi scriºi: %s (%s, %s/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Numãr total octeþi scriºi: %s (%s, %s/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(pipe)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Valoare invalidã pentru record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Nume arhivã nu a fost furnizat"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Nu pot verifica arhive atdin/stdout"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Arhiva este compresatã. Folosiþi opþiunea %s."
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Nu pot actualiza arhive comprimate"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Scrie punct de verificare %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Citeºte punct de verificare %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "La începutul benzii, ieºim acum"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Prea multe erori, ieºim"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Bloc ne-aliniat (%lu octet) în arhivã"
+msgstr[1] "Bloc ne-aliniat (%lu octeþi) în arhivã"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Dimensiune înregistrare = %lu bloc"
+msgstr[1] "Dimensiune înregistrare = %lu blocuri"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Nu pot backspace fiºierul arhivã; acesta ar putea fi de necitit fãrã -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek nu s-a oprit la limita unei înregistrãri"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: conþine numãr volum invalid"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Depãºire domeniu numãr volum"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Preparã volum #%d pentru %s ºi apasã tasta return: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "EOF unde era aºteptat rãspunsul utilizatorului"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "AVERTISMENT: Arhiva este incompletã"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [nume] Daþi un nume de fiºier nou pentru urmatoarele volume\n"
+" q Abandoneazã tar\n"
+" ! Lanseazã un subshell\n"
+" ? Afiºeazã aceastã listã de opþiuni\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Nici un volum nou; terminãm.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "`%s' comanda a eºuat"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Aceasta nu pare a fi o arhivã tar"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s nu este continuat pe acest volum"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s nu este continuat pe acest volum"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s este de dimensiune greºitã (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Acest volum este în afara secvenþei"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arhiva nu este etichetatã sã se potriveascã cu %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Volumul %s nu se potriveºte cu %s"
+
+#: src/buffer.c:1392
+#, fuzzy, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: nume fiºier prea lung pentru a fi storat într-un antet GNU multivolum"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Am putut citi doar %lu din %lu octet"
+msgstr[1] "Am putut citi doar %lu din %lu octeþi"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Conþinuturile diferã"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "EOF neaºteptat în arhivã"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Tipul fiºierelor diferã"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Modurile diferã"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid diferã"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid diferã"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Timp modificare diferã"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Dimensiunea diferã"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Nu este link-at cãtre %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symlink diferã"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Numãr dispozitiv diferã"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verificã "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr ""
+"%s: Tip de fiºier necunoscut '%c', folosesc diff ca pentru un fiºier normal"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Arhiva conþine nume de fiºiere cu prefixele îndepãrtate."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Verificare ar putea eºua sã gãseascã fiºierele originale."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "VERIFICÃ EªEC: detectat %d antet invalid"
+msgstr[1] "VERIFICÃ EªEC: detectat %d antete invalide"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: conþine o etichetã de director cache; nimic generat"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "valoarea %s în afara %s intervalului %s..%s; înlocuiesc %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "valoarea %s în afara %s intervalului %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Generez antete octale negative"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: numele fiºierul este prea lung (maxim %d); nimic generat"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: numele fiºierul este prea lung (nu poate fi spart); nimic generat"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: numele link-ului este prea lung; nimic generat"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Fiºier scurtat cu %s octet; completat cu zerouri"
+msgstr[1] "%s: Fiºier scurtat cu %s octeþi; completat cu zerouri"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: fiºierul este pe un sistem de fiºiere diferit; nimic generat"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Tip de fiºier necunoscut; fiºier ignorat"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr "Link lipsã cãtre '%s'.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: fiºierul este neschimbat; nimic generat"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: fiºierul este în arhivã; nimic generat"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Fiºier ºters înainte de a-l putea citi"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: conþine o etichetã de director cache; nimic generat"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: fiºier schimbat în timp ce îl citeam"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: socket ignorat"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: uºã ignoratã"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Sãrim la urmãtorul antet"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "ªtergem non-antet din arhivã"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: înregistrare de timp neverosimilã %s"
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: înregistrare timp %s este %lu sec în viitor"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Inconsistenþã neaºteptatã când cream directorul"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Director redenumit înainte de a fi putut extrage starea sa"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Extragem fiºiere contigue ca fiºiere normale"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Încerc extragerea link-urilor simbolice ca link-uri hard"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Citesc %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Nu pot extrage -- fiºierul este continuat din altã arhivã"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "EOF neaºteptat în numele amestecate"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Tip de fiºier necunoscut '%c', extras ca fiºier normal"
+
+#: src/extract.c:1184
+#, fuzzy, c-format
+msgid "Current %s is newer or same age"
+msgstr "`%s' curent este mai nou"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Nu am putut arhiva (backup) acest fiºier"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Nu pot redenumi ca %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Nu-mi pot reveni din eroare: termin acum"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Directorul a fost redenumit"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Directorul a fost redenumit"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Directorul este nou"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Înregistrare timp invalidã"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Mod invalid furnizat ca opþiune"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Numãr dispozitiv invalid"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Numãr inode invalid"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "EOF neaºteptat în arhivã"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Argument densitate malformat: '%s'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Argument densitate malformat: '%s'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr ""
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Nu curãþ director: nu pot determina statistici"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: directorul este pe un dispozitiv (device) diferit; necurãþat"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: ªtergem %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Nu pot ºterge"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Omis"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "bloc %s: ** Bloc de NUL-uri **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Un bloc zero singuratic la %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "bloc %s: ** Sfârºit de fiºier **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "bloc %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Spaþii libere în antet unde valoare %s numericã aºteptatã"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Valoare octalã %.*s este în afara %s intervalului; presupunem complementul "
+"lui doi"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Valoare octalã arhivã %.*s este în afara %s intervalului"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Arhiva conþine antete în baza-64 depãºite"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "ªir în baza-64 (semnãtura arhivei) %s este în afara %s intervalului"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Valoare baza-256 a arhivei este în afara %s intervalului"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arhiva conþine %.*s unde valoare %s numericã aºteptatã"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, fuzzy, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Valoare arhivã %s este în afara %s intervalului %s.%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " link cãtre %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " tip fiºier necunoscut %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Link Lung--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Nume Lung--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Antet Volum--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Continuat la octet %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Creez director:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Redenumesc %s ca %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Nu pot redenumi ca %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Redenumesc %s înapoi ca %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Nu pot salva directorul în care lucrez"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Nu pot schimba directorul în care lucrez"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "proces copil"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "canal între-procese"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Nu a fost gãsit în arhivã"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Lucrul cerut nu a fost gãsit în arhivã"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Opþiunile `-%s' ºi `-%s' vor amândouã intrarea standard"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Format arhivã invalid"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Capabilitãþi GNU cerute pentru un format de arhivã incompatibil"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU tar salveazã mai multe fiºiere împreunã într-o singurã arhivã pe bandã "
+"sau disc ºi poate restaura fiºiere individuale din arhivã.\n"
+"\n"
+"Exemple:\n"
+" tar -cf arhiva.tar foo bar # Creazã arhiva.tar din fiºierele foo ºi bar.\n"
+" tar -tvf arhiva.tar # Listeazã cu amãnunte toate fiºierele din "
+"arhiva.tar.\n"
+" tar -xf arhiva.tar # Extrage toate fiºierele din arhiva.tar.\n"
+"\vSufixul pentru backup este `~', dacã nu este setat cu --suffix sau "
+"SIMPLE_BACKUP_SUFFIX.\n"
+"Versiunea de control poate fi setatã cu --backup sau VERSION_CONTROL, "
+"valorile permise sunt:\n"
+"\n"
+" t, numbered creazã backup numerotat\n"
+" nil, existing numeroteazã dacã existã backup numerotat, altfel simplu\n"
+" never, simple întotdeauna creazã backup simplu\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"GNU tar salveazã mai multe fiºiere împreunã într-o singurã arhivã pe bandã "
+"sau disc ºi poate restaura fiºiere individuale din arhivã.\n"
+"\n"
+"Exemple:\n"
+" tar -cf arhiva.tar foo bar # Creazã arhiva.tar din fiºierele foo ºi bar.\n"
+" tar -tvf arhiva.tar # Listeazã cu amãnunte toate fiºierele din "
+"arhiva.tar.\n"
+" tar -xf arhiva.tar # Extrage toate fiºierele din arhiva.tar.\n"
+"\vSufixul pentru backup este `~', dacã nu este setat cu --suffix sau "
+"SIMPLE_BACKUP_SUFFIX.\n"
+"Versiunea de control poate fi setatã cu --backup sau VERSION_CONTROL, "
+"valorile permise sunt:\n"
+"\n"
+" t, numbered creazã backup numerotat\n"
+" nil, existing numeroteazã dacã existã backup numerotat, altfel simplu\n"
+" never, simple întotdeauna creazã backup simplu\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Mod de operare principal:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "listeazã conþinutul unei arhive"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "extrage fiºiere dintr-o arhivã"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "creazã o nouã arhivã"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "gãseºte diferenþele dintre arhive ºi sistemul de fiºiere"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "adaugã fiºiere la sfârºitul unei arhive"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "adaugã numai fiºierele mai noi decât copia din arhivã"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "adaugã fiºiere tar la o arhivã"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "ºterge din arhivã (nu pe benzi magnetice!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Modificatori operaþie:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "manipuleazã eficient fiºierele rerefiate (sparse)"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "foloseºte vechiul format GNU pentru backup incremental"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "FIªIER"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "foloseºte noul format GNU pentru backup incremental"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "nu termina cu non-zero pentru fiºiere ce nu pot fi citite"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "NUMÃR"
+
+#: src/tar.c:404
+#, fuzzy
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"proceseazã numai a NUM-ãra apariþie a fiecãrui fiºier în arhivã. Aceastã "
+"opþiune este validã numai în combinaþie cu una dintre subcomenzile --delete, "
+"--diff, --extract sau --list ºi când o listã de fiºiere este datã fie în "
+"linia de comandã sau folosind opþiunea -T. Implicit, NUMBER=1."
+
+#: src/tar.c:410
+#, fuzzy
+msgid "archive is seekable"
+msgstr "Arhiva este cãutabilã"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "încearcã sã verifici arhiva dupã scrierea sa"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "ºterge fiºierele dupã ce acestea sunt adãugate la arhivã"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "nu înlocui fiºierele existente la extragere"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"nu înlocui fiºierele existente care sunt mai noi decât copiile acestora din "
+"arhivã"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "supra-scrie fiºierele existente la extragere"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "ºterge fiecare fiºier înainte de a extrage peste acesta"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "goleºte ierarhiile înainte de a extrage un director"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "pãstrazã metadata directoarelor existente"
+
+#: src/tar.c:434
+#, fuzzy
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "supra-scrie fiºierele existente la extragere"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "extrage fiºierele la ieºirea standard"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "COMANDÃ"
+
+#: src/tar.c:445
+#, fuzzy
+msgid "pipe extracted files to another program"
+msgstr "extrage fiºierele la ieºirea standard"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Manipulare atribute fiºiere:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "forþeazã NUME ca proprietar pentru fiºierele adãugate"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "forþeazã NUME ca grup pentru fiºierele adãugate"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATA-FIªIERULUI"
+
+#: src/tar.c:461
+#, fuzzy
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "stocheazã numai fiºiere mai noi decât DATA-FIªIERULUI"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "SCHIMBÃRI"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "forþeazã mod (simbolic) SCHIMBÃRI pentru fiºierele adãugate"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "nu extrage timpul de modificare al fiºierului"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "încearcã extragerea fiºierelor cu aceleaºi drepturi (ownership)"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "extrage fiºierele ca dvs. însuºi"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "foloseºte întotdeauna numere pentru numele utilizator/grup"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "sorteazã numele de extras sã se potriveascã cu arhiva"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "la fel ca -p ºi -s"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Selectare ºi schimbare unitate:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARHIVÃ"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "foloseºte fiºier arhivã sau unitate ARHIVÃ"
+
+#: src/tar.c:502
+#, fuzzy
+msgid "archive file is local even if it has a colon"
+msgstr "fiºier arhivã este local chiar când are un :"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "foloseºte rmt COMANDÃ în loc de rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "foloseºte remote COMANDÃ în loc de rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "specificã unitate ºi densitate"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "creazã/listeazã/extrage arhiva pe volume multiple"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "schimbã banda dupã scriere a NUMÃR x 1024 octeþi"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "ruleazã script la terminarea fiecãrei benzi (implicã -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "foloseºte/actualizeazã numãrul de volum în FIªIER"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Blocuri unitate:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOCURI"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLOCURI x 512 octeþi pe întregistrare"
+
+#: src/tar.c:541
+#, fuzzy
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "DIMENSIUNE octeþi pe înregistrare, multiplu de 12"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "ignorã blocuri zero-uate în arhivã (înseamnã EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "redimensioneazã bloc în timpul citirii (pentru pipe-uri BSD4.2"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Selecþie format arhivã:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMAT"
+
+#: src/tar.c:553
+#, fuzzy
+msgid "create archive of the given format"
+msgstr "creazã arhiva de formatul dat."
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "FORMAT este unul din urmãtoarele"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "vechiul format tar V7"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "oldgnu formatul GNU format ca pentru tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "formatul GNU tar 1.13.x"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "formatul POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "formatul POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+#, fuzzy
+msgid "same as pax"
+msgstr "ca ºi pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "ca ºi --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "ca ºi --format=posix"
+
+#: src/tar.c:573
+#, fuzzy
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "cuvânt_cheie[[:]=valoare][,cuvânt_cheie[[:]=valoare], ...]"
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "controleazã cuvintele cheie pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "TEXT"
+
+#: src/tar.c:576
+#, fuzzy
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"creazã arhivã nu nume volum NUME. La listare/extragere, foloseºte TEXT ca "
+"pattern de globbing"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "filtrazã arhiva prin bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "filtreazã arhiva prin gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "filtreazã arhiva prin compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "filtreazã prin PROG (trebuie sã accepte -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Selecþie fiºier local:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "DIR"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "schimbã în directorul DIR"
+
+#: src/tar.c:599
+#, fuzzy
+msgid "get names to extract or create from FILE"
+msgstr "obþine numele de extras sau creat din fiºierul NUME"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T citeºte nume terminate cu null, deactiveazã cu -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "PATTERN"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "exclude fiºiere, date ca un PATTERN"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "pattern-urile de excludere sunt listate în FIªIER"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "exclude directoarele ce conþin o etichetã cache"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "exclude directoarele ce conþin o etichetã cache"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "exclude directoarele ce conþin o etichetã cache"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "exclude directoarele ce conþin o etichetã cache"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "exclude directoarele ce conþin o etichetã cache"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "exclude directoarele ce conþin o etichetã cache"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "evitã coborârea automatã în directoare"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "stai în sistemul de fiºire local la creare arhivei"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "coboarã recursiv în directoare (implicit)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "nu elimina primul `/' din numele fiºierelor"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "NUME-MEMBRU"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "începe la membrul NUME-MEMBRU în arhivã"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "stocheazã numai fiºiere mai noi decât DATA-FIªIERULUI"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATA"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "comparã data ºi timpul numai când a fost schimbatã data"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "CONTROL"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "fã backup înainte de ºtergere, alege CONTROL pentru versiuni"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "ªIR"
+
+#: src/tar.c:645
+#, fuzzy
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"fã backup înainte de ºtergere, înlocuieºte prefixul normal ('~' în afarã de "
+"cazul când este determinat de variabila de mediu SIMPLE_BACKUP_SUFFIX"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+#, fuzzy
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "eliminã NUMÃR componente de la începutul numelor fiºierelor"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+#, fuzzy
+msgid "ignore case"
+msgstr "în excluderi ignorã cazul caracterelor (minuscule/majuscule)"
+
+#: src/tar.c:665
+#, fuzzy
+msgid "patterns match file name start"
+msgstr "pattern-urile de excludere potrivesc începutul numelor de fiºiere"
+
+#: src/tar.c:667
+#, fuzzy
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "pattern-urile de excludere potrivesc dupã orice / (implicit)"
+
+#: src/tar.c:669
+#, fuzzy
+msgid "case sensitive matching (default)"
+msgstr "excluderea depinde de caz (minuscule/majuscule) (implicit)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "wildcard-urile în pattern-urile de excludere nu potrivesc '/'"
+
+#: src/tar.c:677
+#, fuzzy
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "wildcard-urile din pattern-urile de excludere potrivesc '/' (implicit)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Ieºire informativã:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "listeazã cu amãnunte fiºierele procesate"
+
+#: src/tar.c:686
+#, fuzzy
+msgid "[.]NUMBER"
+msgstr "NUMÃR"
+
+#: src/tar.c:687
+#, fuzzy
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "afiºeazã mesaje despre progres la fiecare al 10-a înregistrare"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "afiºeazã un mesaj dacã nu toate link-urile sunt prelucrate"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "afiºeazã datele de modificare a fiºierelor în UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "trimite ieºire detaliatã în FIªIER"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "aratã numãrul blocului din arhivã pentru fiecare mesaj"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "cere confirmare pentru fiecare acþiune"
+
+#: src/tar.c:706
+#, fuzzy
+msgid "show tar defaults"
+msgstr "Aratã valorire implicite folosite de tar"
+
+#: src/tar.c:708
+#, fuzzy
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"La listare sau extragere, listeazã fiecare director care nu se potriveºte cu "
+"criteriile de cãutare"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Opþiuni compatibilitate:"
+
+#: src/tar.c:726
+#, fuzzy
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr "la creare, ca ºi --old-archive. La extragere, ca ºi --no-same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Alte opþiuni:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Nu puteþi specifica mai mult de una dintre opþiunile `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Opþiunile de compresie sunt în conflict"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " tip fiºier necunoscut %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Fiºier date nu a fost gãsit"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Înlocuim %s pentru format de datã necunoscut %s"
+
+#: src/tar.c:961
+#, fuzzy, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Tratez data `%s' ca %s + %ld nanosecundã"
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: fiºierul este în arhivã; nimic generat"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Acest* tar foloseºte implicit:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Factor blocuri invalid"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Avertisment: opþiunea -I nu este suportatã; aþi dorit cumva -j sau -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Lungime de bandã invalidã"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Mai mult de o singurã datã limitã"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Grup invalid"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Mod invalid furnizat ca opþiune"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Numãr invalid"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Proprietar invalid"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Dimensiune înregistrare invalidã"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Dimensiune înregistrare trebuie sã fie un multiplu de %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Numãr invalid de elemente"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, fuzzy, c-format
+msgid "Malformed density argument: %s"
+msgstr "Argument densitate malformat: '%s'"
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Densitate necunoscutã: '%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Opþiunile `-[0-7][lmh]' nu sunt suportate de *acest* tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[FIªIER]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Vechea opþiune `%c' necesitã un argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence n-are sens fãrã o listã de fiºiere"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence nu poate fi folosit în modul de operare cerut"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Fiºiere de arhivã multiple necesitã opþiunea `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Nu puteþi combina --listed-incremental cu --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Eticheta volumului este prea lungã (limita este %lu octet)"
+msgstr[1] "%s: Eticheta volumului este prea lungã (limita este %lu octeþi)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Nu pot verifica arhive pe volume multiple"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Nu pot verifica arhive comprimate"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Nu pot folosi arhive comprimate pe volume multiple"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Nu pot actualiza arhive comprimate"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option poate fi folosit numai pentru arhive POSIX"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Refuz categoric sã creez o arhivã goalã"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Opþiunile `-Aru' sunt incompatibile cu `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Trebuie sã specificaþi una din opþiunile `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Terminare cu eroare întârziatã de erori precedente"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Fiºier scurtat cu %s octet"
+msgstr[1] "%s: Fiºier scurtat cu %s octeþi"
+
+#: src/xheader.c:158
+#, fuzzy, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Cuvânt_cheie %s necunoscut sau încã neimplementat"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Pattern-ul %s nu poate fi folosit"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Cuvânt_cheie %s nu poate fi înlocuit (overridden)"
+
+#: src/xheader.c:498
+#, fuzzy
+msgid "Malformed extended header: missing length"
+msgstr "Antet extins malformat: lipseºte semnul egal"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "ªir în baza-64 (semnãtura arhivei) %s este în afara %s intervalului"
+
+#: src/xheader.c:525
+#, fuzzy
+msgid "Malformed extended header: missing blank after length"
+msgstr "Antet extins malformat: lipseºte spaþiu liber dupã lungime"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Antet extins malformat: lipseºte semnul egal"
+
+#: src/xheader.c:539
+#, fuzzy
+msgid "Malformed extended header: missing newline"
+msgstr "Antet extins malformat: lipseºte semnul egal"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Valoare arhivã %s este în afara %s intervalului %s.%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Antet extins malformat: lipseºte semnul egal"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, fuzzy, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Antet extins malformat: lipseºte semnul egal"
+
+#: src/xheader.c:1328
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "Antet extins malformat: lipseºte semnul egal"
+
+#: src/xheader.c:1338
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Antet extins malformat: lipseºte semnul egal"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Alte opþiuni:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+#, fuzzy
+msgid "Create file of the given SIZE"
+msgstr "creazã arhiva de formatul dat."
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "extrage fiºierele la ieºirea standard"
+
+#: tests/genfile.c:131
+#, fuzzy
+msgid "Read file names from FILE"
+msgstr "Am citit %s octeþi de la %s"
+
+#: tests/genfile.c:133
+#, fuzzy
+msgid "-T reads null-terminated names"
+msgstr "-T citeºte nume terminate cu null, deactiveazã cu -C"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "încearcã sã verifici arhiva dupã scrierea sa"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+#, fuzzy
+msgid "Execute COMMAND"
+msgstr "COMANDÃ"
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Înregistrare timp invalidã"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Numãr inode în afara intervalului"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Eroare sistem necunoscutã"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Nu pot cãuta (seek) cãtre %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " tip fiºier necunoscut %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Nu pot cãuta (seek) cãtre %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr ""
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Amestecat numele fiºierelor--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Acest program vine fãrã NICI O GARANÞIE, în conformitate cu sistemul "
+#~ "legal.\n"
+#~ "Îl puteþi redistribui conform termenilor din GNU General Public License;\n"
+#~ "vedeþi fiºierul numit COPYING pentru detalii."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Comandã gunoi %c\n"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "AVERTISMENT: Nici un antet de volum"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Eroare nume lung evidentã"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Înregistrare timp în afara domeniului"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Numãr dispozitiv în afara intervalului"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Eroare nume lung evidentã"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Redenumit %s ca %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Nu pot crea symlink cãtre %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Creat symlink %s cãtre %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Comanda de-amestecare necunoscutã %s"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Nume fiºier absent dupã -C"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "nu schimba timpurile de acces pentru fiºierele prelucrate"
+
+#~ msgid "extract permissions information"
+#~ msgstr "extrage informaþii permisiuni"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "nu extrage informaþii permisiuni"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "FIªIER-DE-NUME"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "pattern-urile de excludere sunt ºiruri simple"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "foloseºte în schimb fiºierele cãtre care point-eazã symlink-urile"
+
+#~ msgid "same as -N"
+#~ msgstr "ca ºi -N"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "pattern-urile de excludere folosesc wildcard-uri (implicit)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "afiºeazã numãrul total de octeþi scriºi la crearea arhivei"
+
+#~ msgid "Print license and exit"
+#~ msgstr "Afiºeazã licenþa ºi terminã"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Bazat pe munca lui John Gilmore ºi Jay Fenlason. Vedeþi AUTHORS\n"
+#~ "pentru o listã completã a autorilor.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " GNU tar este software liber (free software); îl puteþi redistribui\n"
+#~ " ºi/sau modifica conform termenilor licenþei GNU General Public "
+#~ "License\n"
+#~ " publicatã de Free Software Foundation; fie versiunea 2 a Licenþei,\n"
+#~ " fie (la latitudinea dvs.) orice versiune ulterioarã.\n"
+#~ "\n"
+#~ " GNU tar este distribuit în speranþa cã va fi folositor,\n"
+#~ " dar FÃRÃ NICI O GARANÞIE; fãrã chiar garanþia implicitã de\n"
+#~ " VANDABILITATE sau POTRIVIRE PENTRU UN SCOP ANUME. Vedeþi\n"
+#~ " licenþa GNU General Public License pentru detalii suplimentare.\n"
+#~ "\n"
+#~ " Ar fi trebuit sã fi primit o copie a licenþei GNU General Public "
+#~ "License\n"
+#~ " împreunã cu GNU tar; dacã nu, scrieþi la Free Software Foundation, "
+#~ "Inc.,\n"
+#~ " 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
+#~ "\n"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "Semantica opþiunii -l se va schimba în versiunile viitoare."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Vã rugãm folosiþi opþiunea --one-file-system în schimb."
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Avertisment: opþiunea -y nu este suportatã, aþi dorit cumva -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Eroare de scriere la ieºirea standard"
+
+#~ msgid "Quitting now."
+#~ msgstr "Termin acum."
diff --git a/po/ru.gmo b/po/ru.gmo
new file mode 100644
index 0000000..28efb6b
--- /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..cd4f75d
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,2569 @@
+# Translation of tar-1.16.1.po to Russian
+# Copyright (C) 1998, 1999, 2004, 2006 Free Software Foundation, Inc.
+#
+# Const Kaplinsky <const@ce.cctpu.edu.ru>, 1998, 1999.
+# Pavel Maryanov <acid_jack@ukr.net>, 2004, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.16.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-12-16 17:58+0200\n"
+"Last-Translator: Pavel Maryanov <acid_jack@ukr.net>\n"
+"Language-Team: Russian <ru@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "неверный аргумент %s Ð´Ð»Ñ %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "неоднозначный аргумент %s Ð´Ð»Ñ %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "ДопуÑтимые аргументы:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: Значение %s меньше или равно %s"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: Ð”Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ARGP_HELP_FMT требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: Параметра ARGP_HELP_FMT должен быть положительным"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: ÐеизвеÑтный параметр ARGP_HELP_FMT"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "МуÑор в ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"ОбÑзательные или необÑзательные аргументы Ð´Ð»Ñ Ð´Ð»Ð¸Ð½Ð½Ñ‹Ð¹ опций также ÑвлÑÑŽÑ‚ÑÑ "
+"обÑзательными или необÑзательными Ð´Ð»Ñ ÑоответÑтвующих коротких опций."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "ИÑпользование:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " или: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [ОПЦИЯ...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr ""
+"Попробуйте `%s --help' или `%s --usage' Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ "
+"информации.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Отчеты об ошибках отправлÑйте на %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "вывод Ñтой Ñправки"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "вывод короткого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± иÑпользовании"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "ИМЯ"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "определÑет название программы"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "СЕК"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "ожидание в течение заданных СЕКУÐД (по умолчанию 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "вывод верÑии программы"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(ОШИБКРПРОГРÐММЫ) ÐеизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ?!"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Слишком много аргументов\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(ОШИБКРПРОГРÐММЫ) ÐžÐ¿Ñ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° была быть раÑпознана?!"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ð¸Ñ `%s' не однозначна\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ð¸Ñ `--%s' не разрешает иÑпользовать аргумент\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ð¸Ñ `%c%s' не разрешает иÑпользовать аргумент\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: Ð´Ð»Ñ Ð¾Ð¿Ñ†Ð¸Ð¸ `%s' требуетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: Ð´Ð»Ñ Ð¾Ð¿Ñ†Ð¸Ð¸ требуетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚ -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ð¸Ñ `-W %s' не однозначна\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ð¸Ñ `-W %s' не разрешает иÑпользовать аргумент\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "размер блока"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "памÑÑ‚ÑŒ иÑчерпана"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Ðевозможно %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Предупреждение: Ðевозможно %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Ðевозможно изменить права доÑтупа на %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Ðевозможно изменить владельца на uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Ðевозможно Ñоздать жёÑткую ÑÑылку на %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %s при чтении %lu байт"
+msgstr[1] "%s: Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %s при чтении %lu байт"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Предупреждение: Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %s при чтении %lu байт"
+msgstr[1] "%s: Предупреждение: Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %s при чтении %lu байт"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Ðевозможно найти в %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Предупреждение: Ðевозможно найти в %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Ðевозможно Ñоздать ÑимволичеÑкую ÑÑылку на %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: ЗапиÑан только %lu байт из %lu"
+msgstr[1] "%s: ЗапиÑано только %lu байт из %lu"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "УдалÑетÑÑ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ñ‹Ð¹ `%s' из имен объектов"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "УдалÑÑŽÑ‚ÑÑ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ñ‹Ðµ `%s' из целей жеÑтких ÑÑылок"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "`.' заменÑÑŽÑ‚ÑÑ Ð¿ÑƒÑтыми именами объектов"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[yY]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Служба недоÑтупна"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Ðевозможно запуÑтить удалённый командный процеÑÑор"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Слишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ð²Ñ…Ð¾Ð´Ð½Ð°Ñ Ñтрока"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Ошибка ÑинтакÑиÑа чиÑла"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Ðевозможно выделить буферное проÑтранÑтво\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Ðевозможно выделить буферное проÑтранÑтво"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Попробуйте `%s --help' Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"ИÑпользование: %s [ОПЦИЯ]\n"
+"УправлÑет накопителÑми на магнитной ленте, Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ из удалённого "
+"процеÑÑа.\n"
+"\n"
+" --version Вывод информации о верÑии.\n"
+" --help Вывод Ñтой Ñправки.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Отчёты об ошибках отправлÑйте на <%s>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Ошибка ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñка"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Смещение поиÑка за пределами диапазона"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Ðаправление поиÑка за пределами диапазона"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Преждевременный конец файла\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Преждевременный конец файла"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Ð’Ñего запиÑано байт"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Ð’Ñего прочитано байт"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Ð’Ñего удалено байт: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(канал)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Ðеверное значение Ð´Ð»Ñ record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Ðе указано Ð¸Ð¼Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð°"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ðевозможно проверить архив на stdin/stdout"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Ðрхив Ñжат. ИÑпользуйте опцию %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Ðевозможно обновить Ñжатые архивы"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "ÐšÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° запиÑи %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "ÐšÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Ñ‡Ñ‚ÐµÐ½Ð¸Ñ %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Ðачало ленты, завершение работы"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Слишком много ошибок, завершение работы"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Ðевыровненный блок (%lu байт) в архиве"
+msgstr[1] "Ðевыровненный блок (%lu байт) в архиве"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Размер запиÑи = %lu блок"
+msgstr[1] "Размер запиÑи = %lu блоков"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Ðевозможно вернутьÑÑ Ð½Ð°Ð·Ð°Ð´ на один архивный файл; он может быть нечитаемым "
+"без -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek не оÑтановилÑÑ Ð½Ð° границе запиÑи"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: Ñодержит неверный номер тома"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Переполнение номера тома"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Приготовьте том Ðомер %d Ð´Ð»Ñ %s и нажмите Enter: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Конец файла вмеÑто ожидаемого ответа пользователÑ"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ПРЕДУПРЕЖДЕÐИЕ: Ðрхив не полный"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [имÑ] Указание нового имени файла Ð´Ð»Ñ Ñледующего (и поÑледующих) "
+"томов\n"
+" q Выход из tar\n"
+" y или [нов.Ñтрока] Продолжение операцииÑ\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Порождение подпроцеÑÑа командного процеÑÑора\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Вывод Ñтого ÑпиÑка\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Ðет нового тома, завершение работы.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Ðе указано Ð¸Ð¼Ñ Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°. Попробуйте ещё раз.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Ðеверные входные данные. Ðаберите ? Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "Сбой команды %s"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Это не похоже на tar-архив"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"%s, возможно, продолжаетÑÑ Ð½Ð° Ñтом томе - в заголовке находитÑÑ ÑƒÑечённое имÑ"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s не продолжаетÑÑ Ð½Ð° Ñтом томе"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s ÑвлÑетÑÑ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¼ размером (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Этот том нарушает поÑледовательноÑÑ‚ÑŒ"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Метка архива не ÑоответÑтвует %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Том %s не ÑоответÑтвует %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: Ñлишком длинное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² многотомном заголовке GNU; "
+"обрезано"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Можно было прочитать только %lu байт из %lu"
+msgstr[1] "Можно было прочитать только %lu байт из %lu"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Содержимое отличаетÑÑ"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Ðеожиданный конец файла в архиве"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Типы файлов отличаютÑÑ"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Права доÑтупа отличаютÑÑ"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid отличаютÑÑ"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid отличаютÑÑ"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Размеры отличаютÑÑ"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ðе ÑÑылаетÑÑ Ð½Ð° %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "СимволичеÑкие ÑÑылки отличаютÑÑ"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Ðомера уÑтройÑтв отличаютÑÑ"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Проверка "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: ÐеизвеÑтный тип файла `%c', Ñравнён как обычный файл "
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Ðрхив Ñодержит файлы Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, из которых удалены префикÑÑ‹."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "При проверке оригинальные файлы могут быть не найдены."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "СБОЙ ПРОВЕРКИ: обнаружен %d неверный заголовок"
+msgstr[1] "СБОЙ ПРОВЕРКИ: обнаружено %d неверных заголовков"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: Ñодержит каталог Ñ ÐºÑшем тегов %s; не Ñохранён"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "значение %s за пределами %s диапазона %s..%s; заменÑетÑÑ Ð½Ð° %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "значение %s за пределами %s диапазона %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "СоздаютÑÑ Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ воÑьмеричные заголовки"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñлишком длинное (макÑиÑмум %d); не Ñброшено"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñлишком длинное (не может быть разделено); не Ñброшено"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: Ð¸Ð¼Ñ ÑÑылки Ñлишком длинное; не Ñброшено"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Файл урезан на %s байт; дополнен нулÑми"
+msgstr[1] "%s: Файл урезан на %s байт; дополнен нулÑми"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: файл находитÑÑ Ð½Ð° другой файловой ÑиÑтеме; не Ñброшен"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: ÐеизвеÑтный тип файла; файл проигнорирован"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "ОтÑутÑтвуют ÑÑылки на %s.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: файл не изменён; не Ñброшен"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: файл ÑвлÑетÑÑ Ð°Ñ€Ñ…Ð¸Ð²Ð¾Ð¼; не Ñброшен"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Файла удален до его ÑчитываниÑ"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: Ñодержит каталог Ñ ÐºÑшем тегов; не Ñброшен"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: файл изменилÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: Ñокет проигнорирован"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: door проигнорирован"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "ПропуÑкаетÑÑ Ð´Ð¾ Ñледующего заголовка"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "УдалÑетÑÑ Ð½Ðµ-заголовок из архива"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: невероÑтно ÑÑ‚Ð°Ñ€Ð°Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° %s - %s Ñ Ð² будущем "
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: ÐÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð¾Ñ€ÐµÑ‡Ð¸Ð²Ð¾ÑÑ‚ÑŒ при Ñоздании каталога"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Каталог переименован до того, как мог быть извлечен его ÑтатуÑ"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Ðепрерывные файлы извлекаютÑÑ ÐºÐ°Ðº обычные"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "ВыполнÑетÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° извлечь ÑимволичеÑкие ÑÑылки как жеÑткие"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "СчитываетÑÑ %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Ðевозможно извлечь -- файл продолжаетÑÑ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ тома"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Ðепредвиденный длинный заголовок имени"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: ÐеизвеÑтный тип файла `%c', извлечён как обычный файл"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Текущий %s более новый или такого же возраÑта"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Ðевозможно было выполнить резервное копирование Ñтот файла"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Ðевозможно переименовать %s в %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "ÐеиÑÐ¿Ñ€Ð°Ð²Ð¸Ð¼Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°: завершение работы"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Каталог был переименован из %s"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Каталог был переименован"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Каталог новый"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ°"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Ðеверное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (Ñекунды) "
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Ðеверное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (наноÑекунды)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Ðеверный номер уÑтройÑтва"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Ðеверный номер inode"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Слишком длинное поле при чтении из snapshot-файла"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ snapshot-файла"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Ðеожиданный конец файла snapshot-файле"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Ðеожиданное Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ Ð² snapshot-файле"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "ОтÑутÑтвует указатель конца запиÑи"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Ðеверный формат инкрементного файла"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð½Ð¾Ð³Ð¾ формата: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "Ðеверно Ñформирован dump-каталог: ожидалÑÑ '%c', а найден %#3o"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Ðеверно Ñформирован dump-каталог: 'X' повторÑетÑÑ"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Ðеверно Ñформирован dump-каталог: пуÑтое Ð¸Ð¼Ñ Ð² 'R'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Ðеверно Ñформирован dump-каталог: перед 'T' не Ñтоит 'R'"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Ðеверно Ñформирован dump-каталог: пуÑтое Ð¸Ð¼Ñ Ð² 'T'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr "Ðеверно Ñформирован dump-каталог: ожидалÑÑ '%c', а найден конец данных"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "Ðеверно Ñформирован dump-каталог: 'X' ни разу не иÑпользован"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Ðевозможно Ñоздать временный каталог Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шаблона %s"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Каталог не удалён: невозможно выполнить stat"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: Каталог находитÑÑ Ð½Ð° другом уÑтройÑтве: не удален"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: УдалÑетÑÑ %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Ðевозможно удалить"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: ПропуÑкаетÑÑ"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "блок %s: ** Блок нулей **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Ðулевой блок в %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "блок %s: ** Конец файла **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "блок %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Ð’ заголовке пуÑтое поле вмеÑто ожидаемого чиÑлового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"ВоÑьмеричное значение архива %.*s за пределами диапазона %s; предполагаетÑÑ "
+"дополнение до двух"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "ВоÑьмеричное значение архива %.*s за пределами диапазона %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Ðрхив Ñодержит уÑтаревающие заголовки base-64"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Ðрхив подпиÑан Ñтрокой base-64 %s за пределами диапазона %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Значение base-256 архива за пределами диапазона %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Заголовок Ñодержит %.*s вмеÑто ожидаемого чиÑлового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Значение архива %s за пределами %s диапазона %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " ÑÑылка на %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " неизвеÑтный тип файла %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Ð”Ð»Ð¸Ð½Ð½Ð°Ñ ÑÑылка--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Длинное имÑ--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Заголовок тома--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Продолжение Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Создание каталога:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "%s переименован в %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Ðевозможно переименовать в %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "%s переименовываетÑÑ Ð½Ð°Ð·Ð°Ð´ в %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Ðевозможно Ñохранить рабочий каталог"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Ðевозможно изменить рабочий каталог"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "дочерний процеÑÑ"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "межпроцеÑÑорный канал"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Ð’ именах файлов иÑпользуютÑÑ Ñимволы подÑтановки."
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+"ИÑпользуйте --wildcards, чтобы задейÑтвовать Ñти Ñимволы, или --no-wildcards,"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "чтобы отключить вывод Ñтого предупреждениÑ."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Ðе найден в архиве"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Требуемое вхождение не найдено в архиве"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Обе опции `-%s' и `-%s' иÑпользуют Ñтандартный ввод"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Ðеверный формат архива"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Запрошены раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ GNU Ð´Ð»Ñ Ð½ÐµÑовмеÑтимого формата архива"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"ÐеизвеÑтный Ñтиль Ñ†Ð¸Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ `%s'. ВоÑпользуйтеÑÑŒ `%s --quoting-style=help' "
+"Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ ÑпиÑка. "
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU `tar' предназначен Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² на магнитную ленту или в архив "
+"на диÑке и Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ñ‹Ñ… файлов из архива.\n"
+"\n"
+"Примеры:\n"
+" tar -cf archive.tar foo bar # Создание archive.tar из файлов foo и bar.\n"
+" tar -tvf archive.tar # Вывод подробного ÑпиÑка вÑех файлов в "
+"архиве archive.tar.\n"
+" tar -xf archive.tar # Извлечение вÑех файлов из archive.tar.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Ð¡ÑƒÑ„Ñ„Ð¸ÐºÑ Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ñ‹Ñ… копий - `~', еÑли он не уÑтановлен через --suffix\n"
+"или SIMPLE_BACKUP_SUFFIX. Управление верÑиÑми может быть уÑтановлено\n"
+"через --backup или VERSION_CONTROL. ЗначениÑми могут быть:\n"
+"\n"
+" none, off не Ñоздавать резервные копии\n"
+" t, numbered Ñоздавать нумерованные резервные копии\n"
+" nil, existing нумерованные, еÑли ÑущеÑтвуют нумерованные копии, иначе "
+"проÑтые\n"
+" never, simple вÑегда Ñоздавать проÑтые резервные копии\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "ОÑновной режим работы:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "вывод ÑпиÑка Ñодержимого архива"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "извлечение файлов из архива"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "Ñоздание нового архива"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "поиÑк различий между архивом и файловой ÑиÑтемой"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "добавление файлов в конец архива"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "добавление в архив только более новых файлов"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "приÑоедининие tar-файлов к архиву"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "удаление из архива (не на магнитных лентах!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "проверка метки тома архива и выход"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Модификаторы:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "ÑÑ„Ñ„ÐµÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° разрежённых файлов"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "MAJOR[.MINOR]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+"уÑтановить верÑию иÑпользуемого формата Ñ€Ð°Ð·Ñ€ÐµÐ¶ÐµÐ½Ð¸Ñ (подразумевает --sparse)"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "обработка добавочного Ñ€ÐµÐ·ÐµÑ€Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтарого формата GNU"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "ФÐЙЛ"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "обработка добавочного Ñ€ÐµÐ·ÐµÑ€Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ формата GNU"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "не завершать работу при ненулевом ÑтатуÑе Ð´Ð»Ñ Ð½ÐµÑ‡Ð¸Ñ‚Ð°ÐµÐ¼Ñ‹Ñ… файлов"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "N"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"обработка только N-ого Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ файла в архиве. Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð²ÐµÑ€Ð½Ð° "
+"только в Ñочетании Ñ Ð¾Ð´Ð½Ð¾Ð¹ из подкоманд --delete, --diff, --extract или --"
+"list, и когда ÑпиÑок файлов задан либо в командной Ñтроке, либо через опцию -"
+"T. По умолчанию N равен 1."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "доÑтупен поиÑк по архиву"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "Управление перезапиÑью:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "попытка проверить архив поÑле его запиÑи"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "удаление файлов поÑле их Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² архив"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "не перезапиÑывать ÑущеÑтвующие файлы при извлечении"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+"не перезапиÑывать ÑущеÑтвующие файлы, которые более новые, чем их копии в "
+"архиве"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "перезапиÑÑŒ ÑущеÑтвующих файлов при извлечении"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "удаление каждого файла до Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²ÐµÑ€Ñ… него"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "очиÑтка вÑей иерархии до Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "Ñохранение метаданных ÑущеÑтвующих каталогов"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "перезапиÑÑŒ ÑущеÑтвующих файлов при извлечении (по умолчанию)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Выбор выходного потока:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "извлекать файлы на Ñтандартный вывод"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "КОМÐÐДÐ"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "перенаправлÑÑ‚ÑŒ извлечённые файлы в другую программу"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "игнорировать коды Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ñ… процеÑÑов"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "Ñчитать ненулевые коды Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ñ… процеÑÑов как ошибку"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Обработка атрибутов файлов:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+"принудительно уÑтанаваливать ИМЯ в качеÑтве владельца Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… файлов"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+"принудительно уÑтанаваливать ИМЯ в качеÑтве группы Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… файлов"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "ДÐТÐ-ИЛИ-ФÐЙЛ"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "уÑтанаваливать Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… файлов mtime из ДÐТЫ-ИЛИ-ФÐЙЛÐ"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "РЕЖИМ"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+"принудительно уÑтанавливать (Ñимвольный) РЕЖИМ доÑтупа Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñемых файлов"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "СПОСОБ"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"ÑохранÑÑ‚ÑŒ Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ñтупа Ñкопированных файлов путём воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ "
+"поÑле Ñ‡Ñ‚ÐµÐ½Ð¸Ñ (СПОСОБ='replace'; иÑпользуетÑÑ Ð¿Ð¾ умолчанию) или не уÑтановки "
+"времени в первую очередь (СПОСОБ='system')"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "не извлекать Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "попытатьÑÑ Ð¸Ð·Ð²Ð»ÐµÑ‡ÑŒ файлы Ñ Ñ‚ÐµÐ¼ же владельцем"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "извлекать файлы как Ñвои ÑобÑтвенные"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "иÑпользовать чиÑла вмеÑто имён владельца/группы"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+"извлекать информацию о правах доÑтупа к файлу (по умолчанию Ð´Ð»Ñ "
+"ÑуперпользователÑ)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"применÑÑ‚ÑŒ umask Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¸ извлечении прав доÑтупа из архива (по "
+"умолчанию Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ñ… пользователей)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "Ñортировать извлекаемые имена в том же порÑдке, что и в архиве"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "Ñквивалент -p и -s"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"не уÑтанавливать Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ права доÑтупа извлечённых каталогов до "
+"Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа извлечениÑ"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "отменить дейÑтвие опции --delay-directory-restore"
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Выбор и переключение уÑтройÑтв:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ÐРХИВ"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "иÑпользовать файл или уÑтройÑтво ÐРХИВ"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "файл архива ÑвлÑетÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼, даже еÑли Ñодержит двоеточие"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "иÑпользовать указанную КОМÐÐДУ rmt вмеÑто rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "иÑпользовать удалённую КОМÐÐДУ вмеÑто rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "указать уÑтройÑтво и плотноÑÑ‚ÑŒ"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "Ñоздание/лиÑтинг/извлечение многотомных архивов"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "Ñменить ленту поÑле запиÑи ЧИСЛО x 1024 байт"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+"запуÑтить Ñкрипт по окончании каждой ленты (подразумеваетÑÑ Ð¸Ñпользование -Ðœ)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "иÑпользовать/обновлÑÑ‚ÑŒ номера тома в ФÐЙЛЕ"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Разбиение на блоки:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "БЛОКИ"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "чиÑло БЛОКОВ x 512 байт на запиÑÑŒ"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "ЧИСЛО байт на запиÑÑŒ, кратное 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "игнорировать нулевые блоки в архиве (т.е. EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "заново разбивать на блоки при чтении (Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð² 4.2BSD)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Формата архива:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "ФОРМÐТ"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "Ñоздать архив в указанном формате"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "ФОРМÐТОМ может быть:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "Ñтарый формат tar V7"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "формат GNU как в tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "формат GNU tar 1.13.х"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "формат POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "формат POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "Ñквивалент pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "Ñквивалент --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "Ñквивалент --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "keyword[[:]=значение][,keyword[[:]=значение]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "управлÑющие ключевые Ñлова pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "ТЕКСТ"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"Ñоздать архив Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ тома ТЕКСТ; при лиÑтинге/извлечении иÑпользовать "
+"ТЕКСТ в качеÑтве шаблона подÑтановки"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "пропуÑтить архив через bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "пропуÑтить архив через gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "пропуÑтить архив через compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "ПРОГ"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "пропуÑтить архив через ПРОГ (должна поддерживать -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Выбор локальных файлов:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr "добавить указаный ФÐЙЛ в архив (полезно, еÑли Ð¸Ð¼Ñ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÐµÑ‚ÑÑ Ñ Ð´ÐµÑ„Ð¸Ñа)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "КÐТÐЛОГ"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "перейти в КÐТÐЛОГ"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "загрузить из ФÐЙЛРимена Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑозданиÑ"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T читает Ñтроки, оканчивающиеÑÑ Ð½ÑƒÐ»Ñ‘Ð¼, отключает опцию -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr "убрать кавычки Ñ Ð¸Ð¼Ñ‘Ð½ файлов, прочитанных Ñ Ð¾Ð¿Ñ†Ð¸ÐµÐ¹ -T (по умолчанию)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "не убирать кавычки Ñ Ð¸Ð¼Ñ‘Ð½ файлов, прочитанных Ñ Ð¾Ð¿Ñ†Ð¸ÐµÐ¹ -T"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "ШÐБЛОÐ"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "иÑключать файлы, определённые ШÐБЛОÐОМ"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "иÑключать шаблоны, перечиÑленных в ФÐЙЛЕ"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "иÑключать каталоги Ñ Ñ‚ÐµÐ³Ð¾Ð¼ кÑшированиÑ"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "иÑключать каталоги Ñ Ð¤ÐЙЛОМ"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "иÑключать каталоги Ñ Ð¤ÐЙЛОМ"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "иÑключать каталоги Ñ Ð¤ÐЙЛОМ"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "иÑключать каталоги Ñ Ð¤ÐЙЛОМ"
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr "иÑключать каталоги Ñ Ð¤ÐЙЛОМ"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "отключить автоматичеÑкий ÑпуÑк в каталоги"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "оÑтаватьÑÑ Ð² локальной файловой ÑиÑтеме при Ñоздании архива"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "рекурÑивный ÑпуÑк по каталогам (по умолчанию)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "не удалÑÑ‚ÑŒ начальные `/' из имен файлов"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+"Ñледовать по Ñимвольным ÑÑылкам и ÑохранÑÑ‚ÑŒ файлы, на которые они указывают"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "ИМЯ-ЧЛЕÐÐ"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "начинать Ñ Ñ‡Ð»ÐµÐ½Ð° ИМЯ-ЧЛЕÐРв архиве"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "ÑохранÑÑ‚ÑŒ только те файлы, которые новее ДÐТЫ-ИЛИ-ФÐЙЛÐ"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "ДÐТÐ"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "Ñравнивать дату и времÑ, только еÑли изменены данные"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "УПРÐВЛЕÐИЕ"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "делать копию перед удалением, УПРÐВЛЕÐИЕ выбора верÑий"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "СТРОКÐ"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"делать копию перед удалением, переопределÑет обычный ÑÑƒÑ„Ñ„Ð¸ÐºÑ ('~', еÑли "
+"только он не переопределён переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ SIMPLE_BACKUP_SUFFIX)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Преобразвание имён файлов:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+"удалÑÑ‚ÑŒ указанное ЧИСЛО начальных компонентов из имён файлов перед "
+"извлечением"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "РÐСШИРЕÐИЕ"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr "иÑпользовать замену РÐСШИРЕÐИЯ sed'ом Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼Ñ‘Ð½ файлов"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+"Параметры шаблонов подÑтановки Ð´Ð»Ñ Ð¸Ð¼Ñ‘Ð½ файлов (влÑÑŽÑ‚ на шаблюны Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ "
+"иÑключениÑ):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "игноририровать региÑÑ‚Ñ€"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "шаблоны начала имени файла"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "шаблоны поÑле любого '/' (по умолчанию Ð´Ð»Ñ Ð¸Ñключаемых)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "Ñ ÑƒÑ‡Ñ‘Ñ‚Ð¾Ð¼ региÑтра (по умолчанию)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "иÑпользовать маÑки (по умолчанию Ð´Ð»Ñ Ð¸Ñключаемых)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "точное ÑоответÑтвие Ñтроке"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "маÑки не ÑоответÑтвуют '/'"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "маÑки ÑоответÑтвут '/' (по умолчанию Ð´Ð»Ñ Ð¸Ñключаемых)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Вывод информации:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "подробный лиÑтинг обрабатываемых файлов"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]ЧИСЛО"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+"вывод Ñообщений о ходе Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· каждые ЧИСЛО запиÑей (по умолчанию "
+"10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "вывод Ñообщений, еÑли Ñохранены не вÑе ÑÑылки"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "СИГÐÐЛ"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"вывод общего чиÑла байт поÑле обработки архива; Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð¼ - вывод общего "
+"чиÑла байт поÑле доÑтавки Ñтого СИГÐÐЛÐ. Разрешённые Ñигналы: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 и SIGUSR2. Также разрешаетÑÑ Ð¸Ñпользовать имена без "
+"префикÑа SIG"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "вывод даты Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° в формате UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "отправить подробный вывод данных в FILE"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "выводить номера блоков архива в каждом Ñообщении"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "запрашивать подтверждение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ дейÑтвиÑ"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "показать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ tar по умолчанию"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"при выводе лиÑтинга или извлечении показывать вÑе каталоги, не "
+"ÑоответÑтвующем уÑловию поиÑка"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "показывать имена файлов или архивов поÑле преобразованиÑ"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "СТИЛЬ"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr "уÑтановить Ñтиль Ñ†Ð¸Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼Ñ‘Ð½. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¡Ð¢Ð˜Ð›Ð¯ Ñм. ниже"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "дополнительно цитировать Ñимволы из СТРОКИ"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "отключить цитирование Ñимволов из СТРОКИ"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Опции ÑовмеÑтимоÑти:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"при Ñоздании, Ñквивалент --old-archive; при извлечении, Ñквивалент --no-same-"
+"owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Другие опции:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "отключить иÑпользование некоторых потенциально опаÑных опций"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Указать можно не более одной опции `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Конфликт опций ÑжатиÑ"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "ÐеизвеÑтное название Ñигнала: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Файл Ñ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð¾Ð¼ даты не найден"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "%s заменÑетÑÑ Ð½Ð° неизвеÑтный формат даты %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "ÐžÐ¿Ñ†Ð¸Ñ `%s': дата '%s' раÑÑматриваетÑÑ ÐºÐ°Ðº %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: ÑпиÑок файлов уже прочитан"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: в прочитанном имени файла приÑутÑтвует пуÑтой Ñимвол"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "ДопуÑтимые агрументы Ð´Ð»Ñ Ð¾Ð¿Ñ†Ð¸Ð¹ --quoting-style:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию *Ñтого* tar:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Ðеверный размер ёмкоÑти блока"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+"Предупреждение: Ð¾Ð¿Ñ†Ð¸Ñ -I не поддерживаетÑÑ; может имелаÑÑŒ в виду -j или -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ленты"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Больше одной пороговой даты"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "Ðеверное значение верÑии разрежениÑ"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' не поддерживаетÑÑ Ð½Ð° Ñтой платформе"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "значение --checkpoint не ÑвлетÑÑ Ñ†ÐµÐ»Ñ‹Ð¼ чиÑлом"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Ð’ опции указан неверный режим доÑтупа"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Ðеверное чиÑло"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Ðеверный владелец"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Ðеверный размер запиÑи"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Размер запиÑи должен быть кратен %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Ðеверное чиÑло Ñлементов"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "РазрешаетÑÑ Ð¸Ñпользовать только одну опцию --to-command"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Ðеверно Ñформирован аргумент плотноÑти: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¿Ð»Ð¾Ñ‚Ð½Ð¾ÑÑ‚ÑŒ: '%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Опции `-[0-7][lmh]' не поддерживаютÑÑ *Ñтим* tar'ом"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[ФÐЙЛ]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Ð”Ð»Ñ Ñтарой опции `%c' нужно указать аргумент."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence беÑполезна без ÑпиÑка файлов"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence не может быть иÑпользована запрошеном режиме работы"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Ð”Ð»Ñ Ð½ÐµÑкольких файлов архивов требуетÑÑ Ð¾Ð¿Ñ†Ð¸Ñ `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "ÐÐµÐ»ÑŒÐ·Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ --listed-incremental Ñ --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Метка тома Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ (макÑимум %lu байт)"
+msgstr[1] "%s: Метка тома Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ (макÑимум %lu байт)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Ðевозможно проверить многотомные архивы"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Ðевозможно проверить Ñжатые архивы"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Ðевозможно иÑпользовать многотомные Ñжатые архивы"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Ðевозможно объединить Ñжатые архивы"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option может быть иÑпользована только Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ð¼Ð¸ POSIX"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Робкий отказ от ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑƒÑтого архива"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Опции `-Aru' не ÑовмеÑтимы Ñ `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Вы должны указать одну из опций `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Выход, отложенный по результатам предыдущих ошибок"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Файл урезан на %s байт"
+msgstr[1] "%s: Файл урезан на %s байт"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "ÐеизвеÑтное или ещё не реализованное ключевое Ñлово %s"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Шаблон %s не может быть иÑпользован"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Ключевое Ñлово %s не может быть перекрыто"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Ðеверно Ñформирован раÑширенный заголовок: отÑутÑтвует длина"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "Длина раÑширенного заголовка за пределами допуÑтимого диапазона"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Длина раÑширенного заголовка %*s за пределами допуÑтимого диапазона"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+"Ðеверно Ñформирован раÑширенный заголовок: поÑле длины отÑутÑтвует пробел"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Ðеверно Ñформирован раÑширенный заголовок: отÑутÑтвует знак равенÑтва "
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+"Ðеверно Ñформирован раÑширенный заголовок: отÑутÑтвует знак новой Ñтроки"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "ИгнорируетÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑтное клоючевое Ñлово раÑширенного заголовка `%s'"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+"Слишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ ÑÐ³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð°Ñ€Ð° \"ключевое Ñлово-значение\" (ключевое "
+"Ñлово=%s, длина=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "РаÑширенный заголовок %s=%s за пределами диапазона %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Ðеверно Ñформирован раÑширенный заголовок: неверный %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Ðеверно Ñформирован раÑширенный заголовок: превышен %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+"Ðеверно Ñформирован раÑширенный заголовок: неверный %s: непредвиденный "
+"разделитель %c"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+"Ðеверно Ñформирован раÑширенный заголовок: неверный %s: нечётное чиÑло "
+"значений"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile иÑпользуетÑÑ Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ данных Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ð° теÑтов paxutils "
+"от GNU.\n"
+"ОПЦИИ:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Опции ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "РÐЗМЕР"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Создание файла указанного РÐЗМЕРÐ"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "ЗапиÑÑŒ в файл Ñ Ð˜ÐœÐ•ÐЕМ, а не на Ñтандартный вывод"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Чтение имён файла из ФÐЙЛÐ"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T читает Ñтроки, оканчивающиеÑÑ Ð½ÑƒÐ»Ñ‘Ð¼"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr "Заполнение файла заданным ШÐБЛОÐОМ. ШÐБЛОР- Ñто 'default' или 'zeros'"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Размер блока Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÐ¶Ñ‘Ð½Ð½Ð¾Ð³Ð¾ файла"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+"Создание разрежённого файла. ОÑÑ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ команды определÑет карту файла."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr "СМЕЩЕÐИЕ"
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr "ИÑкать до указанного ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ запиÑью данных"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Опции ÑтатиÑтики по файлам:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"Вывод Ñодержимого Ñтруктуры stat Ð´Ð»Ñ Ð²Ñех указанных файлов. ФОРМÐТ по "
+"умолчанию:"
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Опции Ñинхронного выполнениÑ:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"Выполнение указанной КОМÐÐДЫ. Полезно вмеÑте Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ --checkpoint и "
+"одним из --cut, --append, --touch"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+"Выполнение указанного дейÑÑ‚Ð²Ð¸Ñ (Ñм. ниже) до доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ точки Ñ "
+"заданным ÐОМЕРОМ"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Указание даты Ð´Ð»Ñ Ñледующего параметра --touch"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "Показать выполненные контрольные точки и ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð° КОМÐÐДЫ"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Синхронное выполнение дейÑтвий. Они выполнÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ доÑтижении контрольной "
+"точки Ñ Ð½Ð¾Ð¼ÐµÑ€Ð¾Ð¼, определённым опцией --checkpoint."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"УÑечь ФÐЙЛ до размера, определённого предыдущей опцией --length (или 0, еÑли "
+"не указан)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+"Добавить РÐЗМЕР байт к ФÐЙЛУ. РÐЗМЕР определÑетÑÑ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹ опцией --length."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "Обновить Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего доÑтупа и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¤ÐЙЛÐ."
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "Выполнить КОМÐÐДУ"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "ÐедопуÑтимый размер: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "ЧиÑло за пределами допуÑтимого диапазона: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Отрицательный размер: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "Сбой stat(%s)"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Ошибка разбора чиÑла возле `%s'"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "ÐеизвеÑтный формат даты"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ÐРГУМЕÐТЫ...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "невозможно открыть `%s'"
+
+#: tests/genfile.c:426
+#, c-format
+msgid "cannot seek: %s"
+msgstr "невозможно найти: %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "в имени файла приÑутÑтвует пуÑтой Ñимвол"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"невозможно вывеÑти разрежённые файлы на Ñтандартный вывод; иÑпользуйте опцию "
+"--file"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð°Ñка (возле `%s')"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "ÐеизвеÑтное поле `%s'"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "невозможно уÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð² `%s'"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Команда уÑпешно выполнена\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Сбой команды; ÑоÑтоÑние: %d\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Команда завершена по Ñигналу %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Команда оÑтановлена по Ñигналу %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Команда ÑброÑила дамп памÑти\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Команда завершена\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "Ð´Ð»Ñ Ð¾Ð¿Ñ†Ð¸Ð¸ --stat нужны имена файлов"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "Ñлишком много аргументов"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Эта программа поÑтавлÑетÑÑ Ð‘Ð•Ð— ГÐРÐÐТИИ в маÑкимальной Ñтепени,\n"
+#~ "допуÑкаемой применимым законодательÑтвом. Ð’Ñ‹ можете раÑпроÑтранÑÑ‚ÑŒ\n"
+#~ "ее далее ÑоглаÑно уÑловиÑм GNU General Public License; дополнительную\n"
+#~ "информацию Ñмотрите в файле COPYING."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° %c\n"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ПРЕДУПРЕЖДЕÐИЕ: Ðет метки тома"
+
+#~ msgid "Visible long name error"
+#~ msgstr "По-видимому, ошибка за длинного имени"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° за пределами диапазона"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Ðомер уÑтройÑтва за пределами диапазона"
+
+#~ msgid "Visible longname error"
+#~ msgstr "По-видимому, ошибка длинного имени"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "%s переименован в %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Ðевозможно Ñоздать ÑимволичеÑкую ÑÑылку на %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Создана ÑÐ¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка %s на %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° %s Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ€ÑƒÐ±Ð»ÐµÐ½Ñ‹Ñ… имен"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "ОтÑутÑтвует Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° поÑле -C"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "не изменÑÑ‚ÑŒ Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ñтупа Ð´Ð»Ñ Ñброшенных файлов"
+
+#~ msgid "extract permissions information"
+#~ msgstr "извлечение информации о разрешениÑÑ…"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "не извлекать информацию о разрешениÑÑ…"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "ФÐЙЛ-С-ИМЕÐÐМИ"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "иÑключение шаблонов, ÑвлÑющихÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼Ð¸ Ñтроками"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr ""
+#~ "Ñохранение ÑимволичеÑких ÑÑылок вмеÑто файлов, на которые они указывают"
+
+#~ msgid "same as -N"
+#~ msgstr "Ñквивалент -N"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr ""
+#~ "переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ SIMPLE_BACKUP_SUFFIX, за иÑключением шаблонов, "
+#~ "иÑпользующих маÑки (по умолчанию)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "вывод общего объема запиÑанных байт при Ñоздании архива"
+
+#~ msgid "Print license and exit"
+#~ msgstr "Вывод лицензии и выход"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "ОÑнован на результатах работы Джона Гилмора (John Gilmore) и Ð”Ð¶ÐµÑ "
+#~ "ФенланÑона\n"
+#~ "(Jay Fenlason). Полный ÑпиÑок авторов Ñмотрите в файле AUTHORS.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " GNU tar ÑвлÑетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ программным обеÑпечением; вы можете\n"
+#~ " раÑпроÑтранÑÑ‚ÑŒ ее далее и/или изменÑÑ‚ÑŒ ее ÑоглаÑно уÑловиÑми GNU\n"
+#~ " General Public License, опубликованной Free Software Foundation 2-й\n"
+#~ " верÑии или (на ваше уÑмотрение) любой другой более поздней верÑии.\n"
+#~ "\n"
+#~ " GNU tar раÑпроÑтранÑетÑÑ Ð² надежде, что она будет полезна,\n"
+#~ " но БЕЗ ВСЯКОЙ ГÐРÐÐТИИ; даже без подразумеваемой гарантии\n"
+#~ " ПРИГОДÐОСТИ ДЛЯ ПРОДÐЖИ или ПРИМЕÐИМОСТИ ДЛЯ КОÐКРЕТÐОЙ ЦЕЛИ. За "
+#~ "более\n"
+#~ " подробной информацией обращайтеÑÑŒ к GNU General Public License.\n"
+#~ "\n"
+#~ " Ð’Ñ‹ должны были получить копию GNU General Public License вмеÑте Ñ "
+#~ "Ñтой\n"
+#~ " программой; еÑли Ñто не так, Ñообщите об Ñтом Free Software "
+#~ "Foundation,\n"
+#~ " Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. \n"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "Семантика опции -l изменитÑÑ Ð² будущих верÑиÑÑ…."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "ПожалуйÑта, иÑпользуйте вмеÑто неё опцию --one-file-system."
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr ""
+#~ "Предупреждение: Ð¾Ð¿Ñ†Ð¸Ñ -y не поддерживаетÑÑ; возможно вы имели в виду -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Ошибка при запиÑи на Ñтандартный вывод"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %s, ÑчитываетÑÑ %lu байт"
+#~ msgstr[1] "%s: Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %s, ÑчитываютÑÑ %lu байт"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Рубленые имена файлов--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Ðеожиданный конец файла в рубленых именах"
diff --git a/po/rw.gmo b/po/rw.gmo
new file mode 100644
index 0000000..5b38fad
--- /dev/null
+++ b/po/rw.gmo
Binary files differ
diff --git a/po/rw.po b/po/rw.po
new file mode 100644
index 0000000..4789018
--- /dev/null
+++ b/po/rw.po
@@ -0,0 +1,2724 @@
+# Kinyarwanda translations for tar package.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the tar 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: tar 1.15.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\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"
+"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"
+
+#: lib/argmatch.c:134
+#, fuzzy, c-format
+msgid "invalid argument %s for %s"
+msgstr "Sibyo kugirango"
+
+#: lib/argmatch.c:135
+#, fuzzy, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "kugirango"
+
+#: lib/argmatch.c:154
+#, fuzzy, c-format
+msgid "Valid arguments are:"
+msgstr "ingingo"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, 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"
+"."
+
+#: lib/argp-help.c:227
+#, fuzzy, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+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"
+"."
+
+#: lib/argp-help.c:236
+#, 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"
+"."
+
+#: lib/argp-help.c:248
+#, fuzzy, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "in"
+
+#: lib/argp-help.c:1247
+#, 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"
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Ikoresha:"
+
+#: lib/argp-help.c:1644
+#, fuzzy
+msgid " or: "
+msgstr "Cyangwa"
+
+# padmin/source\rtsetup.src:RID_RTS_DEVICEPAGE.RID_RTS_DEVICE_PPDKEY_TXT.text
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr "[Ihitamo"
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Cyangwa kugirango Birenzeho Ibisobanuro"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Kuri"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+#, fuzzy
+msgid "Unknown system error"
+msgstr "Sisitemu Ikosa"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+#, fuzzy
+msgid "give this help list"
+msgstr "iyi Ifashayobora Urutonde"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+#, fuzzy
+msgid "give a short usage message"
+msgstr "a Ikoresha: Ubutumwa"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+#, fuzzy
+msgid "NAME"
+msgstr "Izina"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+#, fuzzy
+msgid "print program version"
+msgstr "Porogaramu Verisiyo"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s:Ihitamo"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, fuzzy, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s:Ihitamo ni"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, fuzzy, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s:Ihitamo Kwemerera"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, fuzzy, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s:Ihitamo Kwemerera"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, fuzzy, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s:Ihitamo"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, fuzzy, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s:Ihitamo"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, fuzzy, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s:Ihitamo"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, fuzzy, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s:Ihitamo"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, fuzzy, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s:Sibyo Ihitamo"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s:Ihitamo"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, fuzzy, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s:Ihitamo ni"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, fuzzy, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s:Ihitamo Kwemerera"
+
+#: lib/human.c:477
+#, fuzzy
+msgid "block size"
+msgstr "Funga Ingano"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+#, fuzzy
+msgid "memory exhausted"
+msgstr "Ububiko"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr ""
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr ""
+
+#: lib/paxerror.c:93
+#, fuzzy, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s:Guhindura>> Ubwoko Kuri"
+
+#: lib/paxerror.c:101
+#, fuzzy, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s:Guhindura>> Kuri UID"
+
+#: lib/paxerror.c:127
+#, fuzzy, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s:Ikomeye Ihuza Kuri"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s:Ikosa ku Bayite Bayite"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s:Ikosa ku Bayite Bayite"
+
+#: lib/paxerror.c:259
+#, fuzzy, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s:Kuri"
+
+#: lib/paxerror.c:275
+#, fuzzy, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s:Kuri"
+
+#: lib/paxerror.c:284
+#, fuzzy, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s:Kurema Kuri"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s:Bya Bayite"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Nyobora Bivuye Amazina"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Nyobora Bivuye Ikomeye Ihuza"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "kugirango ubusa Izina:"
+
+#: lib/paxnames.c:147
+#, fuzzy
+msgid "Substituting `.' for empty hard link target"
+msgstr "kugirango ubusa Ikomeye Ihuza Intego"
+
+# 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+#, fuzzy
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, fuzzy, c-format
+msgid "exec/tcp: Service not available"
+msgstr "OYA Bihari"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr ""
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr ""
+
+#: lib/rtapelib.c:512
+#, fuzzy, c-format
+msgid "Cannot execute remote shell"
+msgstr "Gukora Igikonoshwa"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr ""
+
+#: rmt/rmt.c:182
+#, fuzzy
+msgid "Cannot allocate buffer space"
+msgstr "Umwanya"
+
+#: rmt/rmt.c:304
+#, fuzzy, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "kugirango Birenzeho Ibisobanuro"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"a Porogaramu- shoboza Amabwiriza Bivuye a Verisiyo Verisiyo Ibisobanuro "
+"Ifashayobora iyi Ifashayobora"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr "Kuri"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Nta- boneza Inyuma Bya Urutonde"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+#, fuzzy
+msgid "Seek offset out of range"
+msgstr "Nta- boneza Inyuma Bya Urutonde"
+
+#: rmt/rmt.c:428
+#, fuzzy
+msgid "Seek direction out of range"
+msgstr "Icyerekezo Inyuma Bya Urutonde"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr ""
+
+#: rmt/rmt.c:474
+#, fuzzy
+msgid "Premature end of file"
+msgstr "Impera Bya IDOSIYE"
+
+#: rmt/rmt.c:672
+#, fuzzy
+msgid "Garbage command"
+msgstr "Komandi:"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Bayite S"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Bayite S"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr ""
+
+#: src/buffer.c:449
+#, fuzzy
+msgid "Invalid value for record_size"
+msgstr "Agaciro kugirango"
+
+#: src/buffer.c:452
+#, fuzzy
+msgid "No archive name given"
+msgstr "Izina:"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr ""
+
+#: src/buffer.c:509
+#, fuzzy, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "ni Byegeranijwe Ihitamo"
+
+#: src/buffer.c:556 src/tar.c:2187
+#, fuzzy
+msgid "Cannot update compressed archives"
+msgstr "Kuvugurura Byegeranijwe Ubushyinguro"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr ""
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr ""
+
+#: src/buffer.c:664
+#, fuzzy
+msgid "At beginning of tape, quitting now"
+msgstr "Itangiriro Bya NONEAHA"
+
+#: src/buffer.c:670
+#, fuzzy
+msgid "Too many errors, quitting"
+msgstr "Amakosa"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Funga Bayite in"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Ingano Funga"
+
+#: src/buffer.c:791
+#, fuzzy
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Gusiba usubira inyuma IDOSIYE Gicurasi i"
+
+#: src/buffer.c:823
+#, fuzzy
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "OYA Kyahagariswe ku a Icyabitswe"
+
+#: src/buffer.c:879
+#, fuzzy, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s:Kirimo Sibyo Igice Umubare"
+
+#: src/buffer.c:914
+#, fuzzy
+msgid "Volume number overflow"
+msgstr "Umubare Byarenze urugero"
+
+#: src/buffer.c:929
+#, fuzzy, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Igice kugirango Na kanda Garuka"
+
+#: src/buffer.c:935
+#, fuzzy
+msgid "EOF where user reply was expected"
+msgstr "Ukoresha: Subiza Ikitezwe:"
+
+#: src/buffer.c:940 src/buffer.c:972
+#, fuzzy
+msgid "WARNING: Archive is incomplete"
+msgstr "ni"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+"N Izina: a Gishya IDOSIYE Izina: kugirango i Komeza>> Na Igice S Q a iyi"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+#, fuzzy
+msgid "No new volume; exiting.\n"
+msgstr "Gishya Igice"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "`%s'Komandi: Byanze"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+#, fuzzy
+msgid "This does not look like a tar archive"
+msgstr "OYA nka a"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%sni OYA ku iyi Igice"
+
+#: src/buffer.c:1223
+#, fuzzy, c-format
+msgid "%s is not continued on this volume"
+msgstr "%sni OYA ku iyi Igice"
+
+#: src/buffer.c:1237
+#, fuzzy, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%sni i Ingano"
+
+#: src/buffer.c:1247
+#, fuzzy
+msgid "This volume is out of sequence"
+msgstr "Igice ni Inyuma Bya"
+
+#: src/buffer.c:1293
+#, fuzzy, c-format
+msgid "Archive not labeled to match %s"
+msgstr "OYA Kuri BIHUYE"
+
+#: src/buffer.c:1296
+#, fuzzy, c-format
+msgid "Volume %s does not match %s"
+msgstr "OYA BIHUYE"
+
+#: src/buffer.c:1392
+#, fuzzy, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr "%s:IDOSIYE Izina: Kuri in a Umutwempangano"
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Gusoma Bya Bayite"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr ""
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+#, fuzzy
+msgid "Unexpected EOF in archive"
+msgstr "in"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+#, fuzzy
+msgid "File type differs"
+msgstr "Idosiye Ubwoko"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr ""
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr ""
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr ""
+
+#: src/compare.c:212
+#, fuzzy
+msgid "Mod time differs"
+msgstr "Igihe"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr ""
+
+#: src/compare.c:270
+#, fuzzy, c-format
+msgid "Not linked to %s"
+msgstr "Kuri"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr ""
+
+#: src/compare.c:322
+#, fuzzy
+msgid "Device number differs"
+msgstr "Umubare"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr ""
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s:IDOSIYE Ubwoko Nka Bisanzwe IDOSIYE"
+
+#: src/compare.c:524
+#, fuzzy
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Kirimo IDOSIYE Amazina Na: Nyobora Cyavanyweho"
+
+#: src/compare.c:526
+#, fuzzy
+msgid "Verification may fail to locate original files."
+msgstr "Gicurasi Kuri Umwimerere Idosiye"
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "Sibyo Umutwempangano"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s:Kirimo a Ubwihisho bushyinguro Itagi: OYA"
+
+#: src/create.c:270
+#, fuzzy, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+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"
+"."
+
+#: src/create.c:276
+#, fuzzy, c-format
+msgid "value %s out of %s range %s..%s"
+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"
+"."
+
+#: src/create.c:336
+#, fuzzy
+msgid "Generating negative octal headers"
+msgstr "Imitwe"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s:IDOSIYE Izina: ni KININI OYA"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s:IDOSIYE Izina: ni Gutandukanya OYA"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s:Ihuza Izina: ni OYA"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s:Idosiye ku Bayite Wuzuza: Na:"
+
+#: src/create.c:1176
+#, fuzzy, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s:IDOSIYE ni ku a OYA"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, fuzzy, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s:IDOSIYE Ubwoko IDOSIYE"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr "amahuza Kuri"
+
+#: src/create.c:1529
+#, fuzzy, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s:IDOSIYE ni OYA"
+
+#: src/create.c:1537
+#, fuzzy, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s:IDOSIYE ni i OYA"
+
+#: src/create.c:1567
+#, fuzzy, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s:Idosiye Cyavanyweho Mbere Twebwe Gusoma"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s:Kirimo a Ubwihisho bushyinguro Itagi: OYA"
+
+#: src/create.c:1654
+#, fuzzy, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s:IDOSIYE Byahinduwe Nka Twebwe Gusoma"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr ""
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr ""
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+#, fuzzy
+msgid "Skipping to next header"
+msgstr "Kuri Komeza>> Umutwempangano"
+
+#: src/delete.c:281
+#, fuzzy
+msgid "Deleting non-header from archive"
+msgstr "Umutwempangano Bivuye"
+
+#: src/extract.c:198
+#, fuzzy, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s:ki/ bishaje Igihe"
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s:Igihe ni S in i"
+
+#: src/extract.c:395
+#, fuzzy, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s:Ryari: bushyinguro"
+
+#: src/extract.c:588
+#, fuzzy, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s:Mbere Imimerere"
+
+#: src/extract.c:724
+#, fuzzy
+msgid "Extracting contiguous files as regular files"
+msgstr "Idosiye Nka Ibisanzwe Idosiye"
+
+#: src/extract.c:1000
+#, fuzzy
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Bya amahuza Nka Ikomeye amahuza"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr ""
+
+#: src/extract.c:1146
+#, fuzzy, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s:IDOSIYE ni Bivuye Igice"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "in Amazina"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s:IDOSIYE Ubwoko Nka Bisanzwe IDOSIYE"
+
+#: src/extract.c:1184
+#, fuzzy, c-format
+msgid "Current %s is newer or same age"
+msgstr "ni"
+
+#: src/extract.c:1230
+#, fuzzy, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s:Kuri Inyibutsa iyi IDOSIYE"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s:Guhindura izina Kuri"
+
+#: src/extract.c:1370
+#, fuzzy, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "ni OYA NONEAHA"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s:ni Gishya"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr ""
+
+#: src/incremen.c:311
+#, fuzzy, c-format
+msgid "%s: Directory is new"
+msgstr "%s:ni Gishya"
+
+#: src/incremen.c:699 src/incremen.c:716
+#, fuzzy
+msgid "Invalid time stamp"
+msgstr "Igihe"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Ubwoko ku Ihitamo"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+#, fuzzy
+msgid "Invalid device number"
+msgstr "APAREYE Umubare"
+
+#: src/incremen.c:805
+#, fuzzy
+msgid "Invalid inode number"
+msgstr "Umubare"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "in"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr ""
+
+#: src/incremen.c:1392
+#, fuzzy, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s:bushyinguro Kuri"
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s:bushyinguro ni ku a APAREYE OYA"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr ""
+
+#: src/incremen.c:1418
+#, fuzzy, c-format
+msgid "%s: Cannot remove"
+msgstr "%s:Gukuraho..."
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr ""
+
+#: src/list.c:131
+#, fuzzy, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "Funga Bya"
+
+#: src/list.c:144
+#, fuzzy, c-format
+msgid "A lone zero block at %s"
+msgstr "A Zeru Funga ku"
+
+#: src/list.c:155
+#, fuzzy, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "Funga Impera Bya Idosiye"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, fuzzy, c-format
+msgid "block %s: "
+msgstr "Funga"
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, fuzzy, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "in Umutwempangano Bikurikije umubare Agaciro Ikitezwe:"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, fuzzy, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr "Agaciro S ni Inyuma Bya Urutonde"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, fuzzy, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Agaciro S ni Inyuma Bya Urutonde"
+
+#: src/list.c:749
+#, fuzzy
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Kirimo SHINGIRO Imitwe"
+
+#: src/list.c:763
+#, fuzzy, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "SHINGIRO Ikurikiranyanyuguti ni Inyuma Bya Urutonde"
+
+#: src/list.c:794
+#, fuzzy, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "SHINGIRO Agaciro ni Inyuma Bya Urutonde"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, fuzzy, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Kirimo S Bikurikije umubare Agaciro Ikitezwe:"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, fuzzy, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Agaciro ni Inyuma Bya Urutonde"
+
+# sw/source\ui\wrtsh\wrtsh.src:STR_DDEERROR_LINK1.text
+#: src/list.c:1217
+#, fuzzy, c-format
+msgid " link to %s\n"
+msgstr "Guhuza na["
+
+#: src/list.c:1225
+#, fuzzy, c-format
+msgid " unknown file type %s\n"
+msgstr "Kitazwi IDOSIYE Ubwoko"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr ""
+
+#: src/list.c:1259
+#, fuzzy, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--ku Bayite"
+
+#: src/list.c:1287
+#, fuzzy
+msgid "Creating directory:"
+msgstr "bushyinguro"
+
+#: src/misc.c:456
+#, fuzzy, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Kuri"
+
+#: src/misc.c:465 src/misc.c:483
+#, fuzzy, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s:Guhindura izina Kuri"
+
+#: src/misc.c:488
+#, fuzzy, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Inyuma Kuri"
+
+#: src/misc.c:615
+#, fuzzy
+msgid "Cannot save working directory"
+msgstr "Kubika bushyinguro"
+
+#: src/misc.c:621
+#, fuzzy
+msgid "Cannot change working directory"
+msgstr "Guhindura>> bushyinguro"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr ""
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr ""
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, fuzzy, c-format
+msgid "%s: Not found in archive"
+msgstr "%s:Byabonetse in"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s:ukugaragara OYA Byabonetse in"
+
+#: src/tar.c:80
+#, fuzzy, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Na Byombi Bisanzwe Iyinjiza"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s:Imiterere"
+
+#: src/tar.c:181
+#, fuzzy
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Ibiranga ku Imiterere"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"Idosiye a UMWE Cyangwa Na Kugarura Idosiye Bivuye i Bivuye Idosiye Na Byose "
+"Idosiye in Byose Idosiye Bivuye Inyibutsa Ingereka ni Gushyiraho Na: "
+"Ingereka Cyangwa Verisiyo Igenzura Gicurasi Gushyiraho Na: Inyibutsa Cyangwa "
+"Uduciro T Iriho Imibare Ubwoko Iriho Imibare Iriho Imibare NIBA Iriho "
+"Imibare Ibyashyinguwe Byoroheje Nta narimwe Byoroheje Buri gihe Ubwoko "
+"Byoroheje"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Idosiye a UMWE Cyangwa Na Kugarura Idosiye Bivuye i Bivuye Idosiye Na Byose "
+"Idosiye in Byose Idosiye Bivuye Inyibutsa Ingereka ni Gushyiraho Na: "
+"Ingereka Cyangwa Verisiyo Igenzura Gicurasi Gushyiraho Na: Inyibutsa Cyangwa "
+"Uduciro T Iriho Imibare Ubwoko Iriho Imibare Iriho Imibare NIBA Iriho "
+"Imibare Ibyashyinguwe Byoroheje Nta narimwe Byoroheje Buri gihe Ubwoko "
+"Byoroheje"
+
+#: src/tar.c:364
+#, fuzzy
+msgid "Main operation mode:"
+msgstr "Ubwoko"
+
+#: src/tar.c:367
+#, fuzzy
+msgid "list the contents of an archive"
+msgstr "Urutonde i Ibigize Bya"
+
+#: src/tar.c:369
+#, fuzzy
+msgid "extract files from an archive"
+msgstr "Idosiye Bivuye"
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Kurema a Gishya"
+
+#: src/tar.c:374
+#, fuzzy
+msgid "find differences between archive and file system"
+msgstr "Gushaka hagati Na IDOSIYE Sisitemu"
+
+#: src/tar.c:377
+#, fuzzy
+msgid "append files to the end of an archive"
+msgstr "Kongeraho... Idosiye Kuri i Impera Bya"
+
+#: src/tar.c:379
+#, fuzzy
+msgid "only append files newer than copy in archive"
+msgstr "Kongeraho... Idosiye Gukoporora in"
+
+#: src/tar.c:381
+#, fuzzy
+msgid "append tar files to an archive"
+msgstr "Kongeraho... Idosiye Kuri"
+
+#: src/tar.c:384
+#, fuzzy
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "Gusiba Bivuye i OYA ku"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+#, fuzzy
+msgid "handle sparse files efficiently"
+msgstr "Idosiye"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+#, fuzzy
+msgid "handle old GNU-format incremental backup"
+msgstr "ki/ bishaje Imiterere Inyibutsa"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "IDOSIYE"
+
+#: src/tar.c:400
+#, fuzzy
+msgid "handle new GNU-format incremental backup"
+msgstr "Gishya Imiterere Inyibutsa"
+
+#: src/tar.c:402
+#, fuzzy
+msgid "do not exit with nonzero on unreadable files"
+msgstr "OYA Gusohoka Na: ku Idosiye"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+#, fuzzy
+msgid "NUMBER"
+msgstr "Umubare"
+
+#: src/tar.c:404
+#, fuzzy
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"i ukugaragara Bya IDOSIYE in i Ihitamo ni Byemewe in Na: Bya i Gusiba "
+"Cyangwa Urutonde Na Ryari: a Urutonde Bya Idosiye ni ku i Komandi: Umurongo "
+"Cyangwa Biturutse Ihitamo Kuri 1."
+
+#: src/tar.c:410
+#, fuzzy
+msgid "archive is seekable"
+msgstr "ni"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+#, fuzzy
+msgid "attempt to verify the archive after writing it"
+msgstr "Kuri i Nyuma"
+
+#: src/tar.c:420
+#, fuzzy
+msgid "remove files after adding them to the archive"
+msgstr "Gukuraho... Idosiye Nyuma Wongera Kuri i"
+
+#: src/tar.c:422
+#, fuzzy
+msgid "don't replace existing files when extracting"
+msgstr "Gusimbura Idosiye Ryari:"
+
+#: src/tar.c:424
+#, fuzzy
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "Gusimbura Idosiye Amakopi"
+
+#: src/tar.c:426
+#, fuzzy
+msgid "overwrite existing files when extracting"
+msgstr "Guhindura Idosiye Ryari:"
+
+#: src/tar.c:428
+#, fuzzy
+msgid "remove each file prior to extracting over it"
+msgstr "Gukuraho... IDOSIYE Kuri KURI"
+
+#: src/tar.c:430
+#, fuzzy
+msgid "empty hierarchies prior to extracting directory"
+msgstr "ubusa Kuri bushyinguro"
+
+#: src/tar.c:432
+#, fuzzy
+msgid "preserve metadata of existing directories"
+msgstr "Bya ububiko bw'amaderese"
+
+#: src/tar.c:434
+#, fuzzy
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "Guhindura Idosiye Ryari:"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Idosiye Kuri Bisanzwe Ibisohoka"
+
+# padmin/source\rtsetup.src:RID_RTS_RTSDIALOG.RID_RTS_RTSDIALOG_TABCONTROL.RID_RTS_COMMANDPAGE.text
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+#, fuzzy
+msgid "COMMAND"
+msgstr "Icyo wifuza"
+
+#: src/tar.c:445
+#, fuzzy
+msgid "pipe extracted files to another program"
+msgstr "Idosiye Kuri Bisanzwe Ibisohoka"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+#, fuzzy
+msgid "Handling of file attributes:"
+msgstr "Bya IDOSIYE Ibiranga"
+
+#: src/tar.c:457
+#, fuzzy
+msgid "force NAME as owner for added files"
+msgstr "Nka kugirango Kyongewe Idosiye"
+
+#: src/tar.c:459
+#, fuzzy
+msgid "force NAME as group for added files"
+msgstr "Nka Itsinda kugirango Kyongewe Idosiye"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+#, fuzzy
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "Idosiye"
+
+# officecfg/registry\schema\org\openoffice\Office\Calc.xcs:....Revision.Color.Change.text
+#: src/tar.c:462
+#, fuzzy
+msgid "CHANGES"
+msgstr "Amahinduka"
+
+#: src/tar.c:463
+#, fuzzy
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "Ubwoko kugirango Kyongewe Idosiye"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+#, fuzzy
+msgid "don't extract file modified time"
+msgstr "IDOSIYE Byahinduwe Igihe"
+
+#: src/tar.c:472
+#, fuzzy
+msgid "try extracting files with the same ownership"
+msgstr "Idosiye Na: i"
+
+#: src/tar.c:474
+#, fuzzy
+msgid "extract files as yourself"
+msgstr "Idosiye Nka"
+
+#: src/tar.c:476
+#, fuzzy
+msgid "always use numbers for user/group names"
+msgstr "Buri gihe Gukoresha Imibare kugirango Ukoresha: Itsinda Amazina"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+#, fuzzy
+msgid "sort names to extract to match archive"
+msgstr "Ishungura Amazina Kuri Kuri BIHUYE"
+
+#: src/tar.c:487
+#, fuzzy
+msgid "same as both -p and -s"
+msgstr "Nka Byombi P Na S"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+#, fuzzy
+msgid "Device selection and switching:"
+msgstr "Ihitamo Na"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+#, fuzzy
+msgid "use archive file or device ARCHIVE"
+msgstr "Gukoresha IDOSIYE Cyangwa APAREYE"
+
+#: src/tar.c:502
+#, fuzzy
+msgid "archive file is local even if it has a colon"
+msgstr "IDOSIYE ni ATARIIGIHARWE NIBA a"
+
+#: src/tar.c:504
+#, fuzzy
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "Gukoresha Bya"
+
+#: src/tar.c:506
+#, fuzzy
+msgid "use remote COMMAND instead of rsh"
+msgstr "Gukoresha Bya"
+
+#: src/tar.c:510
+#, fuzzy
+msgid "specify drive and density"
+msgstr "Porogaramu- shoboza Na"
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Kurema Urutonde Igice"
+
+#: src/tar.c:526
+#, fuzzy
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "Guhindura>> Nyuma X Bayite"
+
+#: src/tar.c:528
+#, fuzzy
+msgid "run script at end of each tape (implies -M)"
+msgstr "Gukoresha IYANDIKA ku Impera Bya"
+
+#: src/tar.c:531
+#, fuzzy
+msgid "use/update the volume number in FILE"
+msgstr "Gukoresha Kuvugurura i Igice Umubare in"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+#, fuzzy
+msgid "BLOCKS x 512 bytes per record"
+msgstr "X Bayite Icyabitswe"
+
+#: src/tar.c:541
+#, fuzzy
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "Bayite Icyabitswe Igikubo Bya"
+
+#: src/tar.c:543
+#, fuzzy
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "Kwirengagiza in"
+
+#: src/tar.c:545
+#, fuzzy
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "Nka Twebwe Gusoma kugirango 4."
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Imiterere Ihitamo"
+
+#: src/tar.c:552 tests/genfile.c:151
+#, fuzzy
+msgid "FORMAT"
+msgstr "Imiterere"
+
+#: src/tar.c:553
+#, fuzzy
+msgid "create archive of the given format"
+msgstr "Kurema Bya i Imiterere"
+
+#: src/tar.c:555
+#, fuzzy
+msgid "FORMAT is one of the following:"
+msgstr "ni Bya i"
+
+#: src/tar.c:556
+#, fuzzy
+msgid "old V7 tar format"
+msgstr "ki/ bishaje Imiterere"
+
+#: src/tar.c:559
+#, fuzzy
+msgid "GNU format as per tar <= 1.12"
+msgstr "Imiterere Nka 1. 12"
+
+#: src/tar.c:561
+#, fuzzy
+msgid "GNU tar 1.13.x format"
+msgstr "1. X Imiterere"
+
+#: src/tar.c:563
+#, fuzzy
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "1. Imiterere"
+
+#: src/tar.c:565
+#, fuzzy
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "1. Imiterere"
+
+#: src/tar.c:566
+#, fuzzy
+msgid "same as pax"
+msgstr "Nka"
+
+#: src/tar.c:569
+#, fuzzy
+msgid "same as --format=v7"
+msgstr "Nka Imiterere"
+
+#: src/tar.c:572
+#, fuzzy
+msgid "same as --format=posix"
+msgstr "Nka Imiterere"
+
+#: src/tar.c:573
+#, fuzzy
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "Ijambo- banze Agaciro Ijambo- banze Agaciro"
+
+#: src/tar.c:574
+#, fuzzy
+msgid "control pax keywords"
+msgstr "Igenzura Amagambo fatizo"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "UMWANDIKO"
+
+#: src/tar.c:576
+#, fuzzy
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr "Kurema Na: Igice Izina: Urutonde Igihe Gukoresha Nka a Ishusho"
+
+#: src/tar.c:578
+#, fuzzy
+msgid "filter the archive through bzip2"
+msgstr "Muyunguruzi... i Gihinguranya"
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "Muyunguruzi... i Gihinguranya"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "Muyunguruzi... i Gihinguranya Kwegeranya"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+#, fuzzy
+msgid "filter through PROG (must accept -d)"
+msgstr "Muyunguruzi... Gihinguranya Kwemera D"
+
+#: src/tar.c:592
+#, fuzzy
+msgid "Local file selection:"
+msgstr "IDOSIYE Ihitamo"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Guhindura>> Kuri bushyinguro"
+
+#: src/tar.c:599
+#, fuzzy
+msgid "get names to extract or create from FILE"
+msgstr "Kubona Amazina Kuri Cyangwa Kurema Bivuye IDOSIYE"
+
+#: src/tar.c:601
+#, fuzzy
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-NTAGIHARI Amazina C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+# sc/source\ui\src\autofmt.src:RID_SCDLG_AUTOFORMAT.BTN_PATTERN.text
+#: src/tar.c:606 tests/genfile.c:134
+#, fuzzy
+msgid "PATTERN"
+msgstr "Ishusho"
+
+#: src/tar.c:607
+#, fuzzy
+msgid "exclude files, given as a PATTERN"
+msgstr "Idosiye Nka a"
+
+#: src/tar.c:609
+#, fuzzy
+msgid "exclude patterns listed in FILE"
+msgstr "in"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "ububiko bw'amaderese a Ubwihisho Itagi:"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "ububiko bw'amaderese a Ubwihisho Itagi:"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "ububiko bw'amaderese a Ubwihisho Itagi:"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "ububiko bw'amaderese a Ubwihisho Itagi:"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "ububiko bw'amaderese a Ubwihisho Itagi:"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "ububiko bw'amaderese a Ubwihisho Itagi:"
+
+#: src/tar.c:626
+#, fuzzy
+msgid "avoid descending automatically in directories"
+msgstr "Ubujyesi ku buryo bwikora in ububiko bw'amaderese"
+
+#: src/tar.c:628
+#, fuzzy
+msgid "stay in local file system when creating archive"
+msgstr "in IDOSIYE Sisitemu Ryari:"
+
+#: src/tar.c:630
+#, fuzzy
+msgid "recurse into directories (default)"
+msgstr "ububiko bw'amaderese Mburabuzi"
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Nyobora S Bivuye IDOSIYE Amazina"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+#, fuzzy
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "ku in i"
+
+#: src/tar.c:638
+#, fuzzy
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "Idosiye"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "ITARIKI"
+
+#: src/tar.c:641
+#, fuzzy
+msgid "compare date and time when data changed only"
+msgstr "Kugereranya# Itariki Na Igihe Ryari: Ibyatanzwe Byahinduwe"
+
+#: src/tar.c:642
+#, fuzzy
+msgid "CONTROL"
+msgstr "Igenzura"
+
+#: src/tar.c:643
+#, fuzzy
+msgid "backup before removal, choose version CONTROL"
+msgstr "Inyibutsa Mbere Guhitamo Verisiyo"
+
+# svx/source\options\optcolor.src:RID_SVXPAGE_COLORCONFIG.CT_COLORCONFIG.WN_SCROLL.FT_BASICSTRING.text
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+#, fuzzy
+msgid "STRING"
+msgstr "Ikurikiranyanyuguti"
+
+#: src/tar.c:645
+#, fuzzy
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr "Inyibutsa Mbere Ingereka ku IMPINDURAGACIRO"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+#, fuzzy
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "Nyobora Bivuye IDOSIYE Amazina"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+#, fuzzy
+msgid "patterns match file name start"
+msgstr "BIHUYE IDOSIYE Izina: Gutangira"
+
+#: src/tar.c:667
+#, fuzzy
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "BIHUYE Nyuma Mburabuzi"
+
+#: src/tar.c:669
+#, fuzzy
+msgid "case sensitive matching (default)"
+msgstr "ni Mburabuzi"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Ishusho OYA BIHUYE"
+
+#: src/tar.c:677
+#, fuzzy
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "Ishusho BIHUYE Mburabuzi"
+
+#: src/tar.c:682
+#, fuzzy
+msgid "Informative output:"
+msgstr "Ibisohoka"
+
+#: src/tar.c:685
+#, fuzzy
+msgid "verbosely list files processed"
+msgstr "Urutonde Idosiye"
+
+#: src/tar.c:686
+#, fuzzy
+msgid "[.]NUMBER"
+msgstr "Umubare"
+
+#: src/tar.c:687
+#, fuzzy
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "Kugaragaza Aho bigeze Ubutumwa buri Icyabitswe"
+
+#: src/tar.c:690
+#, fuzzy
+msgid "print a message if not all links are dumped"
+msgstr "Gucapa a Ubutumwa NIBA OYA Byose amahuza"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+#, fuzzy
+msgid "print file modification dates in UTC"
+msgstr "Gucapa IDOSIYE Amatariki in"
+
+#: src/tar.c:699
+#, fuzzy
+msgid "send verbose output to FILE"
+msgstr "Kohereza Ibisohoka Kuri"
+
+#: src/tar.c:701
+#, fuzzy
+msgid "show block number within archive with each message"
+msgstr "Garagaza Funga Umubare muri Na: Ubutumwa"
+
+#: src/tar.c:703
+#, fuzzy
+msgid "ask for confirmation for every action"
+msgstr "kugirango Iyemeza kugirango buri Igikorwa"
+
+#: src/tar.c:706
+#, fuzzy
+msgid "show tar defaults"
+msgstr "*Kuri"
+
+#: src/tar.c:708
+#, fuzzy
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr "Cyangwa Urutonde bushyinguro OYA BIHUYE Gushaka Ibigenderwaho"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Impress.xcs:....Misc.Compatibility.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Draw.xcs:....Misc.Compatibility.text
+#: src/tar.c:723
+#, fuzzy
+msgid "Compatibility options:"
+msgstr "Amahitamo y'ikorana."
+
+#: src/tar.c:726
+#, fuzzy
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr "Ryari: Nka ki/ bishaje Nka Oya"
+
+#: src/tar.c:731
+#, fuzzy
+msgid "Other options:"
+msgstr "Amahitamo"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+#, fuzzy
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Gicurasi OYA Birenzeho Ihitamo"
+
+#: src/tar.c:848
+#, fuzzy
+msgid "Conflicting compression options"
+msgstr "igabanyangano Amahitamo"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr "Kitazwi IDOSIYE Ubwoko"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "IDOSIYE OYA Byabonetse"
+
+#: src/tar.c:936
+#, fuzzy, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "kugirango Kitazwi Itariki Imiterere"
+
+#: src/tar.c:961
+#, fuzzy, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Itariki Nka"
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s:IDOSIYE ni i OYA"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+#, fuzzy
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr "*Kuri"
+
+#: src/tar.c:1199
+#, fuzzy
+msgid "Invalid blocking factor"
+msgstr "Umubarwa"
+
+#: src/tar.c:1271
+#, fuzzy
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "i Ihitamo ni OYA j Cyangwa"
+
+#: src/tar.c:1304
+#, fuzzy
+msgid "Invalid tape length"
+msgstr "Uburebure"
+
+#: src/tar.c:1336
+#, fuzzy
+msgid "More than one threshold date"
+msgstr "Itariki"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, fuzzy, c-format
+msgid "%s: Invalid group"
+msgstr "%s:Itsinda"
+
+#: src/tar.c:1596
+#, fuzzy
+msgid "Invalid mode given on option"
+msgstr "Ubwoko ku Ihitamo"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Umubare utari wo"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr ""
+
+#: src/tar.c:1705
+#, fuzzy
+msgid "Invalid record size"
+msgstr "Icyabitswe Ingano"
+
+#: src/tar.c:1708
+#, fuzzy, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Ingano a Igikubo Bya"
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "Umubare Bya Ibintu"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr ""
+
+#: src/tar.c:1884
+#, fuzzy, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "0 7 OYA ku iyi"
+
+#: src/tar.c:1919
+#, fuzzy
+msgid "[FILE]..."
+msgstr "[Idosiye"
+
+#: src/tar.c:2022
+#, fuzzy, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Ihitamo"
+
+#: src/tar.c:2104
+#, fuzzy
+msgid "--occurrence is meaningless without a file list"
+msgstr "--ukugaragara ni a IDOSIYE Urutonde"
+
+#: src/tar.c:2110
+#, fuzzy
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--ukugaragara in i Ubwoko"
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Idosiye Ihitamo"
+
+#: src/tar.c:2145
+#, fuzzy
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Kuvanga Na:"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s:Akarango ni ni Bayite"
+
+#: src/tar.c:2175
+#, fuzzy
+msgid "Cannot verify multi-volume archives"
+msgstr "Igice Ubushyinguro"
+
+#: src/tar.c:2177
+#, fuzzy
+msgid "Cannot verify compressed archives"
+msgstr "Byegeranijwe Ubushyinguro"
+
+#: src/tar.c:2183
+#, fuzzy
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Gukoresha Igice Byegeranijwe Ubushyinguro"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Kuvugurura Byegeranijwe Ubushyinguro"
+
+#: src/tar.c:2201
+#, fuzzy
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--Ihitamo ku Ubushyinguro"
+
+#: src/tar.c:2226
+#, fuzzy
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Kuri Kurema ubusa"
+
+#: src/tar.c:2247
+#, fuzzy
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Na: F"
+
+#: src/tar.c:2334
+#, fuzzy
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Bya i Amahitamo"
+
+#: src/tar.c:2385
+#, fuzzy, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Gusohoka Bivuye Ibanjirije Amakosa"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s:Idosiye ku Bayite"
+
+#: src/xheader.c:158
+#, fuzzy, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "ni Kitazwi Cyangwa OYA"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+#, fuzzy
+msgid "Malformed extended header: missing length"
+msgstr "Byongerewe... Umutwempangano Ibuze bingana IKIMENYETSO"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "SHINGIRO Ikurikiranyanyuguti ni Inyuma Bya Urutonde"
+
+#: src/xheader.c:525
+#, fuzzy
+msgid "Malformed extended header: missing blank after length"
+msgstr "Byongerewe... Umutwempangano Ibuze Nyuma i Uburebure"
+
+#: src/xheader.c:533
+#, fuzzy
+msgid "Malformed extended header: missing equal sign"
+msgstr "Byongerewe... Umutwempangano Ibuze bingana IKIMENYETSO"
+
+#: src/xheader.c:539
+#, fuzzy
+msgid "Malformed extended header: missing newline"
+msgstr "Byongerewe... Umutwempangano Ibuze bingana IKIMENYETSO"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Agaciro ni Inyuma Bya Urutonde"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Byongerewe... Umutwempangano Ibuze bingana IKIMENYETSO"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, fuzzy, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Byongerewe... Umutwempangano Ibuze bingana IKIMENYETSO"
+
+#: src/xheader.c:1328
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "Byongerewe... Umutwempangano Ibuze bingana IKIMENYETSO"
+
+#: src/xheader.c:1338
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Byongerewe... Umutwempangano Ibuze bingana IKIMENYETSO"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Amahitamo"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+#, fuzzy
+msgid "Create file of the given SIZE"
+msgstr "Kurema Bya i Imiterere"
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Idosiye Kuri Bisanzwe Ibisohoka"
+
+#: tests/genfile.c:131
+#, fuzzy
+msgid "Read file names from FILE"
+msgstr "Bayite Bivuye"
+
+#: tests/genfile.c:133
+#, fuzzy
+msgid "-T reads null-terminated names"
+msgstr "-NTAGIHARI Amazina C"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "Kuri i Nyuma"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+# padmin/source\rtsetup.src:RID_RTS_RTSDIALOG.RID_RTS_RTSDIALOG_TABCONTROL.RID_RTS_COMMANDPAGE.text
+#: tests/genfile.c:189
+#, fuzzy
+msgid "Execute COMMAND"
+msgstr "Icyo wifuza"
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Igihe"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Umubare Inyuma Bya Urutonde"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Sisitemu Ikosa"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s:Kuri"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr "Kitazwi IDOSIYE Ubwoko"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s:Kuri"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr ""
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--IDOSIYE Amazina"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#, fuzzy
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Porogaramu Na: Kuri i Kwagura ku Gicurasi i Bya i i IDOSIYE kugirango "
+#~ "Birambuye"
+
+#, fuzzy
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "Komandi:"
+
+#, fuzzy
+#~ msgid "WARNING: No volume header"
+#~ msgstr "Igice Umutwempangano"
+
+#, fuzzy
+#~ msgid "Visible long name error"
+#~ msgstr "Izina: Ikosa"
+
+#, fuzzy
+#~ msgid "Time stamp out of range"
+#~ msgstr "Inyuma Bya Urutonde"
+
+#, fuzzy
+#~ msgid "Device number out of range"
+#~ msgstr "Umubare Inyuma Bya Urutonde"
+
+#, fuzzy
+#~ msgid "Visible longname error"
+#~ msgstr "Ikosa"
+
+#, fuzzy
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Kuri"
+
+#, fuzzy
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s:Kuri"
+
+#, fuzzy
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Kuri"
+
+#, fuzzy
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Komandi:"
+
+#, fuzzy
+#~ msgid "Missing file name after -C"
+#~ msgstr "IDOSIYE Izina: Nyuma C"
+
+#, fuzzy
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "Guhindura>> Times ku Idosiye"
+
+#, fuzzy
+#~ msgid "extract permissions information"
+#~ msgstr "Uruhushya Ibisobanuro"
+
+#, fuzzy
+#~ msgid "do not extract permissions information"
+#~ msgstr "OYA Uruhushya Ibisobanuro"
+
+#, fuzzy
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "Byuzuye Ikurikiranyanyuguti"
+
+#, fuzzy
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "i Idosiye Akadomo Kuri"
+
+#, fuzzy
+#~ msgid "same as -N"
+#~ msgstr "Nka"
+
+#, fuzzy
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "Gukoresha Mburabuzi"
+
+#, fuzzy
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "Gucapa Igiteranyo Bayite"
+
+#, fuzzy
+#~ msgid "Print license and exit"
+#~ msgstr "Na Gusohoka"
+
+#, fuzzy
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr "ku i Akazi Bya Na Byuzuye Urutonde Bya Abahanzi"
+
+#, fuzzy
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ni Kigenga Na Cyangwa i Bya i Nka i Verisiyo 2. Bya i ku Ihitamo Verisiyo "
+#~ "ni in i ATARIIGIHARWE i Cyangwa A kugirango Birenzeho Birambuye BYAKIRIWE "
+#~ "a Gukoporora Bya i Na: NIBA OYA Kwandika Kuri i"
+
+#, fuzzy
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "Bya L Ihitamo Guhindura>> in i"
+
+#, fuzzy
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Gukoresha IDOSIYE Sisitemu Ihitamo"
+
+#, fuzzy
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "i Y Ihitamo ni OYA j"
+
+#, fuzzy
+#~ msgid "Error in writing to standard output"
+#~ msgstr "in Kuri Bisanzwe Ibisohoka"
diff --git a/po/sk.gmo b/po/sk.gmo
new file mode 100644
index 0000000..36c8f77
--- /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..ceeddbd
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,2859 @@
+# Slovak translations for GNU tar
+# Copyright (C) 1997 Free Software Foundation, Inc.
+# Martin Lacko <lacko@host.sk>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar- \n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2002-02-10 12:00CEST\n"
+"Last-Translator: Martin Lacko <lacko@host.sk>\n"
+"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 0.9.5\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "argument %s je pre %s neplatný"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "argument %s nie je pre %s jednoznaèný"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Platné argumenty sú:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+#, fuzzy
+msgid " [OPTION...]"
+msgstr ""
+"\n"
+"Pou¾itie: %s [PREPÍNAÈ]...\n"
+
+#: lib/argp-help.c:1683
+#, 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"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+" Chyby v programe oznamujte na adresa <bug-tar@gnu.org> (iba anglicky),\n"
+"pripomienky k pkekladu zasielajte na adresu <sk-i18n@lists.linux.sk> "
+"(slovensky).\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Neznáma systémová chyba"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: prepínaè `%s' vy¾aduje argument\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: prepínaè %s nie je jednoznaèný\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: prepínaè `--%s' musí by» zadaný bez argumentov\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: prepínaè `%c%s' musí by» zadaný bez argumentu\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: prepínaè `%s' vy¾aduje argument\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: neznámy prepínaè `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: neznámy prepínaè `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: neznámy prepínaè -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: neznámy prepínaè -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: prepínaè vy¾aduje argument -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: prepínaè `-W %s' nie je jednoznaèný\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: prepínaè `-W %s' musí by» zadaný bez argumentu\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "veµkos» bloku"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "Pamä» vyèerpaná"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Nedá sa %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Varovanie: Nedá sa %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Práva nie je mo¾né zmeni» na %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Vlastníctvo nie je mo¾né zmeni» na uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Odkaz na %s nie je mo¾né vytvori»"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Chyba pri èítaní na bajte %s, èítanie %lu bajtov"
+msgstr[1] "%s: Chyba pri èítaní na bajte %s, èítanie %lu bajtov"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Varovanie: Chyba pri èítaní na bajte %s, èítanie %lu bajtov"
+msgstr[1] "%s: Varovanie: Chyba pri èítaní na bajte %s, èítanie %lu bajtov"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Nedá sa zmeni» pozícia v súbore na %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Varovanie: Ukazovateµ v súbore nie je mo¾né premiestni» na %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Symbolický odkaz na `%s' nie je mo¾né vytvori»"
+
+#: lib/paxerror.c:349
+#, fuzzy, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Zapísané iba %lu z %lu bajtov"
+msgstr[1] "%s: Zapísané iba %lu z %lu bajtov"
+
+#: lib/paxnames.c:132
+#, fuzzy, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Odstraòujem úvodné `%.*s' z názvov súborov"
+
+#: lib/paxnames.c:133
+#, fuzzy, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Odstraòujem úvodné `%.*s' z názvov súborov"
+
+#: lib/paxnames.c:146
+#, fuzzy
+msgid "Substituting `.' for empty member name"
+msgstr "Odstraòujem úvodné `%.*s' z názvov súborov"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Slu¾ba nie je k dispozícii"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Vzdialený shell nie je mo¾né spusti»"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Miesto pre buffer nie je mo¾né alokova»\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Miesto pre buffer nie je mo¾né alokova»"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Viac informácií získate príkazom `%s --help'.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Pou¾itie: %s [PREPÍNAÈ]\n"
+"Manipuluje s archívom, prjíma príkazy vzdialeného procesu.\n"
+"\n"
+" --version Vypí¹e oznaèenie verzie\n"
+" --help Vypí¹e túto nápovedu\n"
+
+#: rmt/rmt.c:315
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+" Chyby v programe oznamujte na adresa <bug-tar@gnu.org> (iba anglicky),\n"
+"pripomienky k pkekladu zasielajte na adresu <sk-i18n@lists.linux.sk> "
+"(slovensky).\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Veµkos» pozície v súbore je mimo rozsah"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Veµkos» pozície v súbore je mimo rozsah"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Smer posunu v súbore je mimo rozsah"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Predèasný koniec súboru\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Predèasný koniec súboru"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Neznámy príkaz"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Celkom zapísané bajtov: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Celkom zapísané bajtov: %s (%sB, %sB/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(rúra)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Chybná hodnota pre veµkos» záznamu"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Meno archívu nebolo zadané"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Stdin/Stdout archív nie je mo¾né otvori»"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Komprimovaný archív nie je mo¾né aktualizova»"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Zapisujem testovací bod %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Èítanie testovacieho bodu %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Páska na zaèiatku, konèím"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Príli¹ mnoho chýb, konèím"
+
+#: src/buffer.c:698
+#, fuzzy, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Nezarovnaný blok (%lu bajtov) v archíve"
+msgstr[1] "Nezarovnaný blok (%lu bajtov) v archíve"
+
+#: src/buffer.c:718
+#, fuzzy, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Veµkos» záznamu = %lu blokov"
+msgstr[1] "Veµkos» záznamu = %lu blokov"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "V archíve sa nie je mo¾né vráti», bez -i mô¾e by» neèitateµný"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: vracia chybné èíslo zväzku"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Èíslo zväzku preteèené"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Pripravte zväzok #%d pre archív %s a stlaète return:"
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Namiesto u¾ívateµskej odpovede bol zadaný koniec súboru"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "VAROVANIE: Archiv je nekompletný"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [name] Zadanie nového mena pre ïal¹í (a nasledujú) zväzok(ky)\n"
+" q Ukonèenie programu tar\n"
+" ! Vytvorenie podshellu\n"
+" ? Vypísanie tejto nápovedy\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Nie je nový zväzok; konèím.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "'%s' príkaz zlyhal"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Toto pravdepodobne nie je tar archiv"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s nepokraèuje na tomto zväzku"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s nepokraèuje na tomto zväzku"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s je chybnej då¾ky (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Tento zväzok nie je následníkem predchádzajúceho"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Pre vyhodnotenie vzorky `%s' musí by» archív pomenovaný"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Zväzok %s nezodpovedá vzorke %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, fuzzy, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Dá sa èíta» iba %lu z %lu bajtov"
+msgstr[1] "Dá sa èíta» iba %lu z %lu bajtov"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Obsah sa lí¹i"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Neoèekávaný koniec archívu"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Typ súboru sa lí¹i"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Práva sa lí¹ia"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid sa lí¹i"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid sa lí¹i"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Èas poslednej úpravy sa lí¹i"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Veµkos» sa lí¹i"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Nie je odkazom na %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symbolický odkaz sa lí¹i"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Èíslo zariadenia sa lí¹i"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Overujem "
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Neznámy typ súboru '%c', porovnávaný ako normálny súbor"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, fuzzy, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "CHYBNÉ OVERENIE: nájdených chybných hlavièiek: %d"
+msgstr[1] "CHYBNÉ OVERENIE: nájdených chybných hlavièiek: %d"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: súbor je archiv; nearchivovaný"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "hodnota %s typu %s je mimo rozsah %s..%s; nahradzujem za %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "hodnota %s typu %s je mimo rozsah %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Generujem záporné osmièkové hlavièky"
+
+#: src/create.c:622 src/create.c:685
+#, fuzzy, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: súbor nie je zmenený; neaktualizovaný"
+
+#: src/create.c:632
+#, fuzzy, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: súbor nie je zmenený; neaktualizovaný"
+
+#: src/create.c:659
+#, fuzzy, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: súbor nie je zmenený; neaktualizovaný"
+
+#: src/create.c:1075
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Súbor je krat¹í o : %s bajtov; Doplòujem nulami."
+msgstr[1] "%s: Súbor je krat¹í o : %s bajtov; Doplòujem nulami."
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: súbor je na inom súborovom systéme; nearchivovaný"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Neznámy typ súboru; súbor ignorovaný"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr " odkaz na %s\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: súbor nie je zmenený; neaktualizovaný"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: súbor je archiv; nearchivovaný"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Súbor zmazaný skôr ako mohl by» èítaný"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: súbor je archiv; nearchivovaný"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: súbor bol poèas èítania zmenený"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: soket ignorovaný"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: dvere ignorované"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Preskakujem na ïal¹iu hlavièku"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Z archívu je mazané to, èo nie je hlavièka"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: èasová nálepka %s je %lu z dátumu budúcnosti"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Neoèakávaná nekonzistencia, pri vytvárení adresára"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+"%s: Prieèinok bol premenovaný predtým, ako mohol by» extrahovaný jeho stav"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Súvisle ulo¾ené súbory rozbaµujem ako obyèajné súbory"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Skú¹am rozbali» symbolické odkazy ako pevné odkazy"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Èítanie z %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Nedá sa rozbali» -- súbor je pokraèovaním iného zväzku"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Neoèakávaný koniec v rozsekanom mene"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Neznámy typ súboru `%c', rozbalený ako normálny súbor"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Tento súbor nebolo mo¾né zálohova»"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: nie je mo¾né premenova» na %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Z chyby sa nie je mo¾né zotavi»: ukonèuje sa"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Adresár bol premenovaný"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Adresár bol premenovaný"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Adresár je nový"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Neplatný èas súboru"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "Zadáné chybné práva"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Neplatné èíslo zariadenia"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Neplatné èíslo i-uzlu"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Neoèekávaný koniec archívu"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Pre blokový faktor (blokov na záznam) %d nie je mo¾né alokovat pamä»"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: súbor je na inom súborovom systéme; nearchivovaný"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Ma¾em %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Nedá sa zmaza»"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Vynechávam"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** Blok NUL **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok %s: ** Konec súboru **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Medzery v hlavièke na mieste, kde je oèakávaná èíselná hodnota typu %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Osmièková hodnota %.*s typu %s je mimo rozsah; priradzujem dvojkový "
+"complement"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Osmièková hodnota %.*s typu %s je mimo rozsah"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Archív obsahuje zastaralé base-64 hlavièky"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Hodnota base-64 typu %s je mimo %s rozsah"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Hodnota base-256 typu %s je mimo rozsah"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Archív obsahuje %.*s tam, kde je oèakaváná èísalná hodnota typu %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Hodnota %s typu %s je mimo rozsah %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " odkaz na %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " neznámy typ súboru %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Hlavièka zväzku--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Pokraèované od %s bajtu--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Vytváram adresár:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Premenovávam %s na %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: nie je mo¾né premenova» na %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Premenovávám %s spä» na %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Pracovný adresár nie je mo¾né uchova»"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Pracovný adresár nie je mo¾né zmeni»"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "potomok"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "meziprocesový kanál"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: V archíve nenájdený"
+
+#: src/names.c:621
+#, fuzzy, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: V archíve nenájdený"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Prepínaèe `-%s' a `-%s' vy¾adujú ¹tandardný vstup"
+
+#: src/tar.c:157
+#, fuzzy, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Chybná skupina"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU roz¹írenia po¾adované na nekompatibilnom formáte archívu"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Pou¾itie: %s [PREPÍNAÈ]... [SÚBOR]...\n"
+"\n"
+"Príklady:\n"
+" %s -cf archív.tar foo bar # Vytvorí archív.tar zo súboru foo a bar.\n"
+" %s -tvf archív.tar # Podrobne vypí¹e v¹etky súbory v archív.tar.\n"
+" %s -xf archív.tar # Rozbalí v¹etky súbory z archív.tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+" Prípona zálo¾ných súborov bude `~', pokiaµ nie je nastavená pomocou --"
+"suffix\n"
+"alebo premennej SIMPLE_BACKUP_SUFFIX. Ak sa majú tvori» zálo¾né kópie, mô¾e "
+"by»\n"
+"nastavené pomocou prepínaèa --backup alebo premennej VERSION_CONTROL. "
+"Hodnoty\n"
+"mô¾u by»:\n"
+"\n"
+" t, numbered tvoria èíslované zálo¾né kópie\n"
+" nil, existing èíslované, ak u¾ èíslované zálo¾né kópie\n"
+" existujú, inak tvorí jednoduché\n"
+" never, simple tvorí v¾dy jednoduché zálo¾né kópie súborov\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "Neoèekávaný koniec archívu"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "Chyba pri zápise na ¹tandardný výstup"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "Víczväzkový archív nie je mo¾né otvori»"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+#, fuzzy
+msgid "Archive format selection:"
+msgstr "Odporujúce si archívne formáty"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s: súbor je archiv; nearchivovaný"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s: súbor je archiv; nearchivovaný"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "Pracovný adresár nie je mo¾né zmeni»"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "Odstraòujem úvodné `%.*s' z názvov súborov"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "Zväzok %s nezodpovedá vzorke %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Viac ako jeden prepínaè `-Acdtrux' nemô¾e by» zadaných"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Odporujúce si kompresné prepínaèe"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " neznámy typ súboru %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Dátumový súbor nebol nájdený"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Zamieòam %s za neznámy dátumový formát %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: súbor je archiv; nearchivovaný"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Neplatný poèet bajtov na záznam"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+"Varovanie: prepínaè -I nie je podporovaný; pravdepodobne budete chcie» "
+"pou¾i» -j alebo -T!"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Neplatná då¾ka pásky"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Viac ako jeden poèiatoèný dátum"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Chybná skupina"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Zadáné chybné práva"
+
+#: src/tar.c:1649
+#, fuzzy
+msgid "Invalid number"
+msgstr "Neplatné èíslo i-uzlu"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Neplatný vlastník"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Chybná veµkos» záznamu"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Veµkos» záznamu musí by» násobok %d."
+
+#: src/tar.c:1745
+#, fuzzy
+msgid "Invalid number of elements"
+msgstr "Neplatná då¾ka pásky"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr ""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Prepínaè `-[0-7][lmh]' nie je podporovaný týmto tarom"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Prepínaè `%c' vy¾aduje argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+#, fuzzy
+msgid "Multiple archive files require `-M' option"
+msgstr "Viac archivaèných súborov vy¾aduje prepínaè `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "--listed-incremental a --newer nie je mo¾né kombinova»"
+
+#: src/tar.c:2162
+#, fuzzy, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Meno zväzku je príli¹ dlhé (limit je %lu bajtov)"
+msgstr[1] "%s: Meno zväzku je príli¹ dlhé (limit je %lu bajtov)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Víczväzkový archív nie je mo¾né otvori»"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Komprimovaný archív nie je mo¾né otvori»"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Viaczväzkový komprimovaný archív nie je mo¾né vytvori»"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Komprimovaný archív nie je mo¾né aktualizova»"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Vytvorenie prázdneho archívu odmietnuté."
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Prepínaèe `-Aru' a `--delete' sú nezlúèiteµné s prepínaèom `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Musíte zada» jeden z prepínaèov `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Za behu programu nastala chyba"
+
+#: src/update.c:86
+#, fuzzy, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Súbor skrátený o bajtov: %s"
+msgstr[1] "%s: Súbor skrátený o bajtov: %s"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Hodnota base-64 typu %s je mimo %s rozsah"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Hodnota %s typu %s je mimo rozsah %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Generujem datové súbory pre testovanie GNU taru.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Odporujúce si kompresné prepínaèe"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "Chyba pri zápise na ¹tandardný výstup"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Neplatný èas súboru"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Èíslo i-uzlu mimo rozsah"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Neznáma systémová chyba"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Nedá sa zmeni» pozícia v súbore na %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " neznámy typ súboru %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Nedá sa zmeni» pozícia v súbore na %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Potomok bol ukonèený signálom %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Rozdelené meno súboru--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "Cannot close"
+#~ msgstr "Nedá sa zatvori»"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Popisovaè súboru nie je mo¾né duplikova»"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Komprimované alebo vzdialené archívy nie je mo¾né pou¾i»"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (potomok)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (prapotomok)"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "VAROVANIE: Chýba hlavièka zväzku"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Potomok vrátil status %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Názvy súborov obsahujú `..'"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: Názov súboru obsahuje `..'"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Viditeµná chyba dlhého mena"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Èas súboru mimo rozsah"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Èíslo zariadenia je mimo rozsah"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Viditeµná chyba dlhého mena"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Súbor %s premenovaný na %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Odkaz na `%s' nie je mo¾né vytvori»"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s odkazuje na %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Neznámy príkaz %s pre spojovanie rozsekaných mien"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Za -C chýba meno súboru"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ " Toto je volne ¹íriteµné programové vybavenie, které je celkom BEZ "
+#~ "ZÁRUKY.\n"
+#~ "Podmienky pre kopírovanie a roz¹irovanie nájdete vo V¹eobecnej verejnej "
+#~ "licencii GNU\n"
+#~ "(GNU General Public Licence). Viac informáciízískate v zdrojových "
+#~ "textoch\n"
+#~ "v súbore COPYING."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Neznámy príkaz %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ " GNU `tar' je archivaèný program. Ukladá súbory do archívu na pásku "
+#~ "alebo \n"
+#~ "disk. Z archívu doká¾e rozbali» tak celé hierarchie súborov, ako i "
+#~ "jednotlivé\n"
+#~ "súbory.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ " Ak dlhé prepínaèe majú povinný argument, tak tento argument je\n"
+#~ "povinný i u ich krátkych foriem. Obdobne je tomu v prípade, keï je "
+#~ "argument\n"
+#~ "nepovinný.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Hlavné funkcie:\n"
+#~ " -t, --list vypí¹e obsah archívu\n"
+#~ " -x, --extract, --get vyberie súbor(y) z archívu\n"
+#~ " -c, --create vytvorí nový archív\n"
+#~ " -d, --diff, --compare nájde rozdiely medzi archívom a súborovým "
+#~ "systémom\n"
+#~ " -r, --append pridá súbory na koniec archívu\n"
+#~ " -u, --update pridá iba súbory nov¹ie, ako sú v archíve\n"
+#~ " -A, --catenate pridá súbory z tar archívu do archívu\n"
+#~ " --concatenate rovnaké ako -A\n"
+#~ " --delete ma¾e z archívu (nefunguje na magnetických "
+#~ "páskách)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modifikátory operácií:\n"
+#~ " -W, --verify overí archív po zápise na médium\n"
+#~ " --remove-files zma¾e originálne súbory po ich archivácii\n"
+#~ " -k, --keep-old-files neprepisuje existujúce súbory pri "
+#~ "rozbaµovaní\n"
+#~ " archívu\n"
+#~ " --overwrite prepisuje existujúce súbory pri rozbaµovaní\n"
+#~ " --overwrite-dir ak existujú metadáta adresára, tak ich "
+#~ "prepí¹e\n"
+#~ " -U, --unlink-first ma¾e súbory pred ich prepísaním\n"
+#~ " --recursive-unlink zma¾e prázdne hierarchie pred \n"
+#~ " rozbaµovaním adresárov\n"
+#~ " -S, --sparsa súbory s dierami spracuje efektívnej¹ie\n"
+#~ " -O, --to-stdout rozbalí archív na ¹tandardný výstup\n"
+#~ " -G, --incremental spracuje starý GNU-formát inkrementálnej "
+#~ "zálohy\n"
+#~ " -g, --listed-incremental=SÚBOR\n"
+#~ " spracuje nový GNU-formát inkrementálnej "
+#~ "zálohy\n"
+#~ " --ignore-failed-read ignoruje chyby pri èítaní súborov\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Spracovanie vlastností súboru:\n"
+#~ " --owner=MENO pou¾ije MENO ako vlastníka pridávaných "
+#~ "súborov\n"
+#~ " --group=MENO pou¾ije MENO ako skupinu pridávaných "
+#~ "súborov\n"
+#~ " --mode=ZMENY pou¾ije ako práva (symbolická) "
+#~ "pridávaných\n"
+#~ " súborov\n"
+#~ " --atime-presarve nemení prístupový èas na spracovávaných\n"
+#~ " súboroch\n"
+#~ " -m, --modification-time u rozbaµovavaných súborov nenastaví èas\n"
+#~ " poslednej úpravy súboru z archívu\n"
+#~ " --same-owner u rozbalovávaných súborov skú¹a nastavi»\n"
+#~ " toho istého vlastníka ako je v archíve\n"
+#~ " --no-same-owner rozbalí súbory a v¹etky budú vlastnené "
+#~ "Vami\n"
+#~ " --numeric-owner v¾dy pou¾ívá èísla pre mená vlastníka/"
+#~ "skupiny\n"
+#~ " -p, --same-permissions u rozbaµovaných súborov nastaví rovnaké\n"
+#~ " práva, aké majú v archíve\n"
+#~ " --no-same-permissions pri rozbaµovaní nenastavuje práva\n"
+#~ " --presarve-permissions rovnaké ako -p\n"
+#~ " -s, --same-order zoradenie mien súborov pre rozbalenie je\n"
+#~ " zhodné s archívov\n"
+#~ " --presarve-order rovnaké ako -s\n"
+#~ " --presarve rovnaké ako zadané -p a -s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Výber zariadenia:\n"
+#~ " -f, --file=ARCHÍV pracuje s archivom alebo zariadeniami "
+#~ "ARCHÍV\n"
+#~ " --force-local archívny súbor je lokálny, dokonca i "
+#~ "kdeï\n"
+#~ " obsahuje ve mene dvojbodku\n"
+#~ " --rsh-command=PRÍKAZ pou¾ije PRÍKAZ pre prihlásenie namiesto "
+#~ "rsh\n"
+#~ " -[0-7][lmh] zadanie zariadenia a hustoty\n"
+#~ " -M, --multi-volume práca s viaczväzkovým archívom\n"
+#~ " -L, --tape-length=ÈÍSLO vymení pásku po zapísaní ÈÍSLO x 1024 "
+#~ "bajtov\n"
+#~ " -F, --info-script=SÚBOR spustí script na konci ka¾dej pásky\n"
+#~ " (zahrnuje i -M)\n"
+#~ " --new-volume-script=SÚBOR rovnaké ako -F SÚBOR\n"
+#~ " --volno-file=SÚBOR pou¾ije/aktualizuje èíslo zväzku v "
+#~ "SÚBORe\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Bloky zariadenia:\n"
+#~ " -b, --blocking-factor=BLOKOY BLOKY x 512 bajtov na záznam\n"
+#~ " --record-size=VE¥KOS« VE¥KOS« bajtov na záznam, násobok 512\n"
+#~ " -i, --ignore-zeros ignoruje nulové bloky v archíve,\n"
+#~ " ktoré normálne znamenajú EOF.\n"
+#~ " -B, --read-full-records keï nie je preèítané toµko bajtov,\n"
+#~ " koµko je po¾adované, skú¹a doèíta» "
+#~ "zbostatok\n"
+#~ " (vhodné pre rúry)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Výber formátu archívu:\n"
+#~ " -V, --label=MENO vytvorí archív s menom zväzku MENO\n"
+#~ " VZOR v obsahu/rozbaµovaní globálny vzor\n"
+#~ " pre mená súborov\n"
+#~ " -o, --old-archive, --portability zapí¹e archív vo formáte V7\n"
+#~ " --posix zapí¹e archív vo formáte POSIX\n"
+#~ " -I, --bzip2 komprimuje archív pomocou bzip2\n"
+#~ " -z, --gzip, --ungzip komprimuje archív pomocou gzip\n"
+#~ " -Z, --compress, --uncompress komprimuje archív pomocou compress\n"
+#~ " --usa-compress-program=PROG komprimuje archív pomocou PROG\n"
+#~ " (ktorý musí akceptova» -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Výber súborov:\n"
+#~ " -C, --directory=ADRESÁR operácie vykonáva v ADRESÁRi\n"
+#~ " -T, --files-from=MENO pri rozbalovaní alebo vytvárení berie "
+#~ "názvy\n"
+#~ " súborov zo súboru MENO\n"
+#~ " --null -T èita nulou ukonèené mená, zakázané -C\n"
+#~ " --exclude=VZOR nepracuje so súbormi odpovedajúcim VZORu\n"
+#~ " -X, --exclude-from=SÚBOR nepracuje sa so súbormi, ktoré zodpovedajú\n"
+#~ " niektorému vzoru v SÚBORe\n"
+#~ " --anchored nepracuje sa so vzormi, ktoréch zaèínajú "
+#~ "ako názov (predvolené)\n"
+#~ " --no-anchored vynecha» vzory za ka¾dým /\n"
+#~ " --ignore-case vynechávanie ignorujúce veµkosti písmen\n"
+#~ " --no-ignore-case vynechávanie rozoznáva veµkosti písmen "
+#~ "(predvolené)\n"
+#~ " --wildcards vynecha» vzory obsahujúce wildcards "
+#~ "(predvolené)\n"
+#~ " --no-wildcards vynecha» vzory obsahujúce prázdne re»azce\n"
+#~ " --wildcards-match-slash vynecha» vzory, ktorých wildcards obsahujú "
+#~ "'/' (predvolené)\n"
+#~ " --no-wildcards-match-slash vynecha» vzory, ktorých wildcards "
+#~ "neobsahujú '/'\n"
+#~ " -P, --absolute-names neodstraòuje úvodné `/' z mien súborov\n"
+#~ " -h, --dereference namiesto symbolických odkazov pou¾ije "
+#~ "súbory,\n"
+#~ " na ktoré odkazy ukazujú\n"
+#~ " --no-recursion neprechádza adresáre\n"
+#~ " -l, --one-file-system pri vytváraní archívu zostane v jednom\n"
+#~ " súborovom systéme\n"
+#~ " -K, --starting-file=MENO zaène od súboru MENO z archívu\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DÁTUM archívuje iba súbory nov¹ie ako DÁTUM\n"
+#~ " --newer-mtime=DÁTUM archíveje iba súbory, ktorých dátum "
+#~ "ostatnej\n"
+#~ " zmeny dát je novj¹í ako DÁTUM\n"
+#~ " --after-date=DÁTUM rovnaké ako -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=TYP] spôsob zálohovania súborov, pred ich "
+#~ "prepísaním\n"
+#~ " --suffix=PRÍPONA zálohuje pred prepísaním (zmazaním), ako "
+#~ "príponu\n"
+#~ " u zálo¾ných súborov pou¾ije PRÍPONu\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Informatívny výstup:\n"
+#~ " --help vypí¹e túto nápovedu a skonèí\n"
+#~ " --version vypí¹e oznaèenie verzie programu tar a skonèí\n"
+#~ " -v, --verbose. vypisuje spracovávané súbory\n"
+#~ " --checkpoint vypisuje mená adresárov pri èítaní archívu\n"
+#~ " --totals vypí¹e celkom zapísaných bajtov pri tvorbe "
+#~ "archívu\n"
+#~ " -R, --block-number s ka¾dou správou vypí¹e èíslo bloku v archíve\n"
+#~ " -w, --interactive ¾iada potvrdenie ka¾dej akcie\n"
+#~ " --confirmation rovnaké ako -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ " GNU tar nevie èíta» alebo produkova» `--posix' archívy. Ak je\n"
+#~ "v prostredí nastavené POSIXLY_CORRECT, GNU roz¹írenie je zablokované "
+#~ "prepínaèom\n"
+#~ "`--posix'. Podpora POSIX formátu je èiasteène implementovaná, preto s òou "
+#~ "príli¹\n"
+#~ "nepoèítajte.\n"
+#~ " ARCHÍV mô¾e by» SÚBOR, HOSTITEL:SÚBOR alebo U®IVATEL@HOSTITEL:SÚBOR,\n"
+#~ "SÚBOR mô¾e by» súbor alebo zariadenie. Implicitné prepínaèe sú `-f %s -b %"
+#~ "d'.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Zastaralý prepínaè, je teraz zahrnutý v prepínaèi --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Zastaralý prepínaè, nahradený prepínaèom --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Zastaralý prepínaè, nahradený prepínaèom --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Zastaralý prepínaè, nahradený prepínaèom --touch"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Zastaralý prepínaè, nahradený prepínaèom --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Zastaralý prepínaè, nahraený prepínaèom --block-number"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr ""
+#~ "Varovanie: prepínaè -y nie je podporovaný; pravdepodobne budete chcie» "
+#~ "pou¾i» -j!"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Zastaralý prepínaè, nahradený prepínaèom --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Autori: John Gilmore a Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ " Povinné argumenty u dlhých prepínaèov, sú povinné tie¾ u "
+#~ "odpovedajúcich \n"
+#~ "krátkých prepínaèov.\n"
+#~ "\n"
+#~ " -l, --file-length då¾ka generovaného súboru\n"
+#~ " --help vypí¹e túto nápovedu a skonèí\n"
+#~ " --version vypí¹e oznaèenie verzie a skonèí\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Written by F. Pinard."
diff --git a/po/sl.gmo b/po/sl.gmo
new file mode 100644
index 0000000..62d7cd8
--- /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..5850f47
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,3405 @@
+# -*- mode: po; coding: utf-8; -*- Slovenian message catalog for GNU Tar
+# Copyright (C) 1996, 1999, 2000, 2001, 2005, 2006 Free Software Foundation, Inc.
+# Primož Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si>, 1996, 1999, 2000, 2001, 2005, 2006.
+#
+# $Id: tar-1.15.90.sl.po,v 1.2 2006/04/03 15:49:54 peterlin Exp $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.15.90\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-04-03 17:49+0200\n"
+"Last-Translator: Primož Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si>\n"
+"Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
+"%100==4 ? 3 : 0);\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "neveljaven argument %s za %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "dvoumen argument %s za %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Veljavni argumenti so:"
+
+#: lib/argp-help.c:148
+#, fuzzy, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: vrednost %s je manj ali enako od %s"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: parameter ARGP_HELP_FMT zahteva podano vrednost"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: vrednost parametra ARGP_HELP_FMT mora biti pozitivna"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: neznan parameter ARGP_HELP_FMT"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Smetje v ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Argumenti, ki so bodisi obvezni bodisi neobvezni za dolge oblike izbir, so "
+"obvezni/neobvezni tudi za kratke oblike."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Uporaba:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " ali: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [IZBIRA...]"
+
+#: lib/argp-help.c:1683
+#, 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"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "PoroÄila o napakah javite na %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Neznana sistemska napaka"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+#, fuzzy
+msgid "give this help list"
+msgstr "Ta navodila za uporabo"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+#, fuzzy
+msgid "give a short usage message"
+msgstr "Kratka navodila za uporabo"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "IME"
+
+#: lib/argp-parse.c:84
+#, fuzzy
+msgid "set the program name"
+msgstr "Nastavi ime programa"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SEK"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+#, fuzzy
+msgid "hang for SECS seconds (default 3600)"
+msgstr "Premor SEK sekund (privzeto 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+#, fuzzy
+msgid "print program version"
+msgstr "Izpis izdaje programa in izhod"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(PROGRAMSKA NAPAKA) RazliÄica ni poznana?!"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: PreveÄ argumentov\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(PROGRAMSKA NAPAKA) Izbira bi morala biti prepoznana?!"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: izbira »%s« ni enoznaÄna\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: izbira »--%s« ne dovoljuje argumenta\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: izbira »%c%s« ne dovoljuje argumenta\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: izbira »%s« zahteva argument\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: neprepoznana izbira »--%s«\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: neprepoznana izbira »%c%s«\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: nedovoljena izbira -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: neveljavna izbira -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: izbira zahteva argument -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: izbira »-W %s« je dvoumna\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: izbira »-W %s« ne dovoljuje argumenta\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "velikost bloka"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "zmanjkalo pomnilnika"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Ni mogoÄe %s"
+
+# POZOR -- oblike "to stat a file" slovenscina ne pozna
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Opozorilo: Ni mogoÄe %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: ZaÅ¡Äite ni mogoÄe spremeniti na %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Ni mogoÄe spremeniti lastnika in skupina na UID %lu GID %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Trda povezava na %s ni mogoÄa"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Napaka pri branju pri bajtu %s, med branjem %lu bajtov"
+msgstr[1] "%s: Napaka pri branju pri bajtu %s, med branjem %lu bajta"
+msgstr[2] "%s: Napaka pri branju pri bajtu %s, med branjem %lu bajtov"
+msgstr[3] "%s: Napaka pri branju pri bajtu %s, med branjem %lu bajtov"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Opozorilo: Napaka pri branju pri bajtu %s, prebrano %lu bajtov"
+msgstr[1] "%s: Opozorilo: Napaka pri branju pri bajtu %s, prebran %lu bajt"
+msgstr[2] "%s: Opozorilo: Napaka pri branju pri bajtu %s, prebrana %lu bajta"
+msgstr[3] "%s: Opozorilo: Napaka pri branju pri bajtu %s, prebrani %lu bajti"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Pozicioniranje na %s ni mogoÄe"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Opozorilo: Pozicioniranje na %s ni mogoÄe"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Ni mogoÄe ustvariti simbolne povezave na %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Zapisanih samo %lu od skupno %lu bajtov"
+msgstr[1] "%s: Zapisan samo %lu od skupno %lu bajtov"
+msgstr[2] "%s: Zapisana samo %lu od skupno %lu bajtov"
+msgstr[3] "%s: Zapisani samo %lu od skupno %lu bajtov"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Odstranjujemo vodilne »%s« iz imen elementov"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Odstranjujemo vodilne »%s« iz imen trdih povezav"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "NadomeÅ¡Äamo manjkajoÄa imena elementov s ».«"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "NadomeÅ¡Äamo manjkajoÄa imena trdih povezav s ».«<"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "»"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "«"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[dDjJ]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Storitev ni dosegljiva"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "standardni vhod"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "standardni izhod"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Ni mogoÄe pognati nelokalne ukazne lupine"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Napaka v skladnji Å¡tevila"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Ni mogoÄe rezervirati prostora za medpomnilnik\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Ni mogoÄe rezervirati prostora za medpomnilnik"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Poskusite »%s --help« za izÄrpnejÅ¡a navodila.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Uporaba: %s [IZBIRA]\n"
+"Rokovanje s traÄno enoto, ob sprejemu ukazov oddaljenega procesa.\n"
+"\n"
+" --version razliÄica programa\n"
+" --help ta navodila\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"PoroÄila o napakah javite na <%s>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Napaka pri odmiku pri seek"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Odmik pri seek izven obsega"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Smer pri seek izven obsega"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: PredÄasen znak za konec datoteke\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "PredÄasen znak za konec datoteke"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Neveljaven ukaz"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Skupno zapisanih bajtov: %s (%s, %s/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Skupno zapisanih bajtov: %s (%s, %s/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(cev)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Neveljavna vrednost za dolžino zapisa (record_size)"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Ime arhiva ni podano"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Arhivov na stdin/stdout ni mogoÄe preveriti"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Arhiv je stisnjen. Uporabite izbiro %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Stisnjenega arhiva ni mogoÄe ažurirati"
+
+# POZOR Poglej v source!
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Pisanje oznake %d"
+
+# POZOR Poglej v source!
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Branje oznake %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Na zaÄetku traku, konÄujem"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "PreveÄ napak, konÄujem"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Neporavnan blok (%lu bajtov) v arhivu"
+msgstr[1] "Neporavnan blok (%lu bajt) v arhivu"
+msgstr[2] "Neporavnan blok (%lu bajta) v arhivu"
+msgstr[3] "Neporavnan blok (%lu bajti) v arhivu"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Dolžina zapisa = %lu blokov"
+msgstr[1] "Dolžina zapisa = %lu blok"
+msgstr[2] "Dolžina zapisa = %lu bloka"
+msgstr[3] "Dolžina zapisa = %lu bloki"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Nazaj po arhivu ne gre, morda ni berljiv brez izbire -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek se ni ustavil na meji zapisa"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: vsebuje neveljavno Å¡tevilko dela"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "PrekoraÄitev Å¡tevilke dela"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Pripravite del #%d za %s in pritisnite Return: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Znak EOF na mestu, kjer se priÄakuje odgovor uporabnika"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "POZOR: Arhiv nepopoln"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [name] Podamo novo ime datoteke za naslednji del (in vse nadaljnje)\n"
+" q KonÄamo tar\n"
+" ! Poženemo sekundarno ukazno lupino\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Poženemo ukazno podlupino\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Ta seznam uzazov\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Novega dela ni, konec.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Neveljaven vnos. Vtipkajte ? za pomoÄ.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "ukaz %s neuspešen"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "To ne deluje kot arhiv ,tar'"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s se ne nadaljuje v tem delu"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s se ne nadaljuje v tem delu"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s je napaÄne velikosti (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Ta del ne sodi v zaporedje"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arhiv ni oznaÄen skladno z %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Del %s ne ustreza %s"
+
+#: src/buffer.c:1392
+#, fuzzy, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: ime datoteke je predolgo za zapis v glavo GNU veÄdelnega arhiva; odrezano"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Prebrati je bilo moÄ samo %lu od %lu bajtov"
+msgstr[1] "Prebrati je bilo moÄ samo %lu od %lu bajta"
+msgstr[2] "Prebrati je bilo moÄ samo %lu od %lu bajtov"
+msgstr[3] "Prebrati je bilo moÄ samo %lu od %lu bajtov"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Vsebina se razlikuje"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "NepriÄakovan znak za konec datoteke v arhivu"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Zvrst datoteke se razlikuje"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "NaÄin se razlikuje"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Å tevilka uporabnika (UID) se razlikuje"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Å tevilka skupine (GID) se razlikuje"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "ÄŒas zadnje spremembe se razlikuje"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Velikost se razlikuje"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ni povezana z %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Simbolna povezava se razlikuje"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Å tevilka enote se razlikuje"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Preverjanje "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Neznana vrsta datoteke »%c«, diff kot na navadni datoteki"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Arhiv vsebuje imena datotek z odstranjenimi vodilnimi predponami."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Verifikacija morda ne bo uspela locirati izvornih datotek."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "NAPAKA PRI PREVERJANJU: najdeno %d neveljavnih glav"
+msgstr[1] "NAPAKA PRI PREVERJANJU: najdena %d neveljavna glava"
+msgstr[2] "NAPAKA PRI PREVERJANJU: najdeni %d neveljavni glavi"
+msgstr[3] "NAPAKA PRI PREVERJANJU: najdene %d neveljavne glave"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: vsebuje znaÄko medpomnilniÅ¡kega imenika; brez iznosa"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "vrednost %s od %s obseg %s..%s; zamenjano %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "vrednost %s od %s obseg %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Ustvarjanje negativnih osmiških glav"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: ime datoteke je predolgo (najveÄ %d); brez iznosa"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: ime datoteke je predolgo (ni mogoÄe deliti); brez iznosa"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: ime povezave je predolgo; brez iznosa"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Datoteka skrÄena za %s bajtov; dopolnjeno z niÄlami"
+msgstr[1] "%s: Datoteka skrÄena za %s bajt; dopolnjeno z niÄlami"
+msgstr[2] "%s: Datoteka skrÄena za %s bajta; dopolnjeno z niÄlami"
+msgstr[3] "%s: Datoteka skrÄena za %s bajte; dopolnjeno z niÄlami"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: datoteka je na drugem datoteÄnem sistemu; brez iznosa"
+
+# POZOR Imamo za to kak izraz?
+#: src/create.c:1217 src/create.c:1228
+#, fuzzy
+msgid "contents not dumped"
+msgstr " (core dumped)"
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Neznan tip datoteke; datoteka ignorirana"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "Manjkajo povezave na %s.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: datoteka je nespremenjena; brez iznosa"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: datoteka je arhiv; brez iznosa"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Datoteka je bila odstranjena, preden smo jo prebrali"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: vsebuje znaÄko medpomnilniÅ¡kega imenika; brez iznosa"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: Datoteka je bila spremenjena med branjem"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: vtiÄnica ignorirana"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: vrata ignorirana"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Preskok na naslednjo glavo"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Brisanje ne-glave iz arhiva"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: neverjetno stara Äasovna oznaka %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: oznaka Äasa %s je %s s v prihodnosti"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: NepriÄakovana neskladnost pri ustvarjanju imenika"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Imenik preimenovan, preden je bilo moÄ izvleÄi njegov status"
+
+# POZOR! "contiguous files" so datoteke, ki so zapisane na disku
+# na zaporednih sektorjih (na tistih OS, ki jih podpirajo).
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Neprekinjene datoteke izvleÄemo kot navadne"
+
+# POZOR! Grdo!
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Simbolne povezave poskusimo dearhivirati kot trde"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Branje %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Dearhivacija ni mogoÄa - datoteka se nadaljuje iz prejÅ¡njega dela"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "NepriÄakovano zaglavje z dolgim imenom"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Neznana vrsta datoteke »%c«, dearhiviramo kot navadno datoteko"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "ObstojeÄa »%s« je novejÅ¡a ali enako stara"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Varnostne kopije te datoteke ni moÄ napraviti"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Preimenovanje v %s ni mogoÄe"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Napake ni moÄ popraviti: zapuÅ¡Äamo"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Imenik je bil preimenovan"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Imenik je bil preimenovan"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Imenik je nov"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Neveljavna oznaka Äasa"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Neveljaven Äas spremembe (sekunde)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Neveljaven Äas spremembe (nanosekunde)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Neveljavna Å¡tevilka enote"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Neveljavna Å¡tevilka inoda"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+#, fuzzy
+msgid "Read error in snapshot file"
+msgstr "Napaka pri pisanju na %s"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "NepriÄakovan znak za konec datoteke v arhivu"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Okvarjen inkrementalni zapis datoteke"
+
+#: src/incremen.c:1080
+#, fuzzy, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "Nepodprta razliÄica inkrementalnega zapisa: %d"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Okvarjen argument gostote: »%s«"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Okvarjen argument gostote: »%s«"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Ni mogoÄe rezervirati pomnilnika za bloÄni faktor %d"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Imenika ne Äistimo: statistika zanj ni dosegljiva"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: imenik je na drugi napravi; brez ÄiÅ¡Äenja"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Brišemo %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Odstranitev ni mogoÄa"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: IzpuÅ¡Äeno"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** Blok znakov NUL **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Osamljeni niÄelni blok pri %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok %s: ** Konec datoteke **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Na mestu v glavi, kjer priÄakujemo Å¡tevilÄno vrednost %s, so presledki"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Osmiška vrednost arhiva %.*s izven obsega %s; privzemamo dvojiški komplement"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Osmiška vrednost arhiva %.*s izven obsega %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Arhiv vsebuje zastarele glave oblike base-64"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Podpis %s oblike base-64 v arhivu je izven obsega %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Vrednost base-256 v arhivu izven obsega %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arhiv vsebuje %.*s na mestu, kjer priÄakujemo Å¡tevilÄno vrednost %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Vrednost arhiva %s je izven obsega %s: %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " povezava na %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " neznan tip datoteke %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Dolga povezava--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Dolgo ime--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Glava dela--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Nadaljevanje pri bajtu %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Ustvarjamo imenik:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Preimenujemo %s v %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Preimenovanje v %s ni mogoÄe"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Preimenujemo %s nazaj v %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Delovnega imenika ni mogoÄe shraniti"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Delovnega imenika ni mogoÄe spremeniti"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "proces naslednik"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "medprocesni kanal"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Ni najdeno v arhivu"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Zahtevane pojavitve ni moÄ najti v arhivu"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Izbiri »-%s« in »-%s« obe zahtevata standardni vhod"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Neveljavna oblika arhiva"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Razširitve GNU izbrane na nezdružljivem formatu arhiva"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Neznan slog narekovajev »%s«. Poskusite »%s --quoting-style=help« za seznam."
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"Uporaba: %s [IZBIRA]... [DATOTEKA]...\n"
+"\n"
+"Primeri:\n"
+" %s -cf arhiv.tar prva druga # Ustvarimo arhiv.tar z datotekama prva in "
+"druga.\n"
+" %s -tvf arhiv.tar # IzÄrpen seznam datotek v arhivu arhiv.tar.\n"
+" %s -xf arhiv.tar # IzvleÄemo vse datoteke iz arhiva arhiv."
+"tar.\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"GNU »tar« shranjuje veÄ datotek skupaj na trak ali v arhiv na disku ter "
+"lahko povrne posamezne datoteke iz arhiva.\n"
+"\n"
+"Zgledi\n"
+" tar -cf arhiv.tar prva druga # Ustvarimo arhiv.tar z datotekama prva in "
+"druga.\n"
+" tar -tvf arhiv.tar # IzÄrpen seznam datotek v arhivu arhiv."
+"tar.\n"
+" tar -xf arhiv.tar # IzvleÄemo vse datoteke iz arhiva arhiv."
+"tar.\n"
+"\vPripona varnostne kopije je »~«, razen Äe ni drugaÄe doloÄeno z izbiro --"
+"suffix\n"
+"ali s spremenljivko SIMPLE_BACKUP_SUFFIX. Vrsto varnostne kopije lahko "
+"doloÄimo\n"
+"z izbiro --backup ali s spremenljivko VERSION_CONTROL. Vrednosti so:\n"
+"\n"
+" t, numbered oÅ¡tevilÄene varnostne kopije\n"
+" nil, existing oÅ¡tevilÄene varnostne kopije, Äe take že obstajajo,\n"
+" sicer enostavne\n"
+" never, simple vedno enostavne varnostne kopije\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Glavni naÄini delovanja:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "izpis vsebine arhiva"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "izvleÄenje datoteke iz arhiva"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "ustvarjanje novega arhiva"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "iskanje razlik med arhivom in datoteÄnim sistemom"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "dodajanje datotek na konec arhiva"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "dodajanje novih datotek, Äe so novejÅ¡e od že arhiviranih"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "zlivanje arhivov"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "brisanje datotek iz arhiva (ne deluje na traku!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "DoloÄila delovanja:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "ekonomiÄno ravnanje z razprÅ¡enimi datotekami"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "stari zapis GNU za inkrementalne arhive"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "DATOTEKA"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "novi zapis GNU za inkrementalne arhive"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "nadaljuj z branjem, tudi Äe datoteke ni moÄ prebrati"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "N"
+
+#: src/tar.c:404
+#, fuzzy
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"obdelaj le vsako N-to pojavitev vsake datoteke v arhivu. Ta izbira je "
+"veljavna le v zvezi z enim od podukazov --delete, --diff, --extract ali --"
+"list, pri Äemer je seznam datotek podan bodisi v ukazni vrstici, bodisi z "
+"izbiro -T. Privzeta vrednost N je 1."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "po arhivu je mogoÄe iskati"
+
+#: src/tar.c:415
+#, fuzzy
+msgid "Overwrite control:"
+msgstr "Nadzor nad pisanjem prek:\n"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "s poskusom preverjanja zapisanega arhiva"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "pobriši datoteke, potem ko so arhivirane"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "pri izvlaÄenju ne piÅ¡i prek obstojeÄih datotek"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "ne piÅ¡i prek obstojeÄih datotek, novejÅ¡ih od arhiviranih"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "pri izvlaÄenju piÅ¡i prek obstojeÄih datotek"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+"s poprejÅ¡njim brisanjem obstojeÄih datotek pri izvlaÄenju istoimenskih novih"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "izprazni hierarhije pred izvlaÄenjem imenikov"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "ohrani metainformacije o obstojeÄih imenikih"
+
+#: src/tar.c:434
+#, fuzzy
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "pri izvlaÄenju piÅ¡i prek obstojeÄih datotek"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "datoteke izvleci na standardni izhod"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "UKAZ"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "datoteke napelji na vhod drugega programa"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "prezri izhodne kode hÄerinskih procesov"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "obravnavaj neniÄelne izhodne kode hÄerinskih procesov kot napako"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Ravnanje z atributi datotek:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "pri dodajanju datotek spremenimo lastnika v IME"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "pri dodajanju datotek spremenimo skupino v IME"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATUM-ÄŒAS"
+
+#: src/tar.c:461
+#, fuzzy
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "shrani le datoteke, novejše od DATUM-ČAS"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "SPREMEMBE"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "zahtevaj (simbolne) SPREMEMBE zaÅ¡Äite za dodane datoteke"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "brez izvlaÄenja Äasa spremembe"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "z ohranitvijo lastniÅ¡tva, Äe je mogoÄe"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "pri izvlaÄenju prepiÅ¡emo lastniÅ¡tvo nase"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "s Å¡tevilÄnimi vrednostmi UID/GID namesto imen"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "imena razvrstimo tako, da se ujemajo z arhivom"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "isto kot -p in -s skupaj"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+#, fuzzy
+msgid "Device selection and switching:"
+msgstr "Izbira enote in preklapljanje:\n"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARHIV"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "uporabi datoteko ali enoto ARHIV"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "arhiv je lokalen kljub dvopiÄju v imenu datoteke"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "uporabi navedeni UKAZ rmt namesto rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "uporabi nelokalen UKAZ namesto rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "doloÄi enoto in gostoto zapisa"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "ustvari/pregledaj/izvleci arhiva v veÄ delih"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "menjava traku po Å T x 1024 zapisanih bajtih"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "poženi SKRIPT po koncu traku (privzema -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "uporabimo/ažuriramo število dela v DATOTEKI"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "BloÄna razdelitev enote:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOKI"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "dolžina zapisa BLOKI × 512 bajtov"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "Å TEVILO bajtov v zapisu (veÄkratnik 512)"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "ne meni se za bloke niÄel (EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "razdeli na bloke ob branju (cevovodi 4.2BSD)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Izbira oblike arhiva:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "OBLIKA"
+
+#: src/tar.c:553
+#, fuzzy
+msgid "create archive of the given format"
+msgstr "ustvari arhiv v navedeni obliki."
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "OBLIKA je nekaj od naštetega:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "stara oblika V7 tar"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "stara oblika GNU tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "oblika GNU tar 1.13.x"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "oblika POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "oblika POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "isto kot pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "isto kot --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "isto kot --format=posix"
+
+#: src/tar.c:573
+#, fuzzy
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "kljuÄna-beseda[[:]=vrednost][,kljuÄna-beseda[[:]=vrednost],...]"
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "krmilne kljuÄne besede pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "VZOREC"
+
+#: src/tar.c:576
+#, fuzzy
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"ustvari arhiv z imenom dela IME. Pri izpisu seznama/izvleÄku je lahko IME "
+"regularni izraz VZOREC"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "filtriraj arhiv skozi bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "filtriraj arhiv skozi gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "filtriraj arhiv skozi compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROGRAM"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "filtriraj skozi PROGRAM (sprejemati mora izbiro -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Izbira lokalne datoteke:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "IMENIK"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "pomik v navedeni IMENIK"
+
+#: src/tar.c:599
+#, fuzzy
+msgid "get names to extract or create from FILE"
+msgstr "seznam datotek preberemo z navedene DATOTEKE"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T prebere z \\000 terminirana imena; onemogoÄi -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr "odstrani narekovaje iz imen datotek, prebranih s -T (privzeto)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "ne odstrani narekovajev iz imen datotek, prebranih s -T"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "VZOREC"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "brez datotek, ki jih opisuje VZOREC"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "brez datotek, ustrezajoÄim vzorcem, prebranih z DATOTEKE"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "brez imenikov, ki vsebujejo znaÄko medpomnilnika"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "brez imenikov, ki vsebujejo znaÄko medpomnilnika"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "brez imenikov, ki vsebujejo znaÄko medpomnilnika"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "brez imenikov, ki vsebujejo znaÄko medpomnilnika"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "brez imenikov, ki vsebujejo znaÄko medpomnilnika"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "brez imenikov, ki vsebujejo znaÄko medpomnilnika"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "podimenikov ne vkljuÄujemo avtomatiÄno"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "izpustimo datotek na nelokalnih datoteÄnih sistemih"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "rekurzivno vkljuÄi vse podimenike"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "ne odstrani vodilnih »/« iz imen datotek"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "IME"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "zaÄenÅ¡i z navedenim IMENOM v arhivu"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "shrani le datoteke, novejše od DATUM-ČAS"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATUM"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "primerjaj datum in uro le, kadar se podatki spremenijo"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "TIP"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+"varnostna kopija pred brisanjem, z možnostjo izbire TIPA varnostne kopije"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "NIZ"
+
+#: src/tar.c:645
+#, fuzzy
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"varnostna kopija pred brisanjem; prekliÄemo obiÄajno PRIPONO (»~«, razen Äe "
+"lupinska spremenljivka SIMPLE_BACKUP_SUFFIX doloÄa drugaÄe)"
+
+#: src/tar.c:650
+#, fuzzy
+msgid "File name transformations:"
+msgstr "Druge izbire:"
+
+#: src/tar.c:652
+#, fuzzy
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "izpusti Å TEVILO vodilnih komponent iz imen datotek"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+#, fuzzy
+msgid "ignore case"
+msgstr "izkljuÄitveni vzorci ne razlikujejo med malimi in velikimi Ärkami"
+
+#: src/tar.c:665
+#, fuzzy
+msgid "patterns match file name start"
+msgstr "izkljuÄitveni vzorci opisujejo celotno ime datoteke"
+
+#: src/tar.c:667
+#, fuzzy
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+"izkljuÄitveni vzorci opisujejo ime datoteke od znaka »/« dalje (privzeto)"
+
+#: src/tar.c:669
+#, fuzzy
+msgid "case sensitive matching (default)"
+msgstr ""
+"izkljuÄitveni vzorci razlikujejo med malimi in velikimi Ärkami (privzeto)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "izkljuÄitveni vzorci ne opisujejo »/«"
+
+#: src/tar.c:677
+#, fuzzy
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "izkljuÄitveni vzorci opisujejo tudi »/« (privzeto)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Informativni izpisi:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "z izÄrpnim izpisom obdelanih datotek"
+
+#: src/tar.c:686
+#, fuzzy
+msgid "[.]NUMBER"
+msgstr "N"
+
+#: src/tar.c:687
+#, fuzzy
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "izpiÅ¡i poroÄilo o napredku pri vsakem desetem zapisu"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "izpiÅ¡i sporoÄilo, Äe niso zapisane vse povezave"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "z izpisom Äasov sprememb datotek v UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "zapiÅ¡i izÄrpno poroÄilo v DATOTEKO"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "z izpisom zaporednega bloka v arhivu ob vsakem sporoÄilu"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "vprašaj za potrditev pri vsakem koraku"
+
+#: src/tar.c:706
+#, fuzzy
+msgid "show tar defaults"
+msgstr "Prikaži privzete vrednosti programa"
+
+#: src/tar.c:708
+#, fuzzy
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"Pri izpisu seznama ali izvlaÄenju izpiÅ¡i vsak imenik, ki ne ustreza iskalnim "
+"pogojem"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Združljivostne izbire:"
+
+#: src/tar.c:726
+#, fuzzy
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"pri ustvarjanju arhiva isto kot --old-archive; pri izvlaÄenju isto kot --no-"
+"same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Druge izbire:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Naenkrat je dovoljena najveÄ ena od izbir »-Acdtrux«"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "NasprotujoÄe si izbire glede stiskanja arhiva"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " neznan tip datoteke %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Datoteke z datumom ni najti"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "NadomeÅ¡Äamo %s za neznan format datuma %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: datoteka je arhiv; brez iznosa"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"Privzete vrednosti *tega* programa tar:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Neveljaven faktor blokiranja"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Opozorilo: izbira -I ni podprta; ste želeli -j ali -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Neveljavna dolžina traku"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "VeÄ kot en pražni podatek"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Neveljavna skupina"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Podana zaÅ¡Äita ni veljavna"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Neveljavno Å¡tevilo"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Neveljaven lastnik"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Neveljavna dolžina zapisa"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Dolžina zapisa mora biti veÄkratnik %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Neveljavno Å¡tevilo elementov"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, fuzzy, c-format
+msgid "Malformed density argument: %s"
+msgstr "Okvarjen argument gostote: »%s«"
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Neznana gostota: »%c«"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "*Ta* izvedba tar ne podpira izbir »-[0-7][lmh]«"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[DATOTEKA]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Stara izbira »%c« zahteva argument."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence nima pomena brez seznama datotek"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence ni mogoÄe uporabiti v zahtevanem naÄinu delovanja"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "VeÄ arhivskih datotek zahteva izbiro »-M«"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Izbire --listed-incremental ni mogoÄe kombinirati z --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Oznaka dela je predolga (omejitev je %lu bajtov)"
+msgstr[1] "%s: Oznaka dela je predolga (omejitev je %lu bajt)"
+msgstr[2] "%s: Oznaka dela je predolga (omejitev je %lu bajta)"
+msgstr[3] "%s: Oznaka dela je predolga (omejitev je %lu bajti)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Arhivov v veÄ delih ni mogoÄe preveriti"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Stisnjenega arhiva ni mogoÄe preveriti"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Stisnjeni arhivi v veÄ delih niso mogoÄi"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Stisnjenega arhiva ni mogoÄe ažurirati"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "izbira --pax-option je mogoÄa le na arhivih POSIX"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Zahteva po odprtju praznega arhiva bojazljivo zavrnjena"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Izbire »-Aru« so nezdružljive z »-f -«"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Ena od izbir »-Acdtrux« je obvezna"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Izhod ob napaki zakasnjen zaradi prejšnjih napak"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Datoteka skrÄena za %s bajtov"
+msgstr[1] "%s: Datoteka skrÄena za %s bajt"
+msgstr[2] "%s: Datoteka skrÄena za %s bajta"
+msgstr[3] "%s: Datoteka skrÄena za %s bajte"
+
+#: src/xheader.c:158
+#, fuzzy, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "KljuÄna beseda %s je bodisi neznana, bodisi Å¡e ni izvedena"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Vzorca %s ni mogoÄe uporabiti"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "KljuÄne besede %s ni mogoÄe preklicati"
+
+#: src/xheader.c:498
+#, fuzzy
+msgid "Malformed extended header: missing length"
+msgstr "PoÅ¡kodovana razÅ¡irjena glava: manjka enaÄaj"
+
+#: src/xheader.c:506
+#, fuzzy
+msgid "Extended header length is out of allowed range"
+msgstr "Podpis %s oblike base-64 v arhivu je izven obsega %s"
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Podpis %s oblike base-64 v arhivu je izven obsega %s"
+
+#: src/xheader.c:525
+#, fuzzy
+msgid "Malformed extended header: missing blank after length"
+msgstr "Poškodovana razširjena glava: za dolžino manjka presledek"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "PoÅ¡kodovana razÅ¡irjena glava: manjka enaÄaj"
+
+#: src/xheader.c:539
+#, fuzzy
+msgid "Malformed extended header: missing newline"
+msgstr "PoÅ¡kodovana razÅ¡irjena glava: manjka enaÄaj"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Vrednost arhiva %s je izven obsega %s: %s.%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "PoÅ¡kodovana razÅ¡irjena glava: manjka enaÄaj"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, fuzzy, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "PoÅ¡kodovana razÅ¡irjena glava: manjka enaÄaj"
+
+#: src/xheader.c:1328
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "PoÅ¡kodovana razÅ¡irjena glava: manjka enaÄaj"
+
+#: src/xheader.c:1338
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "PoÅ¡kodovana razÅ¡irjena glava: manjka enaÄaj"
+
+#: tests/genfile.c:110
+#, fuzzy
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr "Ustvarimo podatkovne datoteke za testno zbirko GNU tar.\n"
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Druge izbire:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+#, fuzzy
+msgid "Create file of the given SIZE"
+msgstr "ustvari arhiv v navedeni obliki."
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "datoteke izvleci na standardni izhod"
+
+#: tests/genfile.c:131
+#, fuzzy
+msgid "Read file names from FILE"
+msgstr "Prebranih %s bajtov iz %s"
+
+#: tests/genfile.c:133
+#, fuzzy
+msgid "-T reads null-terminated names"
+msgstr "-T prebere z \\000 terminirana imena; onemogoÄi -C"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "s poskusom preverjanja zapisanega arhiva"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+#, fuzzy
+msgid "Update the access and modification times of FILE"
+msgstr "%s: Časa zadnje spremembe in dostopa ni možno spremeniti"
+
+#: tests/genfile.c:189
+#, fuzzy
+msgid "Execute COMMAND"
+msgstr "UKAZ"
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Neveljavna oznaka Äasa"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Å tevilka inoda izven obsega"
+
+#: tests/genfile.c:247
+#, fuzzy, c-format
+msgid "Negative size: %s"
+msgstr "Neveljavna oznaka Äasa"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Neznana sistemska napaka"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "Ni mogoÄe odpreti %s"
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "Ni mogoÄe pognati %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " neznan tip datoteke %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "Ni mogoÄe do statistike za datoteko %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, fuzzy, c-format
+msgid "Command failed with status %d\n"
+msgstr "Naslednik umrl s signalom %d"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+# POZOR Je to res to?
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Predelana imena datotek--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Napaka pri branju pri bajtu %s, prebrano %lu bajtov"
+#~ msgstr[1] "%s: Napaka pri branju pri bajtu %s, prebran %lu bajt"
+#~ msgstr[2] "%s: Napaka pri branju pri bajtu %s, prebrana %lu bajta"
+#~ msgstr[3] "%s: Napaka pri branju pri bajtu %s, prebran %lu bajti"
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Neveljaven ukaz %c\n"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Oznaka Äasa izven obsega"
+
+#~ msgid "Modification time (seconds) out of range"
+#~ msgstr "ÄŒas spremembe (sekunde) izven obsega"
+
+#~ msgid "Modification time (nanoseconds) out of range"
+#~ msgstr "ÄŒas spremembe (nanosekunde) izven obsega"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Å tevilka enote izven obsega"
+
+# POZOR Je to res to?
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Predelana imena datotek--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "NepriÄakovan znak za konec datoteke med predelanimi imeni"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Datoteka %s preimenovana v %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Simbolna povezava na %s ni mogoÄa"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "%s simbolno povezano z %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Neznan ukaz %s za restavriranje izvornih imen"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Za izbiro -C manjka ime datoteke"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "izkljuÄitveni vzorci ne vsebujejo metaznakov"
+
+#~ msgid "same as -N"
+#~ msgstr "isto kot -N"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "izkljuÄitveni vzorci vsebujejo metaznake (privzeto)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "z izpisom celotne dolžine pri zapisu"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "Pomen izbire -l se bo v prihodnjih izdajah spremenil"
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Prosimo, uporabite raje izbiro --one-file-system"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Program je BREZ VSAKEGA JAMSTVA, do zakonsko dovoljene meje. Razširjate "
+#~ "ga\n"
+#~ "lahko pod pogoji, doloÄenimi v SploÅ¡ni javni licenci GNU; za podrobnosti "
+#~ "si\n"
+#~ "oglejte datoteko COPYING."
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "POZOR: Oznaka dela manjka"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Opazna napaka zaradi dolgih imen"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Opazna napaka zaradi dolgih imen"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "brez spreminjanja Äasa zadnjega dostopa"
+
+#~ msgid "extract permissions information"
+#~ msgstr "z ohranitvijo zaÅ¡Äite datotek"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "brez ohranjanja zaÅ¡Äite datotek"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "DATOTEKA"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "shranimo datoteke, na katere kažejo simbolne povezave"
+
+#~ msgid "Print license and exit"
+#~ msgstr "Izpis dovoljenja za rabo in izhod"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Osnovano na delu Johna Gilmora in Jaya Fenlasona. Celoten seznam "
+#~ "sodelavcev\n"
+#~ "je v datoteki AUTHORS.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " GNU tar je prost program; lahko ga razširjate ali spreminjate pod "
+#~ "pogoji,\n"
+#~ " skladnimi s drugo ali poznejšimi izdajami splošnega javnega dovoljenja "
+#~ "GNU\n"
+#~ " (GNU General Public License), izdanem pri Fundaciji za prosto "
+#~ "programje\n"
+#~ " (Free Software Foundation).\n"
+#~ "\n"
+#~ " GNU tar se razširja v upanju, da je koristen, vendar BREZ "
+#~ "KAKRÅ NEGAKOLI\n"
+#~ " JAMSTVA, niti jamstev USTREZNOSTI ZA PRODAJO ali PRIMERNOSTI ZA RABO.\n"
+#~ " Za podrobnosti si oglejte »GNU General Public License«.\n"
+#~ "\n"
+#~ " Izvod »GNU General Public License« bi moral biti priložen temu "
+#~ "programu;\n"
+#~ " Äe ni, piÅ¡ite Free Software Foundation, Inc., 59 Temple Place - Suite "
+#~ "330,\n"
+#~ " Boston, MA 02111-1307, USA.\n"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Opozorilo: izbira -y ni podprta, morda ste želeli -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Napaka pri pisanju na standardni izhod"
+
+#~ msgid "Cannot close"
+#~ msgstr "Ni mogoÄe zapreti"
+
+#~ msgid "Cannot dup"
+#~ msgstr "Podvojitev ni mogoÄa"
+
+#~ msgid "Cannot use compressed or remote archives"
+#~ msgstr "Ni mogoÄe uporabiti stisnjenih ali ne-lokalnih arhivov"
+
+#~ msgid "tar (child)"
+#~ msgstr "tar (naslednik)"
+
+#~ msgid "tar (grandchild)"
+#~ msgstr "tar (pranaslednik)"
+
+#~ msgid "Child returned status %d"
+#~ msgstr "Naslednik vrnil status %d"
+
+#~ msgid "Member names contain `..'"
+#~ msgstr "Imena elementov vsebujejo ,..`"
+
+#~ msgid "%s: Member name contains `..'"
+#~ msgstr "%s: Ime elementa vsebuje ,..`"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU ,tar` shranjuje veÄ datotek skupaj na trak ali arhiv na disku, ter "
+#~ "lahko\n"
+#~ "vrne posamezne datoteke iz arhiva.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Če je pri daljši obliki izbire napisano, da ta zahteva argument, je "
+#~ "argument\n"
+#~ "obvezen tudi za kratko obliko. Podobno velja za neobvezne argumente.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Glavni naÄini delovanja:\n"
+#~ " -t, --list izpis vsebine arhiva\n"
+#~ " -x, --extract, --get izvleÄenje datoteke iz arhiva\n"
+#~ " -c, --create ustvarjanje novega arhiva\n"
+#~ " -d, --diff, --compare iskanje razlik med arhivom in datoteÄnim "
+#~ "sistemom\n"
+#~ " -r, --append dodajanje datotek na konec arhiva\n"
+#~ " -u, --update nadomestitev starih/dodajanje novih datotek\n"
+#~ " -A, --catenate zlivanje arhivov\n"
+#~ " --concatenate isto kot -A\n"
+#~ " --delete brisanje datotek iz arhiva (ne deluje na "
+#~ "traku!)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --overwrite-dir overwrite directory metadata when "
+#~ "extracting\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ msgstr ""
+#~ "\n"
+#~ "DoloÄila:\n"
+#~ " -W, --verify s poskusom preverjanja zapisanega arhiva\n"
+#~ " --remove-files z brisanjem datotek, dodanih v arhiv\n"
+#~ " -k, --keep-old-files brez brisanja obstojeÄih datotek pri "
+#~ "izvlaÄenju\n"
+#~ " --overwrite s pisanjem prek obstojeÄih datotek pri "
+#~ "izvlaÄenju \n"
+#~ " --overwrite-dir s pisanjem prek obstojeÄih imenikov pri "
+#~ "izvlaÄenju\n"
+#~ " -U, --unlink-first s poprejÅ¡njim brisanjem obstojeÄih datotek "
+#~ "pri \n"
+#~ " izvlaÄenju istoimenskih novih\n"
+#~ " --recursive-unlink izpraznimo hierarhije pred izvlaÄenjem "
+#~ "imenikov\n"
+#~ " -S, --sparse ekonomiÄno ravnanje z razprÅ¡enimi "
+#~ "datotekami\n"
+#~ " -O, --to-stdout izvlaÄenje na standardni izhod\n"
+#~ " -G, --incremental stari format GNU za inkrementalne arhive\n"
+#~ " -g, --listed-incremental=DATOTEKA\n"
+#~ " novi format GNU za inkrementalne arhive\n"
+#~ " --ignore-failed-read nadaljuj z branjem, tudi Äe datoteke ni moÄ "
+#~ "prebrati\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Ravnanje z atributi datotek:\n"
+#~ " --owner=IME pri dodajanju datotek spremenimo lastnika "
+#~ "v IME\n"
+#~ " --group=IME pri dodajanju datotek spremenimo skupino v "
+#~ "IME\n"
+#~ " --mode=ZAÅ ÄŒITA pri dodajanju datotek nastavimo ZAÅ ÄŒITO\n"
+#~ " --atime-preserve brez spreminjanja Äasa zadnjega dostopa\n"
+#~ " -m, --modification-time brez izvlaÄenja Äasa spremembe\n"
+#~ " --same-owner z ohranitvijo lastniÅ¡tva, Äe je mogoÄe\n"
+#~ " --no-same-owner pri izvlaÄenju prepiÅ¡emo lastniÅ¡tvo nase\n"
+#~ " --numeric-owner s Å¡tevilÄnimi vrednostmi UID/GID namesto "
+#~ "imen\n"
+#~ " -p, --same-permissions z ohranitvijo zaÅ¡Äite datotek\n"
+#~ " --no-same-permissions brez ohranjanja zaÅ¡Äite datotek\n"
+#~ " --preserve-permissions isto kot -p\n"
+#~ " -s, --same-order imena razvrstimo tako, da se ujemajo z "
+#~ "arhivom\n"
+#~ " --preserve-order isto kot -s\n"
+#~ " --preserve isto kot -p in -s skupaj\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Izbira enote:\n"
+#~ " -f, --file=ARHIV uporabi datoteko ali enoto ARHIV\n"
+#~ " --force-local arhiv je lokalen ne glede na dvopiÄje v "
+#~ "imenu\n"
+#~ " --rsh-command=UKAZ uporabi nelokalen UKAZ namesto rsh\n"
+#~ " -[0-7][lmh] doloÄi enoto in gostoto zapisa\n"
+#~ " -M, --multi-volume ustvarjanje/pregled/izvleÄek arhiva v "
+#~ "veÄ delih\n"
+#~ " -L, --tape-length=Å T menjava traku po Å T x 1024 zapisanih "
+#~ "bajtih\n"
+#~ " -F, --info-script=SKRIPT poženi SKRIPT po koncu traku (privzema -"
+#~ "M)\n"
+#~ " --new-volume-script=SKRIPT isto kot -F SKRIPT\n"
+#~ " --volno-file=DATOTEKA uporabimo/ažuriramo število dela v "
+#~ "DATOTEKI\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "BloÄna razdelitev enote:\n"
+#~ " -b, --blocking-factor=BLOKI dolžina zapisa BLOKI x 512 bajtov\n"
+#~ " --record-size=DOLŽINA DOLŽINA zapisa v bajtih (veÄkratnik "
+#~ "512)\n"
+#~ " -i, --ignore-zeros ne meni se za bloke niÄel (EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -o, --old-archive, --portability write a V7 format archive\n"
+#~ " --posix write a POSIX format archive\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Izbira oblike arhiva:\n"
+#~ " -V, --label=IME ustvarjanje arhiva z danim IMENOM\n"
+#~ " VZOREC pri pregledu vsebine/izvleÄku je "
+#~ "ime\n"
+#~ " lahko regularni izraz VZOREC\n"
+#~ " -o, --old-archive, --portability zapis arhiva v formatu V7\n"
+#~ " --posix zapis arhiva v formatu POSIX\n"
+#~ " -j, --bzip2 arhiv filtriramo skozi program "
+#~ "bzip2\n"
+#~ " -z, --gzip, --ungzip arhiv filtriramo skozi program gzip\n"
+#~ " -Z, --compress, --uncompress arhiv filtriramo skozi program "
+#~ "compress\n"
+#~ " --use-compress-program=PROGRAM arhiv filtriramo skozi PROGRAM (ki "
+#~ "mora\n"
+#~ " sprejemati izbiro -d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Izbira lokalne datoteke:\n"
+#~ " -C, --directory=IMENIK prestavimo se v navedeni IMENIK\n"
+#~ " -T, --files-from=DATOTEKE seznam datotek preberemo z navedene "
+#~ "DATOTEKE\n"
+#~ " --null -T prebere z \\000 terminirana imena; "
+#~ "onemogoÄi -C\n"
+#~ " --exclude=VZOREC izkljuÄimo datoteke, ki jih opisuje "
+#~ "VZOREC\n"
+#~ " -X, --exclude-from=DATOTEKA izkljuÄimo datoteke, ustrezajoÄe vzorcem,\n"
+#~ " prebranih z DATOTEKE\n"
+#~ " --anchored izkljuÄitveni vzorci opisujejo celotno "
+#~ "ime\n"
+#~ " datoteke (privzeto)\n"
+#~ " --no-anchored izkljuÄitveni vzorci opisujejo ime "
+#~ "datoteke od\n"
+#~ " znaka ,/` dalje\n"
+#~ " --ignore-case izkljuÄitveni vzorci ne razlikujejo med "
+#~ "malimi\n"
+#~ " in velikimi Ärkami\n"
+#~ " --no-ignore-case izkljuÄitveni vzorci razlikujejo med "
+#~ "malimi in\n"
+#~ " velikimi Ärkami (privzeto)\n"
+#~ " --wildcards izkljuÄ. vzorci vsebujejo metaznake "
+#~ "(privzeto)\n"
+#~ " --no-wildcards izkljuÄitveni vzorci ne vsebujejo "
+#~ "metaznakov\n"
+#~ " --wildcards-match-slash izkljuÄitveni vzorci opisujejo tudi ,/` "
+#~ "(privzeto)\n"
+#~ " --no-wildcards-match-slash izkljuÄitveni vzorci ne opisujejo ,/`\n"
+#~ " -P, --absolute-names ohranimo vodilni ,/` pri imenih datotek\n"
+#~ " -h, --dereference shranimo datoteke, na katere kažejo "
+#~ "simbolne\n"
+#~ " povezave\n"
+#~ " --no-recursion podimenikov ne vkljuÄujemo avtomatiÄno\n"
+#~ " -l, --one-file-system izpustimo datotek na nelokalnih datoteÄnih "
+#~ "sistemih\n"
+#~ " -K, --starting-file=IME zaÄenÅ¡i z navedenim IMENOM v arhivu\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE only store files newer than DATE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATUM arhiviramo samo datoteke, mlajše od "
+#~ "DATUMA\n"
+#~ " --newer-mtime=DATUM datum in Äas primerjamo le ob spremembah "
+#~ "podatkov\n"
+#~ " --after-date=DATUM isto kot -N\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=TIP] varnostna kopija pred brisanjem, z "
+#~ "možnostjo\n"
+#~ " izbire tipa varnostne kopije\n"
+#~ " --suffix=PRIPONA varnostna kopija pred brisanjem, doloÄimo "
+#~ "pripono\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Informativni izpisi:\n"
+#~ " --help ta navodila\n"
+#~ " --version verzija programa\n"
+#~ " -v, --verbose z zgovornim izpisom obdelanih datotek\n"
+#~ " --checkpoint z izpisom imenikov pri branju arhiva\n"
+#~ " --totals z izpisom celotne dolžine pri zapisu\n"
+#~ " -R, --block-number z izpisom zaporednega bloka v arhivu ob vsakem "
+#~ "sporoÄilu\n"
+#~ " -w, --interactive z uporabnikovo potrditvijo za vsako opravilo\n"
+#~ " --confirmation isto kot -w\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n"
+#~ "is set in the environment, GNU extensions are disallowed with `--posix'.\n"
+#~ "Support for POSIX is only partially implemented, don't count on it yet.\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `-f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GNU tar ne zna ne prebrati in ne ustvariti arhivov ,--posix`. Pri "
+#~ "nastavljeni\n"
+#~ "spremenljivki POSIXLY_CORRECT in uporabi izbire ,--posix` razširitve GNU "
+#~ "niso\n"
+#~ "dovoljene. Podpora za POSIX še ni v celoti izvedena, ne zanašajte se "
+#~ "nanjo.\n"
+#~ "ARHIV je lahko podan v obliki DATOTEKA, RAÄŒUNALNIK:DATOTEKA ali\n"
+#~ "UPORABNIK@RAÄŒUNALNIK:DATOTEKA; kjer je DATOTEKA lahko datoteka ali "
+#~ "enota.\n"
+#~ "DATUM je lahko besedilni datum ali ime datoteke, ki se zaÄne z ,/` ali ,."
+#~ "`; v\n"
+#~ "slednjem primeru se uporabi datum te datoteke.\n"
+#~ "\n"
+#~ "Privzeta izbira *tega* programa ,tar` je `-f%s -b%d'.\n"
+
+#~ msgid "Obsolete option, now implied by --blocking-factor"
+#~ msgstr "Zastarela izbira, zdaj privzeta z --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --blocking-factor"
+#~ msgstr "Zastarela izbira, zdaj nadomeÅ¡Äena z --blocking-factor"
+
+#~ msgid "Obsolete option name replaced by --read-full-records"
+#~ msgstr "Zastarela izbira, zdaj nadomeÅ¡Äena z --read-full-records"
+
+#~ msgid "Obsolete option name replaced by --touch"
+#~ msgstr "Zastarela izbira, zdaj nadomeÅ¡Äena z --touch"
+
+#~ msgid "Conflicting archive format options"
+#~ msgstr "NasprotujoÄe si izbire glede formata arhiva"
+
+#~ msgid "Obsolete option name replaced by --absolute-names"
+#~ msgstr "Zastarela izbira, zdaj nadomeÅ¡Äena z --absolute-names"
+
+#~ msgid "Obsolete option name replaced by --block-number"
+#~ msgstr "Zastarela izbira, zdaj nadomeÅ¡Äena z --block-number"
+
+#~ msgid "Obsolete option name replaced by --backup"
+#~ msgstr "Zastarela izbira, zdaj nadomeÅ¡Äena z --backup"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "Avtorja John Gilmore in Jay Fenlason."
+
+#~ msgid ""
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also.\n"
+#~ "\n"
+#~ " -l, --file-length=LENGTH LENGTH of generated file\n"
+#~ " -p, --pattern=PATTERN PATTERN is `default' or `zeros'\n"
+#~ " --help display this help and exit\n"
+#~ " --version output version information and exit\n"
+#~ msgstr ""
+#~ "Argumenti, ki so obvezni za dolge oblike izbire, so obvezni tudi za "
+#~ "kratke.\n"
+#~ "\n"
+#~ " -l, --file-length=DOLŽINA DOLŽINA ustvarjene datoteke\n"
+#~ " -p, --pattern=VZOREC možnosti za VZOREC sta ,default` in ,zeros`\n"
+#~ " --help ta navodila\n"
+#~ " --version verzija programa\n"
+
+#~ msgid "Written by F. Pinard."
+#~ msgstr "Avtor François Pinard."
+
+#~ msgid "Ambiguous pattern `%s'"
+#~ msgstr "Dvoumen vzorec ,%s`"
+
+#~ msgid "Copyright %d Free Software Foundation, Inc."
+#~ msgstr "Copyright %d Free Software Foundation, Inc."
+
+#~ msgid ""
+#~ "This is free software; see the source for copying conditions. There is "
+#~ "NO\n"
+#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR "
+#~ "PURPOSE.\n"
+#~ msgstr ""
+#~ "To je prost program; pogoji, pod katerimi ga lahko razmnožujete in\n"
+#~ "razširjate so navedeni v izvorni kodi. Za program ni NOBENEGA jamstva,\n"
+#~ "niti jamstev USTREZNOSTI ZA PRODAJO ali PRIMERNOSTI ZA UPORABO.\n"
+
+#~ msgid "Write to compression program short %lu bytes"
+#~ msgstr "Pisanje na vhod programa za stiskanje prekratko za %lu bajtov"
+
+#~ msgid "Removing `%.*s' prefix from member names"
+#~ msgstr "Odstranjujemo predpono ,%.*s` iz imen elementov"
+
+#~ msgid "Archive contains future timestamp %s"
+#~ msgstr "Arhiv vsebuje Äasovno oznako iz prihodnosti: %s"
+
+#~ msgid "%s: Cannot symlink %s %s"
+#~ msgstr "%s: Simbolna povezava %s %s ni mogoÄa"
+
+#~ msgid "Invalid group given on option"
+#~ msgstr "Podana skupina ni veljavna"
+
+#~ msgid "Invalid owner given on option"
+#~ msgstr "Podani uporabnik ni veljaven"
+
+#~ msgid "Cannot close file descriptor"
+#~ msgstr "Ni možno zapreti datoteÄnega deskriptorja"
+
+#~ msgid "Cannot properly duplicate %s"
+#~ msgstr "Ni mogoÄe pravilno podvojiti %s"
+
+#~ msgid "(child) Pipe to stdin"
+#~ msgstr "(naslednik) cev na stdin"
+
+#~ msgid "Archive to stdout"
+#~ msgstr "Arhiv na stdout"
+
+#~ msgid "((child)) Pipe to stdout"
+#~ msgstr "((naslednik)) cev na stdout"
+
+#~ msgid "(grandchild) Pipe to stdin"
+#~ msgstr "(pranaslednik) cev na stdin"
+
+#~ msgid "(child) Pipe to stdout"
+#~ msgstr "(naslednik) cev na stdout"
+
+#~ msgid "((child)) Pipe to stdin"
+#~ msgstr "((naslednik)) cev na stdin"
+
+#~ msgid "(grandchild) Pipe to stdout"
+#~ msgstr "(pranaslednik) cev na stdout"
+
+#~ msgid "Only wrote %lu of %lu bytes to %s"
+#~ msgstr "Samo %lu od %lu bajtov zapisanih na %s"
+
+#~ msgid "WARNING: %s: close (%d, %d)"
+#~ msgstr "OPOZORILO: %s: zapiramo (%d, %d)"
+
+#~ msgid "Cannot allocate memory for diff buffer of %lu bytes"
+#~ msgstr "Ni možno rezervirati pomnilnika za %lu bajtov medpomnilnika za diff"
+
+#~ msgid "Cannot seek to %s in file %s"
+#~ msgstr "Pozicija %s v datoteki %s ni dostopna"
+
+#~ msgid "Wrote %s of %s bytes to file %s"
+#~ msgstr "Zapisano %s od %s bajtov na datoteko %s"
+
+#~ msgid "lseek error at byte %s in file %s"
+#~ msgstr "Napaka pri lseek pri bajtu %s v datoteki %s"
+
+#~ msgid "File %s shrunk, padding with zeros"
+#~ msgstr "Datoteka %s skrÄena, dopolnimo z niÄlami"
+
+#~ msgid "Cannot reposition archive file"
+#~ msgstr "Repozicija arhivske datoteke neuspešna"
+
+#~ msgid "%s: Cannot lchown to uid %lu gid %lu"
+#~ msgstr "%s: LastniÅ¡tva ni moÄ spremeniti z lchown na UID %lu GID %lu"
+
+#~ msgid "%s: Cannot chown to uid %lu gid %lu"
+#~ msgstr "%s: LastniÅ¡tva ni moÄ spremeniti s chown na UID %lu GID %lu"
+
+#~ msgid "%s: lseek error at byte %s"
+#~ msgstr "%s: napaka lseek pri bajtu %s"
+
+#~ msgid "%s: Could only write %s of %s bytes"
+#~ msgstr "%s: Zapisanih samo %s od %s bajtov"
+
+#~ msgid "Error while deleting %s"
+#~ msgstr "Napaka pri brisanju %s"
+
+#~ msgid "EOF in archive file"
+#~ msgstr "Znak za konec datoteke v arhivu"
+
+#~ msgid "Only wrote %lu of %lu bytes to file %s"
+#~ msgstr "Zapisanih samo %lu od %lu bajtov na datoteko %s"
+
+#~ msgid "Renaming previous %s to %s\n"
+#~ msgstr "Prejšnja %s preimenovana v %s\n"
+
+#~ msgid "%s: Cannot rename for backup"
+#~ msgstr "%s: Ni možno preimenovati za pisanje varnostne kopije"
+
+#~ msgid "%s: Cannot rename from backup"
+#~ msgstr "%s: Ni možno preimenovati iz varnostne kopije"
+
+# POZOR -- oblike "to stat a file" slovenscina ne pozna
+#~ msgid "Cannot %s %s"
+#~ msgstr "Ni možno %s %s"
+
+#~ msgid "Read error at byte %s reading %lu bytes in file %s"
+#~ msgstr "Napaka pri branju pri bajtu %s, prebranih %lu bajtov datoteke %s"
+
+#~ msgid "Cannot open pipe"
+#~ msgstr "Ni mogoÄe odpreti cevi"
+
+#~ msgid "Cannot open archive %s"
+#~ msgstr "Ni mogoÄe odpreti arhiva %s"
+
+#~ msgid "Child cannot fork"
+#~ msgstr "Vejitev naslednika ni možna"
+
+#~ msgid "Cannot read from compression program"
+#~ msgstr "Branje z izhoda programa za stiskanje ne gre"
+
+#~ msgid "Cannot write to compression program"
+#~ msgstr "Pisanje na vhod programa za stiskanje ne gre"
+
+#~ msgid "Cannot write to %s"
+#~ msgstr "Pisanje na %s ni možno"
+
+#~ msgid "WARNING: Cannot truncate %s"
+#~ msgstr "OPOZORILO: Ni mogoÄe skrajÅ¡ati %s"
+
+#~ msgid "While waiting for child"
+#~ msgstr "Med Äakanjem na naslednika"
+
+#~ msgid "Cannot fork!"
+#~ msgstr "Vejitev ni možna!"
+
+#~ msgid "Cannot exec a shell %s"
+#~ msgstr "Ni mogoÄe pognati lupine %s"
+
+#~ msgid "Cannot read %s"
+#~ msgstr "Branje %s ni možno"
+
+#~ msgid "Error while closing %s"
+#~ msgstr "Napaka pri zapiranju %s"
+
+#~ msgid "Cannot read link %s"
+#~ msgstr "Ni mogoÄe prebrati povezave %s"
+
+#~ msgid "Could not rewind archive file for verify"
+#~ msgstr "Arhiva ni možno previti na zaÄetek, preverjanje ni možno"
+
+#~ msgid "Removing leading `/' from archive names"
+#~ msgstr "Odstranjujemo vodilne ,/` iz imen arhivov"
+
+#~ msgid "Cannot add file %s"
+#~ msgstr "Ni mogoÄe dodati datoteke %s"
+
+#~ msgid "Cannot add directory %s"
+#~ msgstr "Ni mogoÄe dodati imenika %s"
+
+#~ msgid "Cannot open directory %s"
+#~ msgstr "Ni mogoÄe odpreti imenika %s"
+
+#~ msgid "%s: close"
+#~ msgstr "%s: zaprto"
+
+#~ msgid "%s: Could not write to file"
+#~ msgstr "%s: Zapis na datoteko ni mogoÄ"
+
+#~ msgid "%s: Could not create file"
+#~ msgstr "%s: Ni mogoÄe ustvariti datoteke"
+
+#~ msgid "%s: Error while closing"
+#~ msgstr "%s: Napaka pri zapiranju"
+
+#~ msgid "%s: Could not make node"
+#~ msgstr "%s: Ni možno ustvariti vozla"
+
+#~ msgid "%s: Could not make fifo"
+#~ msgstr "%s: Ni možno ustvariti FIFO"
+
+#~ msgid "%s: Could not create directory"
+#~ msgstr "%s: Ni možno ustvariti imenika"
+
+#~ msgid "Added write and execute permission to directory %s"
+#~ msgstr "Imeniku %s dodani dovoljenji za pisanje in izvajanje"
+
+#~ msgid "Cannot open file %s"
+#~ msgstr "Ni mogoÄe odpreti datoteke %s"
+
+#~ msgid "Archive %s EOF not on block boundary"
+#~ msgstr "Arhiv %s se ne konÄa s koncem bloka"
+
+#~ msgid "Only read %d bytes from archive %s"
+#~ msgstr "Prebrano samo %d zlogov z arhiva %s"
+
+#~ msgid "Removing leading `/' from absolute path names in the archive"
+#~ msgstr "Imena datotek v arhivu oÄistimo vodilnega ,/` pri absolutnih poteh"
+
+#~ msgid "Amount actually written is (I hope) %d.\n"
+#~ msgstr "Dejanska zapisana koliÄina: %d (upajmo)\n"
+
+#~ msgid "File name %s%s too long"
+#~ msgstr "Ime datoteke %s%s predolgo"
+
+#~ msgid "Data differs"
+#~ msgstr "Podatki se razlikujejo"
+
+#~ msgid "File does not exist"
+#~ msgstr "Datoteka ne obstaja"
+
+#~ msgid "Not a regular file"
+#~ msgstr "Ni navadna datoteka"
+
+#~ msgid "Does not exist"
+#~ msgstr "Ne obstaja"
+
+#~ msgid "No such file or directory"
+#~ msgstr "Datoteka ali imenik s tem imenom ne obstaja"
+
+#~ msgid "Mode or device-type changed"
+#~ msgstr "NaÄin ali tip enote je spremenjen"
+
+#~ msgid "No longer a directory"
+#~ msgstr "Ni veÄ imenik"
+
+#~ msgid "%d at %d\n"
+#~ msgstr "%d pri %d\n"
+
+#~ msgid "Could not get current directory"
+#~ msgstr "Ni mogoÄe izvedeti trenutnega imenika"
+
+#~ msgid "Could not get current directory: %s"
+#~ msgstr "Ni mogoÄe izvedeti trenutnega imenika: %s"
+
+#~ msgid "File name %s/%s too long"
+#~ msgstr "Ime datoteke %s/%s je predolgo"
+
+#~ msgid "Cannot chdir to %s"
+#~ msgstr "Imenik %s ni dostopen"
+
+#~ msgid "Hmm, this doesn't look like a tar archive"
+#~ msgstr "Hmm, to ne izgleda kot arhiv tar"
+
+#~ msgid "Skipping to next file header"
+#~ msgstr "PreskoÄimo na naslednjo glavo datoteke"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [OPTION]... [FILE]...\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Uporaba: %s [IZBIRA]... [DATOTEKA]...\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, "
+#~ "Inc.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Avtorske pravice (C) 1988, 92, 93, 94, 95, 96, 97 Free Software "
+#~ "Foundation, Inc.\n"
+
+#~ msgid "Volume mismatch! %s!=%s"
+#~ msgstr "Oznaka dela se ne ujema! %s != %s"
+
+#~ msgid "EOF? What does that mean?"
+#~ msgstr "Konec datoteke?"
+
+#~ msgid "Mode"
+#~ msgstr "NaÄin"
+
+#~ msgid "Uid"
+#~ msgstr "UID"
+
+#~ msgid "Gid"
+#~ msgstr "GID"
+
+#~ msgid "Size"
+#~ msgstr "Velikost"
+
+#~ msgid "Missing filename after -C"
+#~ msgstr "Za izbiro -C manjka ime datoteke"
+
+#~ msgid "Bad regular expression: %s"
+#~ msgstr "Nepravilen regularen izraz: %s"
+
+#~ msgid "File %s\n"
+#~ msgstr "Datoteka %s\n"
+
+#~ msgid "Junk files\n"
+#~ msgstr "Poškodovane datoteke\n"
+
+#~ msgid "file %s\n"
+#~ msgstr "datoteka %s\n"
+
+#~ msgid "Skip %ld\n"
+#~ msgstr "Preskok %ld zlogov\n"
+
+#~ msgid "Out of first loop\n"
+#~ msgstr "Izven prve zanke\n"
+
+#~ msgid "Saved %d blocks, need %d more\n"
+#~ msgstr "Shranjenih %d blokov, potrebuje se jih Å¡e %d\n"
+
+#~ msgid "New record\n"
+#~ msgstr "Nov zapis\n"
+
+#~ msgid "Header type %d\n"
+#~ msgstr "Tip glave %d\n"
+
+#~ msgid "File %s "
+#~ msgstr "Datoteka %s "
+
+#~ msgid "Flush it\n"
+#~ msgstr "Izpraznitev medpomnilnika\n"
+
+#~ msgid "Flushing %d blocks from %s\n"
+#~ msgstr "Izpraznitev %d blokov iz %s\n"
+
+#~ msgid "Block: %d <= %d "
+#~ msgstr "Blok: %d <= %d "
+
+#~ msgid "Block %d left\n"
+#~ msgstr "Å e %d blokov\n"
+
+#~ msgid "Final %d\n"
+#~ msgstr "Zadnjih %d\n"
+
+#~ msgid "Need %d kept_in %d keep %d\n"
+#~ msgstr "Potrebno %d shranjenih %d shranjujem %d\n"
+
+#~ msgid "Flush...\n"
+#~ msgstr "Izpraznitev...\n"
+
+#~ msgid "Copying %d\n"
+#~ msgstr "Kopiranje %d\n"
+
+#~ msgid "Now new %d need %d keep %d keep_in %d block %d/%d\n"
+#~ msgstr ""
+#~ "Zdaj novih %d potrebnih %d shranjujem %d shranjenih %d blok %d/%d\n"
+
+#~ msgid "Write record\n"
+#~ msgstr "Pisanje zapisa\n"
+
+#~ msgid "Fore to %x\n"
+#~ msgstr "Naprej na %x\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..f05026f
--- /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..bbc25cd
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,2403 @@
+# Swedish messages for tar
+# Copyright © 1996, 2001, 2004 Free Software Foundation, Inc.
+# Jan Djärv <jan.h.d@swipnet.se>, 2000, 2001, 2004, 2006, 2007
+# Revision: 1.75
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.16.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2007-05-24 18:05+0200\n"
+"Last-Translator: Jan Djärv <jan.h.d@swipnet.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\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"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "ogiltigt argument %s för %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "tvetydigt argument %s för %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Giltiga argument är:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: %s värde är mindre eller lika med %s"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: Parameter från ARGP_HELP_FMT kräver ett värde."
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: Parameter från ARGP_HELP_FMT måste vara positiv."
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Okänd ARGP_HELP_FMT-parameter"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Skräp i ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Obligatoriska respektive valfria argument för långa flaggor är obligatoriska "
+"repektive valfria även för motsvarande korta."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Användning:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " eller: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [FLAGGA...]"
+
+#: lib/argp-help.c:1683
+#, 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"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"Rapportera fel till %s.\n"
+"Rapportera fel eller synpunkter på översättningen till <tp-sv@listor.tp-sv."
+"se>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Okänt systemfel"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "visa denna hjälptext"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "ge ett kort hjälpmeddelande"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "NAMN"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "ange programnamnet"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SEK"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "vänta i SEK sekunder (standardvärde 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "visa programversion"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(PROGRAMFEL) Ingen version känd!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: För många argument\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(PROGRAMFEL) Flagga borde ha känts igen!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: flaggan \"%s\" är tvetydig\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: flagga \"--%s\" tar inget argument\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: flagga \"%c%s\" tar inget argument\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: flagga \"%s\" kräver ett argument\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: okänd flagga \"--%s\"\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: okänd flagga \"%c%s\"\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: otillåten flagga -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ogiltig flagga -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: flaggan kräver ett argument -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: flaggan \"-W %s\" är tvetydig\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: flagga \"-W %s\" tar inget argument\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "blockstorlek"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "minnet slut"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Funktion \"%s\" misslyckades"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Varning: Funktion \"%s\" misslyckades"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Kan inte ändra rättigheter till %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Kan inte byta ägare (chown) till uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Kan inte skapa hård länk till %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Läsfel vid byte %s, när %lu byte lästes"
+msgstr[1] "%s: Läsfel vid byte %s, när %lu bytes lästes"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Varning: Läsfel vid byte %s, när %lu byte lästes"
+msgstr[1] "%s: Varning: Läsfel vid byte %s, när %lu bytes lästes"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Kunde inte flytta (seek) till %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Varning: Kunde inte flytta (seek) till %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Kan inte skapa symbolisk länk till %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Skrev bara %lu av %lu byte"
+msgstr[1] "%s: Skrev bara %lu av %lu byte"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Tar bort inledande \"%s\" från namnen i arkivet"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Tar bort inledande \"%s\" från mål för hårda länkar"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Ersätter tomma namn i arkivet med \".\""
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Ersätter tomt mål för hård länk med \".\""
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "\""
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "\""
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[yYjJ]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Tjänsten är inte tillgänglig"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "standard in"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "standard ut"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Kan inte exekvera fjärrskal"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Indatasträng är för lång"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Syntaxfel för tal"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Kan inte allokera buffert\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Kan inte allokera buffert"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Användning: %s [FLAGGA]\n"
+"Manipulera en bandstation genom att ta emot kommandon från en annan "
+"process.\n"
+"\n"
+" --version Visa versionsinformation.\n"
+" --help Visa denna hjälptext.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+"Rapportera fel eller synpunkter på översättningen till <sv@li.org>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Ogiltigt positioneringsvärde"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Positioneringsvärde är utanför giltigt intervall"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Positioneringsriktning har ogiltigt värde"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: För tidigt filslut\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "För tidigt filslut"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Okänt kommando"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Summa skrivna byte"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Summa lästa byte"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Summa borttagna byte: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(rör)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Ogiltigt värde på record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Arkivnamn saknas"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Kan inte verifiera standard in/ut-arkiv"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Arkivet är komprimerat. Använd flaggan %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Komprimerade arkiv kan inte uppdateras"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Kontrollpunkt för skrivning %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Kontrollpunkt för läsning %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Vid bandets början, avslutar nu"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "För många fel, avslutar"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Block ej vid blockgräns (%lu byte) i arkivet"
+msgstr[1] "Block ej vid blockgräns (%lu byte) i arkivet"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Poststorlek = %lu block"
+msgstr[1] "Poststorlek = %lu block"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Kunde inte söka bakåt i arkivfilen, den kan vara oläsbar utan -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek stannade inte på en postgräns"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: innehåller ogiltigt volymnummer"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Volymnummer flödade över"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Gör iordning volym nummer %d för %s och tryck vagnretur:"
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Filslut vid förväntat användarsvar"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "VARNING: Arkivet är ofullständigt"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n namn Ge ett nytt filnamn för nästa (och efterföljande) volym(er)\n"
+" q Avsluta programmet\n"
+" y eller nyrad Fortsätt\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Starta ett underskal\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Skriv denna lista\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Ingen ny volym; avslutar.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Filnamn inte angivet, försök igen.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Ogiltig indata. Skriv ? för hjälp.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "kommandot \"%s\" misslyckades"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Det här ser inte ut som ett tar-arkiv"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"%s fortsätter möjligen i denna volym: huvudet innehåller ett trunkerat namn"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s fortsätter inte i denna volym"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s har fel storlek (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Denna volym kommer inte i rätt ordning"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Arkivet är inte märkt för att stämma med %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Volym %s överensstämmer inte med %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: filnamnet är för långt för att lagras i huvudet för ett GNU "
+"multivolymsarkiv, trunkerat"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Kunde bara läsa %lu av %lu byte"
+msgstr[1] "Kunde bara läsa %lu av %lu byte"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Innehållet är olika"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Oväntat filslut i arkivet"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Filtyper är olika"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Rättigheterna är olika"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid är olika"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid är olika"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Modifieringstiderna är olika"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Storlekarna är olika"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Inte länkad till %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Symboliska länkar är olika"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Enhetsnummer är olika"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Verifierar "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Okänd filtyp \"%c\" jämförd som en normal fil"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Arkivet innehåller filnamn med inledande prefix borttaget."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Verifiering kan misslyckas med att hitta originalfiler."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "VERIFIKATIONSFEL: %d felaktigt arkivhuvud upptäckt"
+msgstr[1] "VERIFIKATIONSFEL: %d felaktiga arkivhuvuden upptäckta"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: innehåller en cachekatalog-tagg %s; inte arkiverad"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "%s är utanför intervallet för %s: %s..%s, byter till %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "%s är utanför intervallet för %s: %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Genererar negativa oktala värden i arkivhuvudet"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: filnamnet är för långt (max %d); inte arkiverad"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: filnamnet är för långt (kan ej delas); inte arkiverad"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: länknamn är för långt; inte arkiverad"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Fil krympte med %s byte, fyller ut med nolltecken"
+msgstr[1] "%s: Fil krympte med %s byte, fyller ut med nolltecken"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: filen finns på ett annat filsystem; inte arkiverad"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Okänd filtyp; filen ignorerad"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "Det fattas länkar till \"%s\".\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: filen är oförändrad; inte arkiverad"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: filen är själva arkivet; inte arkiverad"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Fil borttagen innan vi läste den"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: katalog innehåller en cachekatalog-tagg; inte arkiverad"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: Fil ändrades under tiden vi läste den"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: socketfil ignorerad"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: door-fil ignorerad"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Hoppar till nästa filhuvud"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Tar bort icke-huvuddata från arkivet"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: orimligt gammal tidsstämpel %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: tidsvärde %s är %s sekunder i framtiden"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Oväntad inkonsistens när katalog skapades"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Katalog bytte namn innan dess status kunde extraheras"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Extraherar sammanhängande filer som vanliga filer"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Försöker extrahera symboliska länkar som hårda länkar"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Läser %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Kan inte extrahera -- filen fortsätter från en annan volym"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Oväntat huvud för långt filnamn"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Okänd filtyp \"%c\", extraherad som en normal fil"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Nuvarade \"%s\" är nyare eller lika gammal"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s kunde inte säkerhetskopieras"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Kan inte byta namn på %s till %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Felet kan inte åtgärdas, avslutar nu"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Katalogen har bytt namn från %s"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Katalogen har bytt namn"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Katalogen är ny"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Ogiltigt värde på tidsvärde"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Ogiltig modifikationstid (sekunder)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Ogiltig modifikationstid (nanosekunder)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Ogiltigt enhetsnummer"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Ogiltigt inodnummer"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Fält för långt när ögonblicksfil lästes"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Läsfel i ögonblicksfil"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Oväntat filslut i ögonblicksfil"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Oväntat fältvärde i ögonblicksfil"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Postavslutare fattas"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Felaktigt filformat för inkrementell säkerhetskopiering"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+"Formatversion för inkrementell säkerhetskopiering stöds inte: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "Felaktig dumpkatalog: förväntade \"%c\" men hittade %#3o"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Felaktig dumpkatalog: \"X\" duplicerad"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Felaktig dumpkatalog: tomt namn i \"R\""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Felaktig dumpkatalog: \"T\" föregås inte av \"R\""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Felaktig dumpkatalog: tomt namn i \"T\""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr "Felaktig dumpkatalog: förväntade \"%c\" men hittade dataslut"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "Felaktig dumpkatalog: \"X\" används inte"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Kan inte skapa temporärkatalog med mall %s"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Rensar inte katalog: kunde inte ta status"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: katalogen finns på ett annat filsystem; inte rensad"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Tar bort %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Kan inte ta bort"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Utelämnad"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "block %s: ** Block av nolltecken **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Ett ensamt nollblock vid %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "block %s: ** Filslut **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "block %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Blanka i huvud där numeriskt värde av typ %s förväntades"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Arkivets oktala värde %.*s är utanför intervallet för %s, antar två-"
+"komplement"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Arkivets oktala värde %.*s är utanför intervallet för %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Arkivet innehåller föråldrade \"base-64\"-huvuden"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Arkivets \"base-64\"-sträng \"%s\" är utanför intervallet för %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Arkivets \"base-256\"-värde är utanför intervallet för %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arkivet innehåller %.*s där ett numeriskt värde av typ %s förväntades"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Arkivets värde %s är utanför intervallet för %s: %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " länk till %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " okänd filtyp \"%s\"\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Lång länk--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--LÃ¥ngt namn--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Volymhuvud--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Fortsätter vid byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Skapar katalog:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Byter namn på %s till %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Kan inte byta namn till %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Byter namn på %s tillbaka till %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Kan inte spara arbetskatalog"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Kan inte byta arbetskatalog"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "barnprocess"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "interprocesskanal"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Mönstermatchningstecken används i filnamn."
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+"Använd --wildcards för att slå på mönstermatchning, eller --no-wildcards för"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "att undertrycka denna varning."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Fanns inte i arkivet"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Nödvändig förekomst hittades inte i arkivet"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Flaggorna \"-%s\" och \"-%s\" vill båda läsa från standard in"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Ogiltigt arkivformat"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU-tillägg önskade i ett inkompatibelt arkivformat"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Okänd citeringsstil \"%s\". Gör \"%s --quoting-style=help för att få en "
+"lista."
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU tar sparar många filer tillsammans i ett band- eller fil-arkiv och kan\n"
+"återskapa individuella filer från arkivet.\n"
+"\n"
+"Exempel:\n"
+" tar -cf arkiv.tar foo bar # Skapa arkiv.tar med filerna foo och bar.\n"
+" tar -tvf arkiv.tar # Visa filer i arkiv.tar, all information.\n"
+" tar -xf arkiv.tar # Extrahera alla filer i arkiv.tar.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Säkerhetskopieändelse är \"~\", om den inte sätts med --suffix eller\n"
+"SIMPLE_BACKUP_SUFFIX.\n"
+"Versionshanteringen kan styras med --backup eller VERSION_CONTROL,\n"
+"där värdena kan vara:\n"
+"\n"
+" none, off gör aldrig säkerhetskopior\n"
+" t, numbered gör numrerade säkerhetskopior\n"
+" nil, existing numrerade säkerhetskopior om sådana redan finns, enkla "
+"annars\n"
+" never, simple gör alltid enkla säkerhetskopior\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Operationsläge:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "visa innehållet i arkivet"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "extrahera filer från arkivet"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "skapa ett nytt arkiv"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "visa skillnader mellan filsystemet och arkivet"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "lägg till filer på slutet av arkivet"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "lägg till filer som är nyare än de i arkivet"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "lägg till innehållet i en arkivfil till arkivet"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "ta bort från arkivet (inte för arkiv på magnetband!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "verifiera arkivets volymnamn och avsluta."
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Modifiera operationslägen:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "hantera filer med hål mer effektivt"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "ÖVRE[.UNDRE]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+"ange vilken formatversion som ska hantera filer med hål (implicerar --sparse)"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "hantera gamla GNU-formatet för inkrementell säkerhetskopiering"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "FIL"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "hantera nya GNU-formatet för inkrementell säkerhetskopiering"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "avsluta inte med felslutstatus p.g.a. oläsbara filer"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "NUMMER"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"behandla endast förekomst NUMMER av varje fil i arkivet. Denna flagga är "
+"endast giltig med ett av underkommandona --delete, --diff, --extract eller --"
+"list och när en lista av filer anges antingen på kommandoraden eller med "
+"flaggan -T. Standardvärde för NUMMER är 1."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "arkivet är sökbart"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "Kontrollera överskrivning:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "försök verifiera arkivet efter det skapats"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "ta bort filer efter de sparats i arkivet"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "ersätt inte befintliga filer vid extrahering"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "ersätt inte befintliga filer som är nyare än de som finns i arkivet"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "skriv över befintliga filer vid extrahering"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "ta bort befintliga filer innan de nya extraheras"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "töm kataloghierarkier före extrahering av katalog"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "bevara befintliga katalogers metadata"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"skriv över metadata för befintliga kataloger vid extrahering (standardvärde)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Välj utdataström:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "extrahera filer till standard ut"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "KOMMANDO"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "extrahera filer till standard in för ett annat program"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "ignorera barnprocessers slutstatus"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "behandla slutstats från barnprocesser skiljt ifrån noll som fel"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Hantering av filattribut:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "sätt NAMN som ägare för adderade filer"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "sätt NAMN som grupp för adderade filer"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DATUM-ELLER-FIL"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "sätt modifieringstid på adderade filer från DATUM-ELLER-FIL"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "RÄTTIGHET"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "sätt (symbolisk) RÄTTIGHET för adderade filer"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "METOD"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"bevara accesstider på arkiverade filer, antingen genom att återställa "
+"tiderna efter läsning (METOD=\"replace\", standardvärde) eller genom att "
+"inte sätta tiderna alls (METOD=\"system\")"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "extrahera inte filers modifieringstid"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "försök extrahera filer med samma ägare som i arkivet"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "extrahera filer med dig själv som ägare"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "använd alltid tal för användar- och gruppnamn"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+"extrahera information om filrättigheter (standardvärde för superanvändare)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"applicera användarens umask när rättigheter extraheras från arkivet "
+"(standardvärde för vanliga användare)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "sortera namn som ska extraheras så de passar ihop med arkivet"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "samma som både -p och -s"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"fördröj sättandet av modifikationstider och rättigheter på extraherade "
+"kataloger till slutet på arkivextraheringen."
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "ta bort effekten av flaggan --delay-directory-restore"
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Enhetsval och enhetsbyte:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARKIV"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "använd arkivfil eller enhet ARKIV"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "arkivfilen är lokal även om namnet har kolon"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "använd KOMMANDO istället för rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "använd KOMMANDO istället för rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "ange enhet och densitet"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "skapa/visa/extrahera ett flervolymsarkiv"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "byt band efter det att NUMMER x 1024 byte skrivits"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "kör kommandofil vid slutet av varje band (flaggan -M sätts också)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "använd/uppdatera volymnummer i FIL"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Blockhantering:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOCK"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "BLOCK x 512 byte per post"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "NUMMER byte per post, multipel av 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "ignorera block med enbart nolltecken (betyder filslut)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "omblocka vid läsning (för 4.2BSD-rör)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Val av arkivformat:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "FORMAT"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "skapa ett arkiv med givet format"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "FORMAT är ett av följande:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "gammalt V7 format"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "GNU-format enligt tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU-format från tar 1.13.x"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "POSIX 1003.1-1988 (ustar) format"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "POSIX 1003.1-2001 (pax) format"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "samma som pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "samma som --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "samma som --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "nyckelord[[:]=värde][,nyckelord[[:]=värde], ...]"
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "ange nyckelord för pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "NAMN"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"skapa ett arkiv med volymnamnet NAMN. Vid visning/extrahering är NAMN ett "
+"skalmönster (\"globbing\")"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "filtrera arkivet genom bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "filtrera arkivet genom gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "filtrera arkivet genom compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "PROG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "filtrera genom PROG (måste förstå -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Filval:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"lägg till angiven FIL till arkivet (användbart om FIL börjar med \"-\")"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "KATALOG"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "byt katalog till KATALOG"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "hämta namn att extrahera från FIL"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T läser namn åtskilda med nolltecken, -C obrukbar"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr "avcitera filnamn som lästs med -T (standardvärde)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "avcitera inte filnamn som lästs med -T"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "MÖNSTER"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "utelämna filer som matchar MÖNSTER"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "utelämna filer som matchar mönster i FIL"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "utelämna kataloger som innehåller en cache-tagg"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "utelämna kataloger som innehåller FIL"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "utelämna kataloger som innehåller FIL"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "utelämna kataloger som innehåller FIL"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "utelämna kataloger som innehåller FIL"
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr "utelämna kataloger som innehåller FIL"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "gå inte automatiskt ned i kataloger"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "byt inte filsystem när arkivet skapas"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "gå rekursivt ned i kataloger (standardvärde)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "tag inte bort inledande \"/\" från namn"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr "följ symboliska länkar, arkivera filerna de pekar på"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "NAMN"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "börja med fil NAMN i arkivet"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "arkivera bara filer nyare än DATUM-ELLER-FIL"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "DATUM"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "jämför datum och tid endast för dataändringar"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "KONTROLL"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "gör säkerhetskopior före borttagning, välj typ av versionshantering"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "STRÄNG"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"gör säkerhetskopior före borttagning, ersätt den normala "
+"säkerhetskopieändelsen (\"~\" om inte ändrad med miljövariabeln "
+"SIMPLE_BACKUP_SUFFIX)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Filnamnstransformationer:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+"ta bort NUMMER stycken inledande komponenter från filnamn före extrahering"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "UTTRYCK"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr "använd seds ersättnings-UTTRYCK för att transformera filnamn"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+"Flaggor för filnamnsmatchning (påverkar både uteslutnings- och "
+"inkluderingsmönster):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "matcha gemener och versaler lika"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "mönster måste matcha i början på filnamn"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "mönster matchas efter \"/\" i filnamn (standardvärde vid uteslutning)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "matcha gemener och versaler olika (standardvärde)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "använd jokertecken (standardvärde för uteslutning)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "ordagrann strängjämförelse"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "jokertecken matchar inte \"/\""
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "jokertecken matchar \"/\" (standardvärde för uteslutning)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Informativ utskrift:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "visa namn på alla filer som behandlas"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]NUMMER"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+"visa förloppsmeddelande efter varje grupp om NUMMER poster (standardvärde 10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "visa ett meddelande om inte alla länkar arkiverats"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "SIGNAL"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"skriv totalt antal byte efter arkivet hanterats. Med ett argument skrivs "
+"totalt antal byte när SIGNAL levereras. Tillåta signaler är: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 coh SIGUSR2. Namn utan SIG-prefix accepteras också."
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "visa filers modifieringstid i UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "skicka informativa meddelanden till FIL"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "visa blocknummer inom arkivet för varje meddelande"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "fråga efter bekräftelse för varje steg"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "visa standardvärden för \"tar\""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"vid visning eller extrahering, visa varje katalog som inte matchar "
+"sökkriterium"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "visa fil- eller arkivnamn efter transformering"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "STIL"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr "sätt citatstil för namn. Se nedan för giltiga vären på STIL."
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "citera även tecken i STRÄNG"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "citera inte tecken i STRÄNG"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Kompatibilitetsflaggor:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"vid skapande, samma som --old-archive. Vid extrahering, samma som --no-same-"
+"owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Andra flaggor:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "begränsa användningen av eventuellt farliga flaggor"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Du kan endast ange en av flaggorna \"-Acdtrux\""
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Motstridiga komprimeringsflaggor"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Okänt signalnamn: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Tidsfil hittades inte"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Använder %s istället för okänt datumformat %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Flagga %s: Tolkar tidsangivelse \"%s\" som %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: fillistan redan läst"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: filnamnet som lästes innehåller nolltecken"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "Giltiga argument till flaggan --quoting-style är:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Denna* tar har standardvärdena:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Ogiltig blockfaktor"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Varning: flaggan -I stöds inte, du kanske menade -j eller -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Ogiltig bandlängd"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Mer än en datumgräns"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "Ogiltig version för filer med hål"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' stöds inte på denna plattform"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "--checkpoint-värdet är inte ett heltal"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Ogiltig grupp"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Ogiltiga rättigheter givna för flagga"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Ogiltigt nummer"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Ogiltig ägare"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Ogiltig poststorlek"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Poststorlek måste vara en multipel av %d"
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Ogiltig antal element"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "Endast en --to-command flagga tillåten"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Ogiltig densitetsangivelse: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Okänd densitet: \"%c\""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Flaggorna \"-[0-7][lmh]\" stöds inte av *detta* tar-program"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[FIL]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Gammal flagga \"%c\" kräver ett argument"
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence är meningslöst utan en fillista"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence kan inte användas i det begärda operationsläget."
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Multipla arkivfiler kräver \"-M\" flaggan"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Kan inte kombinera --listed-incremental med --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Volymnamn är för långt (maxlängd är %lu byte)"
+msgstr[1] "%s: Volymnamn är för långt (maxlängd är %lu byte)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Flervolymsarkiv kan inte verifieras"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Komprimerade arkiv kan inte verifieras"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Kan inte använda komprimerade flervolymsarkiv"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Komprimerade arkiv kan inte slås samman"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option kan bara användas på POSIX-arkiv"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Vägrar fegt att skapa ett tomt arkiv"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Flaggorna \"-Aru\" är inkompatibla med \"-f -\""
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Du måste ange en av flaggorna \"-Acdtrux\""
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Avslut med felslutstatus fördröjd från föregående fel"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Filen krympte med %s byte"
+msgstr[1] "%s: Filen krympte med %s byte"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Nyckelordet %s är okänt eller inte ännu implementerat"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Mönster %s kan inte användas"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Nyckelord %s kan inte ersättas"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Felaktigt utökat huvud: längd saknas"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "Längd på utökat huvud är utanför giltigt intervall"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Längd %.*s på utökat huvud är utanför giltigt intervall"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "Felaktigt utökat huvud: blanktecken efter längdangivelse saknas"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Felaktigt utökat huvud: likamedtecken saknas"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Felaktigt utökat huvud: nyrad saknas"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "Ignorerar nykelord \"%s\" i utökat huvud"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr "Genererat nyckel/värde-par är för långt (nyckel=%s, längd=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Utökat huvud %s=%s är utanför intervallet %s..%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Felaktigt utökat huvud: ogiltig %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Felaktigt utökat huvud: för många %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "Felaktigt utökat huvud: ogiltigt %s: oväntad avskiljare %c"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Felaktigt utökat huvud: ogiltigt %s: udda antal värden"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile bearbetar datafiler i testsviten för GNU paxutils.\n"
+"FLAGGOR är:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Flaggor för filskapande:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "STORLEK"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Skapa ett arkiv med given STORLEK"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "Skriv till NAMN istället för till standard ut"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Läs filnamn från FIL"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T läser namn åtskilda med nolltecken"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr "Fyll filen med givet MÖNSTER. MÖNSTER är \"default\" eller \"zeros\""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Storlek för ett block för filer med hål"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr "Generera fil med hål. Resten av kommandoraden ger filmappningen."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr "POSITION"
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr "Flytta till given position innan data skrivs"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Flaggor för filstatistik:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"Skriv innehållet i \"struct stat\" för varje given fil. Standardvärde på "
+"FORMAT är:"
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Flaggor för synkron exekvering:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"Kör givet KOMMANDO. Användbart med --checkpoint och en av --cut, --append, --"
+"touch"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr "Utför angiven åtgärd (se nedan) när kontrollpunkt NUMMER nås"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Sätt datum för nästa --touch"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "Visa exekverade kontrollpunkter och slutstatus på KOMMANDO"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Synkront exekverade åtgärder. Dessa exekveras när kontrollpunktnumret givet "
+"av flaggan --checkpoint nås."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"Trunkera FIL till storleken given av föregående flaggan --length (eller 0 om "
+"den inte är given)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+"Lägg till STORLEK byte till FIL. STORLEK är given av föregående flagga --"
+"length."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "Uppdatera access- och modifikationstider för FIL"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "Exekvera KOMMANDO"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Ogiltigt storlek: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Nummer utanför giltigt intervall: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Negativ storlek: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "status (stat) kunde ej tas på %s"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Fel vid parsning av tal nära \"%s\""
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Okänt datumformat"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARGUMENT...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "kan inte öppna \"%s\""
+
+#: tests/genfile.c:426
+#, c-format
+msgid "cannot seek: %s"
+msgstr "kunde inte flytta (seek) till %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "filnamnet innehåller nolltecken"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr "kan inte skapa filer med hål till standard ut, använd flaggan --file"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "felaktig mask (nära \"%s\")"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "Okänt fält \"%s\""
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "kan inte sätta tid på \"%s\""
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Kommandot avslutades utan fel\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Kommandot misslyckades med slutstatus %d\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Kommandot terminerades av signal %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Kommandot stoppades av signal %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Kommandot dumpade minnet\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Kommandot avslutade\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "--stat kräver filnamn"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "för många argument"
diff --git a/po/tar.pot b/po/tar.pot
new file mode 100644
index 0000000..f87a788
--- /dev/null
+++ b/po/tar.pot
@@ -0,0 +1,2310 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr ""
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr ""
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr ""
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr ""
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr ""
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr ""
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr ""
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr ""
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr ""
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr ""
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr ""
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr ""
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr ""
+
+#: lib/human.c:477
+msgid "block size"
+msgstr ""
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr ""
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr ""
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr ""
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr ""
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr ""
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr ""
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr ""
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr ""
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr ""
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr ""
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr ""
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr ""
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr ""
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr ""
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr ""
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr ""
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr ""
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr ""
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr ""
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr ""
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr ""
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr ""
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr ""
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr ""
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr ""
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr ""
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr ""
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr ""
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr ""
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr ""
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr ""
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr ""
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr ""
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr ""
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr ""
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr ""
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr ""
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr ""
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr ""
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr ""
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr ""
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr ""
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr ""
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr ""
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr ""
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr ""
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr ""
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr ""
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr ""
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr ""
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr ""
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr ""
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr ""
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr ""
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr ""
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr ""
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr ""
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr ""
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr ""
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr ""
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr ""
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr ""
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr ""
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr ""
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/create.c:67
+#, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr ""
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr ""
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr ""
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr ""
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr ""
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr ""
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr ""
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr ""
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr ""
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr ""
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr ""
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr ""
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr ""
+
+#: src/create.c:1585
+msgid "directory not dumped"
+msgstr ""
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr ""
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr ""
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr ""
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr ""
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr ""
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr ""
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr ""
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr ""
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr ""
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr ""
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr ""
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr ""
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr ""
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr ""
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr ""
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr ""
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr ""
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr ""
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr ""
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr ""
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr ""
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr ""
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr ""
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr ""
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr ""
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr ""
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr ""
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr ""
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr ""
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr ""
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr ""
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr ""
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr ""
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr ""
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr ""
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr ""
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr ""
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr ""
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr ""
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr ""
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr ""
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr ""
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr ""
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr ""
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr ""
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr ""
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr ""
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr ""
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr ""
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr ""
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr ""
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr ""
+
+#: src/misc.c:711
+msgid "child process"
+msgstr ""
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr ""
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr ""
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr ""
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr ""
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr ""
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr ""
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr ""
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr ""
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr ""
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr ""
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr ""
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr ""
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr ""
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr ""
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr ""
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr ""
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr ""
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr ""
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr ""
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr ""
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr ""
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr ""
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr ""
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr ""
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr ""
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr ""
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr ""
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr ""
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr ""
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr ""
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr ""
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr ""
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr ""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr ""
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr ""
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr ""
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr ""
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr ""
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr ""
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr ""
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr ""
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr ""
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr ""
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr ""
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr ""
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr ""
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr ""
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr ""
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr ""
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr ""
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr ""
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr ""
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr ""
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr ""
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr ""
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr ""
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr ""
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr ""
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr ""
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr ""
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr ""
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr ""
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr ""
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr ""
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, c-format
+msgid "cannot seek: %s"
+msgstr ""
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr ""
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr ""
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr ""
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr ""
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
diff --git a/po/tr.gmo b/po/tr.gmo
new file mode 100644
index 0000000..4471196
--- /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..ea5c6f6
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,2394 @@
+# Turkish translations for GNU tar messages.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+#
+# Nilgün Belma Bugüner <nilgun@buguner.name.tr>, 2001,...,2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.16.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2006-12-09 18:18+0200\n"
+"Last-Translator: Nilgün Belma Bugüner <nilgun@buguner.name.tr>\n"
+"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\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: KBabel 1.11.4\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "`%2$s' için %1$s argümanı geçersiz"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "`%2$s' için %1$s argümanı belirsiz"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Geçerli argümanlar:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: %s değeri %s değerinden küçük ya da ona eşit"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: ARGP_HELP_FMT parametresi bir deÄŸer gerektirir"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: ARGP_HELP_FMT parametresi pozitif olmalı"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: ARGP_HELP_FMT ile belirtilen parametre bilinmiyor"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "ARGP_HELP_FMT bozuk: %s"
+
+#: lib/argp-help.c:1247
+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 veya isteğe bağlı olan argümanlar kısa "
+"seçenekler için de geçerlidir."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Kullanımı:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " veya: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [SEÇENEK...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Daha fazla bilgi için `%s --help' veya `%s --usage' yazın.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"Yazılım hatalarını <%s> adresine,\n"
+"çeviri hatalarını <gnu-tr@belgeler.org> adresine bildiriniz.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Bilinmeyen sistem hatası"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "bu yardım iletisi gösterilir"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "kısa bir kullanım iletisi gösterilir"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "Ä°SÄ°M"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "uygulama ismi"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "SAN"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "SANİYE saniye bekler (öntanımlı 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "sürüm bilgisi gösterilir"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(YAZILIM HATASI) Sürümünü bilmiyor!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: argüman sayısı fazla\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(YAZILIM HATASI) Seçenek tanınmak zorunda!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: `%s' seçeneği belirsiz\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, 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"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: seçenek `%c%s' argümansız kullanılır\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: `%s' seçeneği bir argümanla kullanılır\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: `--%s' seçeneği bilinmiyor\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: `%c%s' seçeneği bilinmiyor\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: kuraldışı seçenek -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: geçersiz seçenek -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: seçenek bir argümanla kullanılır -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: `-W %s' seçeneği belirsiz\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, 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"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "blok uzunluÄŸu"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "bellek tükendi"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: %s olanaksız"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Uyarı: %s olanaksız"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Kip %s olarak deÄŸiÅŸtirilemez"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr ""
+"%s: Dosya sahipliği, Kullanıcı-kimlik %lu ve Grup-kimlik %lu olarak "
+"deÄŸiÅŸtirilemez."
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: %s'e sabit bağ kurulamıyor"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%1$s: %3$lu bayt okunurken %2$s. baytta okuma hatası"
+msgstr[1] "%1$s: %3$lu bayt okunurken %2$s. baytta okuma hatası"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%1$s: Uyarı: %3$lu bayt okunurken %2$s. baytta okuma hatası"
+msgstr[1] "%1$s: Uyarı: %3$lu bayt okunurken %2$s. baytta okuma hatası"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: %s e gidilemiyor"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Uyarı: %s e gidilemiyor"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: %s'e sembolik bağ oluşturulamıyor"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%1$s: %3$lu baytın sadece %2$lu baytı yazıldı"
+msgstr[1] "%1$s: %3$lu baytın sadece %2$lu baytı yazıldı"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Üye isimlerinden `%s' kaldırılıyor"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Sabit bağ hedeflerinden `%s' kaldırılıyor"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Boş üye ismi için `.' ikamesi"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Boş sabit bağ hedefi için `.' ikamesi"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[eEyY]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[hHnN]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Servis yok"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdG"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdÇ"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Uzak kabuk çalıştırılamıyor"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "Girdi dizgesi çok uzun"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Sayısal sözdizimi hatası"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Tampon alanı ayrılamıyor\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Tampon alanı ayrılamıyor"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Daha fazla bilgi için `%s --help' yazın.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Kullanımı: %s [SEÇENEK]\n"
+"Bir teybi uzak bağlantı üzerinden komut kabul ederek çalıştırır.\n"
+"\n"
+" --version Sürümü basar.\n"
+" --help Bu iletiyi basar.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Yazılım hatalarını <%s> adresine,\n"
+"çeviri hatalarını <gnu-tr@belgeler.org> adresine bildiriniz.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Arama başlangıcı hatası"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Arama başlangıcı kapsamdışı"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Arama yönü kapsamdışı"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Dosya sonu belirsiz\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Dosya sonu belirsiz"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Bozuk komut"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "Yazılan toplam bayt"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Okunan toplam bayt"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Silinen toplam bayt: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(boru)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "record_size için geçersiz değer"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "ArÅŸiv ismi verilmemiÅŸ"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "stdG/stdÇ arşivi doğrulanamaz"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Aeşiv sıkıştırılmış. %s seçeneğini kullanın"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Sıkıştırılmış arşivler güncellenemez"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Yazma sınama yeri %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Okuma sınaması yeri %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Bandın başlangıcında, şimdilik çıkıyor"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Çok hata var, çıkıyor"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Arşivde hizalanmamış blok (%lu bayt)"
+msgstr[1] "Arşivde hizalanmamış blok (%lu bayt)"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Kayıt uzunluğu = %lu blok"
+msgstr[1] "Kayıt uzunluğu = %lu blok"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Arşiv dosyası geri alınamaz; -i olmaksızın okunamayabilir"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek bir kaydın sınırında durmadı"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: geçersiz bölüm numarası içeriyor"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Bölüm numarası kapsamdışı"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "#%d. bölümü %s için hazırlamak istiyorsanız return tuşuna basınız: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Kullanıcı cevabı beklenirken dosya sonuna gelindi"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "UYARI: ArÅŸiv eksik"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n isim Sonraki (ve peşisıra) bölüm(ler) için yeni dosya ismi\n"
+" q Uygulama sonlandırılır\n"
+" y veya <enter> İşlem sürdürülür\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! bir alt kabuk açılır\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? Bu listeyi basar\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Yeni bölüm yok; çıkıyor.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Dosya ismi belirtilmemiÅŸ. Tekrar deneyin.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "Girdi geçersiz, Yardım için ? yazın.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "%s komutu başarısız"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Bu bir tar arşivi gibi görünmüyor"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s belki de bu bölümde devam ediyor: başlıktaki isim kırpılmış"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s bu bölümde devam etmiyor"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s yanlış uzunluk (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Bu bölüm sıralama dışı"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "ArÅŸiv etiketi %s ile eÅŸleÅŸmiyor"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "%s bölümü %s ile eşleşmiyor"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: dosya ismi GNU çoklu bölüm başlığında saklanamayacak kadar uzun, kırpıldı"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Sadece %2$lu baytın %1$lu baytı okunabildi"
+msgstr[1] "Sadece %2$lu baytın %1$lu baytı okunabildi"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "İçerikler farklı"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "ArÅŸivde beklenmeyen dosya sonu"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Dosya türleri farklı"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Kipleri farklı"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Kullanıcı-kimlikler farklı"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Grup-kimlikler farklı"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Değişiklik zamanları farklı"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Uzunlukları farklı"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "%s'e bağlı değil"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Sembolik bağlar farklı"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Aygıt numaraları farklı"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "DoÄŸrulama "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: '%c' dosya türü bilinmiyor, normal dosya olarak karşılaştırıldı"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Arşivdeki dosya isimleri dosya yolu içermiyor."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Doğrulama, özgün dosyaların konumlanmasında başarısız olabilir."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "DOĞRULAMA BAŞARISIZ: %d geçersiz başlık saptandı"
+msgstr[1] "DOĞRULAMA BAŞARISIZ: %d geçersiz başlık saptandı"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: %s arabellekleme dizini yaftasını içeriyor; dökümlenmedi"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr ""
+"%1$s değeri, %3$s..%4$s aralığının %2$s dışında; yerine %5$s kullanılıyor"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "%1$s değeri, %3$s..%4$s aralığının %2$s dışında"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Negatif sekizlik başlık üretiliyor"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: dosya ismi çok uzun (en çok %d olabilir); dökümlenmedi"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: dosya ismi çok uzun (parçalanamıyor); dökümlenmedi"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: bağ ismi çok uzun; dökümlenmedi"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Dosya %s baytta kaldı; sıfırlarla dolduruluyor"
+msgstr[1] "%s: Dosya %s baytta kaldı; sıfırlarla dolduruluyor"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: dosya farklı bir dosya sisteminde; dökümlenmedi"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Bilinmeyen dosya türü; dosya yoksayıldı"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "%s için bağlar kayıp.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: dosya değişmedi; dökümlenmedi"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: dosya arşivdir; dökümlenmedi"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Dosya okunamadan kaldırıldı"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: bir arabellekleme dizini yaftası içeriyor; dökümlenmedi"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: dosya okundu olarak imlendi"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: soket yoksayıldı"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: kapı yoksayıldı"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Sonraki başlığa atlanıyor"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Arşivden başlık-olmayan siliniyor"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: makul olmayan eski tarih damgası %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: zaman damgası %s %s s gelecekte"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Dizin oluşturulurken anlaşılamayan uyumsuzluk"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: durumu çıkarılamadan dizin ismi değiştirildi"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Bitişik dosyaları normal dosyalar olarak çıkarıyor"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Sembolik bağlar, sabit bağlar olarak çıkarılmaya çalışılıyor"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "%s okunuyor\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Dosya çıkarılamaz -- dosyanın başı diğer bölümde"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Umulmadık uzun isim başlığı"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Bilinmeyen dosya türü '%c', normal dosya olarak çıkartılıyor"
+
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "Mevcut %s daha yeni ya da yaşıt"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Bu dosyayı yedeklemek mümkün olmadı"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s ismi %s olarak deÄŸiÅŸtirilemez"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Hata kurtarılabilir değil: şimdilik çıkılıyor"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Dizinin eski adı %s idi"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Dizin adı değiştirilmişti"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Dizin yeni"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Geçersiz zaman damgası"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Değişiklik zamanı (saniye cinsinden) geçersiz"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "Değişiklik zamanı (nanosaniye cinsinden) geçersiz"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Geçersiz aygıt numarası"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Geçersiz düğüm numarası"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "Anlık görüntü dosyası okunurken alan çok uzun"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Anlık görüntü dosyasında okuma hatası"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Anlık görüntü dosyasında beklenmeyen dosya sonu"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Anlık görüntü dosyasında beklenmeyen alan değeri"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Kayıt sonlandırıcı eksik"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Arttırımlı dosya biçimi hatalı"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "Desteklenmeyen arttırımlı biçim sürümü: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr "dumpdir bozuk: umulan '%c' ama bulunan %#3o"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "dumpdir bozuk: 'X' yinelenmiÅŸ"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "dumpdir bozuk: 'R'deki isim boÅŸ"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "dumpdir bozuk: 'T' 'R' ile öncelenmemiş"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "dumpdir bozuk: 'T'deki isim boÅŸ"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr "dumpdir bozuk: umulan'%c' ama bulunan veri sonu"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "dumpdir bozuk: 'X' hiç kullanılmamış"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "%s şablonu kullanılarak geçici dizin oluşturulamıyor"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: dizin temizlenmiyor: durumlama yapılamadı"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: dizin farklı bir aygıtta: temizlenmiyor"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: %s siliniyor\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Kaldırılamaz"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Geçiliyor"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "blok %s: ** NUL bloku **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "%s de tek başına sıfır bloğu"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "blok %s: ** Dosya Sonu **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "blok %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Sayısal %s değeri beklenirken başlıkta boşluklar bulundu"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Arşiv sekizlik değeri %.*s aralığın %s dışında; ikinin tümleyeni kabul "
+"ediliyor"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Arşiv sekizlik değeri %.*s aralığın %s dışında"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Arşiv atıl base-64 başlıklar içeriyor"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Arşiv imzalı base-64 dizge %s, %s aralığının dışında"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Arşiv base-256 değeri %s aralığının dışında"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Arşiv %.*s içeriyor, halbuki orada sayısal %s değeri bekleniyor"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Arşiv değeri %s %s türünün %s..%s aralığının dışında"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " bağı -> %s \n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " bilinmeyen dosya türü %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Uzun BaÄŸ--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Uzun Ä°sim--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Bölüm Başlığı--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Devamı bayt %s de--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "OluÅŸturulan dizin:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "%s %s olarak deÄŸiÅŸtiriliyor\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Ä°smi %s olarak deÄŸiÅŸtirilemez"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Gerisin geriye %s %s olarak deÄŸiÅŸtiriliyor\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Çalışılan dizin kaydedilemez"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Çalışma dizini değiştirilemez"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "alt süreç"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "süreçlerarası kanal"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Kalıp eşleme karakterleri dosya isimlerinde kullanılmış. Lütfen,"
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr "ya kalıp eşlemeyi etkin kılmak için --wildcards kullanın,"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "ya da bu uyarıyı engellemek için --no-wildcards kullanın."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: ArÅŸivde yok"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Arşivde bulunması gerekirken yok"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "`-%s' ve `-%s' seçeneklerinin ikisi de standart girdi istiyor"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Geçersiz arşiv biçimi"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "GNU özellikleri ile uyumsuz arşiv biçimi"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Sarmalama şekli `%s' bilinmiyor. Listeyi almak için `%s --quoting-"
+"style=help' yazın."
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU `tar' çok sayıda dosyayı birarada tek bir disk arşivi olarak veya teybe\n"
+" kaydeder ve böyle bir arşivden dosyaları tek tek çıkarabilir\n"
+"\n"
+"Örnekler:\n"
+" tar -cf arşiv.tar foo bar # foo ve bar dosyalarından arşiv.tar "
+"oluÅŸturulur\n"
+" tar -tvf arşiv.tar # arşiv.tar içindeki dosyalar listelenir\n"
+" tar -xf arşiv.tar # arşiv.tar'dan tüm dosyalar çıkarılır\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"--suffix veya SIMPLE_BACKUP_SUFFIX ile belirtilmedikçe yedek soneki '~' "
+"dir.\n"
+"Sürüm denetimi aşağıdaki değerler --backup veya VERSION_CONTROL ile\n"
+"kullanılarak yapılabilir:\n"
+"\n"
+" none, off yedekleme yapılmaz\n"
+" t, numbered numaralı yedekleme yapılır\n"
+" nil, existing numaralıysa numaralı, değilse basit yedekleme yapılır\n"
+" never, simple daima basit yedekleme yapılır\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Ana iÅŸlem kipi:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "bir arşiv içeriğini listeler"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "bir arşivdeki dosyaları çıkarır"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "yeni bir arÅŸiv oluÅŸturur"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "arşiv ile dosya sistemi arasındaki farklar bulunur"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "dosyaları arşivin sonuna ekler"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "sadece arşivdeki kopyasından daha yeni dosyalar eklenir"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "bir arşive tar dosyaları ekler"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "arÅŸivden siler (teyplerde deÄŸil!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "arşiv bölüm etiketini sınar ve çıkar"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Ä°ÅŸlem deÄŸiÅŸtiriciler:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "seyrek dosyalar verimli ÅŸekilde elde edilir"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "ANA[.ALT]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr "kullanılacak seyrek biçim sürümü ayarlanır (--sparse uygular)"
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "GNU eski tarz arttırımlı yedekleme tanınır"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "DOSYA"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "GNU yeni tarz arttırımlı yedekleme tanınır"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "dosyalar okunamadığında sıfırdan farklı bir değerle çıkılmaz"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "SAYI"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"her dosyanın arşivdeki sadece SAYI'ıncı kopyası işlenir; bu seçenek sadece --"
+"delete, --diff, --extract veya --list alt komutlarından biri ile geçerlidir "
+"ve dosyaların listelenmesi sırasında ya komut satırından ya da -T seçeneği "
+"üzerinden belirtilir. SAYI öntanımlı olaral 1'dir."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "arşiv arama yapılabilen türde"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "Ãœsteyazma denetimi:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "yazdıktan sonra arşivi doğrulamaya çalışır"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "arÅŸive eklendikten sonra dosyalar silinir"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "çıkarılırken mevcut dosyalar değiştirilmez"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "arşivdeki kopyalaraından daha yeni dosyalar değiştirilmez"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "çıkarılırken mevcut dosyaların üzerine yazılır"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "çıkarılmadan önce mevcut dosya silinir"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "dizin çıkarılmadan önce alt dizinleri silinir"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "mevcut dizinlerin öznitelikleri korunur"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"çıkarılırken mevcut dizinlerin metaverisinin üzerine yazılır (öntanımlı)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Çıktı akımını seçiniz:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "dosyalar standart çıktıya çıkarılır"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "KOMUT"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "çıkarılan dosyaları başka bir uygulamaya borular"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "altsüreçlerin çıkış kodları yoksayılır"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "altsüreçlerin çıkış kodları sıfırdan farklıysa hata olarak ele alınır"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Dosya özniteliklerinin elde edilmesi:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "İSİM eklenen dosyaların sahibi yapılır"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "İSİM eklenen dosyaların grubu yapılır"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "DOSYA-TARÄ°HÄ°"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "DOSYA-TARİHİnde eklenen dosyalar için mtime ayarlanır"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "KÄ°P"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "KİP eklenen dosyaların (sembolik) kipi yapılır"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "YÖNTEM"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"dökümlenen dosyalarda erişim zamanları korunur; ya okuma sonrası eski "
+"değerine getirerek (YÖNTEM='replace' öntanımlıdır) ya da ilk yerindeki "
+"zamanı değiştirmeyerek (YÖNTEM='system')."
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "dosya değişiklik zamanı çıkarılmaz"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "sahibi aynı olan dosyalar çıkarılmaya çalışılır"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "dosyalar sizin sahipliğinizde çıkarılır"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "kullanıcı/grup isimleri yerine daima numaraları kullanılır"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+"dosya izinleri ile ilgili bilgileri çıkarır (root kullanıcısı için öntanımlı)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"arşivden çıkarılırken izinlere kullanıcıların umask'ı uygulanır (sıradan "
+"kullanıcılar için öntanımlı)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "isimler arşivdeki sırasına göre çıkarılır"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "-p ve -s birlikte verilmiÅŸ gibi olur"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"herşey çıkarılana kadar çıkarılan dizinlerin izinleri ve değişiklik "
+"zamanlarının değiştirilmesi geciktirilir"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "--delay-directory-restore seçeneğinin etkisi iptal edilir."
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Aygıt seçimi ve aygıt değiştirme:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ARŞİV"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "arşiv dosyası ya da ARŞİV aygıtı kullanılır"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "bir iki nokta üstüste içerse bile arşiv dosyası yereldir"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "rmt yerine rmt KOMUT kullanılır"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "rsh yerine uzak uçta KOMUT kullanılır"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "sürücü ve yoğunluk belirtilir"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "çok bölümlü arşivi oluşturur/listeler/çıkarır"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "SAYI x 1024 bayt yazıldıktan sonra band değiştirilir"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "her bandın sonunda betiği çalıştırır (-M uygular)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "DOSYAda bölüm numarası kullanılır/güncellenir"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Aygıtın blok düzeni:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "BLOK"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "kayıt başına BLOK x 512 bayt"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "512'nin katları olarak kayıt başına BOYUT bayt"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "arşivdeki sıfırlı bloklar yoksayılır (dosyasonu anlamında)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "okunmuş olarak yeniden bloklanır (4.2 BSD boruları için)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Arşiv biçimi seçimi:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "BİÇİM"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "belirtilen biçimin arşivi oluşturulur."
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "BİÇİM şunlardan biri olabilir:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "eski V7 tar biçimi"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "tar <= 1.12 için GNU biçimi"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "GNU tar 1.13.x biçimi"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "POSIX 1003.1-1988 (ustar) biçimi"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "POSIX 1003.1-2001 (pax) biçimi"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "pax ile aynı"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr " --format=v7 ile aynı"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "--format=posix ile aynı"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "isim[[:]=deÄŸer][,isim[[:]=deÄŸer]]..."
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "pax anahtar sözcüklerini denetler"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "METÄ°N"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"arşivi METİN bölüm ismiyle oluşturur; listeleme/çıkarma sırasında METİN, "
+"bölüm ismini genelleme kalıbı olarak kullanılır"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "arşivi bzip2 üzerinden geçirir"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "arşivi gzip üzerinden geçirir"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "arşivi compress üzerinden geçirir"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "UYG"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "arşivi UYG üzerinden geçirir (UYG -d kabul etmeli)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Yerel dosya seçimi:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+"belirtilen DOSYA arşive eklenir (isim bir tire ile başlıyorsa kullanışlıdır)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "DÄ°ZÄ°N"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "DİZİN dizinine geçilir"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "çıkarılacak ya da oluşturulacak isimler DOSYAdan alınır"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T boş karakter sonlandırmalı isimleri okur, -C iptal edilir"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr "-T ile okunan dosyaisimlerine tırnak ayıklama uygulanır"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "-T ile okunan dosyaisimlerine tırnak ayıklama uygulanmaz"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "ÅžABLON"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "belirtilen ŞABLONa uyan dosyalar dışlanır"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "DOSYAdaki şablonlara uyan isimler dışlanır"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "bir arabellekleme yaftası içeren dizinler dahil edilmez"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "DOSYA içeren dizinler hariç tutulur"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "DOSYA içeren dizinler hariç tutulur"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "DOSYA içeren dizinler hariç tutulur"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "DOSYA içeren dizinler hariç tutulur"
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr "DOSYA içeren dizinler hariç tutulur"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "dizinlerde özdevinimli olarak azalan sıralamadan kaçınılır"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "arşiv oluşturulurken yerel dosya sisteminde kalınır"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "dizinlerin alt dizinlerine inilir (öntanımlı)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "dosya isimlerinin başındaki `/'lar ayrılmaz"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+"sembolik bağlar izlenir; hedeflerindeki dosyalar arşivlenir ve dökümlenir"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "ÃœYE-Ä°SMÄ°"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "arşivin ÜYE-İSMİ üyesinden başlanır"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "sadece DOSYA-TARİHİnden daha yeni dosyalar saklanır"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "TARÄ°H"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "sadece veri değişecekse tarih ve saat karşılaştırılır"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "DENETÄ°M"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "kaldırılmadan önce DENETİM sürümü seçilerek yedeklenir"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "DÄ°ZGE"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"kaldırmadan önce uygun sonekle yedekleme yapılır (SIMPLE_BACKUP_SUFFIX ortam "
+"değişkeni ile belirlenmemişse sonek olarak '~' kullanılır"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "Dosya ismi dönüşümleri:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "çıkarılırken dosya isimlerinden baştaki SAYI bileşen ayrılır"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "Ä°FADE"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr "dosya isimleri dönüştürülürken sed değiştirme İFADEsi kullanılır"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+"Dosya ismi eşleştirme seçenekleri\n"
+"(içerme ve dışlama kalıplarının her ikisi de etkili):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "harf büyüklükleri önemsenmez"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "dosya isminin başlangıcına uyan kalıplar"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "bir /'dan sonra şablonla eşleşen kalıplar (dışlama için öntanımlı)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "harf büyüklüklerine duyarlı eşleşme (öntanımlı)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "genelleme kalıpları kullanılır (dışlama için öntanımlı)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "birebir dizge eÅŸleme"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "'/' ile eşleşmeyen genelleme kalıpları"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "'/' ile eşleşen genelleme kalıpları (dışlama için öntanımlı)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Bilgilendirme çıktısı:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "işlenen dosyalar ayrıntılı listelenir"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]SAYI"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "her SAYIncı kayıtta gelişim iletisi gösterilir (öntanımlı: 10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "tüm bağlar dökümlenmezse bir ileti basılır"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "SiNYAL"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"arşivi işledikten sonra bayt toplamını basar; bir - argümanla SiNYAL "
+"alındığında bayt toplamını basar; İzin verilen sinyaller: SIGHUP, SIGQUIT, "
+"SIGINT, SIGUSR1 ve SIGUSR2; SIG ile başlamayanları da kabul edilir"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "dosya değişiklik zamanları UTC'ye göre basılır"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "ayrıntılı çıktı DOSYAya gönderilir"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "her iletide arşiv içindeki blok sayısı gösterilir"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "her eylemden önce doğrulama istenir"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "tar öntanımlıları gösterilir"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"listeleme ya da çıkarma sırasında arama koşuluna uymayan dizinler listelenir"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "dönüşümden sonra dosya ve arşiv isimlerini gösterir"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "ÅžEKÄ°L"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr "sarmalama şeklinin ismi; geçerli ŞEKİL değerleri için aşağıya bakınız"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "DÄ°ZGEdeki sarmalama karakterlerine ek olarak"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "DİZGEdeki karakterler için sarmalamayı iptal eder"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Uyumluluk seçenekleri:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr "oluştururken --old-archive ile, çıkarırken --no-same-owner ile aynı"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Diğer seçenekler:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "bozuculuk olasılığı olan bazı seçeneklerin kullanımı iptal edilir"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "`-Acdtrux' seçenekleri birden fazla belirtilemez"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Sıkıştırma seçenekleri çelişiyor"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Bilinmeyen sinyal ismi: %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Tarih örnekleri dosyası bulunamadı"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Bilinmeyen tarih biçemi %2$s yerine %1$s kullanılıyor"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Seçenek %s: `%s' tarihi %s olarak ele alınıyor"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: dosya listesi zaten okundu"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: okunan dosya ismi boş karakter içeriyor"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "--quoting-style seçeneği için geçerli değerler:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"*Bu* tar için öntanımlılar:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Bloklama çarpanı geçersiz"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Uyarı: -I seçeneği desteklenmiyor; -j ya da -T mi yazacaktınız yoksa?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Kayıt ortamının uzunluğu geçersiz"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Birden fazla eÅŸik tarihi"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "Seyrek sürüm değeri geçersiz"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "--atime-preserve='system' seçeneği bu platformda desteklenmiyor"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "--checkpoint değeri bir tamsayı değil"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: geçersiz grup"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Seçenekte verilen kip geçersiz"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Sayı geçersiz"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Sahip geçersiz"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Kayıt uzunluğu geçersiz"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Kayıt uzunluğu %d nin katları olmalı"
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Elemen sayısı geçersiz"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "Sadece tek bir --to-command seçeneği kullanılabilir"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Hatalı yoğunluk argümanı: %s"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Bilinmeyen yoÄŸunluk: '%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "`-[0-7][lmh]' seçeneği *bu* tar ile desteklenmiyor"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[DOSYA]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Eski seçenek `%c' bir argümanla kullanılır."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence bir dosya listesi olmaksızın anlamlı değil"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence istenen işlem kipinde kullanılamaz"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Çok sayıda arşiv dosyası `-M' seçeneği gerektirir"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "--listed-incremental ile --newer birlikte kullanılamaz"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Bölüm etiketi çok uzun (sınır: %lu bayt)"
+msgstr[1] "%s: Bölüm etiketi çok uzun (sınır: %lu bayt)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Çok sayıda bölüm içeren arşivler doğrulanamaz"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Sıkıştırılmış arşivler doğrulanamaz"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Çok sayıda bölüm içeren sıkıştırılmış arşivler kullanılamıyor"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Sıkıştırılmış arşivler birleştirilemez"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option sadece POSIX arşivlerinde kullanılabilir"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Bir boş arşivin oluşturulması ister istemez reddediliyor"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "`-Aru' seçenekleri `-f -' ile uyumsuz"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "`-Acdtrux' seçeneklerinden biri belirtilmeli"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Hata çıkışı önceki hatalardan dolayı gecikti"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Dosya %s baytta kırpılmış"
+msgstr[1] "%s: Dosya %s baytta kırpılmış"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "%s anahtar sözcüğü ya bilinmiyor ya da henüz gerçeklenmemiş"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "%s şablonu kullanılamıyor"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "%s anahtar sözcüğü çakıştırılamaz"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Ek başlık bozuk: uzunluk eksik"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "Ek başlık uzunluğu izin verilen aralığın dışında"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Ek başlık uzunluğu %*s aralık dışında"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr "Ek başlık bozuk: uzunluktan sonra boşluk yok"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Ek başlık bozuk: eşit işareti eksik"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Ek başlık bozuk: satırsonu eksik"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "Bilinmeyen ek başlık anahtar sözcüğü `%s' yoksayılıyor"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr "Üretilen isim/değer çifti çok uzun (isim=%s, uzunluk=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Ek başlık %s=%s, %s..%s aralığının dışında"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Ek başlık bozuk: %s=%s geçersiz"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Ek başlık bozuk: %s=%s aşırıya kaçmış"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "Ek başlık bozuk: %s geçersiz: umulmadık %c ayracı"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Ek başlık bozuk: %s geçersiz: değerler tek sayıda"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile, GNU paxutils deneme araçları için veri dosyalarını işleme sokar.\n"
+"SEÇENEKLER:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Dosya oluşturma seçenekleri:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "BOYUT"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Dosya belirtilen BOYUTta oluÅŸturulur"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "Dosyalar standart çıktı yerine İSİM dosyasına yazılır"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Dosya isimleri DOSYAdan okunur"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr "-T boş karakter sonlandırmalı isimleri okur"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+"Dosyayı belirtilen ŞABLON ile doldurur. ŞABLON 'default' veya 'zeros' "
+"olabilir"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Seyrek dosyalar için blok boyu"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr "Seyrek dosya üretilir. Komut satırının kalanı dosya eşlemini verir."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr "KONUM"
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr "Veriyi yazmadan önce belirtilen konuma gider"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "Dosya istatistikleri seçenekleri:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+"Belirtilen her dosya için stat yapısının içeriğini basar. Öntanımlı BİÇİM: "
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "İcra eşzamanlama seçenekleri:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"Belirtilen KOMUT çalıştırılır. --checkpoint ile ve --cut, --append, --touch "
+"seçeneklerinden biri ile birlikte kullanışlıdır"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr "Sınama SAYIsı aşıldığında belirtilen eylem uygulanır (aşağıya bakınız)"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Sonraki --touch seçeneği için tarih ayarlanır"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "İcra edilen sınamalar ve KOMUTun çıkış durumu gösterilir"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Çalıştırma eylemlerini eşzamanlar. Bunlar --checkpoint seçeneği ile "
+"belirtilen sayı aşıldığında çalıştırılırlar."
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"DOSYA --length seçeneği ile belirtilen boyutta kırpılır (belirtilmemişse 0)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+"DOSYAya BOYUT bayt eklenir. BOYUT evvelce --length seçeneği ile belirtilir."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "DOSYAnın değişiklik ve erişim zamanları güncellenir"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "KOMUT çalıştırılır"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Geçersiz boyut: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Numara izin verilen aralığın dışında: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Negatif boyut: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "stat(%s) başarısız"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Sayı çözümlenirken `%s' civarında hata"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Bilinmeyen tarih biçimi"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ARGÃœMANLAR...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "`%s' açılamıyor"
+
+#: tests/genfile.c:426
+#, c-format
+msgid "cannot seek: %s"
+msgstr "gidilemiyor: %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "dosya ismi boş karakter içeriyor"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"seyrek dosyalar standart çıktıda üretilemez, --file seçeneğini kullanın"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "kalıp yanlış (`%s' yakınında)"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "Bilinmeyen alan `%s'"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "zaman `%s' olarak ayarlanamaz"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Komut başarıyla sonlandı\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Komut %d çıkış durumu ile başarısız oldu\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Komut %d sinyali ile sonlandırıldı\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Komut %d sinyali ile durduruldu\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Komut bellek dökümü verdi\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Komut sonlandı\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "--stat seçeneği dosya isimleri gerektirir"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "argüman sayısı çok fazla"
diff --git a/po/uk.gmo b/po/uk.gmo
new file mode 100644
index 0000000..5713f6f
--- /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..609cd95
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,2583 @@
+# Ukrainian messages for GNU tar
+# Copyright (C) 2006 Free Software Foundation, Inc.
+# Sergey Poznyakoff <gray@gnu.org>, 2005, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.15.92\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2007-06-08 11:53+0300\n"
+"Last-Translator: Sergey Poznyakoff <gray@gnu.org>\n"
+"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\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"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "неправильний аргумент %s Ð´Ð»Ñ %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "неоднозначний аргумент %s Ð´Ð»Ñ %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Дозволені аргументи такі:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr "ARGP_HELP_FMT: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s Ñ” менше ніж або дорівнює %s"
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: параметр ARGP_HELP_FMT вимагає значеннÑ"
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: параметр ARGP_HELP_FMT має бути додатнім"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Ðевідомий параметр ARGP_HELP_FMT"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Хибні дані в ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Ðргументи, обов'Ñзкові Ð´Ð»Ñ Ð´Ð¾Ð²Ð³Ð¸Ñ… ключів, Ñ” обов'Ñзковими й Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¸Ñ…."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "ВикориÑтаннÑ:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " чи: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [ОПЦІЯ...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr ""
+"Спробуйте `%s --help' або `%s --usage' Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð½Ñ–ÑˆÐ¾Ð³Ð¾ опиÑу.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Про помилки звітуйте на <%s>.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Ðевідома ÑиÑтемна помилка"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr "вивеÑти цю довідку"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr "вивеÑти коротке Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ викориÑтаннÑ"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "ÐÐЗВÐ"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr "вÑтановити назву програми"
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr "СЕКУÐДИ"
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr "зачекати вказану кількіÑÑ‚ÑŒ Ñекунд (типово 3600)"
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr "вивеÑти верÑÑ–ÑŽ програми"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(ПОМИЛКРПРОГРÐМУВÐÐÐЯ) Ðевідома верÑÑ–Ñ!?"
+
+#: lib/argp-parse.c:612
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Забагато аргументів\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(ПОМИЛКРПРОГРÐМУВÐÐÐЯ) ÐžÐ¿Ñ†Ñ–Ñ Ð¼Ð°Ð»Ð° бути розпізнана!?"
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ñ–Ñ `%s' неоднозначна\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ñ–Ñ `--%s' не може мати аргументу\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ñ–Ñ `%c%s' не може мати аргументу\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ñ–Ñ `%s' вимагає аргумент\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: невідома Ð¾Ð¿Ñ†Ñ–Ñ `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: невідома Ð¾Ð¿Ñ†Ñ–Ñ `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: недопуÑтима Ð¾Ð¿Ñ†Ñ–Ñ -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: невірна Ð¾Ð¿Ñ†Ñ–Ñ -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ñ–Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” аргумент -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ñ–Ñ `-W %s' неоднозначна\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: Ð¾Ð¿Ñ†Ñ–Ñ `-W %s' не може мати аргументу\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "розмір блока"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "пам'ÑÑ‚ÑŒ вичерпана"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Помилка у функції %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: ПопередженнÑ: Помилка у функції %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Ðе вдаєтьÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ права доÑтупу на %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Ðе вдаєтьÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ влаÑника на uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Ðе вдаєтьÑÑ Ñтворити жорÑтке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Помилка в позиції %s, під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %lu байту"
+msgstr[1] "%s: Помилка в позиції %s, під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %lu байтів"
+msgstr[2] "%s: Помилка в позиції %s, під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %lu байтів"
+
+#: lib/paxerror.c:192
+#, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: ПопередженнÑ: Помилка в позиції %s, під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %lu байту"
+msgstr[1] "%s: ПопередженнÑ: Помилка в позиції %s, під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %lu байтів"
+msgstr[2] "%s: ПопередженнÑ: Помилка в позиції %s, під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %lu байтів"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Ðе вдаєтьÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ lseek до %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: ПопередженнÑ: Ðе вдаєтьÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ lseek до %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Ðе вдаєтьÑÑ Ñтворити Ñимволічне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: ВдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати тільки %lu з %lu байта"
+msgstr[1] "%s: ВдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати тільки %lu з %lu байтів"
+msgstr[2] "%s: ВдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати тільки %lu з %lu байтів"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ префікÑу `%s' з назв файлів"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ префікÑу `%s' з назви цілі жорÑткого поÑиланнÑ"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "ПідÑтановка `.' заміÑÑ‚ÑŒ пуÑтої назви файлу"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr "^[yYтТ]"
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr "^[nNнÐ]"
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: ÑÐµÑ€Ð²Ñ–Ñ Ð²Ñ–Ð´Ñутній"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити віддалену оболонку"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr "За довгий вхідний Ñ€Ñдок"
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr "Помилка ÑинтакÑиÑу чиÑла"
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Ðе вдаєтьÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð°\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Ðе вдаєтьÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð°"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Спробуйте `%s --help' Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð½Ñ–ÑˆÐ¾Ð³Ð¾ опиÑу.\n"
+
+#: rmt/rmt.c:308
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"ВикориÑтаннÑ: %s [ОПЦІЯ]\n"
+"Керує Ñтрічковим приÑтроєм, отримуючи команди від віддаленого процеÑу.\n"
+"\n"
+" --version ВивеÑти верÑÑ–ÑŽ програми та вийти.\n"
+" --help ВивеÑти цю довідку\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Про помилки звітуйте на <%s>.\n"
+
+#: rmt/rmt.c:397
+msgid "Seek offset error"
+msgstr "Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð° межами діапазону"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð° межами діапазону"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "ÐапрÑмок Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð° межами діапазону"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: передчаÑне Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "ПередчаÑне Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Хибна команда"
+
+#: src/buffer.c:326 src/buffer.c:335
+msgid "Total bytes written"
+msgstr "ЗапиÑано загалом"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr "Прочитано байтів загалом"
+
+#: src/buffer.c:337
+#, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Видалено загалом: %s\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(канал)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "ÐедійÑне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ record_size"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Ðе вказано назви архіву"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Ðеможливо перевірÑти архів, запиÑаний до stdout"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Ðрхів ÑтиÑнений. ВикориÑтовуйте опцію %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Ðе можна оновлювати ÑтиÑнені архіви"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, c-format
+msgid "Write checkpoint %u"
+msgstr "Контрольна відмітка запиÑу %u"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, c-format
+msgid "Read checkpoint %u"
+msgstr "Контрольна відмітка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %u"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Ðа початку Ñтрічки, закінчуємо"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Ðадто багато помилок, Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Ðевірне Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ (%lu байт) в архіві"
+msgstr[1] "Ðевірне Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ (%lu байти) в архіві"
+msgstr[2] "Ðевірне Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ (%lu байтів) в архіві"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Розмір запиÑу = %lu блок"
+msgstr[1] "Розмір запиÑу = %lu блоки"
+msgstr[2] "Розмір запиÑу = %lu блоків"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr ""
+"Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¼Ñ–ÑтитиÑÑŒ назад у архіві; можливо архів не можна прочитати "
+"без опції -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek не зупинивÑÑ Ð½Ð° межі запиÑу"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: міÑтить невірний номер тому"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "ÐŸÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð½Ð¾Ð¼ÐµÑ€Ð° тому"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Підготуйте том #%d архіву %s Ñ— натиÑнить return: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Кінець файлу, заміÑÑ‚ÑŒ очікуваної відповіді"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "ПОПЕРЕДЖЕÐÐЯ: Ðезавершений архів"
+
+#: src/buffer.c:954
+#, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n назва Вказати назву файла Ð´Ð»Ñ Ð½Ð°Ñтупного Ñ– подальших томів\n"
+" q Перервати роботу\n"
+" у або новий Ñ€Ñдок Продовжувати\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr " ! Викликати оболонку\n"
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr " ? ВивеÑти цю довідку\n"
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Ðовий том відÑутній. ЗавершеннÑ.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr "Ðе вказано назви файлу. Спробуйте ще раз.\n"
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr "ÐедійÑні вхідні дані. Ðаберіть ? щоб отримати підказку.\n"
+
+#: src/buffer.c:1064
+#, c-format
+msgid "%s command failed"
+msgstr "збій Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ `%s'"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Це не Ñхоже на архів tar"
+
+#: src/buffer.c:1219
+#, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr ""
+"%s можливо продовжуєтьÑÑ Ñƒ цьому томі: заголовок міÑтить обрізану назву"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s не продовжуєтьÑÑ Ñƒ цьому томі"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s є неправильним розміром (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Цей том Ñ” за межами поÑлідовноÑÑ‚Ñ–"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Ðазви тому відÑÑƒÑ‚Ð½Ñ Ð² архіві. Ðе можна порівнÑти з %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Етикетка тому %s не Ñпівпадає з %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+"%s: назва файлу надто довга щоб зберегти її у заголовку тому GNU; назву "
+"обрізано"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "ВдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ тільки %lu з %lu байта"
+msgstr[1] "ВдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ тільки %lu з %lu байтів"
+msgstr[2] "ВдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ тільки %lu з %lu байтів"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñƒ зміÑÑ‚Ñ–"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Ðеочікуваний кінець файла в архіві"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñƒ типі файлу"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñƒ правах доÑтупу"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñƒ значенні UID"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñƒ значенні GID"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñƒ чаÑÑ– модифікації"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñƒ розмірі"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Ðе Ñ” поÑиланнÑм до %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñƒ Ñимволічному поÑиланні"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñƒ номері приÑтрою"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Перевірка "
+
+#: src/compare.c:469
+#, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: Ðевідомий тип файлу `%c', перевірюєтьÑÑ Ñк звичайний файл"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Ðрхів міÑтить назви файлів без попереджуючих префікÑів."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Перевірка може не знайти первинних файлів."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "ПОМИЛКРПЕРЕВІРКИ: знайдено %d невірний заголовок"
+msgstr[1] "ПОМИЛКРПЕРЕВІРКИ: знайдено %d невірних заголовки"
+msgstr[2] "ПОМИЛКРПЕРЕВІРКИ: знайдено %d невірних заголовків"
+
+# Ðе подобаєтьÑÑ Ð¼ÐµÐ½Ñ– це "кешуваннÑ"...
+#: src/create.c:67
+#, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: міÑтить мітку каталогу ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ `%s'; %s"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s поза межами діапазону типа %s %s..%s; заміна на %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s за межами діапазону типа %s %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ñ–Ð´'ємних віÑімкових заголовків"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: назва файлу занадто довга (макÑ. %d); не архівуєтьÑÑ"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: назва файлу занадто довга (не вдаєтьÑÑ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ð¸Ñ‚Ð¸); не архівуєтьÑÑ"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: назва поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ довга; не архівуєтьÑÑ"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Файл ÑкоротивÑÑ Ð½Ð° %s байт; Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð½ÑƒÐ»Ñми"
+msgstr[1] "%s: Файл ÑкоротивÑÑ Ð½Ð° %s байти; Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð½ÑƒÐ»Ñми"
+msgstr[2] "%s: Файл ÑкоротивÑÑ Ð½Ð° %s байтів; Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð½ÑƒÐ»Ñми"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: файл знаходитьÑÑ Ð² іншої файлової ÑиÑтемі; не архівуєтьÑÑ"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr "вміÑÑ‚ не архівуєтьÑÑ"
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Ðевідомий тип файла; Файл проігноровано"
+
+#: src/create.c:1458
+#, c-format
+msgid "Missing links to %s.\n"
+msgstr "ВідÑутні деÑкі поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð¾ `%s'.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: файл не змінено; не архівуєтьÑÑ"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: файл Ñ” архівом; не архівуєтьÑÑ"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Файл було видалено перед тим Ñк tar вÑтиг його прочитати"
+
+#: src/create.c:1585
+msgid "directory not dumped"
+msgstr "каталог не архівуєтьÑÑ"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: файл змінивÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: гніздо ігноруєтьÑÑ"
+
+# FIXME: door?
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: двері ігноруютьÑÑ"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Перехід до наÑтупного заголовка"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½Ðµ-заголовка з архіву"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: неймовірно Ñтара дата %s"
+
+#: src/extract.c:215
+#, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: мітка чаÑу %s зÑунута на %s Ñек. до майбутнього"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Ðеочікувана ÑуперечніÑÑ‚ÑŒ під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Каталог перейменовано перед тим, Ñк tar вÑтиг витÑгнути його Ñтан"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "ВитÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÑ€ÐµÑ€Ð²Ð½Ð¸Ñ… файлів у звичайні"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Спроба перетворити Ñимволічні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° жорÑткі"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Ðе вдаєтьÑÑ Ð²Ð¸Ñ‚Ñгнути -- файл починаєтьÑÑ Ð² іншому томі"
+
+#: src/extract.c:1153 src/list.c:1081
+msgid "Unexpected long name header"
+msgstr "Ðеочікуваний кінець файла у заголовку довгої назви"
+
+#: src/extract.c:1159
+#, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Ðевідомий тип файлу `%c', Ñпроба витÑгнути його Ñк звичайний файл"
+
+# FIXME: або ÑучаÑний?
+#: src/extract.c:1184
+#, c-format
+msgid "Current %s is newer or same age"
+msgstr "ІÑнуючий файл `%s' Ñ” новіший"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Ðе вдалоÑÑ Ñтворити резервну копію цього файла"
+
+#: src/extract.c:1358
+#, c-format
+msgid "Cannot rename %s to %s"
+msgstr "Ðе вдаєтьÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ %s на %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Ðевиправна помилка: Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Каталог перейменовано з %s"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Каталог перейменовано"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Ðовий каталог"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Ðевірний Ñ‡Ð°Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
+
+#: src/incremen.c:755
+msgid "Invalid modification time (seconds)"
+msgstr "Ðевірна дата модифікації (Ñекунди)"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr "ÐедійÑний Ñ‡Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— (наноÑекунди)"
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Ðевірний номер приÑтрою"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Ðевірний номер Ñ–-вузла"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr "З файла-знімка прочитано надто довге поле"
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr "Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°-знімка"
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+msgid "Unexpected EOF in snapshot file"
+msgstr "Ðеочікуваний кінець файла-знімка"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr "Ðеочікуваний кінець файла-знімка"
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr "Бракує ознаки ÐºÑ–Ð½Ñ†Ñ Ð·Ð°Ð¿Ð¸Ñу"
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr "Ðеправильний формат файла знімку"
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr "Такий інкрементний формат не підтримуєтьÑÑ: %<PRIuMAX>"
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+"Ðеправильно Ñформований dumpdir: очікувалоÑÑ '%c' натоміÑÑ‚ÑŒ знайдено %#3o"
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr "Ðеправильно Ñформований dumpdir: 'X' вказаний двічі"
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Ðевірний формат dumpdir: пуÑта назва у `R'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr "Ðевірний формат dumpdir: `T' без попереднього `R'"
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Ðевірний формат dumpdir: пуÑта назва у `T'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+"Ðевірний формат dumpdir: очікувалоÑÑ `%c', натоміÑÑ‚ÑŒ знайдено кінець файла"
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr "Ðевірний формат dumpdir: `X' не викориÑтаний"
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "Ðе вдаєтьÑÑ Ñтворити тимчаÑовий каталог викориÑтовуючи шаблон %s"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Каталог не очищуєтьÑÑ: не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ stat"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: Каталог знаходитьÑÑ Ð½Ð° іншому приÑтрої: не очищуєтьÑÑ"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Ð¡Ñ‚Ð¸Ñ€Ð°Ð½Ð½Ñ %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Ðе вдаєтьÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: ПропуÑкаєтьÑÑ"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "блок %s: ** МіÑтить нулі **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Самотній блок нулів, зÑув %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "блок %s: ** Кінець файлу **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "блок %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Пробіли у заголовку заміÑÑ‚ÑŒ очікуваного чиÑлового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Ð’Ñ–Ñімкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %.*s знаходитьÑÑ Ð¿Ð¾Ð·Ð° межами діапазону типу %s; "
+"вважаєтьÑÑ, що це Ñ” двійкове доповненнÑ"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Ð’Ñ–Ñімкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %.*s знаходитьÑÑ Ð¿Ð¾Ð·Ð° межами діапазону типу %s"
+
+# FIXME: base=64?
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Ðрхів міÑтить заÑтарілі заголовки з оÑновою 64"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr ""
+"Ðрхів міÑтить знакову Ñтроку з оÑновою 64 %s, що Ñ” поза допуÑтимими межами "
+"типу %s"
+
+# FIXME: base-256
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· оÑновою 256 поза допуÑтимими межами типу %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Знайдено %.*s заміÑÑ‚ÑŒ чиÑлового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s поза допуÑтимими межами типу %s %s..%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr "поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð¾ %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr "невідомий тип файла %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Довге поÑиланнÑ--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Довга назва--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Заголовок тому--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--ПродовжуєтьÑÑ Ð· байту %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Перейменовано %s у %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Ðе вдаєтьÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ на %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Перейменовано %s назад у %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Ðе вдаєтьÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ поточний каталог"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Ðе вдаєтьÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ поточний каталог"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "процеÑ-нащадок"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "канал між процеÑами"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr "Ðазви файлів міÑÑ‚ÑÑ‚ÑŒ Ñимволи-шаблони. Будь лаÑка, кориÑтайтеÑÑ"
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+"опцією --wildcards аби увімкнути шаблони, або опцією --no-wildcards, щоб"
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr "уÑунути це повідомленнÑ."
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Ðе знайдено в архіві"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Потрібну копію у архіві не знайдено"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Обидві опції -%s Ñ– -%s вимагають доÑтупу до Ñтандартного входу"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Ðевірний формат архіву"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Формат архіву Ñ” неÑуміÑним з розширеними влаÑтивоÑÑ‚Ñми GNU"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+"Ðевідомий Ñтиль Ñ†Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ `%s'. Ðаберіть `%s --quoting-style=help' аби "
+"отримати перелік Ñтилів."
+
+#: src/tar.c:329
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"GNU `tar' запиÑує будь-Ñку кількіÑÑ‚ÑŒ файлів в архів на Ñтрічці або диÑку а "
+"також може витÑгувати окремі файли з архіву.\n"
+"\n"
+"Приклади:\n"
+" tar -cf archive.tar foo bar # Створює archive.tar з файлів foo та bar.\n"
+" tar -tvf archive.tar # Виводить докладну інформацію про зміÑÑ‚\n"
+" # archive.tar\n"
+" tar -xf archive.tar # ВитÑгує уÑÑ– файли з archive.tar.\n"
+
+#: src/tar.c:338
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"Типовим ÑуфікÑом резервних копій Ñ” `~', його можна змінити за допомогою\n"
+"опції --suffix або змінної Ñередовища SIMPLE_BACKUP_SUFFIX.\n"
+" \n"
+"Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ñ… копій вмикаєтьÑÑ Ñ‡ÐµÑ€ÐµÐ· опцію --backup або змінну "
+"Ñередовища VERSION_CONTROL. Можливі значеннÑ:\n"
+"\n"
+" t, numbered Ñтворювати резервні копії з номерами\n"
+" nil, existing Ñтворювати нумеровані копії, Ñкщо такі вже Ñ–Ñнують,\n"
+" інакше - проÑÑ‚Ñ–\n"
+" never, simple завжди Ñтворювати проÑÑ‚Ñ– резервні копії\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Режими роботи:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "вивеÑти вміÑÑ‚ архіву"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "витÑгнути файли з архіву"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "Ñтворити новий архів"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "порівнÑти файли в архіві з файлами у файлової ÑиÑтемі"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "долучити файли до Ñ–Ñнуючого архіву"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "долучати тільки такі файли, що є новішими за їх копії в архіві"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "долучити архів до архіву"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "видалити файли з архіву (не на Ñтрічці!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr "перевірити мітку тому та вийти"
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Модифікатори режиму роботи:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "заощаджувати проÑÑ‚Ñ–Ñ€ під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÑÑ–Ñних файлів"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr "ГОЛОВÐИЙ[.ДРУГОРЯДÐИЙ]"
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr "вÑтановлює верÑÑ–ÑŽ формату розÑÑ–Ñних файлів (вмикає --sparse)"
+
+# FIXME: incremental
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "обробка Ñтарого формату інкрементного архіву GNU"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "ФÐЙЛ"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "обробка нового формату інкрементного архіву GNU"
+
+# FIXME: хммм...
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "ігнорувати помилки Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "ЧИСЛО"
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"оброблÑти тільки вказане Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ файла в архіві. Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ñ” "
+"дійÑною тільки разом з однією з опцій --delete, --diff, --extract, --list Ñ– "
+"з переліком файлів (у командному Ñ€Ñдку або за допомогою опції -T). Типове "
+"ЧИСЛО: 1."
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr "архів підтримує операцію seek"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñом:"
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "перевірити архів піÑÐ»Ñ Ð·Ð°Ð¿Ð¸Ñу в нього"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "видалÑти файли піÑÐ»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð¾ архіву"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "не замінÑти Ñ–Ñнуючи файли під Ñ‡Ð°Ñ Ð²Ð¸Ñ‚ÑгуваннÑ"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "не замінÑти Ñ–Ñнуючи файли що Ñ” новішими за Ñ—Ñ… копії у архіві"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "перезапиÑувати Ñ–Ñнуючі файли під Ñ‡Ð°Ñ Ð²Ð¸Ñ‚ÑгуваннÑ"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "видалÑти кожний файл перед витÑгуваннÑм його копії"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "ÑпорожнÑти Ñтарий каталог перед витÑгуваннÑм його копії з архіву"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "зберігати мета-дані Ñ–Ñнуючих каталогів"
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+"перезапиÑувати метадані Ñ–Ñнуючих каталогів під Ñ‡Ð°Ñ Ð²Ð¸Ñ‚ÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ (типово)"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr "Вибір вихідного потоку:"
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "витÑгувати файли у Ñтандартний вивід"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "КОМÐÐДÐ"
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr "передавати витÑгнуті файли до Ñтандартного вводу іншої програми"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr "ігнорувати коди Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑів-нащадків"
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr "вважати ненульовий код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð½Ð°Ñ‰Ð°Ð´ÐºÐ° помилкою"
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Обробка атрибутів файлу:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ кориÑтувача влаÑником доданих файлів"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ з вказаною назвою групою влаÑника доданих файлів"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "ДÐТÐ-ÐБО-ФÐЙЛ"
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу оÑтанньої зміни доданих файлів"
+
+# Ðу, Ñ– чому це CHANGES??
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "ПРÐÐ’Ð"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ñ… Ñимволічно прав доÑтупу Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð½Ð¸Ñ… файлів"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr "МЕТОД"
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+"відтворювати Ñ‡Ð°Ñ Ð´Ð¾Ñтупу до доданих файлів через Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‡Ð°Ñу піÑÐ»Ñ "
+"Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ (типово, МЕТОД='replace'), або через Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½ÑŽ чаÑу "
+"(МЕТОД='system')"
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "не витÑгувати Ñ‡Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— файлів"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "витÑгувати назву влаÑника файлів"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "Ñтати влаÑником витÑгнутих файлів"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "завжди викориÑтовувати чиÑла заміÑÑ‚ÑŒ назв влаÑника/групи"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+"вÑтановлювати права доÑтупу згідно з даними архіву (типово Ð´Ð»Ñ Ñупер-"
+"кориÑтувача)"
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+"вÑтановлювати права доÑтупу згідно зі значеннÑм umask (типово Ð´Ð»Ñ Ð·Ð²Ð¸Ñ‡Ð°Ð¹Ð½Ð¾Ð³Ð¾ "
+"кориÑтувача)"
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "витÑгувати файли у порÑдку Ñ—Ñ… з'ÑÐ²Ð»ÐµÐ½Ð½Ñ Ð² архіві"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "те ж, що -p -s разом"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+"затримати вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу модифікації та прав доÑтупу до каталогів до "
+"ÐºÑ–Ð½Ñ†Ñ Ð²Ð¸Ñ‚ÑгуваннÑ"
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr "відмінити дії опції --delay-directory-restore"
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Вибір та зміна приÑтрою:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "ÐРХІВ"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "викориÑтовувати вказаний файл або приÑтрій"
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr "файл архіву Ñ” локальним, навіть Ñкщо його назва міÑтить двокрапку"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "викориÑтовувати вказану команду заміÑÑ‚ÑŒ rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "викориÑтовувати вказану команду заміÑÑ‚ÑŒ rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "визначає приÑтрой та гуÑтину"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "Ñтворити, виводити зміÑÑ‚ або витÑгувати файли з багатотомного архіву"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "змінити Ñтрічку піÑÐ»Ñ Ð·Ð°Ð¿Ð¸Ñу ЧИСЛРx 1024 байтів"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "запуÑкати Ñценарій наприкінці кожної Ñтрічки (вмикає -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "викориÑтовувати/обновлÑти номер тому у ФÐЙЛІ"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñтрою:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "ЧИСЛО-БЛОКІВ"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "розмір запиÑу ЧИСЛО-БЛОКІВ x 512 байтів"
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "вÑтановити розмір запиÑу у блоках по 512 байтів"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "ігнорувати нульові блоки в архіві (звичайно вказують кінець файлу)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "розбивати на блоки під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ (Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð² 4.2BSD)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Вибір формату архіву:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "ФОРМÐТ"
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr "Ñтворити архів у вказаному форматі"
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "ФОРМÐТ будь-Ñкий з наÑтупних:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "Ñтарий формат V7"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "формат GNU, ÑуміÑний з верÑією tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "формат GNU, ÑуміÑний з верÑією tar 1.13.x"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "формат POSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "формат POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr "те ж, що і pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "те ж, що і --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "те ж, що і --format=posix"
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "ключове_Ñлово[[:]=значеннÑ][,ключове_Ñлово[[:]=значеннÑ], ...]\""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¸Ð¼Ð¸ Ñловами pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "ТЕКСТ"
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"Ñтворити архів з назвою тому \"ТЕКСТ\". Під Ñ‡Ð°Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ зміÑту або "
+"витÑгуваннÑ, викориÑтовувати ТЕКСТ Ñк шаблон пошуку тому"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "викориÑтовувати bzip2 Ð´Ð»Ñ ÑтиÑненнÑ/розтиÑÐºÐ°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "викориÑтовувати gzip Ð´Ð»Ñ ÑтиÑненнÑ/розтиÑÐºÐ°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "викориÑтовувати compress Ð´Ð»Ñ ÑтиÑненнÑ/розтиÑÐºÐ°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "ПРОГРÐÐœÐ"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "викориÑтовувати ПРОГРÐМУ Ð´Ð»Ñ ÑтиÑненнÑ/розтиÑÐºÐ°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Вибір файлів:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr "долучити ФÐЙЛ до архіву (кориÑне, Ñкщо його назва починаєтьÑÑ Ð· -)"
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "КÐТÐЛОГ"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "перейти до вказаного каталогу"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr "читати назви файлів Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð½Ð½Ñ/витÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ Ð· вказаного файла"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+"файл, вказаний з опцією -T, міÑтить назви, відокремлені нульовими Ñимволами. "
+"Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð²Ð¸Ð¼Ð¸ÐºÐ°Ñ” -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr "уÑувати Ñ†Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð· назв файлів прочитаних за допомогою -T (типово)"
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr "не уÑувати Ñ†Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð· назв файлів прочитаних за допомогою -T"
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "ШÐБЛОÐ"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "не оброблÑти файли, назви Ñких відповідають вказаному шаблону"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "виключити назви що відповідають шаблонам, вказаним у файлі"
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+"не архівувати файли в каталогах, що міÑÑ‚ÑÑ‚ÑŒ CACHEDIR.TAG, з винÑтком Ñамого "
+"файлу"
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "не архівувати жодні файли в каталогах, що міÑÑ‚ÑÑ‚ÑŒ CACHEDIR.TAG"
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "не архівувати каталоги, що міÑÑ‚ÑÑ‚ÑŒ CACHEDIR.TAG"
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+"не архівувати файли в каталогах, що міÑÑ‚ÑÑ‚ÑŒ ФÐЙЛ, з винÑтком Ñамого файлу"
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr "не архівувати жодні файли в каталогах, що міÑÑ‚ÑÑ‚ÑŒ ФÐЙЛ"
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr "не архівувати каталоги, що міÑÑ‚ÑÑ‚ÑŒ ФÐЙЛ"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "не заходити автоматично у каталоги"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "залишатиÑÑ Ñƒ локальної файлової ÑиÑтемі під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "рекурÑивно проходити каталоги (типово)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "не видалÑти початкову коÑу риÑку `/' з назв файлів"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr "Йти за Ñимвольними поÑиланнÑми: долучати файли, на Ñки вони вказують"
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "ÐÐЗВÐ-ФÐЙЛУ"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "починати обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ з вказаного файлу"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "долучати тільки такі файли, що є новіші за вказану дату або файл"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "ДÐТÐ"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "порівнювати тільки дату Ñ– Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ даних"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "РЕЖИМ"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "перед видаленнÑм Ñтворювати резервні файли у вказаному режимі"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "РЯДОК"
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"перед видаленнÑм Ñтворювати резервні файли з указаним ÑуфікÑом (типово '~', "
+"Ñкщо не перевизначено змінною Ñередовища SIMPLE_BACKUP_SUFFIX)"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr "ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð·Ð² файлів:"
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "видалÑти вказане ЧИСЛО компонентів з початку назв файлів"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr "ВИРÐЗ"
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr "перетворювати назви файлів за допомогою вказаного виразу заміни"
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+"ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñм назв (впливає на взірці Ñк вилученнÑ, так Ñ– "
+"долученнÑ):"
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr "шаблони ігнорують відмінноÑÑ‚Ñ– у регіÑтрі Ñимволів"
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr "порівнювати шаблони з назвами файлів починаючи від початку назви"
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+"порівнювати шаблони з назвами файлів починаючи від будь-Ñкого / (типово)"
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr "шаблони враховують регіÑÑ‚Ñ€ (типово)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr "кориÑтатиÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°Ð¼Ð¸ (типово Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ)"
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr "порівнювати назви буквально"
+
+#: src/tar.c:675
+msgid "wildcards do not match `/'"
+msgstr "шаблони не ÑтоÑуютьÑÑ Ð´Ð¾ '/'"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "шаблони ÑтоÑуютьÑÑ Ð´Ð¾ '/' (типово)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Інформативний вивід:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "виводити докладну інформацію про оброблені файли"
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr "[.]ЧИСЛО"
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "виводити контрольне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¶Ð½Ðµ ЧИСЛО запиÑів (типово 10)"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "виводити Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñкщо до архіву було додано не вÑÑ– поÑиланнÑ"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr "СИГÐÐЛ"
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+"друкувати ÑтатиÑтику піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸; Ñкщо вказаний аргумент СИГÐÐЛ "
+"- друкувати ÑтатиÑтику по отриманню цього Ñигналу; дозволеними Ñигналами Ñ” "
+"SIGHUP, SIGQUIT, SIGINT, SIGUSR1 Ñ– SIGUSR2, а також ці назви без префікÑа SIG"
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "друкувати Ñ‡Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— файлів у UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "виводити детальну інформацію у ФÐЙЛ"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "попереджувати кожне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð¾Ð¼ÐµÑ€Ð¾Ð¼ блоку в архіві"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "Запитувати Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— дії"
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr "вивеÑти типові налаштуваннÑ"
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"під Ñ‡Ð°Ñ Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ñту або витÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² друкувати назви каталогів що "
+"не відповідають критеріÑм пошуку"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr "показувати перетворені назви файлів"
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr "СТИЛЬ"
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr "вÑтановити Ñтиль цитуваннÑ; дозволені Ñтилі див. нижче"
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr "цитувати також вказані Ñимволи"
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr "вимкнути Ñ†Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ñ… Ñимволів"
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Опції ÑуміÑноÑÑ‚Ñ–:"
+
+#: src/tar.c:726
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ, те ж Ñаме, що Ñ– --old-archive. Під Ñ‡Ð°Ñ "
+"витÑгуваннÑ, те ж Ñаме, що --no-same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Інші опції:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr "заборонити кориÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´ÐµÑкими потенційно небезпечними опціÑми"
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Ðе можна вказувати більш ніж одну з опцій `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Опції ÑтиÑÐ½ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚ÑƒÑŽÑ‚ÑŒ одна з другою"
+
+#: src/tar.c:904
+#, c-format
+msgid "Unknown signal name: %s"
+msgstr "Ðевідомий тип файла %s"
+
+#: src/tar.c:928
+msgid "Date sample file not found"
+msgstr "Ðе знайдено файл-зразок дати"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "ВикориÑтовуєтьÑÑ %s заміÑÑ‚ÑŒ невідомого формату дати %s"
+
+#: src/tar.c:961
+#, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "ÐžÐ¿Ñ†Ñ–Ñ %s: Дату `%s' ÑприйнÑто Ñк %s"
+
+#: src/tar.c:1035
+#, c-format
+msgid "%s: file list already read"
+msgstr "%s: перелік файлів уже прочитано"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr "%s: прочитана назва файла міÑтить нульовий Ñимвол"
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr "ДопуÑтимими аргументами опції --quoting-style Ñ”:"
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"Типові Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ *цієї* копії програми:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Ðеправильний фактор блокуваннÑ"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr ""
+"ПопередженнÑ: Ð¾Ð¿Ñ†Ñ–Ñ -I не підтримуєтьÑÑ. Можливо ви маєте на увазі -j або -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Ðеправильна довжина Ñтрічки"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Більш ніж одна гранична дата"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr "ÐедійÑна верÑÑ–Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ розÑÑ–Ñних файлів"
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr "Ð¾Ð¿Ñ†Ñ–Ñ --atime-preserve='system' не підтримуєтьÑÑ Ð½Ð° цій платформі"
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr "аргумент --checkpoint муÑить бути цілим чиÑлом"
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Ðевірна група"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "Ðевірний формат прав доÑтупу"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Ðевірне чиÑло"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Ðевірний влаÑник"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Ðевірний розмір запиÑу"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Розмір запиÑу має ділитиÑÑ Ð½Ð° %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Ðевірна кількіÑÑ‚ÑŒ елементів"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr "ДозволÑєтьÑÑ Ð»Ð¸ÑˆÐµ одна Ð¾Ð¿Ñ†Ñ–Ñ --to-command"
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr "Ðевірний аргумент Ð²ÐºÐ°Ð·Ð°Ð½Ð½Ñ Ð³ÑƒÑтини: `%s'"
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr "Ðевідома гуÑтина: `%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "Опції `-[0-7][lmh]' не підтримуютьÑÑ *цією* верÑією tar"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[ФÐЙЛ]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Стара Ð¾Ð¿Ñ†Ñ–Ñ `%c' потребує аргументу"
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "Ð²ÐºÐ°Ð·Ð°Ð½Ð½Ñ --occurrence не має ÑенÑу без Ð²ÐºÐ°Ð·Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑƒ файлів"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr ""
+"опцію --occurrence не можна викориÑтовувати у зазначеному режимі роботи"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Ð’ÐºÐ°Ð·Ð°Ð½Ð½Ñ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ¾Ñ… файлів потребує Ð²ÐºÐ°Ð·Ð°Ð½Ð½Ñ Ð¾Ð¿Ñ†Ñ–Ñ— `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Ðе можна викориÑтовувати --listed-incremental разом з --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Мітка тому Ñ” надто довга (Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² %lu байт)"
+msgstr[1] "%s: Мітка тому Ñ” надто довга (Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² %lu байти)"
+msgstr[2] "%s: Мітка тому Ñ” надто довга (Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² %lu байтів)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Ðе можна перевірÑти багатотомні архіви"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Ðе можна перевірÑти ÑтиÑнені архіви"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Ðе можна викориÑтовувати ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ñ‚Ð¾Ð¼Ð½Ð¸Ñ… архівів"
+
+#: src/tar.c:2189
+msgid "Cannot concatenate compressed archives"
+msgstr "Ðе можна з'єднувати ÑтиÑнені архіви"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "ÐžÐ¿Ñ†Ñ–Ñ --pax-option викориÑтовуєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ з архівами у форматі POSIX"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Полохливо відмовлÑÑŽÑÑ Ñтворювати пуÑтий архів"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Опції `-Aru' не ÑуміÑні з `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Ðеобхідно вказати одну з опцій `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Вихід з помилкою є викликаний попередніми помилками"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Файл ÑкоротивÑÑ Ð½Ð° %s байт"
+msgstr[1] "%s: Файл ÑкоротивÑÑ Ð½Ð° %s байти"
+msgstr[2] "%s: Файл ÑкоротивÑÑ Ð½Ð° %s байтів"
+
+#: src/xheader.c:158
+#, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Ключове Ñлово %s не Ñ” відоме або ще не реалізоване"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Шаблон %s заборонÑєтьÑÑ ÑƒÐ¶Ð¸Ð²Ð°Ñ‚Ð¸"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Ðе можна перевизначити ключове Ñлово %s"
+
+#: src/xheader.c:498
+msgid "Malformed extended header: missing length"
+msgstr "Ðевірно Ñформований розширений заголовок: бракує довжини"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr "Довжина розширеного заголовку є за межами діапазону"
+
+#: src/xheader.c:513
+#, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Довжина розширеного заголовку %*s є за межами діапазону"
+
+#: src/xheader.c:525
+msgid "Malformed extended header: missing blank after length"
+msgstr ""
+"Ðевірно Ñформований розширений заголовок: відÑутній пробіл піÑÐ»Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Ðевірно Ñформований розширений заголовок: відÑутній знак рівнÑннÑ"
+
+#: src/xheader.c:539
+msgid "Malformed extended header: missing newline"
+msgstr "Ðевірно Ñформований розширений заголовок: відÑутній знак нового Ñ€Ñдка"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr "Ðевідоме ключове Ñлово `%s' іґноруєтьÑÑ"
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr "Створена пара ключове Ñлово/Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ” за довга (ключ=%s, довжина=%s)"
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr ""
+"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ð³Ð¾ заголовку %s=%s лежить поза допуÑтимими межами типу %s.."
+"%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Ðевірно Ñформований розширений заголовок: недійÑна змінна %s=%s"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Ðевірно Ñформований розширений заголовок: зайвий %s=%s"
+
+#: src/xheader.c:1328
+#, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr ""
+"Ðевірно Ñформований розширений заголовок: змінна %s: неочікуваний розділювач "
+"%c"
+
+#: src/xheader.c:1338
+#, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Ðевірно Ñформований розширений заголовок %s: непарна кількіÑÑ‚ÑŒ значень"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+"genfile - програма обробки файлів з набору перевірок пакету GNU paxutils\n"
+"Перелік опцій:\n"
+
+#: tests/genfile.c:125
+msgid "File creation options:"
+msgstr "Опції ÑÑ‚Ð²Ð¾Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr "РОЗМІР"
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr "Створити файл заданого розміру"
+
+#: tests/genfile.c:129
+msgid "Write to file NAME, instead of standard output"
+msgstr "ПиÑати у вказаний файл, заміÑÑ‚ÑŒ Ñтандартного виводу"
+
+#: tests/genfile.c:131
+msgid "Read file names from FILE"
+msgstr "Читати назви файлів з вказаного файлу"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+"файл, вказаний з опцією -T, міÑтить назви, відокремлені нульовими Ñимволами"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+"Взірець Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°: 'default' (типовий) або 'zeros' (Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð½ÑƒÐ»Ñми)"
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr "Розмір блока розÑÑ–Ñного файла"
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr "Створити розÑÑ–Ñний файл. Решта аргументів дає мапу файла."
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr "ЗСУВ"
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr "Перед запиÑом даних перейти до вказаного зÑуву в файлі"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr "СтатиÑтика файлів:"
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr "Виводити вміÑÑ‚ Ñтруктури stat Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ файла. Типовий формат: "
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr "Синхронне виконаннÑ:"
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+"Виконати вказану команду. Ð”Ð»Ñ ÑƒÐ¶Ð¸Ñ‚ÐºÑƒ з опціÑми --cut, --append або --touch"
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+"Виконати вказану операцію (див. нижче) по доÑÑгненню контрольної відмітки"
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr "Ð’Ñтановлює дати Ð´Ð»Ñ Ð½Ð°Ñтупної опції --touch"
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr "Друкувати виконані операції Ñ– код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+"Операції Ñинхронного виконаннÑ. ВиконуютьÑÑ Ð¿Ð¾ доÑÑгненню контрольної "
+"відмітки, вказаної опцією --checkpoint. "
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+"Обрізати файл до розміру, вказаного попередньою опцією --length (до 0, Ñкщо "
+"її не було вказано)"
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr "Додати до файла кількіÑÑ‚ÑŒ байтів, вказану попередньою опцією --length."
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr "Поновити Ñ‡Ð°Ñ Ð´Ð¾Ñтупу та модифікації файла"
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr "Виконати КОМÐÐДУ"
+
+#: tests/genfile.c:239
+#, c-format
+msgid "Invalid size: %s"
+msgstr "Ðевірний розмір: %s"
+
+#: tests/genfile.c:244
+#, c-format
+msgid "Number out of allowed range: %s"
+msgstr "ЧиÑло поза допуÑтимими межами: %s"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr "Від'ємний розмір: %s"
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr "збій Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ stat(%s)"
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr "Помилка розбору чиÑла Ð±Ñ–Ð»Ñ `%s'"
+
+#: tests/genfile.c:360
+#, c-format
+msgid "Unknown date format"
+msgstr "Ðевідомий формат дати"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr "[ÐРГУМЕÐТИ...]"
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr "не вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ `%s'"
+
+#: tests/genfile.c:426
+#, c-format
+msgid "cannot seek: %s"
+msgstr "не вдаєтьÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ lseek: %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr "назва файла міÑтить нульовий Ñимвол"
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+"неможливо Ñтворювати розÑÑ–Ñні файли на Ñтандартному виводі; кориÑтайтеÑÑ "
+"опцією --file"
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr "недійÑна маÑка (Ð±Ñ–Ð»Ñ `%s')"
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, c-format
+msgid "Unknown field `%s'"
+msgstr "Ðевідоме поле `%s'"
+
+#: tests/genfile.c:652
+#, c-format
+msgid "cannot set time on `%s'"
+msgstr "не вдаєтьÑÑ Ð²Ñтановити Ñ‡Ð°Ñ Ñ„Ð°Ð¹Ð»Ð° `%s'"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr "Команда завершилаÑÑ ÑƒÑпішно\n"
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr "Команда завершилаÑÑ Ð· кодом %d\n"
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr "Команда завершилаÑÑ Ð¿Ð¾ Ñигналу %d\n"
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr "Команда зупинилаÑÑ Ð¿Ð¾ Ñигналу %d\n"
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr "Команда Ñкинула відбиток пам'ÑÑ‚Ñ–\n"
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr "Команда завершилаÑÑ\n"
+
+#: tests/genfile.c:852
+#, c-format
+msgid "--stat requires file names"
+msgstr "Ð¾Ð¿Ñ†Ñ–Ñ --stat вимагає назв файлів"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr "забагато аргументів"
+
+#~ msgid "%s: Read error at byte %s, reading %lu byte"
+#~ msgid_plural "%s: Read error at byte %s, reading %lu bytes"
+#~ msgstr[0] "%s: Помилка в позиції %s, під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %lu байту"
+#~ msgstr[1] "%s: Помилка в позиції %s, під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %lu байтів"
+#~ msgstr[2] "%s: Помилка в позиції %s, під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %lu байтів"
+
+#~ msgid "--Mangled file names--\n"
+#~ msgstr "--Закодовані назви файлів--\n"
+
+#~ msgid "Unexpected EOF in mangled names"
+#~ msgstr "Ðеочікуваний кінець файла під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð°ÐºÐ¾Ð´Ð¾Ð²Ð°Ð½Ð¸Ñ… назв"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Перейменовано %s на %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Ðе вдаєтьÑÑ Ñтворити Ñимволічне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð¾ %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Створено Ñимволічне поÑÐ¸Ð»Ð°Ð½Ð½Ñ %s до %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Ðевідома команда Ñ€Ð¾Ð·ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð·Ð² %s"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу поза допуÑтимими межами"
+
+#~ msgid "Modification time (seconds) out of range"
+#~ msgstr "Ð§Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— (Ñекунди) поза межами діапазону"
+
+#~ msgid "Modification time (nanoseconds) out of range"
+#~ msgstr "Ð§Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— (наноÑекунди) поза межами діапазону"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Ðомер приÑтрою поза допуÑтимими межами"
+
+#~ msgid "Error reading time stamp"
+#~ msgstr "Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ¸ чаÑу"
+
+#~ msgid "Unexpected EOF"
+#~ msgstr "Ðеочікуваний кінець файла"
+
+#~ msgid "same as -N"
+#~ msgstr "Те ж, що і -N"
+
+#~ msgid ""
+#~ "creating multi-volume archives in posix format requires using --tape-"
+#~ "length (-L) option"
+#~ msgstr ""
+#~ "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ñ‚Ð¾Ð¼Ð½Ð¸Ñ… архівів вимагає викориÑÑ‚Ð°Ð½Ð½Ñ Ð¾Ð¿Ñ†Ñ–Ñ— --tape-length (-"
+#~ "L)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr ""
+#~ "друкувати загальну кількіÑÑ‚ÑŒ байтів, запиÑаних під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð¿Ñ†Ñ–Ñ— -l змінитьÑÑ Ñƒ майбутніх верÑÑ–ÑÑ… програми."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Будь лаÑка викориÑтовуйте опцію --one-file-system."
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "ВідÑÑƒÑ‚Ð½Ñ Ð½Ð°Ð·Ð²Ð° файлу піÑÐ»Ñ -C"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "шаблони Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ” проÑтими Ñимвольними Ñ€Ñдками"
+
+# FIXME
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "шаблони Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¼Ñ–ÑÑ‚ÑÑ‚ÑŒ мета-Ñимволи '*' Ñ– '?' (типово)"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "Ð¦Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð° поÑтачаєтьÑÑ Ð‘Ð•Ð— БУДЬ-ЯКОЇ ГÐРÐÐТІЇ, у межах дозволених\n"
+#~ "законом. Ви можете розповÑюджувати Ñ—Ñ— на умовах ліцензії GNU General\n"
+#~ "Public License; Додаткову інформацію дивітьÑÑ Ñƒ файл з назвою COPYING."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Хибна команда %c\n"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "ПОПЕРЕДЖЕÐÐЯ: Заголовок тому відÑутній"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Помилка довгої назви"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Помилка довгої назви"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "не відновлювати Ñ‡Ð°Ñ Ð´Ð¾Ñтупу доданих файлів"
+
+#~ msgid "extract permissions information"
+#~ msgstr "вÑтановлювати права доÑтупу з архіву"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "не вÑтановлювати права доÑтупу з архіву"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "ФÐЙЛ-З-ÐÐЗВÐМИ"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "додавати файли на Ñки вказують Ñимволічні поÑиланнÑ"
+
+#~ msgid "Print license and exit"
+#~ msgstr "ВивеÑти текÑÑ‚ ліцензії та вийти"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Ðа оÑнові програми Джона Гілмора Ñ– Ð”Ð¶ÐµÑ Ð¤ÐµÐ½Ð»Ð°Ñона. Повний перелік авторів "
+#~ "див. у файлі AUTHORS.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " GNU tar Ñ” вільна програма; ви можете розповÑюджувати його чи/та\n"
+#~ " змінювати його на умовах ліцензії GNU General Public License\n"
+#~ " опублікованої Free Software Foundation; верÑÑ–Ñ— 2 цієї ліцензії, або\n"
+#~ " (за вашим бажаннÑм) будь-Ñкої пізнішої верÑÑ–Ñ—.\n"
+#~ "\n"
+#~ " GNU tar розповÑюджуєтьÑÑ Ð· надією, що він буде кориÑним, але\n"
+#~ " БЕЗ БУДЬ-ЯКОЇ ГÐРÐÐТІЇ; навіть без неÑвної гарантії\n"
+#~ " КОМЕРЦІЙÐОЇ ПРИДÐТÐОСТІ або ПРИДÐТÐОСТІ ДЛЯ ПЕВÐОЇ МЕТИ. Докладніше\n"
+#~ " про це читайте у GNU General Public License.\n"
+#~ "\n"
+#~ " Разом з програмою GNU tar ви повинні були отримати копію GNU General\n"
+#~ " Public License; Ñкщо це не так, напишіть до Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr ""
+#~ "ПопередженнÑ: Ð¾Ð¿Ñ†Ñ–Ñ -y не підтримуєтьÑÑ. Можливо ви маєте на увазі -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Помилка запиÑу до Ñтандартного виводу"
diff --git a/po/vi.gmo b/po/vi.gmo
new file mode 100644
index 0000000..2c966f5
--- /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..0897985
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,2557 @@
+# translation of tar-1.15.1.po to Vietnamese
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# Phan Vinh Thinh <teppi82@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.15.1\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2005-03-21 13:22+0300\n"
+"Last-Translator: Phan Vinh Thinh <teppi82@gmail.com>\n"
+"Language-Team: Vietnamese <gnomevi-list@lists.sourceforge.net>\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: KBabel 1.9.1\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "tham số không thích hợp %s cho %s"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "tham số không rõ ràng %s cho %s"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "Các tham số đúng là:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: tham số ARGP_HELP_FMT yêu cầu một giá trị"
+
+#: lib/argp-help.c:227
+#, fuzzy, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr "%.*s: tham số ARGP_HELP_FMT yêu cầu một giá trị"
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Tham số không rõ ARGP_HELP_FMT"
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Có rác trong ARGP_HELP_FMT: %s"
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+"Tham số ủy nhiệm hay tham số không bắt buá»™c cho các tùy chá»n dài cÅ©ng đồng "
+"thá»i là ủy nhiệm hay không bắt buá»™c cho các tùy chá»n ngắn tÆ°Æ¡ng ứng."
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr "Sử dụng:"
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr " hoặc: "
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr " [TÙY CHỌN...]"
+
+#: lib/argp-help.c:1683
+#, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Hãy thử `%s --help' hoặc `%s --usage' để biết thêm thông tin.\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Báo cáo lỗi tới %s.\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "Lỗi hệ thống không rõ"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+#, fuzzy
+msgid "give this help list"
+msgstr "ÄÆ°a ra danh sách trợ giúp này"
+
+#: lib/argp-parse.c:83 src/tar.c:737
+#, fuzzy
+msgid "give a short usage message"
+msgstr "ÄÆ°a ra cách sá»­ dụng ngắn gá»n"
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr "TÊN"
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+#, fuzzy
+msgid "print program version"
+msgstr "In ra phiên bản chương trình"
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: tùy chá»n `%s' yêu cầu má»™t tham số\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: tùy chá»n `%s' không rõ ràng\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: tùy chá»n `--%s' không cho phép má»™t tham số\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, 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 má»™t tham số\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: tùy chá»n `%s' yêu cầu má»™t tham số\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: tùy chá»n không nhận ra `--%s'\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: tùy chá»n không nhận ra `%c%s'\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: tùy chá»n không cho phép -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: tùy chá»n không đúng -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: tùy chá»n cần má»™t tham số -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: tùy chá»n `-W %s' không rõ ràng\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: tùy chá»n `-W %s' không yêu cầu má»™t tham số\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "kích thước khối"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "kiệt quệ bộ nhớ"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s: Không thể %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s: Cảnh báo: Không thể %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s: Không thay đổi được chế độ thành %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s: Không thay đổi được quyá»n sở hữu thành uid %lu, gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s: Không tạo được liên kết cứng tới %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Lá»—i Ä‘á»c tại byte %s, Ä‘ang Ä‘á»c %lu byte"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s: Cảnh báo: Lá»—i Ä‘á»c tại byte %s, Ä‘ang Ä‘á»c %lu byte"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s: Không thể tìm tới %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s: Cảnh báo: Không thể tìm tới %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s: Không tạo được liên kết má»m tá»›i %s"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%s: Chỉ ghi nhớ %lu từ %lu byte"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "Xóa bỠphần dẫn đầu `%s' từ tên của các thành viên"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "Xóa bỠphần dẫn đầu `%s' từ đích đến của các liên kết cứng"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "Äang thay thế `.' cho tên rá»—ng của các thành viên"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+msgstr "Äang thay thế `.' cho đích đến rá»—ng của liên kết cứng"
+
+#. 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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "'"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp: Dịch vụ không làm việc"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "stdin"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "stdout"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "Không thể chạy shell ở xa"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd: Không thể phân phối không gian cho bộ đệm\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "Không thể phân phối không gian cho bộ đệm"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Hãy thử `%s --help' để biết thêm thông tin.\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"Sử dụng: %s [TÙY CHỌN]\n"
+"Äiá»u khiển má»™t ổ băng ghi âm (tape), chấp nhận các lệnh từ má»™t tiến trình ở "
+"xa.\n"
+"\n"
+" --version ÄÆ°a ra thông tin phiên bản.\n"
+" --help ÄÆ°a ra trợ giúp này.\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Thông báo lỗi tới <%s>.\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "Bộ tìm kiếm vượt quá vùng cho phép"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "Bộ tìm kiếm vượt quá vùng cho phép"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "Hướng tìm kiếm vượt quá vùng cho phép"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd: Kết thúc tập tin (eof) sớm\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "Kết thúc sớm của tập tin"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "Câu lệnh rác"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "Tổng số byte đã ghi: %s (%s, %s/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "Tổng số byte đã ghi: %s (%s, %s/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(Ä‘Æ°á»ng ống)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "Giá trị cho record_size không đúng"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "Không đưa ra tên tập tin lưu trữ"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "Không kiểm tra được tập tin lưu trữ stdin/stdout"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr "Tập tin lÆ°u trữ được nén. Hãy sá»­ dụng tùy chá»n %s"
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "Không cập nhật được lưu trữ đã nén"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "Äiểm kiểm tra ghi nhá»› %d"
+
+# msgstr[1] "Kích thước bản ghi = %lu khối"
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "Äiểm kiểm tra ghi nhá»› %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "Tại đầu băng ghi âm, thoát ra bây giá»"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "Quá nhiá»u lá»—i, Ä‘ang thoát"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "Khối chưa sắp hàng (%lu byte) trong tập tin lưu trữ"
+
+# msgstr[1] "Khối chưa sắp hàng (%lu byte) trong tập tin lưu trữ"
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "Kích thước bản ghi = %lu khối"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "Không thể \"tua\" lại tập tin lÆ°u trữ; nó có thể Ä‘á»c khi không có -i"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr "rmtlseek không dừng lại tại một ranh giới bản ghi"
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s: chứa số thứ tự khối không đúng"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "Số thứ tự khối thừa ra"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "Chuẩn bị khối #%d cho %s và nhấn Enter: "
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "Kết thúc tập tin (EOF) khi mong đợi trả lá»i của ngÆ°á»i dùng"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "CẢNH BÃO: Tập tin lÆ°u trữ không hoàn thành"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [tên] ÄÆ°a ra tên tập tin má»›i cho (các) khối tiếp theo (và theo sau)\n"
+" q Dừng tar\n"
+" ! Äẻ ra má»™t shell con\n"
+" ? In ra danh sách này\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "Không có khối mới; đang thoát.\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "Câu lệnh `%s' không thành công"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "Äây có vẻ không phải là má»™t tập tin lÆ°u trữ tar"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s không tiếp tục trên khối này"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s không tiếp tục trên khối này"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s là kích thước sai (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "Khối này vượt quá dãy cho phép"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "Tập tin lưu trữ không có nhãn tương ứng với %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "Khối %s không tương ứng %s"
+
+#: src/buffer.c:1392
+#, fuzzy, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr "%s: tên tập tin quá dài để chứa trong một phần đầu đa khối GNU"
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "Chỉ Ä‘á»c được %lu từ %lu byte"
+
+# msgstr[1] "Chỉ Ä‘á»c được %lu từ %lu byte"
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "Diff ná»™i dung"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "Kết thúc tập tin không mong đợi trong lưu trữ"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "Diff dạng tập tin"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "Diff chế độ"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Diff Uid"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Diff Gid"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "Diff thá»i gian sá»­a đổi"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "Diff kích thước"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "Không liên kết tới %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "Diff liên kết má»m"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "Diff số thứ tự của thiết bị"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "Kiểm tra"
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s: không rõ dạng tập tin '%c', diff nhÆ° tập tin thông thÆ°á»ng"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr "Tập tin lÆ°u trữ chứa tên tập tin không có tiá»n tố ở đầu."
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr "Sự kiểm tra có thể không định vị được các tập tin gốc."
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "LỖI KIỂM TRA: tìm thấy %d phần đầu không đúng"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s: tập tin chứa một thẻ ghi thư mục lưu trữ tạm; không được dump"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "giá trị %s vượt quá %s phạm vi %s..%s; đang thay thế %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "giá trị %s vượt quá %s phạm vi %s..%s"
+
+# msgstr[1] "LỖI KIỂM TRA: tìm thấy %d phần đầu không đúng"
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "Äang tạo phần đầu hệ tám âm"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s: tên tập tin quá dài (max %d); không được dump"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s: tên tập tin quá dài (không chia được); không được dump"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s: tên liên kết quá dài; không được dump"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%s: Tập tin được rút ngắn %s byte; độn vào bắng các số không"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s: tập tin trên một hệ thống tập tin khác; không được dump"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s: Không rõ dạng tập tin; tập tin bị lỠđi"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr "Thiếu liên kết tới '%s'.\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s: tập tin chưa thay đổi; không được dump"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s: tập tin là một lưu trữ; không được dump"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s: Tập tin bị xóa trÆ°á»›c khi chúng ta Ä‘á»c nó"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s: tập tin chứa một thẻ ghi thư mục lưu trữ tạm; không được dump"
+
+# msgstr[1] "%s: Tập tin được rút ngắn %s byte; độn vào bắng các số không"
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s: tập tin đã thay đổi khi chúng ta Ä‘á»c nó"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s: socket bị lỠđi"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr "%s: cửa (door) bị lỠđi"
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "Nhảy tới phần đầu tiếp theo"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "Xóa không phải phần đầu từ lưu trữ"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s: tem thá»i gian cÅ© không hợp lý %s"
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s: tem thá»i gian %s là %lu giây trong tÆ°Æ¡ng lai"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s: Sự mâu thuẫn không mong đợi khi tạo thư mục"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s: Äổi tên thÆ° mục trÆ°á»›c khi có thể giải phóng trạng thái của nó"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "Giải nén các tập tin liá»n nhau thành những tập tin thông thÆ°á»ng"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "Äang thá»­ giải nén liên kết má»m thành liên kết cứng"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "Äá»c %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s: Không giải nén được -- tập tin tiếp tục từ khối khác"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "Kết thúc tập tin (EOF) không mong đợi trong các tên há»ng"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s: Dạng tập tin không rõ '%c', giải nén nhÆ° tập tin thông thÆ°á»ng"
+
+#: src/extract.c:1184
+#, fuzzy, c-format
+msgid "Current %s is newer or same age"
+msgstr "Hiện thá»i `%s' má»›i hÆ¡n"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s: Không thể sao lưu tập tin này"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s: Không thể đổi tên thành %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "Lá»—i không thể phục hồi: thoát bây giá»"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s: Äã đổi tên thÆ° mục"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s: Äã đổi tên thÆ° mục"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s: Thư mục là mới"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "Tem thá»i gian không đúng"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "ÄÆ°a ra chế Ä‘á»™ không đúng trên tùy chá»n"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "Số thứ tự thiết bị không đúng"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "Số thứ tự chỉ mục inode sai"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "Kết thúc tập tin không mong đợi trong lưu trữ"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr "Tham số mật độ sai: '%s'"
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+#, fuzzy
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr "Tham số mật độ sai: '%s'"
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr ""
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr "%s: Không làm sạch thư mục: không thể lấy trạng thái (stat)"
+
+#: src/incremen.c:1405
+#, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s: thư mục trên một thiết bị khác: không làm sạch"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s: Äang xóa %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s: Không thể xóa bá»"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s: Äang bá» Ä‘i"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "khối %s: ** Khối của các số không (NUL) **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "Một khối không đơn lẻ tại %s"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "khối %s: ** Kết thúc tập tin **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "khối %s: "
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "Khoảng trống trong Phần đầu trong khi mong đợi một giá trị số %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr ""
+"Giá trị hệ tám %.*s của lưu trữ vượt ra phạm vi %s; coi như phần bù của hai"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "Giá trị hệ tám %.*s của lưu trữ vượt ra phạm vi %s"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "Lưu trữ chứa phần đầu base-64 không còn dùng nữa"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "Lưu trữ ký chuỗi base-64 %s vượt ra ngoài vùng %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "Giá trị base-256 của lưu trữ vượt ra ngoài vùng %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr "Lưu trữ chứa %.*s ở chỗ mong đợi giá trị số %s"
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, fuzzy, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "Giá trị lưu trữ %s vượt quá %s vùng %s.%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " liên kết tới %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " dạng tập tin không rõ %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--Liên kết Dài--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--Tên Dài--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--Phần đầu Khối--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--Tiếp tục tại byte %s--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "Äang tạo thÆ° mục:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Äang đổi tên %s thành %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s: Không thể đổi tên thành %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "Äang đổi tên %s ngược lại thành %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "Không thể ghi nhớ thư mục làm việc"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "Không thay đổi được thư mục làm việc"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "tiến trình con"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "kênh (channel) giữa các tiến trình"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s: Không tìm thấy trong lưu trữ"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s: Không tìm thấy phần tử yêu cầu trong lưu trữ"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "Cả hai tùy chá»n `-%s' và `-%s' Ä‘á»u muốn dữ liệu nhập vào tiêu chuẩn"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s: Äịnh dạng lÆ°u trữ không đúng"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "Muốn tính năng GNU trên định dạng lưu trữ không tương thích"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"ChÆ°Æ¡ng trình `tar' của GNU ghi nhá»› nhiá»u tập tin vào cùng má»™t lÆ°u trữ băng "
+"ghi âm (tape) hay lên đĩa, và có thể phục hồi từng tập tin riêng rẽ từ kho "
+"lưu trữ này.\n"
+"\n"
+"Ví dụ:\n"
+" tar -cf archive.tar foo bar # Tạo archive.tar từ các tập tin foo và bar.\n"
+" tar -tvf archive.tar # Liệt kê chi tiết tất cả các tập tin có "
+"trong archive.tar.\n"
+" tar -xf archive.tar # Giải phóng tất cả các tập tin ra từ archive."
+"tar.\n"
+"\vHậu tố lưu trữ là `~', trừ khi được đặt với --suffix hay "
+"SIMPLE_BACKUP_SUFFIX.\n"
+"Có thể đặt Ä‘iá»u khiển phiên bản bằng --backup hay VERSION_CONTROL, các giá "
+"trị Ä‘iá»u khiển là:\n"
+"\n"
+" t, numbered tạo lưu trữ đánh số\n"
+" nil, existing đánh số nếu lưu trữ tồn tại, nếu không thì đơn giản\n"
+" never, simple luôn luôn tạo lưu trữ đơn giản\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"ChÆ°Æ¡ng trình `tar' của GNU ghi nhá»› nhiá»u tập tin vào cùng má»™t lÆ°u trữ băng "
+"ghi âm (tape) hay lên đĩa, và có thể phục hồi từng tập tin riêng rẽ từ kho "
+"lưu trữ này.\n"
+"\n"
+"Ví dụ:\n"
+" tar -cf archive.tar foo bar # Tạo archive.tar từ các tập tin foo và bar.\n"
+" tar -tvf archive.tar # Liệt kê chi tiết tất cả các tập tin có "
+"trong archive.tar.\n"
+" tar -xf archive.tar # Giải phóng tất cả các tập tin ra từ archive."
+"tar.\n"
+"\vHậu tố lưu trữ là `~', trừ khi được đặt với --suffix hay "
+"SIMPLE_BACKUP_SUFFIX.\n"
+"Có thể đặt Ä‘iá»u khiển phiên bản bằng --backup hay VERSION_CONTROL, các giá "
+"trị Ä‘iá»u khiển là:\n"
+"\n"
+" t, numbered tạo lưu trữ đánh số\n"
+" nil, existing đánh số nếu lưu trữ tồn tại, nếu không thì đơn giản\n"
+" never, simple luôn luôn tạo lưu trữ đơn giản\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr "Chế độ thao tác chính:"
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr "liệt kê nội dung của một lưu trữ"
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr "giải phóng các tập tin từ một lưu trữ"
+
+#: src/tar.c:372
+msgid "create a new archive"
+msgstr "tạo một lưu trữ mới"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr "tìm sự khác nhau giữa lưu trữ và hệ thống tập tin"
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr "thêm các tập tin vào cuối một lưu trữ"
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr "chỉ thêm những tập tin mới hơn bản sao trong lưu trữ"
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr "thêm các tập tin tar vào một lưu trữ"
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr "xóa từ lưu trữ (không dùng trên các băng ghi âm mag!)"
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr "Từ khóa bổ nghĩa thao tác:"
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr "Ä‘iá»u khiển các tập tin thÆ°a thá»›t má»™t cách có hiệu quả"
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr "Ä‘iá»u khiển sao lÆ°u incremental có định dạng GNU cÅ©"
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr "TẬP TIN"
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr "Ä‘iá»u khiển sao lÆ°u incremental có định dạng GNU má»›i"
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr "đừng thoát vá»›i giá trị khác không trên tập tin không thể Ä‘á»c"
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr "Sá»"
+
+#: src/tar.c:404
+#, fuzzy
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+"chỉ thực hiện trên lần xuất hiện thứ SỠcủa mỗi tập tin trong lưu trữ. Tùy "
+"chá»n này chỉ có ý nghÄ©a khi kết hợp vá»›i má»™t trong những câu lệnh con --"
+"delete, --diff, --extract hoặc --list và khi đưa ra một danh sách tập tin "
+"trên dòng lệnh hoặc qua tùy chá»n -T. Mặc định Sá» có giá trị bằng 1."
+
+#: src/tar.c:410
+#, fuzzy
+msgid "archive is seekable"
+msgstr "Lưu trữ là có thể tìm kiếm"
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr "thử kiểm tra lưu trữ sau khi ghi nó"
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr "xóa bỠcác tập tin sau khi thêm chúng vào lưu trữ"
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr "không thay thế những tập tin đã có khi giải phóng"
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr "không thay thế những tập tin đã có mà mới hơn bản sao trong lưu trữ"
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr "ghi đè lên những tập tin đã có khi giải phóng"
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr "xóa bá» quyá»n Æ°u tiên của má»—i tập tin để giải phóng và ghi đè lên nó"
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr "xóa sạch quyá»n Æ°u tiên trong cây thÆ° mục để giải phóng thÆ° mục"
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr "bảo quản dữ liệu mêta của các thư mục đã có"
+
+#: src/tar.c:434
+#, fuzzy
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr "ghi đè lên những tập tin đã có khi giải phóng"
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+msgid "extract files to standard output"
+msgstr "giải phóng tập tin ra đầu ra tiêu chuẩn"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr "CÂU LỆNH"
+
+#: src/tar.c:445
+#, fuzzy
+msgid "pipe extracted files to another program"
+msgstr "giải phóng tập tin ra đầu ra tiêu chuẩn"
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr "Äiá»u khiển thuá»™c tính tập tin:"
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr "bắt buá»™c dùng TÊN làm ngÆ°á»i sở hữu cho những tập tin thêm vào"
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr "bắt buộc dùng TÊN làm nhóm sở hữu cho những tập tin thêm vào"
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr "NGÀY-CỦA-TẬP-TIN"
+
+#: src/tar.c:461
+#, fuzzy
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr "chỉ chứa những tập tin mới hơn NGÀY-CỦA-TẬP-TIN"
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr "THAY Äá»”I"
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr "bắt buá»™c THAY Äá»”I chế Ä‘á»™ (tượng trÆ°ng) cho những tập tin thêm vào"
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr "không giải phóng thá»i gian sá»­a đổi của tập tin"
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr "thá»­ giải phóng tập tin vá»›i cùng quyá»n sở hữu"
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr "giải phóng tập tin như tự bạn"
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr "luôn luôn sá»­ dụng số cho tên ngÆ°á»i dùng/nhóm"
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr "sắp xếp tên để giải phóng tới lưu trữ tương ứng"
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr "giống nhÆ° khi có hai tùy chá»n -p và -s"
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr "Lá»±a chá»n và chuyển đổi thiết bị:"
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr "LƯU TRỮ"
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr "sử dụng tập tin lưu trữ hoặc thiết bị LƯU TRỮ"
+
+#: src/tar.c:502
+#, fuzzy
+msgid "archive file is local even if it has a colon"
+msgstr "tập tin lưu trữ là nội bộ thậm chí nếu có một dấu hai chấm"
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr "sử dụng CÂU LỆNH rmt đưa ra thay cho rmt"
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr "sử dụng CÂU LỆNH từ xa thay cho rsh"
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr "chỉ ra ổ và mật độ ghi dữ liệu"
+
+#: src/tar.c:524
+msgid "create/list/extract multi-volume archive"
+msgstr "tạo/liệt kê/giải phóng lÆ°u trữ nhiá»u khối"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr "thay băng ghi âm (tape) sau khi ghi nhớ SỠX 1024 byte"
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr "chạy script tại cuối mỗi băng ghi âm (có nghĩa -M)"
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr "sử dụng/cập nhật số thứ tự khối trong TẬP TIN"
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr "Khối của thiết bị:"
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr "KHá»I"
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr "KHá»I X 512 byte cho má»—i bản ghi"
+
+#: src/tar.c:541
+#, fuzzy
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr "KÃCH THƯỚC byte cho má»—i bản ghi, bá»™i số của 512"
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr "lỠđi những khối không (zero) trong lưu trữ (có nghĩa EOF)"
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr "đặt khối lại khi chúng ta Ä‘á»c (cho Ä‘Æ°á»ng ống 4.2BSD)"
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr "Lá»±a chá»n định dạng lÆ°u trữ:"
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr "ÄỊNH DẠNG"
+
+#: src/tar.c:553
+#, fuzzy
+msgid "create archive of the given format"
+msgstr "tạo lưư trữ với định dạng đưa ra."
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr "ÄỊNH DẠNG là má»™t trong số sau:"
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr "định dạng tar V7 cũ"
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr "định dạng GNU theo như tar <= 1.12"
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr "định dạng tar GNU 1.13.x"
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr "định dạng PoSIX 1003.1-1988 (ustar)"
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr "định dạng POSIX 1003.1-2001 (pax)"
+
+#: src/tar.c:566
+#, fuzzy
+msgid "same as pax"
+msgstr "Giống như pax"
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr "giống như --format=v7"
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr "giống như --format=posix"
+
+#: src/tar.c:573
+#, fuzzy
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr "từ khóa[[:]=giá trị][,từ khóa[[:]=giá trị], ...]"
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr "từ khóa Ä‘iá»u khiển pax"
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr "VĂN BẢN"
+
+#: src/tar.c:576
+#, fuzzy
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+"tạo lÆ°u trữ vá»›i tên khối TÊN. Tại thá»i Ä‘iểm liệt kê/giải phóng, sá»­ dụng VÄ‚N "
+"BẢN làm mẫu toàn cầu"
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr "lá»c lÆ°u trữ qua bzip2"
+
+#: src/tar.c:580
+msgid "filter the archive through gzip"
+msgstr "lá»c lÆ°u trữ qua gzip"
+
+#: src/tar.c:584
+msgid "filter the archive through compress"
+msgstr "lá»c lÆ°u trữ qua compress"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr "CHƯƠNG TRÌNH"
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr "lá»c qua CHƯƠNG TRÃŒNH (phải chấp nhận -d)"
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr "Lá»±a chá»n tập tin ná»™i bá»™:"
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr "THƯ MỤC"
+
+#: src/tar.c:597
+msgid "change to directory DIR"
+msgstr "thay đổi tới thư mục THƯ MỤC"
+
+#: src/tar.c:599
+#, fuzzy
+msgid "get names to extract or create from FILE"
+msgstr "lấy tên tập tin cần giải phóng hay tạo từ tập tin TÊN"
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr "-T Ä‘á»c tên kết thúc vô hiệu lá»±c, tắt -C"
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr "MẪU"
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr "loại trừ những tập tin tương ứng với MẪU"
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr "loại trừ những mẫu liệt kê trong TẬP TIN"
+
+#: src/tar.c:611
+#, fuzzy
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr "loại trữ những thư mục chứa một thẻ ghi nhớ tạm"
+
+#: src/tar.c:614
+#, fuzzy
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr "loại trữ những thư mục chứa một thẻ ghi nhớ tạm"
+
+#: src/tar.c:617
+#, fuzzy
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr "loại trữ những thư mục chứa một thẻ ghi nhớ tạm"
+
+#: src/tar.c:619
+#, fuzzy
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr "loại trữ những thư mục chứa một thẻ ghi nhớ tạm"
+
+#: src/tar.c:622
+#, fuzzy
+msgid "exclude everything under directories containing FILE"
+msgstr "loại trữ những thư mục chứa một thẻ ghi nhớ tạm"
+
+#: src/tar.c:624
+#, fuzzy
+msgid "exclude directories containing FILE"
+msgstr "loại trữ những thư mục chứa một thẻ ghi nhớ tạm"
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr "tránh sự giảm dần một cách tự động trong các thư mục"
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr "nằm trong hệ thống tập tin nội bộ khi tạo lưu trữ"
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr "đệ quy vào các thư mục (mặc định)"
+
+#: src/tar.c:632
+msgid "don't strip leading `/'s from file names"
+msgstr "đừng bỠ`/' ở đầu tên tập tin"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr "TÊN-THÀNH-VIÊN"
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr "bắt đầu tại thành viên TÊN-THÀNH-VIÊN trong lưu trữ"
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr "chỉ chứa những tập tin mới hơn NGÀY-CỦA-TẬP-TIN"
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr "NGÀY"
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr "so sánh ngày và thá»i gian chỉ khi dữ liệu thay đổi"
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr "ÄIỀU KHIỂN"
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr "sao lÆ°u trÆ°á»›c khi xóa, chá»n phiên bản ÄIỀU KHIỂN"
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr "CHUá»–I"
+
+#: src/tar.c:645
+#, fuzzy
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+"sao lÆ°u trÆ°á»›c khi xóa, ghi đè hậu tố thông thÆ°á»ng ('~' trừ khi ghi đè bằng "
+"biến môi trÆ°á»ng SIMPLE_BACKUP_SUFFIX"
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+#, fuzzy
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr "bỠđi thành phần số SỠđứng đầu từ tên tập tin"
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+#, fuzzy
+msgid "ignore case"
+msgstr "sá»± loại trừ không kể đến chữ hoa hay chữ thÆ°á»ng"
+
+#: src/tar.c:665
+#, fuzzy
+msgid "patterns match file name start"
+msgstr "loại trừ những mẫu tương ứng với bắt đầu tên tập tin"
+
+#: src/tar.c:667
+#, fuzzy
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr "loại trừ những mẫu tương ứng sau bất kỳ / nào (mặc định)"
+
+#: src/tar.c:669
+#, fuzzy
+msgid "case sensitive matching (default)"
+msgstr "sá»± loại trừ có phân biệt chữ hoa chữ thÆ°á»ng (mặc định)"
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "loại trừ những mẫu wildcard không tương ứng '/'"
+
+#: src/tar.c:677
+#, fuzzy
+msgid "wildcards match `/' (default for exclusion)"
+msgstr "loại trừ mẫu wildcard tương ứng '/' (mặc định)"
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr "Dữ liệu kết quả có tính thông tin:"
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr "liệt kê một cách tỉ mỉ những tập tin được tiến hành"
+
+#: src/tar.c:686
+#, fuzzy
+msgid "[.]NUMBER"
+msgstr "Sá»"
+
+#: src/tar.c:687
+#, fuzzy
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr "hiển thị thông báo vỠtiến triển sau mỗi bản ghi thứ 10"
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr "in ra một thông báo nếu không phải tất cả các liên kết được dump"
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr "in ra ngày sửa đổi tập tin theo UTC"
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr "gửi kết quả chi tiết tới TẬP TIN"
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr "hiên thị số thứ tự khối trong lưu trữ với mỗi thông báo"
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr "há»i xác nhận trÆ°á»›c má»—i hành Ä‘á»™ng"
+
+#: src/tar.c:706
+#, fuzzy
+msgid "show tar defaults"
+msgstr "Hiển thị mặc định của tar"
+
+#: src/tar.c:708
+#, fuzzy
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+"Khi liệt kê hay giải phóng, liệt kê mỗi thư mục không tương ứng với tiêu chí "
+"tìm kiếm"
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr "Tùy chá»n tÆ°Æ¡ng thích:"
+
+#: src/tar.c:726
+#, fuzzy
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"khi tạo, giống như --old-archive. Khi giải phóng, giống như --no-same-owner"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr "Những tùy chá»n khác:"
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "Không nên chỉ ra hai tùy chá»n hoặc nhiá»u hÆ¡n trong số `-Acdtrux'"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "Mâu thuẫn giữa các tùy chá»n nén"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " dạng tập tin không rõ %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "Không tìm thấy tập tin ngày tháng"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "Äang thay thế %s cho dạng ngày tháng không rõ %s"
+
+#: src/tar.c:961
+#, fuzzy, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "Äang coi ngày `%s' nhÆ° %s + %ld nano giây"
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s: tập tin là một lưu trữ; không được dump"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+"\n"
+"tar *này* mặc định tới:\n"
+
+#: src/tar.c:1199
+msgid "Invalid blocking factor"
+msgstr "Nhân tố khối không đúng"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "Cảnh báo: không há»— trợ tùy chá»n -I, có thể bạn muốn -j hay -T?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "Chiá»u dài băng ghi âm không đúng"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "Có nhiá»u ngày bắt đầu"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s: Nhóm không đúng"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "ÄÆ°a ra chế Ä‘á»™ không đúng trên tùy chá»n"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "Số không đúng"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "Chủ sở hữu không đúng"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "Kích thước bản ghi không đúng"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "Kích thước bản ghi phải là bội số của %d."
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "Số thứ tự của nguyên tố không đúng"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, fuzzy, c-format
+msgid "Malformed density argument: %s"
+msgstr "Tham số mật độ sai: '%s'"
+
+#: src/tar.c:1867
+#, fuzzy, c-format
+msgid "Unknown density: `%c'"
+msgstr "Mật độ không biết đến: '%c'"
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "tar *này* không há»— trợ tùy chá»n `-[0-7][lmh]'"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr "[TẬP TIN]..."
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "Tùy chá»n cÅ© `%c' yêu cầu má»™t tham số."
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "--occurrence không có giá trị khi không đưa ra một danh sách tập tin"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence không được sử dụng trong chế độ thao tác đã yêu cầu "
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "Tập tin nhiá»u lÆ°u trữ yêu cầu tùy chá»n `-M'"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "Không thể kết hợp --listed-incremental với --newer"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s: Nhãn khối quá dài (giới hạn là %lu byte)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "Không thể kiểm tra lÆ°u trữ nhiá»u khối"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "Không thể kiểm tra lưu trữ đã nén"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "Không thể sá»­ dụng lÆ°u trữ nhiá»u khối đã nén"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "Không cập nhật được lưu trữ đã nén"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option chỉ dùng được trên lưu trữ POSIX"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "Từ chối tạo một lưu trữ trống rỗng"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "Các tùy chá»n `-Aru' không tÆ°Æ¡ng thích vá»›i `-f -'"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "Bạn phải chỉ ra má»™t trong các tùy chá»n `-Acdtrux'"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "Lỗi thoát chậm trễ do lỗi trước"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%s: Tập tin được rút ngắn %s byte"
+
+#: src/xheader.c:158
+#, fuzzy, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "Từ khóa %s không biết hoặc chưa được bổ sung vào chương trình"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "Không thể dùng mẫu (pattern) %s"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "Không thể ghi chèn lên từ khóa %s"
+
+#: src/xheader.c:498
+#, fuzzy
+msgid "Malformed extended header: missing length"
+msgstr "Phần đầu mở rộng bị lỗi: thiếu dấu bằng"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "Lưu trữ ký chuỗi base-64 %s vượt ra ngoài vùng %s"
+
+#: src/xheader.c:525
+#, fuzzy
+msgid "Malformed extended header: missing blank after length"
+msgstr "Phần đầu mở rá»™ng bị lá»—i: thiếu khoảng trắng ở sau chiá»u dài"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "Phần đầu mở rộng bị lỗi: thiếu dấu bằng"
+
+#: src/xheader.c:539
+#, fuzzy
+msgid "Malformed extended header: missing newline"
+msgstr "Phần đầu mở rộng bị lỗi: thiếu dấu bằng"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "Giá trị lưu trữ %s vượt quá %s vùng %s.%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "Phần đầu mở rộng bị lỗi: thiếu dấu bằng"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, fuzzy, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "Phần đầu mở rộng bị lỗi: thiếu dấu bằng"
+
+#: src/xheader.c:1328
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "Phần đầu mở rộng bị lỗi: thiếu dấu bằng"
+
+#: src/xheader.c:1338
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "Phần đầu mở rộng bị lỗi: thiếu dấu bằng"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "Những tùy chá»n khác:"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+#, fuzzy
+msgid "Create file of the given SIZE"
+msgstr "tạo lưư trữ với định dạng đưa ra."
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "giải phóng tập tin ra đầu ra tiêu chuẩn"
+
+#: tests/genfile.c:131
+#, fuzzy
+msgid "Read file names from FILE"
+msgstr "Äá»c %s byte từ %s"
+
+#: tests/genfile.c:133
+#, fuzzy
+msgid "-T reads null-terminated names"
+msgstr "-T Ä‘á»c tên kết thúc vô hiệu lá»±c, tắt -C"
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+#, fuzzy
+msgid "Seek to the given offset before writing data"
+msgstr "thử kiểm tra lưu trữ sau khi ghi nó"
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+#, fuzzy
+msgid "Execute COMMAND"
+msgstr "CÂU LỆNH"
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "Tem thá»i gian không đúng"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "Số thứ tự chỉ mục inode nằm ngoài vùng cho phép"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "Lỗi hệ thống không rõ"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s: Không thể tìm tới %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " dạng tập tin không rõ %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s: Không thể tìm tới %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr ""
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--Tên tập tin há»ng--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "ChÆ°Æ¡ng trình này KHÔNG KÈM THEO BẢO ÄẢM NÀO trong phạm vi cho phép của\n"
+#~ "luật pháp. Bạn có thể phân phối lại theo các Ä‘iá»u khoản của GNU General\n"
+#~ "Public License; Hãy xem tập tin COPYING để biết chi tiết."
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd: Câu lệnh rác %c\n"
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "CẢNH BÃO: Không có phần đầu khối"
+
+#~ msgid "Visible long name error"
+#~ msgstr "Lỗi tên dài"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "Tem thá»i gian nằm ngoài vùng cho phép"
+
+#~ msgid "Device number out of range"
+#~ msgstr "Số thứ tự thiết bị nằm ngoại vùng cho phép"
+
+#~ msgid "Visible longname error"
+#~ msgstr "Lỗi tên dài"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "Äã đổi tên %s thành %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s: Không tạo được liên kết má»m tá»›i %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "Tạo liên kết má»m %s tá»›i %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "Câu lệnh kết gắn không rõ %s"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "Thiếu tên tập tin sau -C"
+
+#~ msgid "don't change access times on dumped files"
+#~ msgstr "không thay đổi thá»i gian truy cập trên những tập tin đã dump"
+
+#~ msgid "extract permissions information"
+#~ msgstr "giải phóng thông tin quyá»n hạn"
+
+#~ msgid "do not extract permissions information"
+#~ msgstr "không giải phóng thông tin quyá»n hạn"
+
+#~ msgid "FILE-OF-NAMES"
+#~ msgstr "TẬP-TIN-TÊN"
+
+#~ msgid "exclude patterns are plain strings"
+#~ msgstr "loại trừ những mẫu là chuỗi đơn giản"
+
+#~ msgid "dump instead the files symlinks point to"
+#~ msgstr "dump tập tin mà liên kết má»m chỉ đến"
+
+#~ msgid "same as -N"
+#~ msgstr "giống như -N"
+
+#~ msgid "exclude patterns use wildcards (default)"
+#~ msgstr "loại trừ mẫu sử dụng các ký tự đặc biệt wildcard (mặc định)"
+
+#~ msgid "print total bytes written while creating archive"
+#~ msgstr "in ra tổng số byte được ghi khi tạo lưu trữ"
+
+#~ msgid "Print license and exit"
+#~ msgstr "In ra bản quyá»n và thoát"
+
+#~ msgid ""
+#~ "Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n"
+#~ "for complete list of authors.\n"
+#~ msgstr ""
+#~ "Dựa trên sản phẩm của John Gilmore và Jay Fenlason. Hãy xem AUTHORS\n"
+#~ "để biết tất cả các tác giả.\n"
+
+#~ msgid ""
+#~ " GNU tar is free software; you can redistribute it and/or modify\n"
+#~ " it under the terms of the GNU General Public License as published by\n"
+#~ " the Free Software Foundation; either version 2 of the License, or\n"
+#~ " (at your option) any later version.\n"
+#~ "\n"
+#~ " GNU tar 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"
+#~ "\n"
+#~ " You should have received a copy of the GNU General Public License\n"
+#~ " along with GNU tar; if not, write to the Free Software\n"
+#~ " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
+#~ "USA\n"
+#~ "\n"
+#~ msgstr ""
+#~ " GNU tar là một chương trình miễn phí. Bạn hoàn toàn có thể phân phối "
+#~ "lại chương\n"
+#~ " trình và/hoặc sửa đổi nó nhưng phải tuân theo những yêu cầu trong giấy "
+#~ "phép bản\n"
+#~ " quyá»n GNU (General Public License của Free Soft ware Foundation); "
+#~ "phiên bản 2\n"
+#~ " hay các phiên bản khác mới hơn (tùy theo ý muốn của bạn).\n"
+#~ "\n"
+#~ " GNU tar được phát hành đến tay các bạn vá»›i hy vá»ng rằng nó sẽ trở nên "
+#~ "hữu ích,\n"
+#~ " nhÆ°ng nó KHÔNG KÈM THEO BẤT KỲ Sá»° BẢO ÄẢM NÀO, ngay cả những đảm\n"
+#~ " bảo ngầm hiểu vỠviệc THƯƠNG MẠI HÓA hay PHẢI PHÙ HỢP VỚI MỘT MỤC "
+#~ "ÄÃCH\n"
+#~ " CỤ THỂ NÀO. Hãy tham khảo giấy phép GNU General Public License để biết "
+#~ "thêm chi tiết.\n"
+#~ "\n"
+#~ " Bạn sẽ nhận được một bản sao của giấy phép GNU General Public License "
+#~ "kèm theo\n"
+#~ " GNU tar, nếu không, bạn có thể viết thư đến Free Software Foundation, "
+#~ "Inc.,\n"
+#~ " 675 Mass Ave, Cambridge, MA 02139, USA\n"
+#~ "\n"
+
+#~ msgid "Semantics of -l option will change in the future releases."
+#~ msgstr "à nghÄ©a của tùy chá»n -I sẽ thay đổi trong những phát hành tá»›i."
+
+#~ msgid "Please use --one-file-system option instead."
+#~ msgstr "Xin hãy sá»­ dụng tùy chá»n --one-file-system để thay thế."
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "Cảnh báo: không há»— trợ tùy chá»n -y, có thể bạn muốn dùng -j?"
+
+#~ msgid "Error in writing to standard output"
+#~ msgstr "Lỗi ghi ra đầu ra tiêu chuẩn"
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
new file mode 100644
index 0000000..8223a42
--- /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..4b712fc
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,2762 @@
+# Chinese (simplified) translation of tar.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Wang Li <charles@linux.net.cn>, 2002.
+# Rongjun Mu <rongjunmu+i18n@gmail.com>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tar 1.14\n"
+"Report-Msgid-Bugs-To: bug-tar@gnu.org\n"
+"POT-Creation-Date: 2007-06-08 11:19+0300\n"
+"PO-Revision-Date: 2004-08-06 23:45+0800\n"
+"Last-Translator: Wang Li <charles@linux.net.cn>\n"
+"Language-Team: Chinese (simplified) <i18n-translation@lists.linux.net.cn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: lib/argmatch.c:134
+#, c-format
+msgid "invalid argument %s for %s"
+msgstr "%2$s çš„å‚æ•° %1$s 无效"
+
+#: lib/argmatch.c:135
+#, c-format
+msgid "ambiguous argument %s for %s"
+msgstr "%2$s çš„å‚æ•° %1$s 具有二义性"
+
+#: lib/argmatch.c:154
+#, c-format
+msgid "Valid arguments are:"
+msgstr "有效的å‚数为:"
+
+#: lib/argp-help.c:148
+#, c-format
+msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+msgstr ""
+
+#: lib/argp-help.c:221
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr ""
+
+#: lib/argp-help.c:227
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+msgstr ""
+
+#: lib/argp-help.c:236
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr ""
+
+#: lib/argp-help.c:248
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr ""
+
+#: lib/argp-help.c:1247
+msgid ""
+"Mandatory or optional arguments to long options are also mandatory or "
+"optional for any corresponding short options."
+msgstr ""
+
+#: lib/argp-help.c:1640
+msgid "Usage:"
+msgstr ""
+
+#: lib/argp-help.c:1644
+msgid " or: "
+msgstr ""
+
+#: lib/argp-help.c:1656
+msgid " [OPTION...]"
+msgstr ""
+
+#: lib/argp-help.c:1683
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "请用“%s --helpâ€èŽ·å¾—更多信æ¯ã€‚\n"
+
+#: lib/argp-help.c:1711 src/tar.c:1169
+#, fuzzy, c-format
+msgid "Report bugs to %s.\n"
+msgstr ""
+"\n"
+"将错误报告到 <%s>。\n"
+
+#: lib/argp-help.c:1930 lib/error.c:125
+msgid "Unknown system error"
+msgstr "未知的系统错误"
+
+#: lib/argp-parse.c:82 src/tar.c:736
+msgid "give this help list"
+msgstr ""
+
+#: lib/argp-parse.c:83 src/tar.c:737
+msgid "give a short usage message"
+msgstr ""
+
+#: lib/argp-parse.c:84 src/tar.c:456 src/tar.c:458 src/tar.c:527
+#: tests/genfile.c:128
+msgid "NAME"
+msgstr ""
+
+#: lib/argp-parse.c:84
+msgid "set the program name"
+msgstr ""
+
+#: lib/argp-parse.c:85
+msgid "SECS"
+msgstr ""
+
+#: lib/argp-parse.c:86 src/tar.c:742
+msgid "hang for SECS seconds (default 3600)"
+msgstr ""
+
+#: lib/argp-parse.c:143 src/tar.c:738
+msgid "print program version"
+msgstr ""
+
+#: lib/argp-parse.c:159
+#, c-format
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: lib/argp-parse.c:612
+#, fuzzy, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s:选项“%sâ€éœ€è¦ä¸€ä¸ªå‚æ•°\n"
+
+#: lib/argp-parse.c:755
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: lib/getopt.c:531 lib/getopt.c:547
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s:选项“%sâ€å…·æœ‰äºŒä¹‰æ€§\n"
+
+#: lib/getopt.c:580 lib/getopt.c:584
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s:选项“--%sâ€ä¸æŽ¥å—å‚æ•°\n"
+
+#: lib/getopt.c:593 lib/getopt.c:598
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s:选项“%c%sâ€ä¸æŽ¥å—å‚æ•°\n"
+
+#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s:选项“%sâ€éœ€è¦ä¸€ä¸ªå‚æ•°\n"
+
+#: lib/getopt.c:698 lib/getopt.c:701
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s:无法识别的选项“--%sâ€\n"
+
+#: lib/getopt.c:709 lib/getopt.c:712
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s:无法识别的选项“%c%sâ€\n"
+
+#: lib/getopt.c:764 lib/getopt.c:767
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s:éžæ³•é€‰é¡¹ -- %c\n"
+
+#: lib/getopt.c:773 lib/getopt.c:776
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s:无效选项 -- %c\n"
+
+#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s:选项需è¦ä¸€ä¸ªå‚æ•° -- %c\n"
+
+#: lib/getopt.c:897 lib/getopt.c:913
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s:选项“-W %sâ€å…·æœ‰äºŒä¹‰æ€§\n"
+
+#: lib/getopt.c:937 lib/getopt.c:955
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s:选项“-W %sâ€ä¸æŽ¥å—å‚æ•°\n"
+
+#: lib/human.c:477
+msgid "block size"
+msgstr "å—大å°"
+
+#: lib/obstack.c:424 lib/obstack.c:426 lib/xalloc-die.c:35 src/extract.c:1377
+msgid "memory exhausted"
+msgstr "内存耗尽"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:58 lib/paxerror.c:71
+#, c-format
+msgid "%s: Cannot %s"
+msgstr "%s:无法 %s"
+
+#. TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+#. Directly translating this to another language will not work, first because
+#. %s itself is not translated.
+#. Translate it as `%s: Function %s failed'.
+#: lib/paxerror.c:84
+#, c-format
+msgid "%s: Warning: Cannot %s"
+msgstr "%s:警告:无法 %s"
+
+#: lib/paxerror.c:93
+#, c-format
+msgid "%s: Cannot change mode to %s"
+msgstr "%s:无法将模å¼æ”¹ä¸º %s"
+
+#: lib/paxerror.c:101
+#, c-format
+msgid "%s: Cannot change ownership to uid %lu, gid %lu"
+msgstr "%s:无法将所有æƒæ”¹ä¸º uid %lu,gid %lu"
+
+#: lib/paxerror.c:127
+#, c-format
+msgid "%s: Cannot hard link to %s"
+msgstr "%s:无法硬连接到 %s"
+
+#: lib/paxerror.c:179 lib/paxerror.c:211
+#, fuzzy, c-format
+msgid "%s: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s:在 %s 字节处å‘生读错误,读入 %lu 字节"
+
+#: lib/paxerror.c:192
+#, fuzzy, c-format
+msgid "%s: Warning: Read error at byte %s, while reading %lu byte"
+msgid_plural "%s: Warning: Read error at byte %s, while reading %lu bytes"
+msgstr[0] "%s:警告:在 %s 字节处å‘生读错误,读入 %lu 字节"
+
+#: lib/paxerror.c:259
+#, c-format
+msgid "%s: Cannot seek to %s"
+msgstr "%s:无法定ä½åˆ° %s"
+
+#: lib/paxerror.c:275
+#, c-format
+msgid "%s: Warning: Cannot seek to %s"
+msgstr "%s:警告:无法定ä½åˆ° %s"
+
+#: lib/paxerror.c:284
+#, c-format
+msgid "%s: Cannot create symlink to %s"
+msgstr "%s:无法创建到 %s 的符å·è¿žæŽ¥"
+
+#: lib/paxerror.c:349
+#, c-format
+msgid "%s: Wrote only %lu of %lu byte"
+msgid_plural "%s: Wrote only %lu of %lu bytes"
+msgstr[0] "%1$s:åªå†™å…¥äº† %3$lu 个中的 %2$lu 个字节"
+
+#: lib/paxnames.c:132
+#, c-format
+msgid "Removing leading `%s' from member names"
+msgstr "从æˆå‘˜å中删除开头的“%sâ€"
+
+#: lib/paxnames.c:133
+#, c-format
+msgid "Removing leading `%s' from hard link targets"
+msgstr "从硬连接目标中删除开头的“%sâ€"
+
+#: lib/paxnames.c:146
+msgid "Substituting `.' for empty member name"
+msgstr "为空æˆå‘˜å替æ¢â€œ.â€"
+
+#: lib/paxnames.c:147
+msgid "Substituting `.' for empty hard link target"
+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
+#. "'". If the catalog has no translation,
+#. locale_quoting_style quotes `like this', and
+#. clocale_quoting_style quotes "like this".
+#.
+#. For example, an American English Unicode locale should
+#. translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+#. should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+#. MARK). A British English Unicode locale should instead
+#. translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+#.
+#. If you don't know what to put here, please see
+#. <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:229
+msgid "`"
+msgstr "“"
+
+#: lib/quotearg.c:230
+msgid "'"
+msgstr "â€"
+
+#: lib/rpmatch.c:70
+msgid "^[yY]"
+msgstr ""
+
+#: lib/rpmatch.c:73
+msgid "^[nN]"
+msgstr ""
+
+#: lib/rtapelib.c:299
+#, c-format
+msgid "exec/tcp: Service not available"
+msgstr "exec/tcp:æœåŠ¡ä¸å¯ç”¨"
+
+#: lib/rtapelib.c:303
+#, c-format
+msgid "stdin"
+msgstr "标准输入"
+
+#: lib/rtapelib.c:306
+#, c-format
+msgid "stdout"
+msgstr "标准输出"
+
+#: lib/rtapelib.c:512
+#, c-format
+msgid "Cannot execute remote shell"
+msgstr "无法执行远程 shell"
+
+#: rmt/rmt.c:142
+msgid "Input string too long"
+msgstr ""
+
+#: rmt/rmt.c:161
+msgid "Number syntax error"
+msgstr ""
+
+#: rmt/rmt.c:180
+msgid "rmtd: Cannot allocate buffer space\n"
+msgstr "rmtd:无法分é…缓冲区空间\n"
+
+#: rmt/rmt.c:182
+msgid "Cannot allocate buffer space"
+msgstr "无法分é…缓冲区空间"
+
+#: rmt/rmt.c:304
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "请用“%s --helpâ€èŽ·å¾—更多信æ¯ã€‚\n"
+
+#: rmt/rmt.c:308
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"Manipulate a tape drive, accepting commands from a remote process.\n"
+"\n"
+" --version Output version info.\n"
+" --help Output this help.\n"
+msgstr ""
+"用法:%s [选项]\n"
+"æ“作ç£å¸¦é©±åŠ¨å™¨ï¼ŒæŽ¥å—æ¥è‡ªè¿œç¨‹è¿›ç¨‹çš„命令。\n"
+"\n"
+" --version 输出版本信æ¯ã€‚\n"
+" --help 输出该求助。\n"
+
+#: rmt/rmt.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"将错误报告到 <%s>。\n"
+
+#: rmt/rmt.c:397
+#, fuzzy
+msgid "Seek offset error"
+msgstr "定ä½æ“作的å移é‡è¶…出范围"
+
+#: rmt/rmt.c:406 rmt/rmt.c:547 rmt/rmt.c:557
+msgid "Seek offset out of range"
+msgstr "定ä½æ“作的å移é‡è¶…出范围"
+
+#: rmt/rmt.c:428
+msgid "Seek direction out of range"
+msgstr "定ä½æ–¹å‘超出范围"
+
+#: rmt/rmt.c:472
+msgid "rmtd: Premature eof\n"
+msgstr "rmtd:过早的 eof\n"
+
+#: rmt/rmt.c:474
+msgid "Premature end of file"
+msgstr "过早的文件结尾"
+
+#: rmt/rmt.c:672
+msgid "Garbage command"
+msgstr "垃圾命令"
+
+#: src/buffer.c:326 src/buffer.c:335
+#, fuzzy
+msgid "Total bytes written"
+msgstr "总计写入字节数:%s (%s,%s/s)\n"
+
+#: src/buffer.c:333 src/buffer.c:347
+msgid "Total bytes read"
+msgstr ""
+
+#: src/buffer.c:337
+#, fuzzy, c-format
+msgid "Total bytes deleted: %s\n"
+msgstr "总计写入字节数:%s (%s,%s/s)\n"
+
+#: src/buffer.c:426
+msgid "(pipe)"
+msgstr "(管é“)"
+
+#: src/buffer.c:449
+msgid "Invalid value for record_size"
+msgstr "record_size 的无效值"
+
+#: src/buffer.c:452
+msgid "No archive name given"
+msgstr "未给出归档文件å"
+
+#: src/buffer.c:496
+msgid "Cannot verify stdin/stdout archive"
+msgstr "无法验è¯æ ‡å‡†è¾“å…¥/标准输出归档文件"
+
+#: src/buffer.c:509
+#, c-format
+msgid "Archive is compressed. Use %s option"
+msgstr ""
+
+#: src/buffer.c:556 src/tar.c:2187
+msgid "Cannot update compressed archives"
+msgstr "无法更新压缩归档文件"
+
+#. TRANSLATORS: This is a ``checkpoint of write operation'',
+#. *not* ``Writing a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+#. *not* ``Escribiendo un punto de comprobaci@'on''
+#: src/buffer.c:606
+#, fuzzy, c-format
+msgid "Write checkpoint %u"
+msgstr "写入检查点 %d"
+
+#. TRANSLATORS: This is a ``checkpoint of read operation'',
+#. *not* ``Reading a checkpoint''.
+#. E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+#. *not* ``Leyendo un punto de comprobaci@'on''
+#: src/buffer.c:612
+#, fuzzy, c-format
+msgid "Read checkpoint %u"
+msgstr "读入检查点 %d"
+
+#: src/buffer.c:664
+msgid "At beginning of tape, quitting now"
+msgstr "处于ç£å¸¦çš„起点,现在退出"
+
+#: src/buffer.c:670
+msgid "Too many errors, quitting"
+msgstr "错误过多,退出"
+
+#: src/buffer.c:698
+#, c-format
+msgid "Unaligned block (%lu byte) in archive"
+msgid_plural "Unaligned block (%lu bytes) in archive"
+msgstr[0] "归档中未对é½çš„å— (%lu 字节)s"
+
+#: src/buffer.c:718
+#, c-format
+msgid "Record size = %lu block"
+msgid_plural "Record size = %lu blocks"
+msgstr[0] "è®°å½•å¤§å° = %lu å—"
+
+#: src/buffer.c:791
+msgid "Cannot backspace archive file; it may be unreadable without -i"
+msgstr "无法倒回归档文件;如果没有 -i å¯èƒ½æ— æ³•è¯»å…¥å®ƒ"
+
+#: src/buffer.c:823
+msgid "rmtlseek not stopped at a record boundary"
+msgstr ""
+
+#: src/buffer.c:879
+#, c-format
+msgid "%s: contains invalid volume number"
+msgstr "%s:包å«æ— æ•ˆçš„å·ç¼–å·"
+
+#: src/buffer.c:914
+msgid "Volume number overflow"
+msgstr "å·ç¼–å·æº¢å‡º"
+
+#: src/buffer.c:929
+#, c-format
+msgid "Prepare volume #%d for %s and hit return: "
+msgstr "为 %2$s å‡†å¤‡å· #%1$d 并按回车:"
+
+#: src/buffer.c:935
+msgid "EOF where user reply was expected"
+msgstr "需得到用户应答时文件结æŸ"
+
+#: src/buffer.c:940 src/buffer.c:972
+msgid "WARNING: Archive is incomplete"
+msgstr "警告:归档文件ä¸å®Œæ•´"
+
+#: src/buffer.c:954
+#, fuzzy, c-format
+msgid ""
+" n name Give a new file name for the next (and subsequent) volume(s)\n"
+" q Abort tar\n"
+" y or newline Continue operation\n"
+msgstr ""
+" n [name] 给下一å·(以åŠä»¥åŽçš„å·)å–一个新文件å\n"
+" q 终止 tar\n"
+" ! å¦èµ·ä¸€ä¸ªå­ shell\n"
+" ? 显示本列表\n"
+
+#: src/buffer.c:959
+#, c-format
+msgid " ! Spawn a subshell\n"
+msgstr ""
+
+#: src/buffer.c:960
+#, c-format
+msgid " ? Print this list\n"
+msgstr ""
+
+#: src/buffer.c:967
+msgid "No new volume; exiting.\n"
+msgstr "没有新的å·ï¼›é€€å‡ºã€‚\n"
+
+#: src/buffer.c:1000
+msgid "File name not specified. Try again.\n"
+msgstr ""
+
+#: src/buffer.c:1013
+#, c-format
+msgid "Invalid input. Type ? for help.\n"
+msgstr ""
+
+#: src/buffer.c:1064
+#, fuzzy, c-format
+msgid "%s command failed"
+msgstr "“%sâ€å‘½ä»¤å¤±è´¥"
+
+#: src/buffer.c:1126 src/delete.c:210 src/list.c:167 src/update.c:165
+msgid "This does not look like a tar archive"
+msgstr "它似乎ä¸åƒæ˜¯ä¸€ä¸ª tar 归档文件"
+
+#: src/buffer.c:1219
+#, fuzzy, c-format
+msgid "%s is possibly continued on this volume: header contains truncated name"
+msgstr "%s 在本å·ä¸­ä¸è¿žç»­"
+
+#: src/buffer.c:1223
+#, c-format
+msgid "%s is not continued on this volume"
+msgstr "%s 在本å·ä¸­ä¸è¿žç»­"
+
+#: src/buffer.c:1237
+#, c-format
+msgid "%s is the wrong size (%s != %s + %s)"
+msgstr "%s 的大å°é”™è¯¯ (%s != %s + %s)"
+
+#: src/buffer.c:1247
+msgid "This volume is out of sequence"
+msgstr "æ­¤å·æ¬¡åºæœ‰è¯¯"
+
+#: src/buffer.c:1293
+#, c-format
+msgid "Archive not labeled to match %s"
+msgstr "å½’æ¡£æœªè¢«æ ‡è®°ä¸ºåŒ¹é… %s"
+
+#: src/buffer.c:1296
+#, c-format
+msgid "Volume %s does not match %s"
+msgstr "å·æ ‡ %s ä¸åŒ¹é… %s"
+
+#: src/buffer.c:1392
+#, c-format
+msgid ""
+"%s: file name too long to be stored in a GNU multivolume header, truncated"
+msgstr ""
+
+#: src/compare.c:96
+#, c-format
+msgid "Could only read %lu of %lu byte"
+msgid_plural "Could only read %lu of %lu bytes"
+msgstr[0] "仅能读入 %2$lu 中的 %1$lu 个字节"
+
+#: src/compare.c:106 src/compare.c:388
+msgid "Contents differ"
+msgstr "内容ä¸åŒ"
+
+#: src/compare.c:132 src/extract.c:790 src/incremen.c:1193 src/list.c:372
+#: src/list.c:1314
+msgid "Unexpected EOF in archive"
+msgstr "归档文件中异常的 EOF"
+
+#: src/compare.c:180 src/compare.c:196 src/compare.c:314 src/compare.c:412
+msgid "File type differs"
+msgstr "文件类型ä¸åŒ"
+
+#: src/compare.c:183 src/compare.c:203 src/compare.c:328
+msgid "Mode differs"
+msgstr "访问模å¼ä¸åŒ"
+
+#: src/compare.c:206
+msgid "Uid differs"
+msgstr "Uid ä¸åŒ"
+
+#: src/compare.c:208
+msgid "Gid differs"
+msgstr "Gid ä¸åŒ"
+
+#: src/compare.c:212
+msgid "Mod time differs"
+msgstr "修改时间ä¸åŒ"
+
+#: src/compare.c:216 src/compare.c:420
+msgid "Size differs"
+msgstr "大å°ä¸åŒ"
+
+#: src/compare.c:270
+#, c-format
+msgid "Not linked to %s"
+msgstr "没有连接到 %s"
+
+#: src/compare.c:293
+msgid "Symlink differs"
+msgstr "符å·è¿žæŽ¥ä¸åŒ"
+
+#: src/compare.c:322
+msgid "Device number differs"
+msgstr "设备å·ä¸åŒ"
+
+#: src/compare.c:462
+#, c-format
+msgid "Verify "
+msgstr "校验"
+
+#: src/compare.c:469
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', diffed as normal file"
+msgstr "%s:未知的文件类型“%câ€ï¼Œä¸Žæ™®é€šæ–‡ä»¶ä¸åŒ"
+
+#: src/compare.c:524
+msgid "Archive contains file names with leading prefixes removed."
+msgstr ""
+
+#: src/compare.c:526
+msgid "Verification may fail to locate original files."
+msgstr ""
+
+#: src/compare.c:596
+#, c-format
+msgid "VERIFY FAILURE: %d invalid header detected"
+msgid_plural "VERIFY FAILURE: %d invalid headers detected"
+msgstr[0] "校验失败:检测到 %d 个无效的头"
+
+#: src/create.c:67
+#, fuzzy, c-format
+msgid "%s: contains a cache directory tag %s; %s"
+msgstr "%s:连接å太长;未输出"
+
+#: src/create.c:270
+#, c-format
+msgid "value %s out of %s range %s..%s; substituting %s"
+msgstr "值 %s 超出了 %s 的范围 %s..%sï¼›æ­£åœ¨æ›¿æ¢ %s"
+
+#: src/create.c:276
+#, c-format
+msgid "value %s out of %s range %s..%s"
+msgstr "值 %s 超出了 %s 的范围 %s..%s"
+
+#: src/create.c:336
+msgid "Generating negative octal headers"
+msgstr "正在生æˆè´Ÿå…«è¿›åˆ¶å¤´"
+
+#: src/create.c:622 src/create.c:685
+#, c-format
+msgid "%s: file name is too long (max %d); not dumped"
+msgstr "%s:文件å太长(最长 %d);未输出"
+
+#: src/create.c:632
+#, c-format
+msgid "%s: file name is too long (cannot be split); not dumped"
+msgstr "%s:文件å太长(ä¸èƒ½è¢«åˆ†å‰²);未输出"
+
+#: src/create.c:659
+#, c-format
+msgid "%s: link name is too long; not dumped"
+msgstr "%s:连接å太长;未输出"
+
+#: src/create.c:1075
+#, c-format
+msgid "%s: File shrank by %s byte; padding with zeros"
+msgid_plural "%s: File shrank by %s bytes; padding with zeros"
+msgstr[0] "%sï¼šæ–‡ä»¶ç¼©å° %s 字节;用零填充"
+
+#: src/create.c:1176
+#, c-format
+msgid "%s: file is on a different filesystem; not dumped"
+msgstr "%s:文件在ä¸åŒçš„文件系统上;未输出"
+
+#: src/create.c:1217 src/create.c:1228
+msgid "contents not dumped"
+msgstr ""
+
+#: src/create.c:1357
+#, c-format
+msgid "%s: Unknown file type; file ignored"
+msgstr "%s:未知的文件类型;忽略文件"
+
+#: src/create.c:1458
+#, fuzzy, c-format
+msgid "Missing links to %s.\n"
+msgstr "缺少到“%sâ€çš„连接。\n"
+
+#: src/create.c:1529
+#, c-format
+msgid "%s: file is unchanged; not dumped"
+msgstr "%s:文件未改å˜ï¼›æœªè¾“出"
+
+#: src/create.c:1537
+#, c-format
+msgid "%s: file is the archive; not dumped"
+msgstr "%s:文件是归档文件;未输出"
+
+#: src/create.c:1567
+#, c-format
+msgid "%s: File removed before we read it"
+msgstr "%s:文件在我们读入之å‰è¢«åˆ é™¤äº†"
+
+#: src/create.c:1585
+#, fuzzy
+msgid "directory not dumped"
+msgstr "%s:连接å太长;未输出"
+
+#: src/create.c:1654
+#, c-format
+msgid "%s: file changed as we read it"
+msgstr "%s:在我们读入文件时文件å‘生了å˜åŒ–"
+
+#: src/create.c:1733
+#, c-format
+msgid "%s: socket ignored"
+msgstr "%s:忽略套接字(socket)"
+
+#: src/create.c:1738
+#, c-format
+msgid "%s: door ignored"
+msgstr ""
+
+#: src/delete.c:216 src/list.c:181 src/update.c:170
+msgid "Skipping to next header"
+msgstr "跳转到下一个头"
+
+#: src/delete.c:281
+msgid "Deleting non-header from archive"
+msgstr "从归档文件中删除éžå¤´ä¿¡æ¯"
+
+#: src/extract.c:198
+#, c-format
+msgid "%s: implausibly old time stamp %s"
+msgstr "%s:ä¸å¯ä¿¡çš„旧时间戳 %s"
+
+#: src/extract.c:215
+#, fuzzy, c-format
+msgid "%s: time stamp %s is %s s in the future"
+msgstr "%s:时间戳 %s 是将æ¥çš„ %lu 秒之åŽ"
+
+#: src/extract.c:395
+#, c-format
+msgid "%s: Unexpected inconsistency when making directory"
+msgstr "%s:创建目录时出现æ„外的ä¸ä¸€è‡´"
+
+#: src/extract.c:588
+#, c-format
+msgid "%s: Directory renamed before its status could be extracted"
+msgstr "%s:目录å在状æ€ä¿¡æ¯è¢«èŽ·å–之å‰æ”¹å˜äº†"
+
+#: src/extract.c:724
+msgid "Extracting contiguous files as regular files"
+msgstr "展开紧邻的文件为普通文件"
+
+#: src/extract.c:1000
+msgid "Attempting extraction of symbolic links as hard links"
+msgstr "正试图将符å·è¿žæŽ¥å±•å¼€ä¸ºç¡¬è¿žæŽ¥"
+
+#: src/extract.c:1057
+#, c-format
+msgid "Reading %s\n"
+msgstr "正在读入 %s\n"
+
+#: src/extract.c:1146
+#, c-format
+msgid "%s: Cannot extract -- file is continued from another volume"
+msgstr "%s:无法展开 -- 文件一直æŒç»­åˆ°å¦ä¸€å·ä¸­"
+
+#: src/extract.c:1153 src/list.c:1081
+#, fuzzy
+msgid "Unexpected long name header"
+msgstr "转æ¢çš„文件å中有异常的 EOF"
+
+#: src/extract.c:1159
+#, fuzzy, c-format
+msgid "%s: Unknown file type `%c', extracted as normal file"
+msgstr "%s:未知的文件类型“%câ€ï¼Œä½œä¸ºæ™®é€šæ–‡ä»¶è¿›è¡Œå±•å¼€"
+
+#: src/extract.c:1184
+#, fuzzy, c-format
+msgid "Current %s is newer or same age"
+msgstr "当å‰çš„“%sâ€æ›´æ–°"
+
+#: src/extract.c:1230
+#, c-format
+msgid "%s: Was unable to backup this file"
+msgstr "%s:无法备份该文件"
+
+#: src/extract.c:1358
+#, fuzzy, c-format
+msgid "Cannot rename %s to %s"
+msgstr "%s:无法é‡å‘½å为 %s"
+
+#: src/extract.c:1370
+#, c-format
+msgid "Error is not recoverable: exiting now"
+msgstr "错误ä¸å¯æ¢å¤ï¼šçŽ°åœ¨é€€å‡º"
+
+#: src/incremen.c:260 src/incremen.c:300
+#, fuzzy, c-format
+msgid "%s: Directory has been renamed from %s"
+msgstr "%s:目录已被改å"
+
+#: src/incremen.c:270
+#, c-format
+msgid "%s: Directory has been renamed"
+msgstr "%s:目录已被改å"
+
+#: src/incremen.c:311
+#, c-format
+msgid "%s: Directory is new"
+msgstr "%s:目录是新的"
+
+#: src/incremen.c:699 src/incremen.c:716
+msgid "Invalid time stamp"
+msgstr "无效的时间戳"
+
+#: src/incremen.c:755
+#, fuzzy
+msgid "Invalid modification time (seconds)"
+msgstr "选项中给出无效的访问模å¼"
+
+#: src/incremen.c:770
+msgid "Invalid modification time (nanoseconds)"
+msgstr ""
+
+#: src/incremen.c:790
+msgid "Invalid device number"
+msgstr "无效的设备å·"
+
+#: src/incremen.c:805
+msgid "Invalid inode number"
+msgstr "无效的 inode å·"
+
+#: src/incremen.c:856 src/incremen.c:893
+msgid "Field too long while reading snapshot file"
+msgstr ""
+
+#: src/incremen.c:863 src/incremen.c:901
+msgid "Read error in snapshot file"
+msgstr ""
+
+#: src/incremen.c:865 src/incremen.c:905 src/incremen.c:957
+#: src/incremen.c:1015
+#, fuzzy
+msgid "Unexpected EOF in snapshot file"
+msgstr "归档文件中异常的 EOF"
+
+#: src/incremen.c:872 src/incremen.c:912
+msgid "Unexpected field value in snapshot file"
+msgstr ""
+
+#: src/incremen.c:1007
+msgid "Missing record terminator"
+msgstr ""
+
+#: src/incremen.c:1058 src/incremen.c:1061
+msgid "Bad incremental file format"
+msgstr ""
+
+#: src/incremen.c:1080
+#, c-format
+msgid "Unsupported incremental format version: %<PRIuMAX>"
+msgstr ""
+
+#: src/incremen.c:1233
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found %#3o"
+msgstr ""
+
+#: src/incremen.c:1243
+msgid "Malformed dumpdir: 'X' duplicated"
+msgstr ""
+
+#: src/incremen.c:1256
+msgid "Malformed dumpdir: empty name in 'R'"
+msgstr ""
+
+#: src/incremen.c:1269
+msgid "Malformed dumpdir: 'T' not preceeded by 'R'"
+msgstr ""
+
+#: src/incremen.c:1275
+msgid "Malformed dumpdir: empty name in 'T'"
+msgstr ""
+
+#: src/incremen.c:1295
+#, c-format
+msgid "Malformed dumpdir: expected '%c' but found end of data"
+msgstr ""
+
+#: src/incremen.c:1301
+msgid "Malformed dumpdir: 'X' never used"
+msgstr ""
+
+#: src/incremen.c:1344
+#, fuzzy, c-format
+msgid "Cannot create temporary directory using template %s"
+msgstr "无法为å—å› å­(blocking factor) %d 分é…内存"
+
+#: src/incremen.c:1392
+#, c-format
+msgid "%s: Not purging directory: unable to stat"
+msgstr ""
+
+#: src/incremen.c:1405
+#, fuzzy, c-format
+msgid "%s: directory is on a different device: not purging"
+msgstr "%s:文件在ä¸åŒçš„文件系统上;未输出"
+
+#: src/incremen.c:1413
+#, c-format
+msgid "%s: Deleting %s\n"
+msgstr "%s:正在删除 %s\n"
+
+#: src/incremen.c:1418
+#, c-format
+msgid "%s: Cannot remove"
+msgstr "%s:无法删除"
+
+#: src/list.c:113
+#, c-format
+msgid "%s: Omitting"
+msgstr "%s:忽略"
+
+#: src/list.c:131
+#, c-format
+msgid "block %s: ** Block of NULs **\n"
+msgstr "å— %s:** ç©ºå— **\n"
+
+#: src/list.c:144
+#, c-format
+msgid "A lone zero block at %s"
+msgstr "在 %s 处一个å•ç‹¬çš„零å—"
+
+#: src/list.c:155
+#, c-format
+msgid "block %s: ** End of File **\n"
+msgstr "å— %s:** æ–‡ä»¶ç»“æŸ **\n"
+
+#: src/list.c:178 src/list.c:1054 src/list.c:1282
+#, c-format
+msgid "block %s: "
+msgstr "å— %s:"
+
+#. TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.)
+#: src/list.c:662
+#, c-format
+msgid "Blanks in header where numeric %s value expected"
+msgstr "头中需è¦æ•°å€¼ %s 处为空白符"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:717
+#, c-format
+msgid "Archive octal value %.*s is out of %s range; assuming two's complement"
+msgstr "归档的八进制值 %.*s 超出范围 %sï¼›å‡å®šä¸ºå…¶äºŒè¿›åˆ¶è¡¥"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:728
+#, c-format
+msgid "Archive octal value %.*s is out of %s range"
+msgstr "归档八进制值 %.*s 超出 %s 的范围"
+
+#: src/list.c:749
+msgid "Archive contains obsolescent base-64 headers"
+msgstr "归档包å«è¿‡æ—¶çš„ base-64 头"
+
+#: src/list.c:763
+#, c-format
+msgid "Archive signed base-64 string %s is out of %s range"
+msgstr "归档签署的 base-64 字符串 %s 超出范围 %s"
+
+#: src/list.c:794
+#, c-format
+msgid "Archive base-256 value is out of %s range"
+msgstr "归档的 base-256 值超出范围 %s"
+
+#. TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.)
+#: src/list.c:823
+#, c-format
+msgid "Archive contains %.*s where numeric %s value expected"
+msgstr ""
+
+#. TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.)
+#: src/list.c:845
+#, fuzzy, c-format
+msgid "Archive value %s is out of %s range %s..%s"
+msgstr "归档值 %s 超出 %s 的范围 %s.%s"
+
+#: src/list.c:1217
+#, c-format
+msgid " link to %s\n"
+msgstr " 连接到 %s\n"
+
+#: src/list.c:1225
+#, c-format
+msgid " unknown file type %s\n"
+msgstr " 未知的文件类型 %s\n"
+
+#: src/list.c:1243
+#, c-format
+msgid "--Long Link--\n"
+msgstr "--长连接--\n"
+
+#: src/list.c:1247
+#, c-format
+msgid "--Long Name--\n"
+msgstr "--é•¿å--\n"
+
+#: src/list.c:1251
+#, c-format
+msgid "--Volume Header--\n"
+msgstr "--å·å¤´--\n"
+
+#: src/list.c:1259
+#, c-format
+msgid "--Continued at byte %s--\n"
+msgstr "--从 %s 字节继续--\n"
+
+#: src/list.c:1287
+msgid "Creating directory:"
+msgstr "正在创建目录:"
+
+#: src/misc.c:456
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "å°† %s 改å为 %s\n"
+
+#: src/misc.c:465 src/misc.c:483
+#, c-format
+msgid "%s: Cannot rename to %s"
+msgstr "%s:无法é‡å‘½å为 %s"
+
+#: src/misc.c:488
+#, c-format
+msgid "Renaming %s back to %s\n"
+msgstr "å°† %s çš„å字改回 %s\n"
+
+#: src/misc.c:615
+msgid "Cannot save working directory"
+msgstr "无法ä¿å­˜å·¥ä½œç›®å½•"
+
+#: src/misc.c:621
+msgid "Cannot change working directory"
+msgstr "无法改å˜å·¥ä½œç›®å½•"
+
+#: src/misc.c:711
+msgid "child process"
+msgstr "å­è¿›ç¨‹"
+
+#: src/misc.c:720
+msgid "interprocess channel"
+msgstr "进程内通é“"
+
+#. TRANSLATORS: The following three msgids form a single sentence.
+#.
+#: src/names.c:599
+msgid "Pattern matching characters used in file names. Please,"
+msgstr ""
+
+#: src/names.c:601
+msgid "use --wildcards to enable pattern matching, or --no-wildcards to"
+msgstr ""
+
+#: src/names.c:603
+msgid "suppress this warning."
+msgstr ""
+
+#: src/names.c:618 src/names.c:636
+#, c-format
+msgid "%s: Not found in archive"
+msgstr "%s:归档中找ä¸åˆ°"
+
+#: src/names.c:621
+#, c-format
+msgid "%s: Required occurrence not found in archive"
+msgstr "%s:没有在归档中找到需è¦çš„"
+
+#: src/tar.c:80
+#, c-format
+msgid "Options `-%s' and `-%s' both want standard input"
+msgstr "选项“-%sâ€å’Œâ€œ-%sâ€éƒ½éœ€è¦æ ‡å‡†è¾“出"
+
+#: src/tar.c:157
+#, c-format
+msgid "%s: Invalid archive format"
+msgstr "%s:无效的归档格å¼"
+
+#: src/tar.c:181
+msgid "GNU features wanted on incompatible archive format"
+msgstr "在ä¸å…¼å®¹çš„归档格å¼ä¸Šéœ€è¦ GNU 特å¾"
+
+#: src/tar.c:242
+#, c-format
+msgid ""
+"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."
+msgstr ""
+
+#: src/tar.c:329
+#, fuzzy
+msgid ""
+"GNU `tar' saves many files together into a single tape or disk archive, and "
+"can restore individual files from the archive.\n"
+"\n"
+"Examples:\n"
+" tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n"
+" tar -tvf archive.tar # List all files in archive.tar verbosely.\n"
+" tar -xf archive.tar # Extract all files from archive.tar.\n"
+msgstr ""
+"\n"
+"用法:%s [选项]... [文件]...\n"
+"\n"
+"示例:\n"
+" %s -cf archive.tar foo bar # 从文件 foo 和 bar 创建归档文件 archive."
+"tar。\n"
+" %s -tvf archive.tar # 详细列举归档文件 archive.tar 中的所有文件。\n"
+" %s -xf archive.tar # 展开归档文件 archive.tar 中的所有文件。\n"
+
+#: src/tar.c:338
+#, fuzzy
+msgid ""
+"The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n"
+"The version control may be set with --backup or VERSION_CONTROL, values "
+"are:\n"
+"\n"
+" none, off never make backups\n"
+" t, numbered make numbered backups\n"
+" nil, existing numbered if numbered backups exist, simple otherwise\n"
+" never, simple always make simple backups\n"
+msgstr ""
+"\n"
+"除éžä»¥ --suffix 或 SIMPLE_BACKUP_SUFFIX 设置备份åŽç¼€ï¼Œå¦åˆ™å¤‡ä»½åŽç¼€å°±æ˜¯â€œ~â€ã€‚\n"
+"å¯ä»¥ç”¨ --backup 或 VERSION_CONTROL 设置版本控制,å¯èƒ½çš„值为:\n"
+"\n"
+" t, numbered 进行编å·å¤‡ä»½\n"
+" nil, existing 如果编å·å¤‡ä»½å­˜åœ¨åˆ™è¿›è¡Œç¼–å·å¤‡ä»½ï¼Œå¦åˆ™è¿›è¡Œç®€å•å¤‡ä»½\n"
+" never, simple 总是使用简å•å¤‡ä»½\n"
+
+#: src/tar.c:364
+msgid "Main operation mode:"
+msgstr ""
+
+#: src/tar.c:367
+msgid "list the contents of an archive"
+msgstr ""
+
+#: src/tar.c:369
+msgid "extract files from an archive"
+msgstr ""
+
+#: src/tar.c:372
+#, fuzzy
+msgid "create a new archive"
+msgstr "归档文件中异常的 EOF"
+
+#: src/tar.c:374
+msgid "find differences between archive and file system"
+msgstr ""
+
+#: src/tar.c:377
+msgid "append files to the end of an archive"
+msgstr ""
+
+#: src/tar.c:379
+msgid "only append files newer than copy in archive"
+msgstr ""
+
+#: src/tar.c:381
+msgid "append tar files to an archive"
+msgstr ""
+
+#: src/tar.c:384
+msgid "delete from the archive (not on mag tapes!)"
+msgstr ""
+
+#: src/tar.c:386
+msgid "test the archive volume label and exit"
+msgstr ""
+
+#: src/tar.c:391
+msgid "Operation modifiers:"
+msgstr ""
+
+#: src/tar.c:394
+msgid "handle sparse files efficiently"
+msgstr ""
+
+#: src/tar.c:395
+msgid "MAJOR[.MINOR]"
+msgstr ""
+
+#: src/tar.c:396
+msgid "set version of the sparse format to use (implies --sparse)"
+msgstr ""
+
+#: src/tar.c:398
+msgid "handle old GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:399 src/tar.c:530 src/tar.c:594 src/tar.c:598 src/tar.c:608
+#: src/tar.c:618 src/tar.c:621 src/tar.c:623 src/tar.c:698 tests/genfile.c:130
+#: tests/genfile.c:178 tests/genfile.c:182 tests/genfile.c:185
+msgid "FILE"
+msgstr ""
+
+#: src/tar.c:400
+msgid "handle new GNU-format incremental backup"
+msgstr ""
+
+#: src/tar.c:402
+msgid "do not exit with nonzero on unreadable files"
+msgstr ""
+
+#: src/tar.c:403 src/tar.c:525 src/tar.c:540 src/tar.c:651 tests/genfile.c:164
+msgid "NUMBER"
+msgstr ""
+
+#: src/tar.c:404
+msgid ""
+"process only the NUMBERth occurrence of each file in the archive; this "
+"option is valid only in conjunction with one of the subcommands --delete, --"
+"diff, --extract or --list and when a list of files is given either on the "
+"command line or via the -T option; NUMBER defaults to 1"
+msgstr ""
+
+#: src/tar.c:410
+msgid "archive is seekable"
+msgstr ""
+
+#: src/tar.c:415
+msgid "Overwrite control:"
+msgstr ""
+
+#: src/tar.c:418
+msgid "attempt to verify the archive after writing it"
+msgstr ""
+
+#: src/tar.c:420
+msgid "remove files after adding them to the archive"
+msgstr ""
+
+#: src/tar.c:422
+msgid "don't replace existing files when extracting"
+msgstr ""
+
+#: src/tar.c:424
+msgid "don't replace existing files that are newer than their archive copies"
+msgstr ""
+
+#: src/tar.c:426
+msgid "overwrite existing files when extracting"
+msgstr ""
+
+#: src/tar.c:428
+msgid "remove each file prior to extracting over it"
+msgstr ""
+
+#: src/tar.c:430
+msgid "empty hierarchies prior to extracting directory"
+msgstr ""
+
+#: src/tar.c:432
+msgid "preserve metadata of existing directories"
+msgstr ""
+
+#: src/tar.c:434
+msgid "overwrite metadata of existing directories when extracting (default)"
+msgstr ""
+
+#: src/tar.c:440
+msgid "Select output stream:"
+msgstr ""
+
+#: src/tar.c:443
+#, fuzzy
+msgid "extract files to standard output"
+msgstr "写入标准输出时出错"
+
+#: src/tar.c:444 src/tar.c:503 src/tar.c:505 tests/genfile.c:161
+#: tests/genfile.c:188
+msgid "COMMAND"
+msgstr ""
+
+#: src/tar.c:445
+msgid "pipe extracted files to another program"
+msgstr ""
+
+#: src/tar.c:447
+msgid "ignore exit codes of children"
+msgstr ""
+
+#: src/tar.c:449
+msgid "treat non-zero exit codes of children as error"
+msgstr ""
+
+#: src/tar.c:454
+msgid "Handling of file attributes:"
+msgstr ""
+
+#: src/tar.c:457
+msgid "force NAME as owner for added files"
+msgstr ""
+
+#: src/tar.c:459
+msgid "force NAME as group for added files"
+msgstr ""
+
+#: src/tar.c:460 src/tar.c:637
+msgid "DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:461
+msgid "set mtime for added files from DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:462
+msgid "CHANGES"
+msgstr ""
+
+#: src/tar.c:463
+msgid "force (symbolic) mode CHANGES for added files"
+msgstr ""
+
+#: src/tar.c:465
+msgid "METHOD"
+msgstr ""
+
+#: src/tar.c:466
+msgid ""
+"preserve access times on dumped files, either by restoring the times after "
+"reading (METHOD='replace'; default) or by not setting the times in the first "
+"place (METHOD='system')"
+msgstr ""
+
+#: src/tar.c:470
+msgid "don't extract file modified time"
+msgstr ""
+
+#: src/tar.c:472
+msgid "try extracting files with the same ownership"
+msgstr ""
+
+#: src/tar.c:474
+msgid "extract files as yourself"
+msgstr ""
+
+#: src/tar.c:476
+msgid "always use numbers for user/group names"
+msgstr ""
+
+#: src/tar.c:478
+msgid "extract information about file permissions (default for superuser)"
+msgstr ""
+
+#: src/tar.c:482
+msgid ""
+"apply the user's umask when extracting permissions from the archive (default "
+"for ordinary users)"
+msgstr ""
+
+#: src/tar.c:484
+msgid "sort names to extract to match archive"
+msgstr ""
+
+#: src/tar.c:487
+msgid "same as both -p and -s"
+msgstr ""
+
+#: src/tar.c:489
+msgid ""
+"delay setting modification times and permissions of extracted directories "
+"until the end of extraction"
+msgstr ""
+
+#: src/tar.c:492
+msgid "cancel the effect of --delay-directory-restore option"
+msgstr ""
+
+#: src/tar.c:497
+msgid "Device selection and switching:"
+msgstr ""
+
+#: src/tar.c:499
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/tar.c:500
+msgid "use archive file or device ARCHIVE"
+msgstr ""
+
+#: src/tar.c:502
+msgid "archive file is local even if it has a colon"
+msgstr ""
+
+#: src/tar.c:504
+msgid "use given rmt COMMAND instead of rmt"
+msgstr ""
+
+#: src/tar.c:506
+msgid "use remote COMMAND instead of rsh"
+msgstr ""
+
+#: src/tar.c:510
+msgid "specify drive and density"
+msgstr ""
+
+#: src/tar.c:524
+#, fuzzy
+msgid "create/list/extract multi-volume archive"
+msgstr "无法检验多å·å½’档文件"
+
+#: src/tar.c:526
+msgid "change tape after writing NUMBER x 1024 bytes"
+msgstr ""
+
+#: src/tar.c:528
+msgid "run script at end of each tape (implies -M)"
+msgstr ""
+
+#: src/tar.c:531
+msgid "use/update the volume number in FILE"
+msgstr ""
+
+#: src/tar.c:536
+msgid "Device blocking:"
+msgstr ""
+
+#: src/tar.c:538
+msgid "BLOCKS"
+msgstr ""
+
+#: src/tar.c:539
+msgid "BLOCKS x 512 bytes per record"
+msgstr ""
+
+#: src/tar.c:541
+msgid "NUMBER of bytes per record, multiple of 512"
+msgstr ""
+
+#: src/tar.c:543
+msgid "ignore zeroed blocks in archive (means EOF)"
+msgstr ""
+
+#: src/tar.c:545
+msgid "reblock as we read (for 4.2BSD pipes)"
+msgstr ""
+
+#: src/tar.c:550
+msgid "Archive format selection:"
+msgstr ""
+
+#: src/tar.c:552 tests/genfile.c:151
+msgid "FORMAT"
+msgstr ""
+
+#: src/tar.c:553
+msgid "create archive of the given format"
+msgstr ""
+
+#: src/tar.c:555
+msgid "FORMAT is one of the following:"
+msgstr ""
+
+#: src/tar.c:556
+msgid "old V7 tar format"
+msgstr ""
+
+#: src/tar.c:559
+msgid "GNU format as per tar <= 1.12"
+msgstr ""
+
+#: src/tar.c:561
+msgid "GNU tar 1.13.x format"
+msgstr ""
+
+#: src/tar.c:563
+msgid "POSIX 1003.1-1988 (ustar) format"
+msgstr ""
+
+#: src/tar.c:565
+msgid "POSIX 1003.1-2001 (pax) format"
+msgstr ""
+
+#: src/tar.c:566
+msgid "same as pax"
+msgstr ""
+
+#: src/tar.c:569
+msgid "same as --format=v7"
+msgstr ""
+
+#: src/tar.c:572
+msgid "same as --format=posix"
+msgstr ""
+
+#: src/tar.c:573
+msgid "keyword[[:]=value][,keyword[[:]=value]]..."
+msgstr ""
+
+#: src/tar.c:574
+msgid "control pax keywords"
+msgstr ""
+
+#: src/tar.c:575
+msgid "TEXT"
+msgstr ""
+
+#: src/tar.c:576
+msgid ""
+"create archive with volume name TEXT; at list/extract time, use TEXT as a "
+"globbing pattern for volume name"
+msgstr ""
+
+#: src/tar.c:578
+msgid "filter the archive through bzip2"
+msgstr ""
+
+#: src/tar.c:580
+#, fuzzy
+msgid "filter the archive through gzip"
+msgstr "%s:文件是归档文件;未输出"
+
+#: src/tar.c:584
+#, fuzzy
+msgid "filter the archive through compress"
+msgstr "%s:文件是归档文件;未输出"
+
+#: src/tar.c:586
+msgid "PROG"
+msgstr ""
+
+#: src/tar.c:587
+msgid "filter through PROG (must accept -d)"
+msgstr ""
+
+#: src/tar.c:592
+msgid "Local file selection:"
+msgstr ""
+
+#: src/tar.c:595
+msgid "add given FILE to the archive (useful if its name starts with a dash)"
+msgstr ""
+
+#: src/tar.c:596
+msgid "DIR"
+msgstr ""
+
+#: src/tar.c:597
+#, fuzzy
+msgid "change to directory DIR"
+msgstr "无法改å˜å·¥ä½œç›®å½•"
+
+#: src/tar.c:599
+msgid "get names to extract or create from FILE"
+msgstr ""
+
+#: src/tar.c:601
+msgid "-T reads null-terminated names, disable -C"
+msgstr ""
+
+#: src/tar.c:603
+msgid "unquote filenames read with -T (default)"
+msgstr ""
+
+#: src/tar.c:605
+msgid "do not unquote filenames read with -T"
+msgstr ""
+
+#: src/tar.c:606 tests/genfile.c:134
+msgid "PATTERN"
+msgstr ""
+
+#: src/tar.c:607
+msgid "exclude files, given as a PATTERN"
+msgstr ""
+
+#: src/tar.c:609
+msgid "exclude patterns listed in FILE"
+msgstr ""
+
+#: src/tar.c:611
+msgid ""
+"exclude contents of directories containing CACHEDIR.TAG, except for the tag "
+"file itself"
+msgstr ""
+
+#: src/tar.c:614
+msgid "exclude everything under directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:617
+msgid "exclude directories containing CACHEDIR.TAG"
+msgstr ""
+
+#: src/tar.c:619
+msgid "exclude contents of directories containing FILE, except for FILE itself"
+msgstr ""
+
+#: src/tar.c:622
+msgid "exclude everything under directories containing FILE"
+msgstr ""
+
+#: src/tar.c:624
+msgid "exclude directories containing FILE"
+msgstr ""
+
+#: src/tar.c:626
+msgid "avoid descending automatically in directories"
+msgstr ""
+
+#: src/tar.c:628
+msgid "stay in local file system when creating archive"
+msgstr ""
+
+#: src/tar.c:630
+msgid "recurse into directories (default)"
+msgstr ""
+
+#: src/tar.c:632
+#, fuzzy
+msgid "don't strip leading `/'s from file names"
+msgstr "从æˆå‘˜å中删除开头的“%sâ€"
+
+#: src/tar.c:634
+msgid "follow symlinks; archive and dump the files they point to"
+msgstr ""
+
+#: src/tar.c:635
+msgid "MEMBER-NAME"
+msgstr ""
+
+#: src/tar.c:636
+msgid "begin at member MEMBER-NAME in the archive"
+msgstr ""
+
+#: src/tar.c:638
+msgid "only store files newer than DATE-OR-FILE"
+msgstr ""
+
+#: src/tar.c:640
+msgid "DATE"
+msgstr ""
+
+#: src/tar.c:641
+msgid "compare date and time when data changed only"
+msgstr ""
+
+#: src/tar.c:642
+msgid "CONTROL"
+msgstr ""
+
+#: src/tar.c:643
+msgid "backup before removal, choose version CONTROL"
+msgstr ""
+
+#: src/tar.c:644 src/tar.c:715 src/tar.c:717 tests/genfile.c:167
+msgid "STRING"
+msgstr ""
+
+#: src/tar.c:645
+msgid ""
+"backup before removal, override usual suffix ('~' unless overridden by "
+"environment variable SIMPLE_BACKUP_SUFFIX)"
+msgstr ""
+
+#: src/tar.c:650
+msgid "File name transformations:"
+msgstr ""
+
+#: src/tar.c:652
+msgid "strip NUMBER leading components from file names on extraction"
+msgstr ""
+
+#: src/tar.c:654
+msgid "EXPRESSION"
+msgstr ""
+
+#: src/tar.c:655
+msgid "use sed replace EXPRESSION to transform file names"
+msgstr ""
+
+#: src/tar.c:660
+msgid "File name matching options (affect both exclude and include patterns):"
+msgstr ""
+
+#: src/tar.c:663
+msgid "ignore case"
+msgstr ""
+
+#: src/tar.c:665
+msgid "patterns match file name start"
+msgstr ""
+
+#: src/tar.c:667
+msgid "patterns match after any `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:669
+msgid "case sensitive matching (default)"
+msgstr ""
+
+#: src/tar.c:671
+msgid "use wildcards (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:673
+msgid "verbatim string matching"
+msgstr ""
+
+#: src/tar.c:675
+#, fuzzy
+msgid "wildcards do not match `/'"
+msgstr "å·æ ‡ %s ä¸åŒ¹é… %s"
+
+#: src/tar.c:677
+msgid "wildcards match `/' (default for exclusion)"
+msgstr ""
+
+#: src/tar.c:682
+msgid "Informative output:"
+msgstr ""
+
+#: src/tar.c:685
+msgid "verbosely list files processed"
+msgstr ""
+
+#: src/tar.c:686
+msgid "[.]NUMBER"
+msgstr ""
+
+#: src/tar.c:687
+msgid "display progress messages every NUMBERth record (default 10)"
+msgstr ""
+
+#: src/tar.c:690
+msgid "print a message if not all links are dumped"
+msgstr ""
+
+#: src/tar.c:691
+msgid "SIGNAL"
+msgstr ""
+
+#: src/tar.c:692
+msgid ""
+"print total bytes after processing the archive; with an argument - print "
+"total bytes when this SIGNAL is delivered; Allowed signals are: SIGHUP, "
+"SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names without SIG prefix are also "
+"accepted"
+msgstr ""
+
+#: src/tar.c:697
+msgid "print file modification dates in UTC"
+msgstr ""
+
+#: src/tar.c:699
+msgid "send verbose output to FILE"
+msgstr ""
+
+#: src/tar.c:701
+msgid "show block number within archive with each message"
+msgstr ""
+
+#: src/tar.c:703
+msgid "ask for confirmation for every action"
+msgstr ""
+
+#: src/tar.c:706
+msgid "show tar defaults"
+msgstr ""
+
+#: src/tar.c:708
+msgid ""
+"when listing or extracting, list each directory that does not match search "
+"criteria"
+msgstr ""
+
+#: src/tar.c:710
+msgid "show file or archive names after transformation"
+msgstr ""
+
+#: src/tar.c:713
+msgid "STYLE"
+msgstr ""
+
+#: src/tar.c:714
+msgid "set name quoting style; see below for valid STYLE values"
+msgstr ""
+
+#: src/tar.c:716
+msgid "additionally quote characters from STRING"
+msgstr ""
+
+#: src/tar.c:718
+msgid "disable quoting for characters from STRING"
+msgstr ""
+
+#: src/tar.c:723
+msgid "Compatibility options:"
+msgstr ""
+
+#: src/tar.c:726
+#, fuzzy
+msgid ""
+"when creating, same as --old-archive; when extracting, same as --no-same-"
+"owner"
+msgstr ""
+"\n"
+"兼容性选项:\n"
+" -o 创建归档时,相当于 --old-archive\n"
+" 展开归档时,相当于 --no-same-owner\n"
+
+#: src/tar.c:731
+msgid "Other options:"
+msgstr ""
+
+#: src/tar.c:734
+msgid "disable use of some potentially harmful options"
+msgstr ""
+
+#: src/tar.c:838
+msgid "You may not specify more than one `-Acdtrux' option"
+msgstr "您ä¸èƒ½åœ¨â€œ-Acdtruxâ€ä¸­æŒ‡å®šå¤šä¸ªé€‰é¡¹"
+
+#: src/tar.c:848
+msgid "Conflicting compression options"
+msgstr "冲çªçš„压缩选项"
+
+#: src/tar.c:904
+#, fuzzy, c-format
+msgid "Unknown signal name: %s"
+msgstr " 未知的文件类型 %s\n"
+
+#: src/tar.c:928
+#, fuzzy
+msgid "Date sample file not found"
+msgstr "找ä¸åˆ°æ•°æ®æ–‡ä»¶"
+
+#: src/tar.c:936
+#, c-format
+msgid "Substituting %s for unknown date format %s"
+msgstr "æŠŠæœªçŸ¥çš„æ—¶é—´æ ¼å¼ %2$s 替æ¢ä¸º %1$s"
+
+#: src/tar.c:961
+#, fuzzy, c-format
+msgid "Option %s: Treating date `%s' as %s"
+msgstr "把时间 `%s' 当作 %s + %ld 纳秒"
+
+#: src/tar.c:1035
+#, fuzzy, c-format
+msgid "%s: file list already read"
+msgstr "%s:文件是归档文件;未输出"
+
+#: src/tar.c:1098
+#, c-format
+msgid "%s: file name read contains nul character"
+msgstr ""
+
+#: src/tar.c:1163
+msgid "Valid arguments for --quoting-style options are:"
+msgstr ""
+
+#: src/tar.c:1166
+msgid ""
+"\n"
+"*This* tar defaults to:\n"
+msgstr ""
+
+#: src/tar.c:1199
+#, fuzzy
+msgid "Invalid blocking factor"
+msgstr "无效的å—å› å­"
+
+#: src/tar.c:1271
+msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?"
+msgstr "警告:ä¸æ”¯æŒ -I 选项,或许您的æ„æ€æ˜¯ -j 或者 -T ?"
+
+#: src/tar.c:1304
+msgid "Invalid tape length"
+msgstr "无效的ç£å¸¦é•¿åº¦"
+
+#: src/tar.c:1336
+msgid "More than one threshold date"
+msgstr "多于一个时间阈值"
+
+#: src/tar.c:1391 src/tar.c:1394
+msgid "Invalid sparse version value"
+msgstr ""
+
+#: src/tar.c:1479
+msgid "--atime-preserve='system' is not supported on this platform"
+msgstr ""
+
+#: src/tar.c:1496
+msgid "--checkpoint value is not an integer"
+msgstr ""
+
+#: src/tar.c:1589
+#, c-format
+msgid "%s: Invalid group"
+msgstr "%s:无效的组"
+
+#: src/tar.c:1596
+msgid "Invalid mode given on option"
+msgstr "选项中给出无效的访问模å¼"
+
+#: src/tar.c:1649
+msgid "Invalid number"
+msgstr "无效的数字"
+
+#: src/tar.c:1671
+msgid "Invalid owner"
+msgstr "无效的所有者"
+
+#: src/tar.c:1705
+msgid "Invalid record size"
+msgstr "无效的记录大å°"
+
+#: src/tar.c:1708
+#, c-format
+msgid "Record size must be a multiple of %d."
+msgstr "记录大å°å¿…须是 %d çš„å€æ•°ã€‚"
+
+#: src/tar.c:1745
+msgid "Invalid number of elements"
+msgstr "无效的元素数"
+
+#: src/tar.c:1765
+msgid "Only one --to-command option allowed"
+msgstr ""
+
+#: src/tar.c:1841
+#, c-format
+msgid "Malformed density argument: %s"
+msgstr ""
+
+#: src/tar.c:1867
+#, c-format
+msgid "Unknown density: `%c'"
+msgstr ""
+
+#: src/tar.c:1884
+#, c-format
+msgid "Options `-[0-7][lmh]' not supported by *this* tar"
+msgstr "本 tar ä¸æ”¯æŒé€‰é¡¹â€œ-[0-7][lmh]â€"
+
+#: src/tar.c:1919
+msgid "[FILE]..."
+msgstr ""
+
+#: src/tar.c:2022
+#, c-format
+msgid "Old option `%c' requires an argument."
+msgstr "旧选项“%câ€éœ€è¦å‚数。"
+
+#: src/tar.c:2104
+msgid "--occurrence is meaningless without a file list"
+msgstr "没有一个文件列表时 --occurrence 是没有æ„义的"
+
+#: src/tar.c:2110
+msgid "--occurrence cannot be used in the requested operation mode"
+msgstr "--occurrence ä¸èƒ½ç”¨äºŽè¯·æ±‚çš„æ“作模å¼ä¸­"
+
+#: src/tar.c:2140
+msgid "Multiple archive files require `-M' option"
+msgstr "多个归档文件需è¦ä½¿ç”¨â€œ-Mâ€é€‰é¡¹"
+
+#: src/tar.c:2145
+msgid "Cannot combine --listed-incremental with --newer"
+msgstr "无法在使用 --newer 的时候使用 --listed-incremental"
+
+#: src/tar.c:2162
+#, c-format
+msgid "%s: Volume label is too long (limit is %lu byte)"
+msgid_plural "%s: Volume label is too long (limit is %lu bytes)"
+msgstr[0] "%s:å·æ ‡è¿‡é•¿ (é™åˆ¶ä¸º %lu 字节)"
+
+#: src/tar.c:2175
+msgid "Cannot verify multi-volume archives"
+msgstr "无法检验多å·å½’档文件"
+
+#: src/tar.c:2177
+msgid "Cannot verify compressed archives"
+msgstr "无法检验压缩归档文件"
+
+#: src/tar.c:2183
+msgid "Cannot use multi-volume compressed archives"
+msgstr "无法使用多å·åŽ‹ç¼©å½’档文件"
+
+#: src/tar.c:2189
+#, fuzzy
+msgid "Cannot concatenate compressed archives"
+msgstr "无法更新压缩归档文件"
+
+#: src/tar.c:2201
+msgid "--pax-option can be used only on POSIX archives"
+msgstr "--pax-option åªèƒ½ç”¨äºŽ POSIX 归档中"
+
+#: src/tar.c:2226
+msgid "Cowardly refusing to create an empty archive"
+msgstr "谨慎地拒ç»åˆ›å»ºç©ºå½’档文件"
+
+#: src/tar.c:2247
+msgid "Options `-Aru' are incompatible with `-f -'"
+msgstr "选项“-Aruâ€ä¸Žâ€œ-f -â€ä¸å…¼å®¹"
+
+#: src/tar.c:2334
+msgid "You must specify one of the `-Acdtrux' options"
+msgstr "您必须从选项“-Acdtruxâ€ä¸­æŒ‡å®šä¸€ä¸ª"
+
+#: src/tar.c:2385
+#, c-format
+msgid "Error exit delayed from previous errors"
+msgstr "由于å‰é¢å»¶è¿Ÿçš„错误而退出"
+
+#: src/update.c:86
+#, c-format
+msgid "%s: File shrank by %s byte"
+msgid_plural "%s: File shrank by %s bytes"
+msgstr[0] "%sï¼šæ–‡ä»¶ç¼©å° %s 字节"
+
+#: src/xheader.c:158
+#, fuzzy, c-format
+msgid "Keyword %s is unknown or not yet implemented"
+msgstr "关键字 %s 未知或还未实现"
+
+#: src/xheader.c:184
+#, c-format
+msgid "Pattern %s cannot be used"
+msgstr "ä¸èƒ½ä½¿ç”¨æ¨¡å¼ %s"
+
+#: src/xheader.c:194
+#, c-format
+msgid "Keyword %s cannot be overridden"
+msgstr "ä¸èƒ½è¦†ç›–关键字 %s"
+
+#: src/xheader.c:498
+#, fuzzy
+msgid "Malformed extended header: missing length"
+msgstr "错误的扩展头:缺少等于符å·"
+
+#: src/xheader.c:506
+msgid "Extended header length is out of allowed range"
+msgstr ""
+
+#: src/xheader.c:513
+#, fuzzy, c-format
+msgid "Extended header length %*s is out of range"
+msgstr "归档签署的 base-64 字符串 %s 超出范围 %s"
+
+#: src/xheader.c:525
+#, fuzzy
+msgid "Malformed extended header: missing blank after length"
+msgstr "错误的扩展头:长度åŽç¼ºå°‘空白符"
+
+#: src/xheader.c:533
+msgid "Malformed extended header: missing equal sign"
+msgstr "错误的扩展头:缺少等于符å·"
+
+#: src/xheader.c:539
+#, fuzzy
+msgid "Malformed extended header: missing newline"
+msgstr "错误的扩展头:缺少等于符å·"
+
+#: src/xheader.c:576
+#, c-format
+msgid "Ignoring unknown extended header keyword `%s'"
+msgstr ""
+
+#: src/xheader.c:780
+#, c-format
+msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the pax extended header keyword
+#. (atime, gid, etc.).
+#: src/xheader.c:812
+#, fuzzy, c-format
+msgid "Extended header %s=%s is out of range %s..%s"
+msgstr "归档值 %s 超出 %s 的范围 %s.%s"
+
+#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s=%s"
+msgstr "错误的扩展头:缺少等于符å·"
+
+#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315
+#, fuzzy, c-format
+msgid "Malformed extended header: excess %s=%s"
+msgstr "错误的扩展头:缺少等于符å·"
+
+#: src/xheader.c:1328
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: unexpected delimiter %c"
+msgstr "错误的扩展头:缺少等于符å·"
+
+#: src/xheader.c:1338
+#, fuzzy, c-format
+msgid "Malformed extended header: invalid %s: odd number of values"
+msgstr "错误的扩展头:缺少等于符å·"
+
+#: tests/genfile.c:110
+msgid ""
+"genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n"
+msgstr ""
+
+#: tests/genfile.c:125
+#, fuzzy
+msgid "File creation options:"
+msgstr "冲çªçš„压缩选项"
+
+#: tests/genfile.c:126 tests/genfile.c:137
+msgid "SIZE"
+msgstr ""
+
+#: tests/genfile.c:127
+msgid "Create file of the given SIZE"
+msgstr ""
+
+#: tests/genfile.c:129
+#, fuzzy
+msgid "Write to file NAME, instead of standard output"
+msgstr "写入标准输出时出错"
+
+#: tests/genfile.c:131
+#, fuzzy
+msgid "Read file names from FILE"
+msgstr "从 %2$s 读入 %1$s 字节"
+
+#: tests/genfile.c:133
+msgid "-T reads null-terminated names"
+msgstr ""
+
+#: tests/genfile.c:135
+msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"
+msgstr ""
+
+#: tests/genfile.c:138
+msgid "Size of a block for sparse file"
+msgstr ""
+
+#: tests/genfile.c:140
+msgid "Generate sparse file. Rest of the command line gives the file map."
+msgstr ""
+
+#: tests/genfile.c:142
+msgid "OFFSET"
+msgstr ""
+
+#: tests/genfile.c:143
+msgid "Seek to the given offset before writing data"
+msgstr ""
+
+#: tests/genfile.c:149
+msgid "File statistics options:"
+msgstr ""
+
+#: tests/genfile.c:152
+msgid "Print contents of struct stat for each given file. Default FORMAT is: "
+msgstr ""
+
+#: tests/genfile.c:159
+msgid "Synchronous execution options:"
+msgstr ""
+
+#: tests/genfile.c:162
+msgid ""
+"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, "
+"--touch"
+msgstr ""
+
+#: tests/genfile.c:165
+msgid "Perform given action (see below) upon reaching checkpoint NUMBER"
+msgstr ""
+
+#: tests/genfile.c:168
+msgid "Set date for next --touch option"
+msgstr ""
+
+#: tests/genfile.c:171
+msgid "Display executed checkpoints and exit status of COMMAND"
+msgstr ""
+
+#: tests/genfile.c:176
+msgid ""
+"Synchronous execution actions. These are executed when checkpoint number "
+"given by --checkpoint option is reached."
+msgstr ""
+
+#: tests/genfile.c:179
+msgid ""
+"Truncate FILE to the size specified by previous --length option (or 0, if it "
+"is not given)"
+msgstr ""
+
+#: tests/genfile.c:183
+msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option."
+msgstr ""
+
+#: tests/genfile.c:186
+msgid "Update the access and modification times of FILE"
+msgstr ""
+
+#: tests/genfile.c:189
+msgid "Execute COMMAND"
+msgstr ""
+
+#: tests/genfile.c:239
+#, fuzzy, c-format
+msgid "Invalid size: %s"
+msgstr "无效的时间戳"
+
+#: tests/genfile.c:244
+#, fuzzy, c-format
+msgid "Number out of allowed range: %s"
+msgstr "inode å·è¶…出范围"
+
+#: tests/genfile.c:247
+#, c-format
+msgid "Negative size: %s"
+msgstr ""
+
+#: tests/genfile.c:260 tests/genfile.c:559
+#, c-format
+msgid "stat(%s) failed"
+msgstr ""
+
+#: tests/genfile.c:354
+#, c-format
+msgid "Error parsing number near `%s'"
+msgstr ""
+
+#: tests/genfile.c:360
+#, fuzzy, c-format
+msgid "Unknown date format"
+msgstr "未知的系统错误"
+
+#: tests/genfile.c:383
+msgid "[ARGS...]"
+msgstr ""
+
+#: tests/genfile.c:420 tests/genfile.c:460 tests/genfile.c:513
+#: tests/genfile.c:663 tests/genfile.c:677
+#, c-format
+msgid "cannot open `%s'"
+msgstr ""
+
+#: tests/genfile.c:426
+#, fuzzy, c-format
+msgid "cannot seek: %s"
+msgstr "%s:无法定ä½åˆ° %s"
+
+#: tests/genfile.c:443
+#, c-format
+msgid "file name contains null character"
+msgstr ""
+
+#: tests/genfile.c:508
+#, c-format
+msgid "cannot generate sparse files on standard output, use --file option"
+msgstr ""
+
+#: tests/genfile.c:586
+#, c-format
+msgid "incorrect mask (near `%s')"
+msgstr ""
+
+#: tests/genfile.c:592 tests/genfile.c:625
+#, fuzzy, c-format
+msgid "Unknown field `%s'"
+msgstr " 未知的文件类型 %s\n"
+
+#: tests/genfile.c:652
+#, fuzzy, c-format
+msgid "cannot set time on `%s'"
+msgstr "%s:无法定ä½åˆ° %s"
+
+#: tests/genfile.c:806
+#, c-format
+msgid "Command exited successfully\n"
+msgstr ""
+
+#: tests/genfile.c:808
+#, c-format
+msgid "Command failed with status %d\n"
+msgstr ""
+
+#: tests/genfile.c:812
+#, c-format
+msgid "Command terminated on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:814
+#, c-format
+msgid "Command stopped on signal %d\n"
+msgstr ""
+
+#: tests/genfile.c:817
+#, c-format
+msgid "Command dumped core\n"
+msgstr ""
+
+#: tests/genfile.c:820
+#, c-format
+msgid "Command terminated\n"
+msgstr ""
+
+#: tests/genfile.c:852
+#, fuzzy, c-format
+msgid "--stat requires file names"
+msgstr "--转æ¢çš„文件å--\n"
+
+#: tests/genfile.c:865
+#, c-format
+msgid "too many arguments"
+msgstr ""
+
+#~ msgid "WARNING: No volume header"
+#~ msgstr "警告:没有å·å¤´"
+
+#~ msgid "Visible long name error"
+#~ msgstr "å¯è§çš„长文件å错误"
+
+#~ msgid "Time stamp out of range"
+#~ msgstr "时间标记超出范围"
+
+#~ msgid "Device number out of range"
+#~ msgstr "设备å·è¶…出范围"
+
+#~ msgid "Visible longname error"
+#~ msgstr "å¯è§çš„长文件å错误"
+
+#~ msgid "Renamed %s to %s"
+#~ msgstr "å°† %s 改å为 %s"
+
+#~ msgid "%s: Cannot symlink to %s"
+#~ msgstr "%s:无法符å·è¿žæŽ¥åˆ° %s"
+
+#~ msgid "Symlinked %s to %s"
+#~ msgstr "å°† %s 符å·è¿žæŽ¥åˆ° %s"
+
+#~ msgid "Unknown demangling command %s"
+#~ msgstr "未知的å转æ¢å‘½ä»¤ %s"
+
+#~ msgid "Missing file name after -C"
+#~ msgstr "-C 之åŽç¼ºå°‘文件å"
+
+#~ msgid ""
+#~ "This program comes with NO WARRANTY, to the extent permitted by law.\n"
+#~ "You may redistribute it under the terms of the GNU General Public "
+#~ "License;\n"
+#~ "see the file named COPYING for details."
+#~ msgstr ""
+#~ "在法律许å¯çš„范围内,本程åºä¸æ供任何担ä¿ã€‚\n"
+#~ "您å¯ä»¥åœ¨ GNU 一般通用许å¯è¯çš„æ¡æ¬¾ä¸‹åˆ†å‘本程åºï¼›\n"
+#~ "请å‚考å为 COPYING 的文件以了解详细信æ¯ã€‚"
+
+#~ msgid "rmtd: Garbage command %c\n"
+#~ msgstr "rmtd:垃圾命令 %c\n"
+
+#~ msgid ""
+#~ "GNU `tar' saves many files together into a single tape or disk archive, "
+#~ "and\n"
+#~ "can restore individual files from the archive.\n"
+#~ msgstr ""
+#~ "GNU“tarâ€å°†è®¸å¤šæ–‡ä»¶ä¿å­˜åˆ°ä¸€ä¸ªç£å¸¦æˆ–ç£ç›˜å½’档文件中,\n"
+#~ "并å¯ä»¥ä»Žå½’档文件中æ¢å¤å„个文件。\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If a long option shows an argument as mandatory, then it is mandatory\n"
+#~ "for the equivalent short option also. Similarly for optional arguments.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "如果长选项表明å‚数是必需的,那么对等价的短选项\n"
+#~ "æ¥è¯´å®ƒåŒæ ·æ˜¯å¿…需的。对å¯é€‰çš„å‚æ•°æ¥è¯´ä¹Ÿç±»ä¼¼ã€‚\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Main operation mode:\n"
+#~ " -t, --list list the contents of an archive\n"
+#~ " -x, --extract, --get extract files from an archive\n"
+#~ " -c, --create create a new archive\n"
+#~ " -d, --diff, --compare find differences between archive and file "
+#~ "system\n"
+#~ " -r, --append append files to the end of an archive\n"
+#~ " -u, --update only append files newer than copy in archive\n"
+#~ " -A, --catenate append tar files to an archive\n"
+#~ " --concatenate same as -A\n"
+#~ " --delete delete from the archive (not on mag tapes!)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "主è¦æ“作模å¼ï¼š\n"
+#~ " -t, --list 列出归档文件内容目录\n"
+#~ " -x, --extract, --get 从归档文件中展开文件\n"
+#~ " -c, --create 创建新的归档文件\n"
+#~ " -d, --diff, --compare 找出归档文件和文件系统的ä¸åŒä¹‹å¤„\n"
+#~ " -r, --append 将文件附加到归档文件之åŽ\n"
+#~ " -u, --update åªé™„加比归档中新的文件\n"
+#~ " -A, --catenate å°† tar 文件附加到归档文件之åŽ\n"
+#~ " --concatenate 与 -A 相åŒ\n"
+#~ " --delete 从归档文件中删除 (ä¸èƒ½åœ¨ç£å¸¦ä¸Šï¼)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Operation modifiers:\n"
+#~ " -W, --verify attempt to verify the archive after writing "
+#~ "it\n"
+#~ " --remove-files remove files after adding them to the "
+#~ "archive\n"
+#~ " -k, --keep-old-files don't replace existing files when "
+#~ "extracting\n"
+#~ " --keep-newer-files don't replace existing files that are newer\n"
+#~ " than their archive copies\n"
+#~ " --overwrite overwrite existing files when extracting\n"
+#~ " --no-overwrite-dir preserve metadata of existing directories\n"
+#~ " -U, --unlink-first remove each file prior to extracting over "
+#~ "it\n"
+#~ " --recursive-unlink empty hierarchies prior to extracting "
+#~ "directory\n"
+#~ " -S, --sparse handle sparse files efficiently\n"
+#~ " -O, --to-stdout extract files to standard output\n"
+#~ " -G, --incremental handle old GNU-format incremental backup\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " handle new GNU-format incremental backup\n"
+#~ " --ignore-failed-read do not exit with nonzero on unreadable "
+#~ "files\n"
+#~ " --occurrence[=NUM] process only the NUMth occurrence of each "
+#~ "file in\n"
+#~ " the archive. This option is valid only in\n"
+#~ " conjunction with one of the subcommands --"
+#~ "delete,\n"
+#~ " --diff, --extract or --list and when a list "
+#~ "of\n"
+#~ " files is given either on the command line "
+#~ "or\n"
+#~ " via -T option.\n"
+#~ " NUM defaults to 1.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "æ“作修饰符:\n"
+#~ " -W, --verify 试图在写入归档之åŽå¯¹å…¶è¿›è¡ŒéªŒè¯\n"
+#~ " --remove-files 在将文件添加到归档之åŽåˆ é™¤æ–‡ä»¶\n"
+#~ " -k, --keep-old-files 在展开时ä¸æ›¿æ¢å·²å­˜åœ¨çš„文件\n"
+#~ " --keep-newer-files ä¸æ›¿æ¢æ¯”归档中的副本更新的文件\n"
+#~ " --overwrite 在展开时覆盖已存在的文件\n"
+#~ " --no-overwrite-dir 在展开时ä¿æŒå·²å­˜åœ¨ç›®å½•å…ƒæ•°æ®\n"
+#~ " -U, --unlink-first 在展开文件之å‰åˆ é™¤å·²å­˜åœ¨çš„文件\n"
+#~ " --recursive-unlink 在展开目录之å‰æ¸…空目录结构\n"
+#~ " -S, --sparse 有效地处ç†ç¦»æ•£æ–‡ä»¶\n"
+#~ " -O, --to-stdout 将文件展开到标准输出\n"
+#~ " -G, --incremental 处ç†æ—§ GNU-æ ¼å¼çš„增é‡å¤‡ä»½\n"
+#~ " -g, --listed-incremental=FILE\n"
+#~ " 处ç†æ–° GNU-æ ¼å¼çš„增é‡å¤‡ä»½\n"
+#~ " --ignore-failed-read é‡åˆ°ä¸å¯è¯»æ–‡ä»¶æ—¶ä¸é€€å‡º\n"
+#~ " --occurrence[=NUM] 仅处ç†å½’档中æ¯ä¸ªæ–‡ä»¶çš„第 NUM 次出现\n"
+#~ " 此选项åªåœ¨å’Œ --delete,--diff,--extract 或"
+#~ "者 --list\n"
+#~ " ç­‰å­å‘½ä»¤ä¸€èµ·ä½¿ç”¨æ—¶ï¼Œå¹¶ä¸”当没有通过命令行或 -"
+#~ "T\n"
+#~ " 选项æ供一个文件列表时æ‰æœ‰æ•ˆã€‚\n"
+#~ " NUM 默认为 1.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Handling of file attributes:\n"
+#~ " --owner=NAME force NAME as owner for added files\n"
+#~ " --group=NAME force NAME as group for added files\n"
+#~ " --mode=CHANGES force (symbolic) mode CHANGES for added "
+#~ "files\n"
+#~ " --atime-preserve don't change access times on dumped files\n"
+#~ " -m, --modification-time don't extract file modified time\n"
+#~ " --same-owner try extracting files with the same "
+#~ "ownership\n"
+#~ " --no-same-owner extract files as yourself\n"
+#~ " --numeric-owner always use numbers for user/group names\n"
+#~ " -p, --same-permissions extract permissions information\n"
+#~ " --no-same-permissions do not extract permissions information\n"
+#~ " --preserve-permissions same as -p\n"
+#~ " -s, --same-order sort names to extract to match archive\n"
+#~ " --preserve-order same as -s\n"
+#~ " --preserve same as both -p and -s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "处ç†æ–‡ä»¶å±žæ€§ï¼š\n"
+#~ " --owner=NAME 将被添加的文件所有者设置为 NAME\n"
+#~ " --group=NAME 将被添加的文件所属的组设置为 NAME\n"
+#~ " --mode=CHANGES 将被添加的文件的属性设置为 CHANGES\n"
+#~ " --atime-preserve ä¸è¦æ”¹å˜è¾“出文件的访问时间\n"
+#~ " -m, --modification-time ä¸è¦å±•å¼€æ–‡ä»¶çš„修改时间\n"
+#~ " --same-owner 试图以相åŒçš„所有æƒå±•å¼€æ–‡ä»¶\n"
+#~ " --no-same-owner 以您自己的身份展开文件\n"
+#~ " --numeric-owner 总是用编å·ä½œä¸ºç”¨æˆ·/组的åå­—\n"
+#~ " -p, --same-permissions 展开æƒé™ä¿¡æ¯\n"
+#~ " --no-same-permissions ä¸å±•å¼€æƒé™ä¿¡æ¯\n"
+#~ " --preserve-permissions 与 -p 相åŒ\n"
+#~ " -s, --same-order 对è¦å±•å¼€çš„å称进行排åºä»¥ä¾¿ä¸Žå½’档匹é…\n"
+#~ " --preserve-order 与 -s 相åŒ\n"
+#~ " --preserve 与 -p å’Œ -s 都相åŒ\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device selection and switching:\n"
+#~ " -f, --file=ARCHIVE use archive file or device ARCHIVE\n"
+#~ " --force-local archive file is local even if has a "
+#~ "colon\n"
+#~ " --rmt-command=COMMAND use given rmt COMMAND instead of /etc/"
+#~ "rmt\n"
+#~ " --rsh-command=COMMAND use remote COMMAND instead of rsh\n"
+#~ " -[0-7][lmh] specify drive and density\n"
+#~ " -M, --multi-volume create/list/extract multi-volume "
+#~ "archive\n"
+#~ " -L, --tape-length=NUM change tape after writing NUM x 1024 "
+#~ "bytes\n"
+#~ " -F, --info-script=FILE run script at end of each tape (implies -"
+#~ "M)\n"
+#~ " --new-volume-script=FILE same as -F FILE\n"
+#~ " --volno-file=FILE use/update the volume number in FILE\n"
+#~ msgstr ""
+#~ "\n"
+#~ "设备选择与切æ¢ï¼š\n"
+#~ " -f, --file=ARCHIVE 使用归档文件或设备 ARCHIVE\n"
+#~ " --force-local å³ä½¿å«æœ‰å†’å·ï¼Œå½’档文件也是本地文件\n"
+#~ " --rmt-command=COMMAND 用给定的 rmt COMMAND 代替 /etc/rmt\n"
+#~ " --rsh-command=COMMAND 用远程 COMMAND 代替 rsh\n"
+#~ " -[0-7][lmh] 指定驱动器和密度\n"
+#~ " -M, --multi-volume 创建/列举/展开多å·å½’档文件\n"
+#~ " -L, --tape-length=NUM 在写入 NUM x 1024 个字节åŽæ›´æ¢ç£å¸¦\n"
+#~ " -F, --info-script=FILE 在æ¯ä¸ªç£å¸¦æœ«ç«¯è¿è¡Œè„šæœ¬ (éšå« -M)\n"
+#~ " --new-volume-script=FILE 与 -F FILE 相åŒ\n"
+#~ " --volno-file=FILE 使用/æ›´æ–° FILE 中的å·ç¼–å·\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Device blocking:\n"
+#~ " -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n"
+#~ " --record-size=SIZE SIZE bytes per record, multiple of 512\n"
+#~ " -i, --ignore-zeros ignore zeroed blocks in archive (means "
+#~ "EOF)\n"
+#~ " -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "设备分å—:\n"
+#~ " -b, --blocking-factor=BLOCKS æ¯ä¸ªè®°å½• BLOCKS x 512 个字节\n"
+#~ " --record-size=SIZE æ¯ä¸ªè®°å½• SIZE 个字节,512 çš„å€æ•°\n"
+#~ " -i, --ignore-zeros å¿½ç•¥å½’æ¡£ä¸­å…¨ä¸ºé›¶çš„å— (标示文件结æŸ)\n"
+#~ " -B, --read-full-records 当我们读入时é‡æ–°åˆ†å— (为 4.2BSD 管é“æ"
+#~ "ä¾›)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Archive format selection:\n"
+#~ " --format=FMTNAME create archive of the given format.\n"
+#~ " FMTNAME is one of the following:\n"
+#~ " v7 old V7 tar format\n"
+#~ " oldgnu GNU format as per tar <= "
+#~ "1.12\n"
+#~ " gnu GNU tar 1.13 format\n"
+#~ " ustar POSIX 1003.1-1988 (ustar) "
+#~ "format\n"
+#~ " posix POSIX 1003.1-2001 (pax) "
+#~ "format\n"
+#~ " --old-archive, --portability same as --format=v7\n"
+#~ " --posix same as --format=posix\n"
+#~ " --pax-option keyword[[:]=value][,keyword[[:]=value], ...]\n"
+#~ " control pax keywords\n"
+#~ " -V, --label=NAME create archive with volume name "
+#~ "NAME\n"
+#~ " PATTERN at list/extract time, a globbing "
+#~ "PATTERN\n"
+#~ " -j, --bzip2 filter the archive through bzip2\n"
+#~ " -z, --gzip, --ungzip filter the archive through gzip\n"
+#~ " -Z, --compress, --uncompress filter the archive through compress\n"
+#~ " --use-compress-program=PROG filter through PROG (must accept -"
+#~ "d)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "归档格å¼é€‰æ‹©ï¼š\n"
+#~ " --format=FMTNAME 创建指定格å¼çš„归档。\n"
+#~ " FMTNAME 为下列格å¼ä¸­çš„一个:\n"
+#~ " v7 æ—§å¼ V7 tar æ ¼å¼\n"
+#~ " oldgnu tar <= 1.12 时的 GNU æ ¼å¼\n"
+#~ " gnu GNU tar 1.13 æ ¼å¼\n"
+#~ " ustar POSIX 1003.1-1988 (ustar) "
+#~ "æ ¼å¼\n"
+#~ " posix POSIX 1003.1-2001 (pax) æ ¼"
+#~ "å¼\n"
+#~ " --old-archive, --portability 与 --format=v7 相åŒ\n"
+#~ " --posix 与 --format=posix 相åŒ\n"
+#~ " --pax-option keyword[[:]=value][,keyword[[:]=value], ...]\n"
+#~ " 控制 pax 关键字\n"
+#~ " -V, --label=NAME 以å·æ ‡å NAME 创建归档\n"
+#~ " PATTERN 在列出/å±•å¼€æ—¶ï¼Œä¸€ä¸ªæ¨¡ç³ŠåŒ¹é… PATTERN\n"
+#~ " -j, --bzip2 用 bzip2 过滤归档\n"
+#~ " -z, --gzip, --ungzip 用 gzip 过滤归档\n"
+#~ " -Z, --compress, --uncompress 用 compress 过滤归档\n"
+#~ " --use-compress-program=PROG ç”¨ç¨‹åº PROG(必须接å—å‚æ•° -d) 过滤归"
+#~ "æ¡£\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Local file selection:\n"
+#~ " -C, --directory=DIR change to directory DIR\n"
+#~ " -T, --files-from=NAME get names to extract or create from file "
+#~ "NAME\n"
+#~ " --null -T reads null-terminated names, disable -"
+#~ "C\n"
+#~ " --exclude=PATTERN exclude files, given as a PATTERN\n"
+#~ " -X, --exclude-from=FILE exclude patterns listed in FILE\n"
+#~ " --anchored exclude patterns match file name start "
+#~ "(default)\n"
+#~ " --no-anchored exclude patterns match after any /\n"
+#~ " --ignore-case exclusion ignores case\n"
+#~ " --no-ignore-case exclusion is case sensitive (default)\n"
+#~ " --wildcards exclude patterns use wildcards (default)\n"
+#~ " --no-wildcards exclude patterns are plain strings\n"
+#~ " --wildcards-match-slash exclude pattern wildcards match "
+#~ "'/' (default)\n"
+#~ " --no-wildcards-match-slash exclude pattern wildcards do not match "
+#~ "'/'\n"
+#~ " -P, --absolute-names don't strip leading `/'s from file names\n"
+#~ " -h, --dereference dump instead the files symlinks point to\n"
+#~ " --no-recursion avoid descending automatically in "
+#~ "directories\n"
+#~ " -l, --one-file-system stay in local file system when creating "
+#~ "archive\n"
+#~ " -K, --starting-file=NAME begin at file NAME in the archive\n"
+#~ " --strip-path=NUM strip NUM leading components from file "
+#~ "names\n"
+#~ " before extraction\n"
+#~ msgstr ""
+#~ "\n"
+#~ "本地文件选择:\n"
+#~ " -C, --directory=DIR 进入目录 DIR\n"
+#~ " -T, --files-from=NAME 从文件 NAME 中获å–è¦å±•å¼€æˆ–创建的文件å\n"
+#~ " --null -T 读入以 null 终止的å称,ç¦ç”¨ -C\n"
+#~ " --exclude=PATTERN é™¤åŽ»åŒ¹é… PATTERN 的文件\n"
+#~ " -X, --exclude-from=FILE 出去匹é…在 FILE 中列出的模å¼çš„文件\n"
+#~ " --anchored 去除模å¼åŒ¹é…文件起点 (默认)\n"
+#~ " --no-anchored 去除任何 / 之åŽçš„模å¼åŒ¹é…\n"
+#~ " --ignore-case 去除匹é…时忽略大å°å†™\n"
+#~ " --no-ignore-case 去除匹é…时关心大å°å†™ (默认)\n"
+#~ " --wildcards 在去除匹é…时使用通é…符 (默认)\n"
+#~ " --no-wildcards 在去除匹é…时使用普通字符串\n"
+#~ " --wildcards-match-slash 去除模å¼é€šé…符匹é…“/†(默认)\n"
+#~ " --no-wildcards-match-slash 去除模å¼é€šé…符ä¸åŒ¹é…“/â€\n"
+#~ " -P, --absolute-names ä¸è¦ä»Žæ–‡ä»¶å中去掉最å‰å¤´çš„“/â€\n"
+#~ " -h, --dereference 输出连接指å‘的文件而ä¸æ˜¯æ–‡ä»¶è¿žæŽ¥\n"
+#~ " --no-recursion é¿å…在目录间自动递归\n"
+#~ " -l, --one-file-system 创建归档文件时留在本地文件系统中\n"
+#~ " -K, --starting-file=NAME 从归档中的文件 NAME 开始\n"
+#~ " --strip-path=NUM 展开å‰ä»Žæ–‡ä»¶å中删除å‰é¢çš„ NUM 个元素\n"
+
+#~ msgid ""
+#~ " -N, --newer=DATE-OR-FILE only store files newer than DATE-OR-FILE\n"
+#~ " --newer-mtime=DATE compare date and time when data changed "
+#~ "only\n"
+#~ " --after-date=DATE same as -N\n"
+#~ msgstr ""
+#~ " -N, --newer=DATE-OR-FILE åªå­˜å‚¨æ¯”指定的日期或者文件更新的文件\n"
+#~ " --newer-mtime=DATE åªåœ¨æ•°æ®å‘生å˜åŒ–时比较日期和时间\n"
+#~ " --after-date=DATE 与 -N 相åŒ\n"
+
+#~ msgid ""
+#~ " --backup[=CONTROL] backup before removal, choose version "
+#~ "control\n"
+#~ " --suffix=SUFFIX backup before removal, override usual "
+#~ "suffix\n"
+#~ msgstr ""
+#~ " --backup[=CONTROL] 在删除å‰å¤‡ä»½ï¼Œé€‰æ‹©ç‰ˆæœ¬æŽ§åˆ¶\n"
+#~ " --suffix=SUFFIX 在删除å‰å¤‡ä»½ï¼Œè¦†ç›–常用åŽç¼€\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Informative output:\n"
+#~ " --help print this help, then exit\n"
+#~ " --version print tar program version number, then exit\n"
+#~ " -v, --verbose verbosely list files processed\n"
+#~ " --checkpoint print directory names while reading the archive\n"
+#~ " --check-links print a message if not all links are dumped\n"
+#~ " --totals print total bytes written while creating archive\n"
+#~ " --index-file=FILE send verbose output to FILE\n"
+#~ " --utc print file modification dates in UTC\n"
+#~ " -R, --block-number show block number within archive with each "
+#~ "message\n"
+#~ " -w, --interactive ask for confirmation for every action\n"
+#~ " --confirmation same as -w\n"
+#~ msgstr ""
+#~ "\n"
+#~ "æ示性输出:\n"
+#~ " --help 打å°è¯¥æ±‚助信æ¯ï¼Œè€ŒåŽé€€å‡º\n"
+#~ " --version æ‰“å° tar 程åºçš„版本å·ï¼Œè€ŒåŽé€€å‡º\n"
+#~ " -v, --verbose 详细列出处ç†çš„文件\n"
+#~ " --checkpoint 在读入归档文件时打å°ç›®å½•å\n"
+#~ " --check-links 如果未输出所以连接则打å°ä¸€æ¡æ¶ˆæ¯\n"
+#~ " --totals 在创建归档文件时打å°æ€»è®¡å†™å…¥çš„字节数\n"
+#~ " --index-file=FILE 输出详细输出到文件 FILE\n"
+#~ " --utc 以 UTC æ ¼å¼æ‰“å°æ–‡ä»¶ä¿®æ”¹æ—¶é—´\n"
+#~ " -R, --block-number 在æ¯æ¡æ¶ˆæ¯ä¸­éƒ½æ˜¾ç¤ºå½’档文件中的å—ç¼–å·\n"
+#~ " -w, --interactive æ¯ä¸€åŠ¨ä½œéƒ½è¯·æ±‚确认\n"
+#~ " --confirmation 与 -w 相åŒ\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual "
+#~ "date\n"
+#~ "or a file name starting with `/' or `.', in which case the file's date is "
+#~ "used.\n"
+#~ "*This* `tar' defaults to `--format=%s -f%s -b%d'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ARCHIVE å¯ä»¥æ˜¯ FILE,HOST:FILE 或者 USER@HOST:FILEï¼›DATE å¯ä»¥æ˜¯ä¸€æ–‡å­—æ—¶"
+#~ "é—´\n"
+#~ "或者是一以“/â€æˆ–“.â€å¼€å¤´çš„文件å,这时使用该文件的时间。\n"
+#~ "*本* “tar†默认为“--format=%s -f%s -b%dâ€ã€‚\n"
+
+#~ msgid "Warning: the -y option is not supported; perhaps you meant -j?"
+#~ msgstr "警告:ä¸æ”¯æŒ -y 选项;您的æ„æ€å¯èƒ½æ˜¯ -j?"
+
+#~ msgid "Written by John Gilmore and Jay Fenlason."
+#~ msgstr "由 John Gilmore 和 Jay Fenlason 编写。"
diff --git a/rmt/Makefile.am b/rmt/Makefile.am
new file mode 100644
index 0000000..b455212
--- /dev/null
+++ b/rmt/Makefile.am
@@ -0,0 +1,13 @@
+rmtdir=$(DEFAULT_RMT_DIR)
+rmt_PROGRAMS = @PU_RMT_PROG@
+EXTRA_PROGRAMS = rmt
+
+rmt_SOURCES = rmt.c
+
+INCLUDES = -I$(top_srcdir)/lib -I../ -I../lib
+
+LDADD = ../lib/lib$(PACKAGE).a $(LIBINTL)
+
+rmt_LDADD = $(LDADD) $(LIB_SETSOCKOPT)
+
+rmt.o: ../lib/configmake.h
diff --git a/rmt/Makefile.in b/rmt/Makefile.in
new file mode 100644
index 0000000..07da899
--- /dev/null
+++ b/rmt/Makefile.in
@@ -0,0 +1,733 @@
+# Makefile.in generated by automake 1.10a from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007 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@
+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@
+EXTRA_PROGRAMS = rmt$(EXEEXT)
+subdir = rmt
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/absolute-header.m4 \
+ $(top_srcdir)/m4/alloca.m4 $(top_srcdir)/m4/allocsa.m4 \
+ $(top_srcdir)/m4/argmatch.m4 $(top_srcdir)/m4/argp.m4 \
+ $(top_srcdir)/m4/backupfile.m4 $(top_srcdir)/m4/bison.m4 \
+ $(top_srcdir)/m4/canonicalize-lgpl.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/chown.m4 \
+ $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close-stream.m4 $(top_srcdir)/m4/closeout.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/d-ino.m4 \
+ $(top_srcdir)/m4/dirfd.m4 $(top_srcdir)/m4/dirname.m4 \
+ $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/double-slash-root.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eealloc.m4 \
+ $(top_srcdir)/m4/eoverflow.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exclude.m4 $(top_srcdir)/m4/exitfail.m4 \
+ $(top_srcdir)/m4/extensions.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-safer.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+ $(top_srcdir)/m4/fileblocks.m4 $(top_srcdir)/m4/float_h.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fpending.m4 \
+ $(top_srcdir)/m4/ftruncate.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdate.m4 $(top_srcdir)/m4/getdelim.m4 \
+ $(top_srcdir)/m4/getline.m4 $(top_srcdir)/m4/getopt.m4 \
+ $(top_srcdir)/m4/getpagesize.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/hash.m4 \
+ $(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intmax_t.m4 \
+ $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lchown.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/lstat.m4 $(top_srcdir)/m4/mbchar.m4 \
+ $(top_srcdir)/m4/mbiter.m4 $(top_srcdir)/m4/mbrtowc.m4 \
+ $(top_srcdir)/m4/mbscasecmp.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mempcpy.m4 \
+ $(top_srcdir)/m4/memrchr.m4 $(top_srcdir)/m4/memset.m4 \
+ $(top_srcdir)/m4/mkdtemp.m4 $(top_srcdir)/m4/mktime.m4 \
+ $(top_srcdir)/m4/modechange.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/pathmax.m4 \
+ $(top_srcdir)/m4/paxutils.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quote.m4 \
+ $(top_srcdir)/m4/quotearg.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/rmdir.m4 \
+ $(top_srcdir)/m4/rmt.m4 $(top_srcdir)/m4/rpmatch.m4 \
+ $(top_srcdir)/m4/rtapelib.m4 $(top_srcdir)/m4/safe-read.m4 \
+ $(top_srcdir)/m4/safe-write.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/savedir.m4 $(top_srcdir)/m4/setenv.m4 \
+ $(top_srcdir)/m4/sleep.m4 $(top_srcdir)/m4/ssize_t.m4 \
+ $(top_srcdir)/m4/stat-time.m4 $(top_srcdir)/m4/stdarg.m4 \
+ $(top_srcdir)/m4/stdbool.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/string_h.m4 $(top_srcdir)/m4/strndup.m4 \
+ $(top_srcdir)/m4/strnlen.m4 $(top_srcdir)/m4/strtoimax.m4 \
+ $(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoll.m4 \
+ $(top_srcdir)/m4/strtoul.m4 $(top_srcdir)/m4/strtoull.m4 \
+ $(top_srcdir)/m4/strtoumax.m4 $(top_srcdir)/m4/sys_stat_h.m4 \
+ $(top_srcdir)/m4/sys_time_h.m4 $(top_srcdir)/m4/sysexits.m4 \
+ $(top_srcdir)/m4/system.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/time_r.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
+ $(top_srcdir)/m4/unlinkdir.m4 $(top_srcdir)/m4/unlocked-io.m4 \
+ $(top_srcdir)/m4/utimbuf.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wchar.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wctype.m4 \
+ $(top_srcdir)/m4/wcwidth.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xgetcwd.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/xstrtol.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(rmtdir)"
+rmtPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(rmt_PROGRAMS)
+am_rmt_OBJECTS = rmt.$(OBJEXT)
+rmt_OBJECTS = $(am_rmt_OBJECTS)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = ../lib/lib$(PACKAGE).a $(am__DEPENDENCIES_1)
+rmt_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(rmt_SOURCES)
+DIST_SOURCES = $(rmt_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ABSOLUTE_DIRENT_H = @ABSOLUTE_DIRENT_H@
+ABSOLUTE_FCNTL_H = @ABSOLUTE_FCNTL_H@
+ABSOLUTE_FLOAT_H = @ABSOLUTE_FLOAT_H@
+ABSOLUTE_INTTYPES_H = @ABSOLUTE_INTTYPES_H@
+ABSOLUTE_STDINT_H = @ABSOLUTE_STDINT_H@
+ABSOLUTE_STDIO_H = @ABSOLUTE_STDIO_H@
+ABSOLUTE_STDLIB_H = @ABSOLUTE_STDLIB_H@
+ABSOLUTE_STRING_H = @ABSOLUTE_STRING_H@
+ABSOLUTE_SYSEXITS_H = @ABSOLUTE_SYSEXITS_H@
+ABSOLUTE_SYS_STAT_H = @ABSOLUTE_SYS_STAT_H@
+ABSOLUTE_SYS_TIME_H = @ABSOLUTE_SYS_TIME_H@
+ABSOLUTE_TIME_H = @ABSOLUTE_TIME_H@
+ABSOLUTE_UNISTD_H = @ABSOLUTE_UNISTD_H@
+ABSOLUTE_WCHAR_H = @ABSOLUTE_WCHAR_H@
+ABSOLUTE_WCTYPE_H = @ABSOLUTE_WCTYPE_H@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOM4TE = @AUTOM4TE@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BACKUP_LIBEXEC_SCRIPTS = @BACKUP_LIBEXEC_SCRIPTS@
+BACKUP_SBIN_SCRIPTS = @BACKUP_SBIN_SCRIPTS@
+BACKUP_SED_COND = @BACKUP_SED_COND@
+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@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFAULT_ARCHIVE = @DEFAULT_ARCHIVE@
+DEFAULT_ARCHIVE_FORMAT = @DEFAULT_ARCHIVE_FORMAT@
+DEFAULT_BLOCKING = @DEFAULT_BLOCKING@
+DEFAULT_QUOTING_STYLE = @DEFAULT_QUOTING_STYLE@
+DEFAULT_RMT_COMMAND = @DEFAULT_RMT_COMMAND@
+DEFAULT_RMT_DIR = @DEFAULT_RMT_DIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRENT_H = @DIRENT_H@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EOVERFLOW = @EOVERFLOW@
+EXEEXT = @EXEEXT@
+FCNTL_H = @FCNTL_H@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+GETOPT_H = @GETOPT_H@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GREP = @GREP@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_MKDIR = @HAVE_DECL_MKDIR@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_IO_H = @HAVE_IO_H@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_READLINK = @HAVE_READLINK@
+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_SLEEP = @HAVE_SLEEP@
+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_STRNDUP = @HAVE_STRNDUP@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_SYSEXITS_H = @HAVE_SYSEXITS_H@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE__BOOL = @HAVE__BOOL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTTYPES_H = @INTTYPES_H@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTAR_LIBDEPS = @LIBTAR_LIBDEPS@
+LIBTAR_LTLIBDEPS = @LIBTAR_LTLIBDEPS@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_SETSOCKOPT = @LIB_SETSOCKOPT@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PU_RMT_PROG = @PU_RMT_PROG@
+RANLIB = @RANLIB@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_FCHDIR = @REPLACE_FCHDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STRPTIME = @REPLACE_STRPTIME@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYSEXITS_H = @SYSEXITS_H@
+SYS_STAT_H = @SYS_STAT_H@
+SYS_TIME_H = @SYS_TIME_H@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WCHAR_H = @WCHAR_H@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WCTYPE_H = @WCTYPE_H@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+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@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+rmtdir = $(DEFAULT_RMT_DIR)
+rmt_PROGRAMS = @PU_RMT_PROG@
+rmt_SOURCES = rmt.c
+INCLUDES = -I$(top_srcdir)/lib -I../ -I../lib
+LDADD = ../lib/lib$(PACKAGE).a $(LIBINTL)
+rmt_LDADD = $(LDADD) $(LIB_SETSOCKOPT)
+all: 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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits rmt/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnits rmt/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(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
+install-rmtPROGRAMS: $(rmt_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(rmtdir)" || $(MKDIR_P) "$(DESTDIR)$(rmtdir)"
+ @list='$(rmt_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(rmtPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(rmtdir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(rmtPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(rmtdir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-rmtPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(rmt_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(rmtdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(rmtdir)/$$f"; \
+ done
+
+clean-rmtPROGRAMS:
+ -test -z "$(rmt_PROGRAMS)" || rm -f $(rmt_PROGRAMS)
+
+installcheck-rmtPROGRAMS: $(rmt_PROGRAMS)
+ bad=0; pid=$$$$; list="$(rmt_PROGRAMS)"; for p in $$list; do \
+ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+ esac; \
+ f=`echo "$$p" | \
+ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ for opt in --help --version; do \
+ if "$(DESTDIR)$(rmtdir)/$$f" $$opt >c$${pid}_.out \
+ 2>c$${pid}_.err </dev/null \
+ && test -n "`cat c$${pid}_.out`" \
+ && test -z "`cat c$${pid}_.err`"; then :; \
+ else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+ done; \
+ done; rm -f c$${pid}_.???; exit $$bad
+rmt$(EXEEXT): $(rmt_OBJECTS) $(rmt_DEPENDENCIES)
+ @rm -f rmt$(EXEEXT)
+ $(LINK) $(rmt_OBJECTS) $(rmt_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmt.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(rmtdir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-rmtPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-rmtPROGRAMS
+
+install-dvi: install-dvi-am
+
+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
+
+installcheck-am: installcheck-rmtPROGRAMS
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-rmtPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-rmtPROGRAMS ctags 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-rmtPROGRAMS install-strip \
+ installcheck installcheck-am installcheck-rmtPROGRAMS \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
+ ps ps-am tags uninstall uninstall-am uninstall-rmtPROGRAMS
+
+
+rmt.o: ../lib/configmake.h
+# 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/rmt/rmt.c b/rmt/rmt.c
new file mode 100644
index 0000000..a423018
--- /dev/null
+++ b/rmt/rmt.c
@@ -0,0 +1,676 @@
+/* Remote connection server.
+
+ Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2004,
+ 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Copyright (C) 1983 Regents of the University of California.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms are permitted provided
+ that the above copyright notice and this paragraph are duplicated in all
+ such forms and that any documentation, advertising materials, and other
+ materials related to such distribution and use acknowledge that the
+ software was developed by the University of California, Berkeley. The
+ name of the University may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */
+
+#include "system.h"
+#include "system-ioctl.h"
+#include <closeout.h>
+#include <configmake.h>
+#include <safe-read.h>
+#include <full-write.h>
+#include <version-etc.h>
+#define obstack_chunk_alloc malloc
+#define obstack_chunk_free free
+#include <obstack.h>
+#include <getopt.h>
+#include <sys/socket.h>
+
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+
+/* Maximum size of a string from the requesting program.
+ It must hold enough for any integer, possibly with a sign. */
+#define STRING_SIZE (UINTMAX_STRSIZE_BOUND + 1)
+
+const char *program_name;
+
+/* File descriptor of the tape device, or negative if none open. */
+static int tape = -1;
+
+/* Buffer containing transferred data, and its allocated size. */
+static char *record_buffer;
+static size_t allocated_size;
+
+/* Buffer for constructing the reply. */
+static char reply_buffer[BUFSIZ];
+
+/* Obstack for arbitrary-sized strings */
+struct obstack string_stk;
+
+/* Debugging tools. */
+
+static FILE *debug_file;
+
+#define DEBUG(File) \
+ if (debug_file) fprintf(debug_file, File)
+
+#define DEBUG1(File, Arg) \
+ if (debug_file) fprintf(debug_file, File, Arg)
+
+#define DEBUG2(File, Arg1, Arg2) \
+ if (debug_file) fprintf(debug_file, File, Arg1, Arg2)
+
+static void
+report_error_message (const char *string)
+{
+ DEBUG1 ("rmtd: E 0 (%s)\n", string);
+
+ sprintf (reply_buffer, "E0\n%s\n", string);
+ full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
+}
+
+static void
+report_numbered_error (int num)
+{
+ DEBUG2 ("rmtd: E %d (%s)\n", num, strerror (num));
+
+ sprintf (reply_buffer, "E%d\n%s\n", num, strerror (num));
+ full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
+}
+
+static char *
+get_string (void)
+{
+ for (;;)
+ {
+ char c;
+ if (safe_read (STDIN_FILENO, &c, 1) != 1)
+ exit (EXIT_SUCCESS);
+
+ if (c == '\n')
+ break;
+
+ obstack_1grow (&string_stk, c);
+ }
+ obstack_1grow (&string_stk, 0);
+ return obstack_finish (&string_stk);
+}
+
+static void
+free_string (char *string)
+{
+ obstack_free (&string_stk, string);
+}
+
+static void
+get_string_n (char *string)
+{
+ size_t counter;
+
+ for (counter = 0; ; counter++)
+ {
+ if (safe_read (STDIN_FILENO, string + counter, 1) != 1)
+ exit (EXIT_SUCCESS);
+
+ if (string[counter] == '\n')
+ break;
+
+ if (counter == STRING_SIZE - 1)
+ report_error_message (N_("Input string too long"));
+ }
+ string[counter] = '\0';
+}
+
+static long int
+get_long (char const *string)
+{
+ char *p;
+ long int n;
+ errno = 0;
+ n = strtol (string, &p, 10);
+ if (errno == ERANGE)
+ {
+ report_numbered_error (errno);
+ exit (EXIT_FAILURE);
+ }
+ if (!*string || *p)
+ {
+ report_error_message (N_("Number syntax error"));
+ exit (EXIT_FAILURE);
+ }
+ return n;
+}
+
+static void
+prepare_input_buffer (int fd, size_t size)
+{
+ if (size <= allocated_size)
+ return;
+
+ if (record_buffer)
+ free (record_buffer);
+
+ record_buffer = malloc (size);
+
+ if (! record_buffer)
+ {
+ DEBUG (_("rmtd: Cannot allocate buffer space\n"));
+
+ report_error_message (N_("Cannot allocate buffer space"));
+ exit (EXIT_FAILURE); /* exit status used to be 4 */
+ }
+
+ allocated_size = size;
+
+#ifdef SO_RCVBUF
+ if (0 <= fd)
+ {
+ int isize = size < INT_MAX ? size : INT_MAX;
+ while (setsockopt (fd, SOL_SOCKET, SO_RCVBUF,
+ (char *) &isize, sizeof isize)
+ && 1024 < isize)
+ isize >>= 1;
+ }
+#endif
+}
+
+/* Decode OFLAG_STRING, which represents the 2nd argument to `open'.
+ OFLAG_STRING should contain an optional integer, followed by an optional
+ symbolic representation of an open flag using only '|' to separate its
+ components (e.g. "O_WRONLY|O_CREAT|O_TRUNC"). Prefer the symbolic
+ representation if available, falling back on the numeric
+ representation, or to zero if both formats are absent.
+
+ This function should be the inverse of encode_oflag. The numeric
+ representation is not portable from one host to another, but it is
+ for backward compatibility with old-fashioned clients that do not
+ emit symbolic open flags. */
+
+static int
+decode_oflag (char const *oflag_string)
+{
+ char *oflag_num_end;
+ int numeric_oflag = strtol (oflag_string, &oflag_num_end, 10);
+ int symbolic_oflag = 0;
+
+ oflag_string = oflag_num_end;
+ while (ISSPACE ((unsigned char) *oflag_string))
+ oflag_string++;
+
+ do
+ {
+ struct name_value_pair { char const *name; int value; };
+ static struct name_value_pair const table[] =
+ {
+#ifdef O_APPEND
+ {"APPEND", O_APPEND},
+#endif
+ {"CREAT", O_CREAT},
+#ifdef O_DSYNC
+ {"DSYNC", O_DSYNC},
+#endif
+ {"EXCL", O_EXCL},
+#ifdef O_LARGEFILE
+ {"LARGEFILE", O_LARGEFILE}, /* LFS extension for opening large files */
+#endif
+#ifdef O_NOCTTY
+ {"NOCTTY", O_NOCTTY},
+#endif
+#if O_NONBLOCK
+ {"NONBLOCK", O_NONBLOCK},
+#endif
+ {"RDONLY", O_RDONLY},
+ {"RDWR", O_RDWR},
+#ifdef O_RSYNC
+ {"RSYNC", O_RSYNC},
+#endif
+#ifdef O_SYNC
+ {"SYNC", O_SYNC},
+#endif
+ {"TRUNC", O_TRUNC},
+ {"WRONLY", O_WRONLY}
+ };
+ struct name_value_pair const *t;
+ size_t s;
+
+ if (*oflag_string++ != 'O' || *oflag_string++ != '_')
+ return numeric_oflag;
+
+ for (t = table;
+ (strncmp (oflag_string, t->name, s = strlen (t->name)) != 0
+ || (oflag_string[s]
+ && strchr ("ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789",
+ oflag_string[s])));
+ t++)
+ if (t == table + sizeof table / sizeof *table - 1)
+ return numeric_oflag;
+
+ symbolic_oflag |= t->value;
+ oflag_string += s;
+ }
+ while (*oflag_string++ == '|');
+
+ return symbolic_oflag;
+}
+
+static struct option const long_opts[] =
+{
+ {"help", no_argument, 0, 'h'},
+ {"version", no_argument, 0, 'v'},
+ {0, 0, 0, 0}
+};
+
+/* In-line localization is used only if --help or --version are
+ locally used. Otherwise, the localization burden lies with tar. */
+static void
+i18n_setup ()
+{
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+}
+
+static void usage (int) __attribute__ ((noreturn));
+
+static void
+usage (int status)
+{
+ i18n_setup ();
+
+ if (status != EXIT_SUCCESS)
+ fprintf (stderr, _("Try `%s --help' for more information.\n"),
+ program_name);
+ else
+ {
+ printf (_("\
+Usage: %s [OPTION]\n\
+Manipulate a tape drive, accepting commands from a remote process.\n\
+\n\
+ --version Output version info.\n\
+ --help Output this help.\n"),
+ program_name);
+ printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ close_stdout ();
+ }
+
+ exit (status);
+}
+
+static void
+respond (long int status)
+{
+ DEBUG1 ("rmtd: A %ld\n", status);
+
+ sprintf (reply_buffer, "A%ld\n", status);
+ full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
+}
+
+
+
+static void
+open_device (void)
+{
+ char *device_string = get_string ();
+ char *oflag_string = get_string ();
+
+ DEBUG2 ("rmtd: O %s %s\n", device_string, oflag_string);
+
+ if (tape >= 0)
+ close (tape);
+
+ tape = open (device_string, decode_oflag (oflag_string), MODE_RW);
+ if (tape < 0)
+ report_numbered_error (errno);
+ else
+ respond (0);
+ free_string (device_string);
+ free_string (oflag_string);
+}
+
+static void
+close_device (void)
+{
+ free_string (get_string ()); /* discard */
+ DEBUG ("rmtd: C\n");
+
+ if (close (tape) < 0)
+ report_numbered_error (errno);
+ else
+ {
+ tape = -1;
+ respond (0);
+ }
+}
+
+static void
+lseek_device (void)
+{
+ char count_string[STRING_SIZE];
+ char position_string[STRING_SIZE];
+ off_t count = 0;
+ int negative;
+ int whence;
+ char *p;
+
+ get_string_n (count_string);
+ get_string_n (position_string);
+ DEBUG2 ("rmtd: L %s %s\n", count_string, position_string);
+
+ /* Parse count_string, taking care to check for overflow.
+ We can't use standard functions,
+ since off_t might be longer than long. */
+
+ for (p = count_string; *p == ' ' || *p == '\t'; p++)
+ ;
+
+ negative = *p == '-';
+ p += negative || *p == '+';
+
+ for (; *p; p++)
+ {
+ int digit = *p - '0';
+ if (9 < (unsigned) digit)
+ {
+ report_error_message (N_("Seek offset error"));
+ exit (EXIT_FAILURE);
+ }
+ else
+ {
+ off_t c10 = 10 * count;
+ off_t nc = negative ? c10 - digit : c10 + digit;
+ if (c10 / 10 != count || (negative ? c10 < nc : nc < c10))
+ {
+ report_error_message (N_("Seek offset out of range"));
+ exit (EXIT_FAILURE);
+ }
+ count = nc;
+ }
+ }
+
+ switch (get_long (position_string))
+ {
+ case 0:
+ whence = SEEK_SET;
+ break;
+
+ case 1:
+ whence = SEEK_CUR;
+ break;
+
+ case 2:
+ whence = SEEK_END;
+ break;
+
+ default:
+ report_error_message (N_("Seek direction out of range"));
+ exit (EXIT_FAILURE);
+ }
+
+ count = lseek (tape, count, whence);
+ if (count < 0)
+ report_numbered_error (errno);
+ else
+ {
+ /* Convert count back to string for reply.
+ We can't use sprintf, since off_t might be longer
+ than long. */
+ p = count_string + sizeof count_string;
+ *--p = '\0';
+ do
+ *--p = '0' + (int) (count % 10);
+ while ((count /= 10) != 0);
+
+ DEBUG1 ("rmtd: A %s\n", p);
+
+ sprintf (reply_buffer, "A%s\n", p);
+ full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
+ }
+}
+
+static void
+write_device (void)
+{
+ char count_string[STRING_SIZE];
+ size_t size;
+ size_t counter;
+ size_t status = 0;
+
+ get_string_n (count_string);
+ size = get_long (count_string);
+ DEBUG1 ("rmtd: W %s\n", count_string);
+
+ prepare_input_buffer (STDIN_FILENO, size);
+ for (counter = 0; counter < size; counter += status)
+ {
+ status = safe_read (STDIN_FILENO, &record_buffer[counter],
+ size - counter);
+ if (status == SAFE_READ_ERROR || status == 0)
+ {
+ DEBUG (_("rmtd: Premature eof\n"));
+
+ report_error_message (N_("Premature end of file"));
+ exit (EXIT_FAILURE); /* exit status used to be 2 */
+ }
+ }
+ status = full_write (tape, record_buffer, size);
+ if (status != size)
+ report_numbered_error (errno);
+ else
+ respond (status);
+}
+
+static void
+read_device (void)
+{
+ char count_string[STRING_SIZE];
+ size_t size;
+ size_t status;
+
+ get_string_n (count_string);
+ DEBUG1 ("rmtd: R %s\n", count_string);
+
+ size = get_long (count_string);
+ prepare_input_buffer (-1, size);
+ status = safe_read (tape, record_buffer, size);
+ if (status == SAFE_READ_ERROR)
+ report_numbered_error (errno);
+ else
+ {
+ sprintf (reply_buffer, "A%lu\n", (unsigned long int) status);
+ full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
+ full_write (STDOUT_FILENO, record_buffer, status);
+ }
+}
+
+static void
+mtioctop (void)
+{
+ char operation_string[STRING_SIZE];
+ char count_string[STRING_SIZE];
+
+ get_string_n (operation_string);
+ get_string_n (count_string);
+ DEBUG2 ("rmtd: I %s %s\n", operation_string, count_string);
+
+#ifdef MTIOCTOP
+ {
+ struct mtop mtop;
+ const char *p;
+ off_t count = 0;
+ int negative;
+
+ /* Parse count_string, taking care to check for overflow.
+ We can't use standard functions,
+ since off_t might be longer than long. */
+
+ for (p = count_string; *p == ' ' || *p == '\t'; p++)
+ ;
+
+ negative = *p == '-';
+ p += negative || *p == '+';
+
+ for (;;)
+ {
+ int digit = *p++ - '0';
+ if (9 < (unsigned) digit)
+ break;
+ else
+ {
+ off_t c10 = 10 * count;
+ off_t nc = negative ? c10 - digit : c10 + digit;
+ if (c10 / 10 != count
+ || (negative ? c10 < nc : nc < c10))
+ {
+ report_error_message (N_("Seek offset out of range"));
+ exit (EXIT_FAILURE);
+ }
+ count = nc;
+ }
+ }
+
+ mtop.mt_count = count;
+ if (mtop.mt_count != count)
+ {
+ report_error_message (N_("Seek offset out of range"));
+ exit (EXIT_FAILURE);
+ }
+ mtop.mt_op = get_long (operation_string);
+
+ if (ioctl (tape, MTIOCTOP, (char *) &mtop) < 0)
+ {
+ report_numbered_error (errno);
+ return;
+ }
+ }
+#endif
+ respond (0);
+}
+
+static void
+status_device (void)
+{
+ DEBUG ("rmtd: S\n");
+
+#ifdef MTIOCGET
+ {
+ struct mtget operation;
+
+ if (ioctl (tape, MTIOCGET, (char *) &operation) < 0)
+ report_numbered_error (errno);
+ else
+ {
+ respond (sizeof operation);
+ full_write (STDOUT_FILENO, (char *) &operation, sizeof operation);
+ }
+ }
+#endif
+}
+
+int
+main (int argc, char **argv)
+{
+ char command;
+
+ program_name = argv[0];
+
+ obstack_init (&string_stk);
+
+ switch (getopt_long (argc, argv, "", long_opts, NULL))
+ {
+ default:
+ usage (EXIT_FAILURE);
+
+ case 'h':
+ usage (EXIT_SUCCESS);
+
+ case 'v':
+ i18n_setup ();
+ version_etc (stdout, "rmt", PACKAGE_NAME, PACKAGE_VERSION,
+ "John Gilmore", "Jay Fenlason", (char *) NULL);
+ close_stdout ();
+ return EXIT_SUCCESS;
+
+ case -1:
+ break;
+ }
+
+ if (optind < argc)
+ {
+ if (optind != argc - 1)
+ usage (EXIT_FAILURE);
+ debug_file = fopen (argv[optind], "w");
+ if (debug_file == 0)
+ {
+ report_numbered_error (errno);
+ return EXIT_FAILURE;
+ }
+ setbuf (debug_file, 0);
+ }
+
+ while (1)
+ {
+ errno = 0;
+
+ if (safe_read (STDIN_FILENO, &command, 1) != 1)
+ return EXIT_SUCCESS;
+
+ switch (command)
+ {
+ case 'O':
+ open_device ();
+ break;
+
+ case 'C':
+ close_device ();
+ break;
+
+ case 'L':
+ lseek_device ();
+ break;
+
+ case 'W':
+ write_device ();
+ break;
+
+ case 'R':
+ read_device ();
+ break;
+
+ case 'I':
+ mtioctop ();
+ break;
+
+ case 'S':
+ status_device ();
+ break;
+
+ default:
+ DEBUG1 ("rmtd: Garbage command %c\n", command);
+ report_error_message (N_("Garbage command"));
+ return EXIT_FAILURE; /* exit status used to be 3 */
+ }
+ }
+}
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
new file mode 100644
index 0000000..a250a66
--- /dev/null
+++ b/scripts/Makefile.am
@@ -0,0 +1,49 @@
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+## 02110-1301, USA.
+
+BACKUP_LIBEXEC_SCRIPTS_LIST=backup.sh dump-remind
+BACKUP_SBIN_SCRIPTS_LIST=backup restore
+libexec_SCRIPTS=@BACKUP_LIBEXEC_SCRIPTS@
+AM_INSTALLCHECK_STD_OPTIONS_EXEMPT=backup.sh dump-remind
+sbin_SCRIPTS=@BACKUP_SBIN_SCRIPTS@
+EXTRA_SCRIPTS=tarcat
+EXTRA_DIST=\
+ backup.sh.in\
+ backup.in\
+ restore.in\
+ dump-remind.in\
+ backup-specs
+CLEANFILES=backup.sh backup restore dump-remind
+
+SED_CMD="s,\@libexecdir\@,$(libexecdir),;\
+ s,\@sysconfdir\@,$(sysconfdir),;\
+ s,\@PACKAGE_NAME\@,$(PACKAGE_NAME),;\
+ s,\@VERSION\@,$(VERSION),;\
+ s,\@PACKAGE_BUGREPORT\@,$(PACKAGE_BUGREPORT),;\
+ s,\@DATE_FORMAT_OK\@,$(DATE_FORMAT_OK),;@BACKUP_SED_COND@"
+
+backup.sh: $(srcdir)/backup.sh.in
+ sed $(SED_CMD) $? > $@
+
+backup: $(srcdir)/backup.in
+ sed $(SED_CMD) $? > $@
+
+restore: $(srcdir)/restore.in
+ sed $(SED_CMD) $? > $@
+
+dump-remind: $(srcdir)/dump-remind.in
+ sed $(SED_CMD) $? > $@
diff --git a/scripts/Makefile.in b/scripts/Makefile.in
new file mode 100644
index 0000000..a28170e
--- /dev/null
+++ b/scripts/Makefile.in
@@ -0,0 +1,705 @@
+# Makefile.in generated by automake 1.10a from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007 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) 2004, 2006 Free Software Foundation, Inc.
+
+VPATH = @srcdir@
+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 = scripts
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/absolute-header.m4 \
+ $(top_srcdir)/m4/alloca.m4 $(top_srcdir)/m4/allocsa.m4 \
+ $(top_srcdir)/m4/argmatch.m4 $(top_srcdir)/m4/argp.m4 \
+ $(top_srcdir)/m4/backupfile.m4 $(top_srcdir)/m4/bison.m4 \
+ $(top_srcdir)/m4/canonicalize-lgpl.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/chown.m4 \
+ $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close-stream.m4 $(top_srcdir)/m4/closeout.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/d-ino.m4 \
+ $(top_srcdir)/m4/dirfd.m4 $(top_srcdir)/m4/dirname.m4 \
+ $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/double-slash-root.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eealloc.m4 \
+ $(top_srcdir)/m4/eoverflow.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exclude.m4 $(top_srcdir)/m4/exitfail.m4 \
+ $(top_srcdir)/m4/extensions.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-safer.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+ $(top_srcdir)/m4/fileblocks.m4 $(top_srcdir)/m4/float_h.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fpending.m4 \
+ $(top_srcdir)/m4/ftruncate.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdate.m4 $(top_srcdir)/m4/getdelim.m4 \
+ $(top_srcdir)/m4/getline.m4 $(top_srcdir)/m4/getopt.m4 \
+ $(top_srcdir)/m4/getpagesize.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/hash.m4 \
+ $(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intmax_t.m4 \
+ $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lchown.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/lstat.m4 $(top_srcdir)/m4/mbchar.m4 \
+ $(top_srcdir)/m4/mbiter.m4 $(top_srcdir)/m4/mbrtowc.m4 \
+ $(top_srcdir)/m4/mbscasecmp.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mempcpy.m4 \
+ $(top_srcdir)/m4/memrchr.m4 $(top_srcdir)/m4/memset.m4 \
+ $(top_srcdir)/m4/mkdtemp.m4 $(top_srcdir)/m4/mktime.m4 \
+ $(top_srcdir)/m4/modechange.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/pathmax.m4 \
+ $(top_srcdir)/m4/paxutils.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quote.m4 \
+ $(top_srcdir)/m4/quotearg.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/rmdir.m4 \
+ $(top_srcdir)/m4/rmt.m4 $(top_srcdir)/m4/rpmatch.m4 \
+ $(top_srcdir)/m4/rtapelib.m4 $(top_srcdir)/m4/safe-read.m4 \
+ $(top_srcdir)/m4/safe-write.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/savedir.m4 $(top_srcdir)/m4/setenv.m4 \
+ $(top_srcdir)/m4/sleep.m4 $(top_srcdir)/m4/ssize_t.m4 \
+ $(top_srcdir)/m4/stat-time.m4 $(top_srcdir)/m4/stdarg.m4 \
+ $(top_srcdir)/m4/stdbool.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/string_h.m4 $(top_srcdir)/m4/strndup.m4 \
+ $(top_srcdir)/m4/strnlen.m4 $(top_srcdir)/m4/strtoimax.m4 \
+ $(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoll.m4 \
+ $(top_srcdir)/m4/strtoul.m4 $(top_srcdir)/m4/strtoull.m4 \
+ $(top_srcdir)/m4/strtoumax.m4 $(top_srcdir)/m4/sys_stat_h.m4 \
+ $(top_srcdir)/m4/sys_time_h.m4 $(top_srcdir)/m4/sysexits.m4 \
+ $(top_srcdir)/m4/system.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/time_r.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
+ $(top_srcdir)/m4/unlinkdir.m4 $(top_srcdir)/m4/unlocked-io.m4 \
+ $(top_srcdir)/m4/utimbuf.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wchar.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wctype.m4 \
+ $(top_srcdir)/m4/wcwidth.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xgetcwd.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/xstrtol.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)"
+libexecSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(libexec_SCRIPTS) $(sbin_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ABSOLUTE_DIRENT_H = @ABSOLUTE_DIRENT_H@
+ABSOLUTE_FCNTL_H = @ABSOLUTE_FCNTL_H@
+ABSOLUTE_FLOAT_H = @ABSOLUTE_FLOAT_H@
+ABSOLUTE_INTTYPES_H = @ABSOLUTE_INTTYPES_H@
+ABSOLUTE_STDINT_H = @ABSOLUTE_STDINT_H@
+ABSOLUTE_STDIO_H = @ABSOLUTE_STDIO_H@
+ABSOLUTE_STDLIB_H = @ABSOLUTE_STDLIB_H@
+ABSOLUTE_STRING_H = @ABSOLUTE_STRING_H@
+ABSOLUTE_SYSEXITS_H = @ABSOLUTE_SYSEXITS_H@
+ABSOLUTE_SYS_STAT_H = @ABSOLUTE_SYS_STAT_H@
+ABSOLUTE_SYS_TIME_H = @ABSOLUTE_SYS_TIME_H@
+ABSOLUTE_TIME_H = @ABSOLUTE_TIME_H@
+ABSOLUTE_UNISTD_H = @ABSOLUTE_UNISTD_H@
+ABSOLUTE_WCHAR_H = @ABSOLUTE_WCHAR_H@
+ABSOLUTE_WCTYPE_H = @ABSOLUTE_WCTYPE_H@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOM4TE = @AUTOM4TE@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BACKUP_LIBEXEC_SCRIPTS = @BACKUP_LIBEXEC_SCRIPTS@
+BACKUP_SBIN_SCRIPTS = @BACKUP_SBIN_SCRIPTS@
+BACKUP_SED_COND = @BACKUP_SED_COND@
+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@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFAULT_ARCHIVE = @DEFAULT_ARCHIVE@
+DEFAULT_ARCHIVE_FORMAT = @DEFAULT_ARCHIVE_FORMAT@
+DEFAULT_BLOCKING = @DEFAULT_BLOCKING@
+DEFAULT_QUOTING_STYLE = @DEFAULT_QUOTING_STYLE@
+DEFAULT_RMT_COMMAND = @DEFAULT_RMT_COMMAND@
+DEFAULT_RMT_DIR = @DEFAULT_RMT_DIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRENT_H = @DIRENT_H@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EOVERFLOW = @EOVERFLOW@
+EXEEXT = @EXEEXT@
+FCNTL_H = @FCNTL_H@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+GETOPT_H = @GETOPT_H@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GREP = @GREP@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_MKDIR = @HAVE_DECL_MKDIR@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_IO_H = @HAVE_IO_H@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_READLINK = @HAVE_READLINK@
+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_SLEEP = @HAVE_SLEEP@
+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_STRNDUP = @HAVE_STRNDUP@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_SYSEXITS_H = @HAVE_SYSEXITS_H@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE__BOOL = @HAVE__BOOL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTTYPES_H = @INTTYPES_H@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTAR_LIBDEPS = @LIBTAR_LIBDEPS@
+LIBTAR_LTLIBDEPS = @LIBTAR_LTLIBDEPS@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_SETSOCKOPT = @LIB_SETSOCKOPT@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PU_RMT_PROG = @PU_RMT_PROG@
+RANLIB = @RANLIB@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_FCHDIR = @REPLACE_FCHDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STRPTIME = @REPLACE_STRPTIME@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYSEXITS_H = @SYSEXITS_H@
+SYS_STAT_H = @SYS_STAT_H@
+SYS_TIME_H = @SYS_TIME_H@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WCHAR_H = @WCHAR_H@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WCTYPE_H = @WCTYPE_H@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+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@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+BACKUP_LIBEXEC_SCRIPTS_LIST = backup.sh dump-remind
+BACKUP_SBIN_SCRIPTS_LIST = backup restore
+libexec_SCRIPTS = @BACKUP_LIBEXEC_SCRIPTS@
+AM_INSTALLCHECK_STD_OPTIONS_EXEMPT = backup.sh dump-remind
+sbin_SCRIPTS = @BACKUP_SBIN_SCRIPTS@
+EXTRA_SCRIPTS = tarcat
+EXTRA_DIST = \
+ backup.sh.in\
+ backup.in\
+ restore.in\
+ dump-remind.in\
+ backup-specs
+
+CLEANFILES = backup.sh backup restore dump-remind
+SED_CMD = "s,\@libexecdir\@,$(libexecdir),;\
+ s,\@sysconfdir\@,$(sysconfdir),;\
+ s,\@PACKAGE_NAME\@,$(PACKAGE_NAME),;\
+ s,\@VERSION\@,$(VERSION),;\
+ s,\@PACKAGE_BUGREPORT\@,$(PACKAGE_BUGREPORT),;\
+ s,\@DATE_FORMAT_OK\@,$(DATE_FORMAT_OK),;@BACKUP_SED_COND@"
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits scripts/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnits scripts/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(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
+install-libexecSCRIPTS: $(libexec_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)"
+ @list='$(libexec_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(libexecSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(libexecdir)/$$f'"; \
+ $(libexecSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(libexecdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-libexecSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libexec_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(libexecdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(libexecdir)/$$f"; \
+ done
+
+installcheck-libexecSCRIPTS: $(libexec_SCRIPTS)
+ bad=0; pid=$$$$; list="$(libexec_SCRIPTS)"; for p in $$list; do \
+ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+ esac; \
+ f=`echo "$$p" | sed 's,^.*/,,;$(transform)'`; \
+ for opt in --help --version; do \
+ if "$(DESTDIR)$(libexecdir)/$$f" $$opt >c$${pid}_.out \
+ 2>c$${pid}_.err </dev/null \
+ && test -n "`cat c$${pid}_.out`" \
+ && test -z "`cat c$${pid}_.err`"; then :; \
+ else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+ done; \
+ done; rm -f c$${pid}_.???; exit $$bad
+install-sbinSCRIPTS: $(sbin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)"
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(sbinSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+ $(sbinSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(sbindir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-sbinSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+ done
+
+installcheck-sbinSCRIPTS: $(sbin_SCRIPTS)
+ bad=0; pid=$$$$; list="$(sbin_SCRIPTS)"; for p in $$list; do \
+ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+ esac; \
+ f=`echo "$$p" | sed 's,^.*/,,;$(transform)'`; \
+ for opt in --help --version; do \
+ if "$(DESTDIR)$(sbindir)/$$f" $$opt >c$${pid}_.out \
+ 2>c$${pid}_.err </dev/null \
+ && test -n "`cat c$${pid}_.out`" \
+ && test -z "`cat c$${pid}_.err`"; then :; \
+ else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+ done; \
+ done; rm -f c$${pid}_.???; exit $$bad
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 $(SCRIPTS)
+installdirs:
+ for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-libexecSCRIPTS install-sbinSCRIPTS
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am: installcheck-libexecSCRIPTS installcheck-sbinSCRIPTS
+
+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: uninstall-libexecSCRIPTS uninstall-sbinSCRIPTS
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic 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-libexecSCRIPTS install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-sbinSCRIPTS install-strip \
+ installcheck installcheck-am installcheck-libexecSCRIPTS \
+ installcheck-sbinSCRIPTS installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-libexecSCRIPTS uninstall-sbinSCRIPTS
+
+
+backup.sh: $(srcdir)/backup.sh.in
+ sed $(SED_CMD) $? > $@
+
+backup: $(srcdir)/backup.in
+ sed $(SED_CMD) $? > $@
+
+restore: $(srcdir)/restore.in
+ sed $(SED_CMD) $? > $@
+
+dump-remind: $(srcdir)/dump-remind.in
+ sed $(SED_CMD) $? > $@
+# 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/scripts/backup-specs b/scripts/backup-specs
new file mode 100644
index 0000000..95ef316
--- /dev/null
+++ b/scripts/backup-specs
@@ -0,0 +1,100 @@
+# This is a sample configuration file for GNU tar backup script.
+# See end of file for copying conditions
+
+# User name or email address of the administrator of backups. A report
+# will be sent to this address when the backup terminates
+ADMINISTRATOR="root@localhost"
+
+# (Optional) Path to tar binary.
+TAR=/bin/tar
+
+# (Optional) Path to rsh binary or its equivalent. You may wish to
+# set it to ssh as shown in the example below, to improve security.
+# In this case you will have to use public key authentication.
+RSH=/usr/local/bin/ssh
+
+# (Optional) Path to rsh binary on remote mashines. This will be
+# passed via --rsh-command option to the remote invocation of
+# tar
+RSH_COMMAND=/usr/local/bin/ssh
+
+# Name of temporary file to hold volume numbers. This needs to be accessible
+# by all the machines which have filesystems to be dumped.
+VOLNO_FILE=/root/volume
+
+# Device to use for dumping. It should be on the host
+# on which the dump scripts are run.
+TAPE_FILE=/dev/rmt0
+
+# Blocking factor to use for writing the dump.
+BLOCKING=124
+
+# List of file systems to be dumped. If prefixed with a HOST:
+# the filesystem is accessed on the given HOST, unless it
+# coincides with the local machine name.
+# If a file system starts with a slash, it is handled as a local
+# one.
+BACKUP_DIRS='remote1:/etc remote1:/var/spool/crontab'
+# Alternatively, you may leave this variable unassigned, and
+# keep the list of filesystems to be dumped in file
+# $SYSCONFDIR/backup/dirs, one filesystem per line. Empty
+# lines and shell comments are allowed in this file. The location
+# of this file may be overridden using DIRLIST variable, e.g.:
+# DIRLIST=/etc/my-backup/dirlist
+
+# List of individual files to be dumped.
+# These should be accesible from the machine on which the dump is run.
+BACKUP_FILES=''
+# This list may also be kept in file $SYSCONFDIR/backup/files, the
+# format of which is the same as described above. The location of
+# this file may be overridden by setting FILELIST variable:
+# FILELIST=/etc/my-backup/filelist
+
+# Name of 'exclude file list'. It is searched under $SYSCONFDIR/tar-backup
+# on remote machines
+XLIST=exclude_files
+
+# Default directory for storing incremental listings on remote
+# machines is $SYSCONFDIR/tar-backup. It can be overridden using
+# REMOTEBACKUPDIR variable
+
+# Default directory for storing backup logs is $SYSCONFDIR/backup/log.
+# It can also be overridden via LOGPATH variable.
+
+# Time to sleep between dumps of any two successive filesystems
+SLEEP_TIME=15
+
+# Script to be run when it's time to insert a new tape in for the next
+# volume. Administrators may want to tailor this script for their site.
+# If this variable isn't set, tar will use some default behavior which is
+# probably defined in the manual.
+#DUMP_REMIND_SCRIPT='rsh apple-gunkies /home/gd2/dump/dump-remind'
+
+# Message to display on the terminal while waiting for dump time. Usually
+# this will just be some literal text, preferably something more
+# entertaining than this. The awk script here saves some redundant
+# repetition, but is not really all that desirable.
+SLEEP_MESSAGE="`awk '
+ BEGIN {
+ for (i = 0; i < 30; i++)
+ print \" \" \
+ \"D O N O T T O U C H T H I S T E R M I N A L !!!!!\"
+ }' /dev/null`"
+
+
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+## 02110-1301, USA.
diff --git a/scripts/backup.in b/scripts/backup.in
new file mode 100644
index 0000000..6a50e51
--- /dev/null
+++ b/scripts/backup.in
@@ -0,0 +1,253 @@
+#! /bin/sh
+# This program is part of GNU tar
+# Copyright (C) 2004, 2005, 2006 Free Software Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 1, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Load library routines
+SYSCONFDIR=${SYSCONFDIR-@sysconfdir@}
+. ${LIBDIR-@libexecdir@}/backup.sh
+
+DUMP_LEVEL=0
+TIME=
+NOW=`now`
+
+usage() {
+ cat - <<EOF
+usage: $PROGNAME [OPTIONS] [WHEN]
+Options are:
+
+ -l, --level=LEVEL Do backup level LEVEL (default $DUMP_LEVEL).
+ -f, --force Force backup even if today's log file already
+ exists.
+ -v, --verbose[=LEVEL] Set verbosity level. Default 100.
+ -t, --time=TIME Wait till TIME, then do backup.
+
+Informational options:
+ -h, --help Display this help message.
+ -V, --version Display program version.
+
+ Optional argument WHEN is for backward compatibility only. It has been
+ superseded by --time option.
+ TIME argument can be one of:
+
+ now -- do backup immediately.
+ HH -- do backup at HH hours.
+ HH:MM -- do backup at HH:MM.
+
+Send bug reports to @PACKAGE_BUGREPORT@.
+EOF
+}
+
+# For compatibility with previous versions, deduce the backup level
+# from the command name
+case "$PROGNAME" in
+level-[0-9]) DUMP_LEVEL=`expr $PROGNAME : 'level-\([0-9][0-9]*\)'`;;
+esac
+
+for opt
+do
+ if [ -z "$prev" ]; then
+ option=$opt
+ optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
+ else
+ option="${prev}=$opt"
+ prev=""
+ optarg=$opt
+ fi
+ case $option in
+ --l=*|--le=*|--lev=*|--leve=*|--level=*)
+ DUMP_LEVEL=$optarg
+ ;;
+ -l|--l|--le|--lev|--leve|--level)
+ prev=$option
+ ;;
+ --verb=*|--verbo=*|--verbos=*|--verbose=*)
+ VERBOSE=$optarg
+ ;;
+ -v|--verb|--verbo|--verbos|--verbose)
+ VERBOSE=100
+ ;;
+ -v*) VERBOSE=`expr $option : "-v\(.*\)"`;;
+ --t=*|--ti=*|--tim=*|--time=*)
+ TIME=$optarg
+ ;;
+ -t) prev=--t;;
+ -t*) TIME=`expr $option : "-t\(.*\)"`;;
+ --t|--ti|--tim|--time)
+ prev=$option
+ ;;
+ -V|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "backup (@PACKAGE_NAME@) @VERSION@"
+ license
+ exit;;
+ -h|--h|--he|--hel|--help)
+ usage
+ exit;;
+ -f|--f|--fo|--for|--forc|--force)
+ FORCE=yes
+ ;;
+ *) if [ "x$TIME" != "x" ]; then
+ bailout "Extra argument. Try $PROGNAME --help for more info."
+ else
+ TIME=$option
+ fi;;
+ esac
+done
+
+if [ "x$TIME" = x ]; then
+ bailout "No backup time specified. Try $PROGNAME --help for more info."
+ exit 1
+fi
+
+init_backup
+
+# Maybe sleep until around specified or default hour.
+wait_time $TIME
+
+if [ $DUMP_LEVEL -ne 0 ]; then
+ PREV_LEVEL=`expr $DUMP_LEVEL - 1`
+ PREV_DATE=`ls -t ${LOGPATH}/log-*-level-$PREV_LEVEL|
+ head -n 1|
+ sed "s,${LOGPATH}/log-\(.*\)-level.*,\1,"`
+ if [ "x$PREV_DATE" = x ]; then
+ bailout "Can't determine date of the previous backup"
+ fi
+ message 0 "Backup from $PREV_DATE to $NOW"
+fi
+
+# start doing things
+
+# Make sure the log file did not already exist. Create it.
+
+if [ "x$FORCE" = "xyes" ]; then
+ rm ${LOGFILE}
+fi
+
+if [ -f "${LOGFILE}" ] ; then
+ bailout "Log file ${LOGFILE} already exists."
+else
+ touch "${LOGFILE}"
+fi
+message 1 "Ready for backup."
+message 10 "TAR invocation: $TAR_PART1"
+message 20 "Variables:"
+message 20 "BACKUP_DIRS=$BACKUP_DIRS"
+message 20 "BACKUP_FILES=$BACKUP_FILES"
+
+# The buch of commands below is run in a subshell for which all output is
+# piped through `tee' to the logfile. Doing this, instead of having
+# multiple pipelines all over the place, is cleaner and allows access to
+# the exit value from various commands more easily.
+(
+ message 1 "preparing tapes"
+ $MT_BEGIN "${TAPE_FILE}"
+ rm -f "${VOLNO_FILE}"
+
+ message 1 "processing backup directories"
+
+ set - ${BACKUP_DIRS}
+ while [ $# -ne 0 ] ; do
+ date="`date`"
+ fs="`echo \"${1}\" | sed -e 's/^.*://'`"
+ fs=`root_fs $fs`
+ fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
+ remotehost="`expr \"${1}\" : '\([^/][^/]*\):.*'`"
+ if [ -z "$remotehost" ]; then
+ remotehost=$localhost
+ fi
+
+ echo "Backing up ${1} at ${date}"
+ message 10 "fs=$fs"
+ message 10 "fsname=$fsname"
+ message 10 "remotehost=$remotehost"
+ if [ $DUMP_LEVEL -eq 0 ]; then
+ make_level_log ${remotehost}
+ else
+ echo "Last `prev_level` dump on this filesystem was on $PREV_DATE"
+ remote_run "${remotehost}" cp "`level_log_name ${fsname} $PREV_LEVEL`" "`level_log_name temp`"
+ fi
+
+ ${DUMP_BEGIN-:} $DUMP_LEVEL $remotehost $fs $fsname
+ backup_host ${remotehost} \
+ "--listed=`level_log_name temp`" \
+ "--label='`print_level` backup of ${fs} on ${remotehost} at ${NOW}'" \
+ -C ${fs} .
+
+ # `rsh' doesn't exit with the exit status of the remote command. What
+ # stupid lossage. TODO: think of a reliable workaround.
+ if [ $? -ne 0 ] ; then
+ echo "Backup of ${1} failed." 1>&2
+ # I'm assuming that the tar will have written an empty
+ # file to the tape, otherwise I should do a cat here.
+ else
+ flush_level_log ${remotehost} ${fsname}
+ fi
+ ${MT_STATUS} "$TAPE_FILE"
+ ${DUMP_END-:} $DUMP_LEVEL $remotehost $fs $fsname
+ echo "sleeping ${SLEEP_TIME} seconds"
+ sleep ${SLEEP_TIME}
+ shift
+ done
+
+ # Dump any individual files requested.
+
+ if [ "x${BACKUP_FILES}" != "x" ] ; then
+ message 1 "processing individual files"
+
+ date="`date`"
+
+ if [ $DUMP_LEVEL -eq 0 ]; then
+ make_level_log $localhost
+ else
+ echo "Last `prev_level` dump on this filesystem was on $PREV_DATE"
+ remote_run "${localhost}" cp "`level_log_name MISC $PREV_LEVEL`" "`level_log_name temp`"
+ fi
+
+ echo "Backing up miscellaneous files at ${date}"
+
+ ${DUMP_BEGIN-:} $DUMP_LEVEL $localhost MISC MISC
+ backup_host $localhost \
+ "--listed=`level_log_name temp`"\
+ "--label='`print_level` backup of miscellaneous files at ${NOW}'" \
+ ${BACKUP_FILES}
+
+ if [ $? -ne 0 ] ; then
+ echo "Backup of miscellaneous files failed."
+ # I'm assuming that the tar will have written an empty
+ # file to the tape, otherwise I should do a cat here.
+ else
+ flush_level_log $localhost MISC
+ fi
+ ${MT_STATUS} "$TAPE_FILE"
+ ${DUMP_END-:} $DUMP_LEVEL $localhost MISC MISC
+ else
+ echo "No miscellaneous files specified"
+ fi
+
+ message 1 "final cleanup"
+
+ $MT_REWIND "${TAPE_FILE}"
+ $MT_OFFLINE "${TAPE_FILE}"
+ echo "."
+) 2>&1 | tee -a "${LOGFILE}"
+
+if test "${ADMINISTRATOR}" != NONE; then
+ echo "Sending the dump log to ${ADMINISTRATOR}"
+ mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}"
+fi
+
+# EOF
diff --git a/scripts/backup.sh.in b/scripts/backup.sh.in
new file mode 100644
index 0000000..adcdfe2
--- /dev/null
+++ b/scripts/backup.sh.in
@@ -0,0 +1,347 @@
+#! /bin/sh
+# This program is part of GNU tar
+# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 1, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+PROGNAME=`basename $0`
+CONFIGPATH="$SYSCONFDIR/backup"
+REMOTEBACKUPDIR="$SYSCONFDIR/tar-backup"
+CONFIGFILE=${CONFIGPATH}/backup-specs
+DIRLIST=${CONFIGPATH}/dirs
+FILELIST=${CONFIGPATH}/files
+LOGPATH=${CONFIGPATH}/log
+
+# Default functions for running various magnetic tape commands
+mt_begin() {
+ $MT -f "$1" retension
+}
+
+mt_rewind() {
+ $MT -f "$1" rewind
+}
+
+mt_offline() {
+ $MT -f "$1" offl
+}
+
+mt_status() {
+ $MT -f "$1" status
+}
+
+# The main configuration file may override any of these variables
+MT_BEGIN=mt_begin
+MT_REWIND=mt_rewind
+MT_OFFLINE=mt_offline
+MT_STATUS=mt_status
+
+# Insure `mail' is in PATH.
+PATH="/usr/ucb:${PATH}"
+export PATH
+# Put startdate in the subject line of mailed report, since if it happens
+# to run longer than 24 hours (as may be the case if someone forgets to put
+# in the next volume of the tape in adequate time), the backup date won't
+# appear too misleading.
+startdate="`date`"
+here="`pwd`"
+# Save local hostname
+localhost="`hostname | sed -e 's/\..*//' | tr A-Z a-z`"
+
+# Produce a diagnostic output
+message() {
+ if [ "$VERBOSE" != "" ]; then
+ if [ $VERBOSE -ge $1 ]; then
+ shift
+ echo "$@" >&2
+ fi
+ fi
+}
+
+# Bail out and exit.
+bailout() {
+ echo "$PROGNAME: $*" >&2
+ exit 1
+}
+
+# Return current date
+now() {
+#IF_DATE_FORMAT_OK
+ date +%Y-%m-%d
+#ELSE_DATE_FORMAT_OK
+ LC_ALL=C date | \
+ sed 's/[^ ]* *\([^ ]*\) *\([^ ]*\).* \([^ ]*\)$/\3-\1-\2/
+ /-[0-9]$/s/\([0-9]\)$/0\1/
+ /Jan/{s/Jan/01/p;q;}
+ /Feb/{s/Feb/02/p;q;}
+ /Mar/{s/Mar/03/p;q;}
+ /Apr/{s/Apr/04/p;q;}
+ /May/{s/May/05/p;q;}
+ /Jun/{s/Jun/06/p;q;}
+ /Jul/{s/Jul/07/p;q;}
+ /Aug/{s/Aug/08/p;q;}
+ /Sep/{s/Sep/09/p;q;}
+ /Oct/{s/Oct/10/p;q;}
+ /Nov/{s/Nov/11/p;q;}
+ /Dec/{s/Dec/12/p;q;}'
+#ENDIF_DATE_FORMAT_OK
+}
+
+# Bail out if we don't have root privileges.
+test_root() {
+ if [ ! -w ${ROOT_FS-/} ]; then
+ bailout "The backup must be run as root or else some files will fail to be dumped."
+ fi
+}
+
+root_fs() {
+ echo "${ROOT_FS}$1" | tr -s /
+}
+
+advice() {
+ echo "Directory $1 is not found." >&2
+ cat >&2 <<EOF
+The following directories and files are needed for the backup to function:
+
+1. Directory with configuration files and file lists:
+$CONFIGPATH
+2. Directory for backup log files
+$LOGPATH
+3. Main configuration file
+$CONFIGFILE
+
+Please, create these and invoke the script again.
+EOF
+}
+
+init_common() {
+ # Check if the necessary directories exist
+ if [ ! -d $CONFIGPATH ]; then
+ advice $CONFIGPATH
+ exit 1
+ fi
+ if [ ! -d $LOGPATH ]; then
+ if mkdir $LOGPATH; then
+ :
+ else
+ advice $LOGPATH
+ exit 1
+ fi
+ fi
+ # Get the values of BACKUP_DIRS, BACKUP_FILES, and other variables.
+ if [ ! -r $CONFIGFILE ]; then
+ echo "$PROGNAME: cannot read $CONFIGFILE. Stop." >&2
+ exit 1
+ fi
+ . $CONFIGFILE
+
+ # Environment sanity check
+
+ test_root
+
+ if [ x"${ADMINISTRATOR}" = x ]; then
+ bailout "ADMINISTRATOR not defined"
+ fi
+
+ [ x"$TAR" = x ] && TAR=tar
+ [ x"$SLEEP_TIME" = x ] && SLEEP_TIME=60
+
+ if [ x$VOLNO_FILE = x ]; then
+ bailout "VOLNO_FILE not specified"
+ fi
+
+ if [ -r $DIRLIST ]; then
+ BACKUP_DIRS="$BACKUP_DIRS `cat $DIRLIST`"
+ fi
+ if [ -r $FILELIST ]; then
+ BACKUP_FILES="$BACKUP_FILES `cat $FILELIST`"
+ fi
+
+ if [ \( x"$BACKUP_DIRS" = x \) -a \( x"$BACKUP_FILES" = x \) ]; then
+ bailout "Neither BACKUP_DIRS nor BACKUP_FILES specified"
+ fi
+ if [ -z "$RSH" ]; then
+ RSH=rsh
+ MT_RSH_OPTION=
+ else
+ MT_RSH_OPTION="--rsh-command=$RSH"
+ fi
+ if [ -z "$TAPE_FILE" ]; then
+ TAPE_FILE=/dev/tape
+ fi
+
+ # If TAPE_FILE is a remote device, update mt invocation accordingly
+ : ${MT:=mt}
+ case $TAPE_FILE in
+ *:*) MT="$MT $MT_RSH_OPTION";;
+ *) ;;
+ esac
+
+ POSIXLY_CORRECT=1
+ export POSIXLY_CORRECT
+}
+
+init_backup() {
+ init_common
+ TAR_PART1="${TAR} -c --format=gnu --multi-volume --one-file-system --sparse --volno-file=${VOLNO_FILE}"
+ if [ "x$XLIST" != x ]; then
+ TAR_PART1="${TAR_PART1} \`test -r $REMOTEBACKUPDIR/$XLIST && echo \"--exclude-from $REMOTEBACKUPDIR/$XLIST\"\`"
+ fi
+ if [ "$RSH_COMMAND" != "" ]; then
+ TAR_PART1="${TAR_PART1} --rsh-command=$RSH_COMMAND"
+ fi
+ if [ x$BLOCKING != x ]; then
+ TAR_PART1="${TAR_PART1} --blocking=${BLOCKING}"
+ fi
+
+ # Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs
+ if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then
+ TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'"
+ fi
+ # Set logfile name
+ # Logfile name should be in the form ``log-1993-03-18-level-0''
+ # They go in the directory `@sysconfdir@/log'.
+ # i.e. year-month-date. This format is useful for sorting by name, since
+ # logfiles are intentionally kept online for future reference.
+ LOGFILE="${LOGPATH}/log-`now`-level-${DUMP_LEVEL}"
+}
+
+init_restore() {
+ init_common
+ # FIXME: Replace --list with --extract
+ TAR_PART1="${TAR} --extract --multi-volume"
+ if [ "$RSH_COMMAND" != "" ]; then
+ TAR_PART1="${TAR_PART1} --rsh-command=$RSH_COMMAND"
+ fi
+ if [ x$BLOCKING != x ]; then
+ TAR_PART1="${TAR_PART1} --blocking=${BLOCKING}"
+ fi
+
+ # Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs
+ if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then
+ TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'"
+ fi
+ LOGFILE="${LOGPATH}/restore-`now`"
+}
+
+wait_time() {
+ if [ "${1}" != "now" ]; then
+ if [ "${1}x" != "x" ]; then
+ spec="${1}"
+ else
+ spec="${BACKUP_HOUR}"
+ fi
+
+ pausetime="`date | awk -v spec=\"${spec}\" '
+ BEGIN {
+ split(spec, time, ":")
+ }
+ {
+ split($4, now, ":")
+ diff = 3600 * (time[1] - now[1]) + 60 * (time[2] - now[2]);
+ if (diff < 0)
+ diff += 3600 * 24
+ print diff
+ }'`"
+ clear
+ echo "${SLEEP_MESSAGE}"
+ sleep "${pausetime}"
+ fi
+}
+
+level_log_name() {
+ echo "$REMOTEBACKUPDIR/${1}.level-${2-$DUMP_LEVEL}"
+}
+
+# Prepare a temporary level logfile
+# usage: make_level_log HOSTNAME
+make_level_log() {
+ if [ "z${localhost}" != "z$1" ] ; then
+ $RSH "$1" mkdir $REMOTEBACKUPDIR > /dev/null 2>&1
+ $RSH "$1" rm -f `level_log_name temp`
+ else
+ mkdir $REMOTEBACKUPDIR > /dev/null 2>&1
+ rm -f `level_log_name temp`
+ fi
+}
+
+# Rename temporary log
+# usage: flush_level_log HOSTNAME FSNAME
+flush_level_log() {
+ message 10 "RENAME: `level_log_name temp` --> `level_log_name $2`"
+ if [ "z${localhost}" != "z$1" ] ; then
+ $RSH "$1" mv -f `level_log_name temp` "`level_log_name $2`"
+ else
+ mv -f `level_log_name temp` "`level_log_name $2`"
+ fi
+}
+
+# Return the timestamp of the last backup.
+# usage: get_dump_time LEVEL
+get_dump_time() {
+ ls -r ${LOGPATH}/log-*-level-$1 \
+ | head -n 1 \
+ | sed "s,.*log-\(.*\)-level-$1,\1,"
+}
+
+# Do actual backup on a host
+# usage: backup_host HOSTNAME [TAR_ARGUMENTS]
+backup_host() {
+ message 10 "ARGS: $@"
+ rhost=$1
+ shift
+ if [ "z${localhost}" != "z$rhost" ] ; then
+ $RSH "$rhost" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" $@
+ else
+ # Using `sh -c exec' causes nested quoting and shell substitution
+ # to be handled here in the same way rsh handles it.
+ CMD="exec ${TAR_PART1} -f \"${TAPE_FILE}\" $@"
+ message 10 "CMD: $CMD"
+ sh -c "$CMD"
+ message 10 "RC: $?"
+ fi
+}
+
+print_level() {
+ if [ ${1-$DUMP_LEVEL} -eq 0 ]; then
+ echo "Full"
+ else
+ echo "Level ${1-$DUMP_LEVEL}"
+ fi
+}
+
+prev_level() {
+ print_level `expr $DUMP_LEVEL - 1` | tr A-Z a-z
+}
+
+remote_run() {
+ rhost=$1
+ shift
+ message 10 "REMOTE $rhost: $@"
+ if [ "x$rhost" != "x${localhost}" ] ; then
+ $RSH "${rhost}" "$@"
+ else
+ $*
+ fi
+}
+
+license() {
+ cat - <<EOF
+Copyright (C) 2006 Free Software Foundation, Inc.
+This is free software. You may redistribute copies of it under the terms of
+the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
+There is NO WARRANTY, to the extent permitted by law.
+EOF
+}
diff --git a/scripts/dump-remind.in b/scripts/dump-remind.in
new file mode 100644
index 0000000..0b95f4b
--- /dev/null
+++ b/scripts/dump-remind.in
@@ -0,0 +1,103 @@
+#!/bin/sh
+# This file is included in the GNU tar distribution as an example. It is
+# not used by default unless the proper line is uncommented in backup-specs.
+# System administrators will probably want to customize this and
+# backup-specs for their site.
+#
+# This script should be run by tar with --info-script (-F) to inform
+# interested parties that a tape for the next volume of the backup needs to
+# be put in the tape drive.
+#
+
+# Include location of `sendmail' and GNU finger.
+PATH="/usr/lib:/usr/local/gnubin:${PATH}"
+export PATH
+
+# Load library routines
+SYSCONFDIR=${SYSCONFDIR-@sysconfdir@}
+. ${LIBPATH-@libexecdir@}/backup.sh
+
+MT_REWIND
+MT_OFFLINE
+
+# Get a list of people to whom to mail a request for changing the tape.
+# This egregious nightmare parses the output from GNU finger which shows
+# which users are logged into consoles (and thus in the office and capable
+# of changing tapes).
+#
+# Certain users (like `root') aren't real users, and shouldn't be notified.
+# Neither should `zippy', `elvis', etc. (on the GNU machines) since they're
+# just test accounts.
+recipients="`
+ finger .clients 2> /dev/null \
+ | sed -ne '
+ 1{
+ /clientstatus: file has not changed in/{
+ n;n;n;n;d
+ }
+ n;n;d
+ }
+ s/^..................................................//
+ $!{/^$/d
+ /^root?*$/d
+ /^zippy$/d
+ /^fnord$/d
+ /^elvis$/d
+ /^snurd$/d
+ H
+ }
+ ${g
+ : 1
+ s/\(\n\)\([A-Za-z0-9_][A-Za-z0-9_]*\)\(\n.*\)\2\(.*\)/\1\2\3\4/g
+ s/\n$//g
+ t 1
+ s/^\n//
+ s/\n$//g
+ s/\n/, /g
+ : 2
+ s/, ,/,/g
+ t 2
+ p
+ }'`"
+
+# Customized behavior for FSF machines, to bring attention to the fact that
+# the tape needs to be changed (who looks at the terminal?)
+sendmail -oi -t << __EOF__
+From: `basename $0` (backup tape-changing reminder)
+To: ${recipients}
+Cc: ${ADMINISTRATOR}
+Subject: Backup needs new tape for volume ${TAR_VOLUME}
+Reply-To: ${ADMINISTRATOR}
+
+This is an automated report from the backup script running on
+`hostname`.
+
+Volume ${TAR_VOLUME} of the backup needs to be put in the tape drive.
+Usually whoever prepared the backup leaves labeled tapes on top of the
+drive itself. If there aren't any more, information about where to find
+tapes and how to label them are posted on the wall by apple-gunkies
+(unhelpfully obscured by a bookshelf). An online copy (which is probably
+more up-to-date) can also be found in ~friedman/etc/fsf/backup.how.
+__EOF__
+
+
+echo "Please put volume ${TAR_VOLUME} in tape drive and press RETURN"
+read input
+echo "Writing volume ${TAR_VOLUME}..."
+
+sendmail -oi -t << __EOF__
+From: `basename $0` (backup tape-changing reminder)
+To: ${recipients}
+Cc: ${ADMINISTRATOR}
+Subject: Volume ${TAR_VOLUME} for backup has been added
+Reply-To: ${ADMINISTRATOR}
+
+This is an automated report from the backup script running on
+`hostname`.
+
+The backup has been continued, so for now no further attention is required.
+__EOF__
+
+exit 0
+
+# eof
diff --git a/scripts/restore.in b/scripts/restore.in
new file mode 100644
index 0000000..efc320a
--- /dev/null
+++ b/scripts/restore.in
@@ -0,0 +1,229 @@
+#! /bin/sh
+# This program is part of GNU tar
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 1, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Load library routines
+SYSCONFDIR=${SYSCONFDIR-@sysconfdir@}
+. ${LIBDIR-@libexecdir@}/backup.sh
+
+usage() {
+ cat - <<EOF
+usage: $PROGNAME [OPTIONS] [PATTERN [PATTERN...]]
+Options are:
+
+ -a, --all Restore all filesystems.
+ -l, --level=LEVEL Start restoring from the given backup LEVEL
+ (default $DUMP_LEVEL).
+ -v, --verbose[=LEVEL] Set verbosity level. Default 100.
+
+Informational options:
+ -h, --help Display this help message.
+ -V, --version Display program version.
+
+Send bug reports to @PACKAGE_BUGREPORT@.
+EOF
+}
+
+unset PATTERN
+DUMP_LEVEL=0
+CMDLINE="$0 $@"
+
+for opt
+do
+ if [ -z "$prev" ]; then
+ option=$opt
+ optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
+ else
+ option="${prev}=$opt"
+ prev=""
+ optarg=$opt
+ fi
+ case $option in
+ -a|--a|--al|--all)
+ RESTORE_ALL=1
+ ;;
+ --l=*|--le=*|--lev=*|--leve=*|--level=*)
+ DUMP_LEVEL=$optarg
+ ;;
+ -l|--l|--le|--lev|--leve|--level)
+ prev=$option
+ ;;
+ --verb=*|--verbo=*|--verbos=*|--verbose=*)
+ VERBOSE=$optarg
+ ;;
+ -v|--verb|--verbo|--verbos|--verbose)
+ VERBOSE=100
+ ;;
+ -v*) VERBOSE=`expr $option : "-v\(.*\)"`;;
+ -V|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "restore (@PACKAGE_NAME@) @VERSION@"
+ license
+ exit;;
+ -h|--h|--he|--hel|--help)
+ usage
+ exit;;
+ -*) bailout "Unknown option $opt. Try $PROGNAME --help for more info.";;
+ *) if [ -z "$PATTERN" ]; then
+ PATTERN=$opt
+ else
+ PATTERN="$PATTERN|$opt"
+ fi
+ ;;
+ esac
+done
+
+if [ -z "$RESTORE_ALL" ]; then
+ if [ -z "$PATTERN" ]; then
+ usage
+ exit;
+ fi
+fi
+
+init_restore
+cat > $LOGFILE <<EOF
+This file contains any messages produced by $PROGNAME.
+
+It was created by GNU $PROGNAME, from @PACKAGE@ (@VERSION@).
+Invocation command line was
+
+ \$ $CMDLINE
+
+EOF
+
+restore_fs()
+{
+ fs="`echo \"${1}\" | sed -e 's/^.*://'`"
+ fs=`root_fs $fs`
+ fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
+ remotehost="`expr \"${1}\" : '\([^/][^/]*\):.*'`"
+ if [ -z "$remotehost" ]; then
+ remotehost=$localhost
+ fi
+ message 10 "fs=$fs"
+ message 10 "fsname=$fsname"
+ message 10 "remotehost=$remotehost"
+
+ LOGPAT="`level_log_name ${fsname} '[0-9]'`"
+ PREFIX="`level_log_name ${fsname} ''`"
+ message 10 LOGPAT=$LOGPAT
+ message 10 PREFIX=$PREFIX
+ LEVELS=`remote_run "${remotehost}" ls $LOGPAT |
+ sed "s,$PREFIX,," | sort -n`
+ message 10 "LEVELS=$LEVELS"
+
+ echo "Starting restore of ${1} at level $DUMP_LEVEL."
+ for level in $LEVELS
+ do
+ if [ $level -lt $DUMP_LEVEL ]; then
+ message 10 "Skipping level $level"
+ continue;
+ fi
+ message 10 "Restoring level $level"
+
+ DATE=`get_dump_time $level`
+ FILE="`level_log_name ${fsname} ${level}`"
+ message 10 "FILE=$FILE"
+
+ LABEL="`print_level $level` backup of ${fs} on ${remotehost} at ${DATE}"
+ ${RESTORE_BEGIN-:} $level $remotehost $fs $fsname
+ backup_host ${remotehost} \
+ "--listed=\"$FILE\"" \
+ "--label=\"$LABEL\"" \
+ -C $fs
+ ${RESTORE_END-:} $level $remotehost $fs $fsname
+ done
+}
+
+restore_files()
+{
+ LOGPAT="`level_log_name MISC '[0-9]'`"
+ PREFIX="`level_log_name MISC ''`"
+ message 10 LOGPAT=$LOGPAT
+ message 10 PREFIX=$PREFIX
+ LEVELS=`remote_run "${localhost}" ls $LOGPAT | sed "s,$PREFIX,," | sort -n`
+ message 10 "LEVELS=$LEVELS"
+
+ echo "Starting restore of miscellaneous files at level $DUMP_LEVEL."
+ for level in $LEVELS
+ do
+ if [ $level -lt $DUMP_LEVEL ]; then
+ message 10 "Skipping level $level"
+ continue;
+ fi
+ message 10 "Restoring level $level"
+
+ DATE=`get_dump_time $level`
+ FILE="`level_log_name MISC ${level}`"
+ message 10 "FILE=$FILE"
+
+ LABEL="`print_level $level` backup of miscellaneous files at ${DATE}"
+ ${RESTORE_BEGIN-:} $level $localhost MISC MISC
+ backup_host ${localhost} \
+ "--listed=\"$FILE\"" \
+ "--label=\"$LABEL\"" \
+ -C ${ROOT_FS-/} $@
+ ${RESTORE_END-:} $level $localhost MISC MISC
+ done
+}
+
+# Operation Overwiew:
+#
+# 1. Determine the time of the last backup
+# 2. Create list of incremental listings to process
+# 3. For each filesystem:
+# 3.1. Start at the requested dump level (default 0) and proceed up to
+# the last available level:
+# 3.1.1 Deduce the volume label
+# 3.1.2. Invoke [rsh] tar --listed=FILE --label=LABEL [opts] -xf $TAPE_FILE
+# 4. End
+
+(message 1 "Preparing for restore"
+
+message 1 "processing backup directories"
+
+for dir in ${BACKUP_DIRS}
+do
+ message 1 "Processing $dir"
+ case $dir in
+ ${PATTERN-*}) restore_fs $dir;;
+ esac
+done
+
+if [ "x${BACKUP_FILES}" != "x" ] ; then
+ message 1 "processing miscellaneous files"
+ if [ -z "$PATTERN" ]; then
+ restore_files
+ else
+ RESTORE_FILES=""
+ for file in ${BACKUP_FILES}
+ do
+ rel_file=`expr $file : '/\(.*\)'`
+ case $file in
+ $PATTERN) if [ -z "$RESTORE_FILES" ]; then
+ RESTORE_FILES="$rel_file"
+ else
+ RESTORE_FILES="$RESTORE_FILES $rel_file"
+ fi;;
+ esac
+ done
+ [ -z "$RESTORE_FILES" ] || restore_files $RESTORE_FILES
+ fi
+
+fi) 2>&1 | tee -a "${LOGFILE}"
+
+# EOF
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..61f6cbd
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,46 @@
+# Makefile for GNU tar sources.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2006
+# Free Software Foundation, Inc.
+
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+## 02110-1301, USA.
+
+bin_PROGRAMS = tar
+
+noinst_HEADERS = arith.h common.h tar.h
+tar_SOURCES = \
+ buffer.c\
+ compare.c\
+ create.c\
+ delete.c\
+ extract.c\
+ xheader.c\
+ incremen.c\
+ list.c\
+ misc.c\
+ names.c\
+ sparse.c\
+ system.c\
+ tar.c\
+ transform.c\
+ update.c\
+ utf8.c
+
+INCLUDES = -I$(top_srcdir)/lib -I../ -I../lib
+
+LDADD = ../lib/libtar.a $(LIBINTL) $(LIBICONV)
+
+tar_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..148448a
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,776 @@
+# Makefile.in generated by automake 1.10a from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007 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 GNU tar sources.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2006
+# Free Software Foundation, Inc.
+
+
+VPATH = @srcdir@
+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 = tar$(EXEEXT)
+subdir = src
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/absolute-header.m4 \
+ $(top_srcdir)/m4/alloca.m4 $(top_srcdir)/m4/allocsa.m4 \
+ $(top_srcdir)/m4/argmatch.m4 $(top_srcdir)/m4/argp.m4 \
+ $(top_srcdir)/m4/backupfile.m4 $(top_srcdir)/m4/bison.m4 \
+ $(top_srcdir)/m4/canonicalize-lgpl.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/chown.m4 \
+ $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close-stream.m4 $(top_srcdir)/m4/closeout.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/d-ino.m4 \
+ $(top_srcdir)/m4/dirfd.m4 $(top_srcdir)/m4/dirname.m4 \
+ $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/double-slash-root.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eealloc.m4 \
+ $(top_srcdir)/m4/eoverflow.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exclude.m4 $(top_srcdir)/m4/exitfail.m4 \
+ $(top_srcdir)/m4/extensions.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-safer.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+ $(top_srcdir)/m4/fileblocks.m4 $(top_srcdir)/m4/float_h.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fpending.m4 \
+ $(top_srcdir)/m4/ftruncate.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdate.m4 $(top_srcdir)/m4/getdelim.m4 \
+ $(top_srcdir)/m4/getline.m4 $(top_srcdir)/m4/getopt.m4 \
+ $(top_srcdir)/m4/getpagesize.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/hash.m4 \
+ $(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intmax_t.m4 \
+ $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lchown.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/lstat.m4 $(top_srcdir)/m4/mbchar.m4 \
+ $(top_srcdir)/m4/mbiter.m4 $(top_srcdir)/m4/mbrtowc.m4 \
+ $(top_srcdir)/m4/mbscasecmp.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mempcpy.m4 \
+ $(top_srcdir)/m4/memrchr.m4 $(top_srcdir)/m4/memset.m4 \
+ $(top_srcdir)/m4/mkdtemp.m4 $(top_srcdir)/m4/mktime.m4 \
+ $(top_srcdir)/m4/modechange.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/pathmax.m4 \
+ $(top_srcdir)/m4/paxutils.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quote.m4 \
+ $(top_srcdir)/m4/quotearg.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/rmdir.m4 \
+ $(top_srcdir)/m4/rmt.m4 $(top_srcdir)/m4/rpmatch.m4 \
+ $(top_srcdir)/m4/rtapelib.m4 $(top_srcdir)/m4/safe-read.m4 \
+ $(top_srcdir)/m4/safe-write.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/savedir.m4 $(top_srcdir)/m4/setenv.m4 \
+ $(top_srcdir)/m4/sleep.m4 $(top_srcdir)/m4/ssize_t.m4 \
+ $(top_srcdir)/m4/stat-time.m4 $(top_srcdir)/m4/stdarg.m4 \
+ $(top_srcdir)/m4/stdbool.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/string_h.m4 $(top_srcdir)/m4/strndup.m4 \
+ $(top_srcdir)/m4/strnlen.m4 $(top_srcdir)/m4/strtoimax.m4 \
+ $(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoll.m4 \
+ $(top_srcdir)/m4/strtoul.m4 $(top_srcdir)/m4/strtoull.m4 \
+ $(top_srcdir)/m4/strtoumax.m4 $(top_srcdir)/m4/sys_stat_h.m4 \
+ $(top_srcdir)/m4/sys_time_h.m4 $(top_srcdir)/m4/sysexits.m4 \
+ $(top_srcdir)/m4/system.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/time_r.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
+ $(top_srcdir)/m4/unlinkdir.m4 $(top_srcdir)/m4/unlocked-io.m4 \
+ $(top_srcdir)/m4/utimbuf.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wchar.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wctype.m4 \
+ $(top_srcdir)/m4/wcwidth.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xgetcwd.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/xstrtol.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_tar_OBJECTS = buffer.$(OBJEXT) compare.$(OBJEXT) create.$(OBJEXT) \
+ delete.$(OBJEXT) extract.$(OBJEXT) xheader.$(OBJEXT) \
+ incremen.$(OBJEXT) list.$(OBJEXT) misc.$(OBJEXT) \
+ names.$(OBJEXT) sparse.$(OBJEXT) system.$(OBJEXT) \
+ tar.$(OBJEXT) transform.$(OBJEXT) update.$(OBJEXT) \
+ utf8.$(OBJEXT)
+tar_OBJECTS = $(am_tar_OBJECTS)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = ../lib/libtar.a $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+tar_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(tar_SOURCES)
+DIST_SOURCES = $(tar_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ABSOLUTE_DIRENT_H = @ABSOLUTE_DIRENT_H@
+ABSOLUTE_FCNTL_H = @ABSOLUTE_FCNTL_H@
+ABSOLUTE_FLOAT_H = @ABSOLUTE_FLOAT_H@
+ABSOLUTE_INTTYPES_H = @ABSOLUTE_INTTYPES_H@
+ABSOLUTE_STDINT_H = @ABSOLUTE_STDINT_H@
+ABSOLUTE_STDIO_H = @ABSOLUTE_STDIO_H@
+ABSOLUTE_STDLIB_H = @ABSOLUTE_STDLIB_H@
+ABSOLUTE_STRING_H = @ABSOLUTE_STRING_H@
+ABSOLUTE_SYSEXITS_H = @ABSOLUTE_SYSEXITS_H@
+ABSOLUTE_SYS_STAT_H = @ABSOLUTE_SYS_STAT_H@
+ABSOLUTE_SYS_TIME_H = @ABSOLUTE_SYS_TIME_H@
+ABSOLUTE_TIME_H = @ABSOLUTE_TIME_H@
+ABSOLUTE_UNISTD_H = @ABSOLUTE_UNISTD_H@
+ABSOLUTE_WCHAR_H = @ABSOLUTE_WCHAR_H@
+ABSOLUTE_WCTYPE_H = @ABSOLUTE_WCTYPE_H@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOM4TE = @AUTOM4TE@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BACKUP_LIBEXEC_SCRIPTS = @BACKUP_LIBEXEC_SCRIPTS@
+BACKUP_SBIN_SCRIPTS = @BACKUP_SBIN_SCRIPTS@
+BACKUP_SED_COND = @BACKUP_SED_COND@
+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@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFAULT_ARCHIVE = @DEFAULT_ARCHIVE@
+DEFAULT_ARCHIVE_FORMAT = @DEFAULT_ARCHIVE_FORMAT@
+DEFAULT_BLOCKING = @DEFAULT_BLOCKING@
+DEFAULT_QUOTING_STYLE = @DEFAULT_QUOTING_STYLE@
+DEFAULT_RMT_COMMAND = @DEFAULT_RMT_COMMAND@
+DEFAULT_RMT_DIR = @DEFAULT_RMT_DIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRENT_H = @DIRENT_H@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EOVERFLOW = @EOVERFLOW@
+EXEEXT = @EXEEXT@
+FCNTL_H = @FCNTL_H@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+GETOPT_H = @GETOPT_H@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GREP = @GREP@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_MKDIR = @HAVE_DECL_MKDIR@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_IO_H = @HAVE_IO_H@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_READLINK = @HAVE_READLINK@
+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_SLEEP = @HAVE_SLEEP@
+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_STRNDUP = @HAVE_STRNDUP@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_SYSEXITS_H = @HAVE_SYSEXITS_H@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE__BOOL = @HAVE__BOOL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTTYPES_H = @INTTYPES_H@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTAR_LIBDEPS = @LIBTAR_LIBDEPS@
+LIBTAR_LTLIBDEPS = @LIBTAR_LTLIBDEPS@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_SETSOCKOPT = @LIB_SETSOCKOPT@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PU_RMT_PROG = @PU_RMT_PROG@
+RANLIB = @RANLIB@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_FCHDIR = @REPLACE_FCHDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STRPTIME = @REPLACE_STRPTIME@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYSEXITS_H = @SYSEXITS_H@
+SYS_STAT_H = @SYS_STAT_H@
+SYS_TIME_H = @SYS_TIME_H@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WCHAR_H = @WCHAR_H@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WCTYPE_H = @WCTYPE_H@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+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@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+noinst_HEADERS = arith.h common.h tar.h
+tar_SOURCES = \
+ buffer.c\
+ compare.c\
+ create.c\
+ delete.c\
+ extract.c\
+ xheader.c\
+ incremen.c\
+ list.c\
+ misc.c\
+ names.c\
+ sparse.c\
+ system.c\
+ tar.c\
+ transform.c\
+ update.c\
+ utf8.c
+
+INCLUDES = -I$(top_srcdir)/lib -I../ -I../lib
+LDADD = ../lib/libtar.a $(LIBINTL) $(LIBICONV)
+tar_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
+all: 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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnits src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(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
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+installcheck-binPROGRAMS: $(bin_PROGRAMS)
+ bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \
+ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+ esac; \
+ f=`echo "$$p" | \
+ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ for opt in --help --version; do \
+ if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \
+ 2>c$${pid}_.err </dev/null \
+ && test -n "`cat c$${pid}_.out`" \
+ && test -z "`cat c$${pid}_.err`"; then :; \
+ else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+ done; \
+ done; rm -f c$${pid}_.???; exit $$bad
+tar$(EXEEXT): $(tar_OBJECTS) $(tar_DEPENDENCIES)
+ @rm -f tar$(EXEEXT)
+ $(LINK) $(tar_OBJECTS) $(tar_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compare.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/create.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delete.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/incremen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/names.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sparse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/system.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tar.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/update.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xheader.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 $(PROGRAMS) $(HEADERS)
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am: installcheck-binPROGRAMS
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags 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 installcheck-binPROGRAMS \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
+ ps ps-am tags uninstall uninstall-am uninstall-binPROGRAMS
+
+# 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/arith.h b/src/arith.h
new file mode 100644
index 0000000..2bc5ced
--- /dev/null
+++ b/src/arith.h
@@ -0,0 +1,27 @@
+/* Long integers, for GNU tar.
+ Copyright 1999 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Handle large integers for calculating big tape lengths and the
+ like. In practice, double precision does for now. On the vast
+ majority of machines, it counts up to 2**52 bytes without any loss
+ of information, and counts up to 2**62 bytes if data are always
+ blocked in 1 kB boundaries. We'll need arbitrary precision
+ arithmetic anyway once we get into the 2**64 range, so there's no
+ point doing anything fancy before then. */
+
+#define TARLONG_FORMAT "%.0f"
+typedef double tarlong;
diff --git a/src/buffer.c b/src/buffer.c
new file mode 100644
index 0000000..f103463
--- /dev/null
+++ b/src/buffer.c
@@ -0,0 +1,1696 @@
+/* Buffer management for tar.
+
+ Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
+ 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ Written by John Gilmore, on 1985-08-25.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <system-ioctl.h>
+
+#include <signal.h>
+
+#include <closeout.h>
+#include <fnmatch.h>
+#include <getline.h>
+#include <human.h>
+#include <quotearg.h>
+
+#include "common.h"
+#include <rmt.h>
+
+/* Number of retries before giving up on read. */
+#define READ_ERROR_MAX 10
+
+/* Globbing pattern to append to volume label if initial match failed. */
+#define VOLUME_LABEL_APPEND " Volume [1-9]*"
+
+/* Variables. */
+
+static tarlong prev_written; /* bytes written on previous volumes */
+static tarlong bytes_written; /* bytes written on this volume */
+static void *record_buffer[2]; /* allocated memory */
+union block *record_buffer_aligned[2];
+static int record_index;
+
+/* FIXME: The following variables should ideally be static to this
+ module. However, this cannot be done yet. The cleanup continues! */
+
+union block *record_start; /* start of record of archive */
+union block *record_end; /* last+1 block of archive record */
+union block *current_block; /* current block of archive */
+enum access_mode access_mode; /* how do we handle the archive */
+off_t records_read; /* number of records read from this archive */
+off_t records_written; /* likewise, for records written */
+extern off_t records_skipped; /* number of records skipped at the start
+ of the archive, defined in delete.c */
+
+static off_t record_start_block; /* block ordinal at record_start */
+
+/* Where we write list messages (not errors, not interactions) to. */
+FILE *stdlis;
+
+static void backspace_output (void);
+
+/* PID of child program, if compress_option or remote archive access. */
+static pid_t child_pid;
+
+/* Error recovery stuff */
+static int read_error_count;
+
+/* Have we hit EOF yet? */
+static bool hit_eof;
+
+/* Checkpointing counter */
+static unsigned checkpoint;
+
+static bool read_full_records = false;
+
+/* We're reading, but we just read the last block and it's time to update.
+ Declared in update.c
+
+ As least EXTERN like this one as possible. (?? --gray)
+ FIXME: Either eliminate it or move it to common.h.
+*/
+extern bool time_to_start_writing;
+
+bool write_archive_to_stdout;
+
+void (*flush_write_ptr) (size_t);
+void (*flush_read_ptr) (void);
+
+
+char *volume_label;
+char *continued_file_name;
+uintmax_t continued_file_size;
+uintmax_t continued_file_offset;
+
+
+static int volno = 1; /* which volume of a multi-volume tape we're
+ on */
+static int global_volno = 1; /* volume number to print in external
+ messages */
+
+bool write_archive_to_stdout;
+
+/* Used by flush_read and flush_write to store the real info about saved
+ names. */
+static char *real_s_name;
+static off_t real_s_totsize;
+static off_t real_s_sizeleft;
+
+
+/* Multi-volume tracking support */
+static char *save_name; /* name of the file we are currently writing */
+static off_t save_totsize; /* total size of file we are writing, only
+ valid if save_name is nonzero */
+static off_t save_sizeleft; /* where we are in the file we are writing,
+ only valid if save_name is nonzero */
+
+
+static struct tar_stat_info dummy;
+
+void
+buffer_write_global_xheader ()
+{
+ xheader_write_global (&dummy.xhdr);
+}
+
+void
+mv_begin (struct tar_stat_info *st)
+{
+ if (multi_volume_option)
+ {
+ assign_string (&save_name, st->orig_file_name);
+ save_totsize = save_sizeleft = st->stat.st_size;
+ }
+}
+
+void
+mv_end ()
+{
+ if (multi_volume_option)
+ assign_string (&save_name, 0);
+}
+
+void
+mv_total_size (off_t size)
+{
+ save_totsize = size;
+}
+
+void
+mv_size_left (off_t size)
+{
+ save_sizeleft = size;
+}
+
+
+/* Functions. */
+
+void
+clear_read_error_count (void)
+{
+ read_error_count = 0;
+}
+
+
+/* Time-related functions */
+
+double duration;
+
+void
+set_start_time ()
+{
+ gettime (&start_time);
+ volume_start_time = start_time;
+ last_stat_time = start_time;
+}
+
+void
+set_volume_start_time ()
+{
+ gettime (&volume_start_time);
+ last_stat_time = volume_start_time;
+}
+
+void
+compute_duration ()
+{
+ struct timespec now;
+ gettime (&now);
+ duration += ((now.tv_sec - last_stat_time.tv_sec)
+ + (now.tv_nsec - last_stat_time.tv_nsec) / 1e9);
+ gettime (&last_stat_time);
+}
+
+
+/* Compression detection */
+
+enum compress_type {
+ ct_none,
+ ct_compress,
+ ct_gzip,
+ ct_bzip2
+};
+
+struct zip_magic
+{
+ enum compress_type type;
+ size_t length;
+ char *magic;
+ char *program;
+ char *option;
+};
+
+static struct zip_magic const magic[] = {
+ { ct_none, },
+ { ct_compress, 2, "\037\235", "compress", "-Z" },
+ { ct_gzip, 2, "\037\213", "gzip", "-z" },
+ { ct_bzip2, 3, "BZh", "bzip2", "-j" },
+};
+
+#define NMAGIC (sizeof(magic)/sizeof(magic[0]))
+
+#define compress_option(t) magic[t].option
+#define compress_program(t) magic[t].program
+
+/* Check if the file ARCHIVE is a compressed archive. */
+enum compress_type
+check_compressed_archive ()
+{
+ struct zip_magic const *p;
+ bool sfr;
+
+ /* Prepare global data needed for find_next_block: */
+ record_end = record_start; /* set up for 1st record = # 0 */
+ sfr = read_full_records;
+ read_full_records = true; /* Suppress fatal error on reading a partial
+ record */
+ find_next_block ();
+
+ /* Restore global values */
+ read_full_records = sfr;
+
+ if (tar_checksum (record_start, true) == HEADER_SUCCESS)
+ /* Probably a valid header */
+ return ct_none;
+
+ for (p = magic + 1; p < magic + NMAGIC; p++)
+ if (memcmp (record_start->buffer, p->magic, p->length) == 0)
+ return p->type;
+
+ return ct_none;
+}
+
+/* Open an archive named archive_name_array[0]. Detect if it is
+ a compressed archive of known type and use corresponding decompression
+ program if so */
+int
+open_compressed_archive ()
+{
+ archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
+ MODE_RW, rsh_command_option);
+ if (archive == -1)
+ return archive;
+
+ if (!multi_volume_option)
+ {
+ enum compress_type type = check_compressed_archive ();
+
+ if (type == ct_none)
+ return archive;
+
+ /* FD is not needed any more */
+ rmtclose (archive);
+
+ hit_eof = false; /* It might have been set by find_next_block in
+ check_compressed_archive */
+
+ /* Open compressed archive */
+ use_compress_program_option = compress_program (type);
+ child_pid = sys_child_open_for_uncompress ();
+ read_full_records = true;
+ }
+
+ records_read = 0;
+ record_end = record_start; /* set up for 1st record = # 0 */
+
+ return archive;
+}
+
+
+static void
+print_stats (FILE *fp, const char *text, tarlong numbytes)
+{
+ char bytes[sizeof (tarlong) * CHAR_BIT];
+ char abbr[LONGEST_HUMAN_READABLE + 1];
+ char rate[LONGEST_HUMAN_READABLE + 1];
+
+ int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
+
+ sprintf (bytes, TARLONG_FORMAT, numbytes);
+
+ fprintf (fp, "%s: %s (%s, %s/s)\n",
+ text, bytes,
+ human_readable (numbytes, abbr, human_opts, 1, 1),
+ (0 < duration && numbytes / duration < (uintmax_t) -1
+ ? human_readable (numbytes / duration, rate, human_opts, 1, 1)
+ : "?"));
+}
+
+void
+print_total_stats ()
+{
+ switch (subcommand_option)
+ {
+ case CREATE_SUBCOMMAND:
+ case CAT_SUBCOMMAND:
+ case UPDATE_SUBCOMMAND:
+ case APPEND_SUBCOMMAND:
+ /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */
+ print_stats (stderr, _("Total bytes written"),
+ prev_written + bytes_written);
+ break;
+
+ case DELETE_SUBCOMMAND:
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ print_stats (stderr, _("Total bytes read"),
+ records_read * record_size);
+ print_stats (stderr, _("Total bytes written"),
+ prev_written + bytes_written);
+ fprintf (stderr, _("Total bytes deleted: %s\n"),
+ STRINGIFY_BIGINT ((records_read - records_skipped)
+ * record_size
+ - (prev_written + bytes_written), buf));
+ }
+ break;
+
+ case EXTRACT_SUBCOMMAND:
+ case LIST_SUBCOMMAND:
+ case DIFF_SUBCOMMAND:
+ print_stats (stderr, _("Total bytes read"),
+ records_read * record_size);
+ break;
+
+ default:
+ abort ();
+ }
+}
+
+/* Compute and return the block ordinal at current_block. */
+off_t
+current_block_ordinal (void)
+{
+ return record_start_block + (current_block - record_start);
+}
+
+/* If the EOF flag is set, reset it, as well as current_block, etc. */
+void
+reset_eof (void)
+{
+ if (hit_eof)
+ {
+ hit_eof = false;
+ current_block = record_start;
+ record_end = record_start + blocking_factor;
+ access_mode = ACCESS_WRITE;
+ }
+}
+
+/* Return the location of the next available input or output block.
+ Return zero for EOF. Once we have returned zero, we just keep returning
+ it, to avoid accidentally going on to the next file on the tape. */
+union block *
+find_next_block (void)
+{
+ if (current_block == record_end)
+ {
+ if (hit_eof)
+ return 0;
+ flush_archive ();
+ if (current_block == record_end)
+ {
+ hit_eof = true;
+ return 0;
+ }
+ }
+ return current_block;
+}
+
+/* Indicate that we have used all blocks up thru BLOCK. */
+void
+set_next_block_after (union block *block)
+{
+ while (block >= current_block)
+ current_block++;
+
+ /* Do *not* flush the archive here. If we do, the same argument to
+ set_next_block_after could mean the next block (if the input record
+ is exactly one block long), which is not what is intended. */
+
+ if (current_block > record_end)
+ abort ();
+}
+
+/* Return the number of bytes comprising the space between POINTER
+ through the end of the current buffer of blocks. This space is
+ available for filling with data, or taking data from. POINTER is
+ usually (but not always) the result of previous find_next_block call. */
+size_t
+available_space_after (union block *pointer)
+{
+ return record_end->buffer - pointer->buffer;
+}
+
+/* Close file having descriptor FD, and abort if close unsuccessful. */
+void
+xclose (int fd)
+{
+ if (close (fd) != 0)
+ close_error (_("(pipe)"));
+}
+
+static void
+init_buffer ()
+{
+ if (! record_buffer_aligned[record_index])
+ record_buffer_aligned[record_index] =
+ page_aligned_alloc (&record_buffer[record_index], record_size);
+
+ record_start = record_buffer_aligned[record_index];
+ current_block = record_start;
+ record_end = record_start + blocking_factor;
+}
+
+/* Open an archive file. The argument specifies whether we are
+ reading or writing, or both. */
+static void
+_open_archive (enum access_mode wanted_access)
+{
+ int backed_up_flag = 0;
+
+ if (record_size == 0)
+ FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
+
+ if (archive_names == 0)
+ FATAL_ERROR ((0, 0, _("No archive name given")));
+
+ tar_stat_destroy (&current_stat_info);
+ save_name = 0;
+ real_s_name = 0;
+
+ record_index = 0;
+ init_buffer ();
+
+ /* When updating the archive, we start with reading. */
+ access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
+
+ read_full_records = read_full_records_option;
+
+ records_read = 0;
+
+ if (use_compress_program_option)
+ {
+ switch (wanted_access)
+ {
+ case ACCESS_READ:
+ child_pid = sys_child_open_for_uncompress ();
+ read_full_records = true;
+ record_end = record_start; /* set up for 1st record = # 0 */
+ break;
+
+ case ACCESS_WRITE:
+ child_pid = sys_child_open_for_compress ();
+ break;
+
+ case ACCESS_UPDATE:
+ abort (); /* Should not happen */
+ break;
+ }
+
+ if (!index_file_name
+ && wanted_access == ACCESS_WRITE
+ && strcmp (archive_name_array[0], "-") == 0)
+ stdlis = stderr;
+ }
+ else if (strcmp (archive_name_array[0], "-") == 0)
+ {
+ read_full_records = true; /* could be a pipe, be safe */
+ if (verify_option)
+ FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
+
+ switch (wanted_access)
+ {
+ case ACCESS_READ:
+ {
+ enum compress_type type;
+
+ archive = STDIN_FILENO;
+
+ type = check_compressed_archive ();
+ if (type != ct_none)
+ FATAL_ERROR ((0, 0,
+ _("Archive is compressed. Use %s option"),
+ compress_option (type)));
+ }
+ break;
+
+ case ACCESS_WRITE:
+ archive = STDOUT_FILENO;
+ if (!index_file_name)
+ stdlis = stderr;
+ break;
+
+ case ACCESS_UPDATE:
+ archive = STDIN_FILENO;
+ write_archive_to_stdout = true;
+ record_end = record_start; /* set up for 1st record = # 0 */
+ if (!index_file_name)
+ stdlis = stderr;
+ break;
+ }
+ }
+ else if (verify_option)
+ archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY,
+ MODE_RW, rsh_command_option);
+ else
+ switch (wanted_access)
+ {
+ case ACCESS_READ:
+ archive = open_compressed_archive ();
+ break;
+
+ case ACCESS_WRITE:
+ if (backup_option)
+ {
+ maybe_backup_file (archive_name_array[0], 1);
+ backed_up_flag = 1;
+ }
+ archive = rmtcreat (archive_name_array[0], MODE_RW,
+ rsh_command_option);
+ break;
+
+ case ACCESS_UPDATE:
+ archive = rmtopen (archive_name_array[0],
+ O_RDWR | O_CREAT | O_BINARY,
+ MODE_RW, rsh_command_option);
+
+ if (check_compressed_archive () != ct_none)
+ FATAL_ERROR ((0, 0,
+ _("Cannot update compressed archives")));
+ break;
+ }
+
+ if (archive < 0
+ || (! _isrmt (archive) && !sys_get_archive_stat ()))
+ {
+ int saved_errno = errno;
+
+ if (backed_up_flag)
+ undo_last_backup ();
+ errno = saved_errno;
+ open_fatal (archive_name_array[0]);
+ }
+
+ sys_detect_dev_null_output ();
+ sys_save_archive_dev_ino ();
+ SET_BINARY_MODE (archive);
+
+ switch (wanted_access)
+ {
+ case ACCESS_READ:
+ find_next_block (); /* read it in, check for EOF */
+ break;
+
+ case ACCESS_UPDATE:
+ case ACCESS_WRITE:
+ records_written = 0;
+ break;
+ }
+}
+
+static void
+do_checkpoint (bool write)
+{
+ if (checkpoint_option && !(++checkpoint % checkpoint_option))
+ {
+ switch (checkpoint_style)
+ {
+ case checkpoint_dot:
+ fputc ('.', stdlis);
+ fflush (stdlis);
+ break;
+
+ case checkpoint_text:
+ if (write)
+ /* TRANSLATORS: This is a ``checkpoint of write operation'',
+ *not* ``Writing a checkpoint''.
+ E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
+ *not* ``Escribiendo un punto de comprobaci@'on'' */
+ WARN ((0, 0, _("Write checkpoint %u"), checkpoint));
+ else
+ /* TRANSLATORS: This is a ``checkpoint of read operation'',
+ *not* ``Reading a checkpoint''.
+ E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
+ *not* ``Leyendo un punto de comprobaci@'on'' */
+ WARN ((0, 0, _("Read checkpoint %u"), checkpoint));
+ break;
+ }
+ }
+}
+
+/* Perform a write to flush the buffer. */
+ssize_t
+_flush_write (void)
+{
+ ssize_t status;
+
+ do_checkpoint (true);
+ if (tape_length_option && tape_length_option <= bytes_written)
+ {
+ errno = ENOSPC;
+ status = 0;
+ }
+ else if (dev_null_output)
+ status = record_size;
+ else
+ status = sys_write_archive_buffer ();
+
+ return status;
+}
+
+/* Handle write errors on the archive. Write errors are always fatal.
+ Hitting the end of a volume does not cause a write error unless the
+ write was the first record of the volume. */
+void
+archive_write_error (ssize_t status)
+{
+ /* It might be useful to know how much was written before the error
+ occurred. */
+ if (totals_option)
+ {
+ int e = errno;
+ print_total_stats ();
+ errno = e;
+ }
+
+ write_fatal_details (*archive_name_cursor, status, record_size);
+}
+
+/* Handle read errors on the archive. If the read should be retried,
+ return to the caller. */
+void
+archive_read_error (void)
+{
+ read_error (*archive_name_cursor);
+
+ if (record_start_block == 0)
+ FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
+
+ /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
+ then give up on reading the archive. */
+
+ if (read_error_count++ > READ_ERROR_MAX)
+ FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
+ return;
+}
+
+static void
+short_read (size_t status)
+{
+ size_t left; /* bytes left */
+ char *more; /* pointer to next byte to read */
+
+ more = record_start->buffer + status;
+ left = record_size - status;
+
+ while (left % BLOCKSIZE != 0
+ || (left && status && read_full_records))
+ {
+ if (status)
+ while ((status = rmtread (archive, more, left)) == SAFE_READ_ERROR)
+ archive_read_error ();
+
+ if (status == 0)
+ break;
+
+ if (! read_full_records)
+ {
+ unsigned long rest = record_size - left;
+
+ FATAL_ERROR ((0, 0,
+ ngettext ("Unaligned block (%lu byte) in archive",
+ "Unaligned block (%lu bytes) in archive",
+ rest),
+ rest));
+ }
+
+ /* User warned us about this. Fix up. */
+
+ left -= status;
+ more += status;
+ }
+
+ /* FIXME: for size=0, multi-volume support. On the first record, warn
+ about the problem. */
+
+ if (!read_full_records && verbose_option > 1
+ && record_start_block == 0 && status != 0)
+ {
+ unsigned long rsize = (record_size - left) / BLOCKSIZE;
+ WARN ((0, 0,
+ ngettext ("Record size = %lu block",
+ "Record size = %lu blocks",
+ rsize),
+ rsize));
+ }
+
+ record_end = record_start + (record_size - left) / BLOCKSIZE;
+ records_read++;
+}
+
+/* Flush the current buffer to/from the archive. */
+void
+flush_archive (void)
+{
+ size_t buffer_level = current_block->buffer - record_start->buffer;
+ record_start_block += record_end - record_start;
+ current_block = record_start;
+ record_end = record_start + blocking_factor;
+
+ if (access_mode == ACCESS_READ && time_to_start_writing)
+ {
+ access_mode = ACCESS_WRITE;
+ time_to_start_writing = false;
+ backspace_output ();
+ }
+
+ switch (access_mode)
+ {
+ case ACCESS_READ:
+ flush_read ();
+ break;
+
+ case ACCESS_WRITE:
+ flush_write_ptr (buffer_level);
+ break;
+
+ case ACCESS_UPDATE:
+ abort ();
+ }
+}
+
+/* Backspace the archive descriptor by one record worth. If it's a
+ tape, MTIOCTOP will work. If it's something else, try to seek on
+ it. If we can't seek, we lose! */
+static void
+backspace_output (void)
+{
+#ifdef MTIOCTOP
+ {
+ struct mtop operation;
+
+ operation.mt_op = MTBSR;
+ operation.mt_count = 1;
+ if (rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
+ return;
+ if (errno == EIO && rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
+ return;
+ }
+#endif
+
+ {
+ off_t position = rmtlseek (archive, (off_t) 0, SEEK_CUR);
+
+ /* Seek back to the beginning of this record and start writing there. */
+
+ position -= record_size;
+ if (position < 0)
+ position = 0;
+ if (rmtlseek (archive, position, SEEK_SET) != position)
+ {
+ /* Lseek failed. Try a different method. */
+
+ WARN ((0, 0,
+ _("Cannot backspace archive file; it may be unreadable without -i")));
+
+ /* Replace the first part of the record with NULs. */
+
+ if (record_start->buffer != output_start)
+ memset (record_start->buffer, 0,
+ output_start - record_start->buffer);
+ }
+ }
+}
+
+off_t
+seek_archive (off_t size)
+{
+ off_t start = current_block_ordinal ();
+ off_t offset;
+ off_t nrec, nblk;
+ off_t skipped = (blocking_factor - (current_block - record_start));
+
+ size -= skipped * BLOCKSIZE;
+
+ if (size < record_size)
+ return 0;
+ /* FIXME: flush? */
+
+ /* Compute number of records to skip */
+ nrec = size / record_size;
+ offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
+ if (offset < 0)
+ return offset;
+
+ if (offset % record_size)
+ FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary")));
+
+ /* Convert to number of records */
+ offset /= BLOCKSIZE;
+ /* Compute number of skipped blocks */
+ nblk = offset - start;
+
+ /* Update buffering info */
+ records_read += nblk / blocking_factor;
+ record_start_block = offset - blocking_factor;
+ current_block = record_end;
+
+ return nblk;
+}
+
+/* Close the archive file. */
+void
+close_archive (void)
+{
+ if (time_to_start_writing || access_mode == ACCESS_WRITE)
+ {
+ flush_archive ();
+ if (current_block > record_start)
+ flush_archive ();
+ }
+
+ sys_drain_input_pipe ();
+
+ compute_duration ();
+ if (verify_option)
+ verify_volume ();
+
+ if (rmtclose (archive) != 0)
+ close_warn (*archive_name_cursor);
+
+ sys_wait_for_child (child_pid);
+
+ tar_stat_destroy (&current_stat_info);
+ if (save_name)
+ free (save_name);
+ if (real_s_name)
+ free (real_s_name);
+ free (record_buffer[0]);
+ free (record_buffer[1]);
+}
+
+/* Called to initialize the global volume number. */
+void
+init_volume_number (void)
+{
+ FILE *file = fopen (volno_file_option, "r");
+
+ if (file)
+ {
+ if (fscanf (file, "%d", &global_volno) != 1
+ || global_volno < 0)
+ FATAL_ERROR ((0, 0, _("%s: contains invalid volume number"),
+ quotearg_colon (volno_file_option)));
+ if (ferror (file))
+ read_error (volno_file_option);
+ if (fclose (file) != 0)
+ close_error (volno_file_option);
+ }
+ else if (errno != ENOENT)
+ open_error (volno_file_option);
+}
+
+/* Called to write out the closing global volume number. */
+void
+closeout_volume_number (void)
+{
+ FILE *file = fopen (volno_file_option, "w");
+
+ if (file)
+ {
+ fprintf (file, "%d\n", global_volno);
+ if (ferror (file))
+ write_error (volno_file_option);
+ if (fclose (file) != 0)
+ close_error (volno_file_option);
+ }
+ else
+ open_error (volno_file_option);
+}
+
+
+static void
+increase_volume_number ()
+{
+ global_volno++;
+ if (global_volno < 0)
+ FATAL_ERROR ((0, 0, _("Volume number overflow")));
+ volno++;
+}
+
+void
+change_tape_menu (FILE *read_file)
+{
+ char *input_buffer = NULL;
+ size_t size = 0;
+ bool stop = false;
+
+ while (!stop)
+ {
+ fputc ('\007', stderr);
+ fprintf (stderr,
+ _("Prepare volume #%d for %s and hit return: "),
+ global_volno + 1, quote (*archive_name_cursor));
+ fflush (stderr);
+
+ if (getline (&input_buffer, &size, read_file) <= 0)
+ {
+ WARN ((0, 0, _("EOF where user reply was expected")));
+
+ if (subcommand_option != EXTRACT_SUBCOMMAND
+ && subcommand_option != LIST_SUBCOMMAND
+ && subcommand_option != DIFF_SUBCOMMAND)
+ WARN ((0, 0, _("WARNING: Archive is incomplete")));
+
+ fatal_exit ();
+ }
+
+ if (input_buffer[0] == '\n'
+ || input_buffer[0] == 'y'
+ || input_buffer[0] == 'Y')
+ break;
+
+ switch (input_buffer[0])
+ {
+ case '?':
+ {
+ fprintf (stderr, _("\
+ n name Give a new file name for the next (and subsequent) volume(s)\n\
+ q Abort tar\n\
+ y or newline Continue operation\n"));
+ if (!restrict_option)
+ fprintf (stderr, _(" ! Spawn a subshell\n"));
+ fprintf (stderr, _(" ? Print this list\n"));
+ }
+ break;
+
+ case 'q':
+ /* Quit. */
+
+ WARN ((0, 0, _("No new volume; exiting.\n")));
+
+ if (subcommand_option != EXTRACT_SUBCOMMAND
+ && subcommand_option != LIST_SUBCOMMAND
+ && subcommand_option != DIFF_SUBCOMMAND)
+ WARN ((0, 0, _("WARNING: Archive is incomplete")));
+
+ fatal_exit ();
+
+ case 'n':
+ /* Get new file name. */
+
+ {
+ char *name;
+ char *cursor;
+
+ for (name = input_buffer + 1;
+ *name == ' ' || *name == '\t';
+ name++)
+ ;
+
+ for (cursor = name; *cursor && *cursor != '\n'; cursor++)
+ ;
+ *cursor = '\0';
+
+ if (name[0])
+ {
+ /* FIXME: the following allocation is never reclaimed. */
+ *archive_name_cursor = xstrdup (name);
+ stop = true;
+ }
+ else
+ fprintf (stderr, "%s",
+ _("File name not specified. Try again.\n"));
+ }
+ break;
+
+ case '!':
+ if (!restrict_option)
+ {
+ sys_spawn_shell ();
+ break;
+ }
+ /* FALL THROUGH */
+
+ default:
+ fprintf (stderr, _("Invalid input. Type ? for help.\n"));
+ }
+ }
+ free (input_buffer);
+}
+
+/* We've hit the end of the old volume. Close it and open the next one.
+ Return nonzero on success.
+*/
+static bool
+new_volume (enum access_mode mode)
+{
+ static FILE *read_file;
+ static int looped;
+ int prompt;
+
+ if (!read_file && !info_script_option)
+ /* FIXME: if fopen is used, it will never be closed. */
+ read_file = archive == STDIN_FILENO ? fopen (TTY_NAME, "r") : stdin;
+
+ if (now_verifying)
+ return false;
+ if (verify_option)
+ verify_volume ();
+
+ assign_string (&volume_label, NULL);
+ assign_string (&continued_file_name, NULL);
+ continued_file_size = continued_file_offset = 0;
+ current_block = record_start;
+
+ if (rmtclose (archive) != 0)
+ close_warn (*archive_name_cursor);
+
+ archive_name_cursor++;
+ if (archive_name_cursor == archive_name_array + archive_names)
+ {
+ archive_name_cursor = archive_name_array;
+ looped = 1;
+ }
+ prompt = looped;
+
+ tryagain:
+ if (prompt)
+ {
+ /* We have to prompt from now on. */
+
+ if (info_script_option)
+ {
+ if (volno_file_option)
+ closeout_volume_number ();
+ if (sys_exec_info_script (archive_name_cursor, global_volno+1))
+ FATAL_ERROR ((0, 0, _("%s command failed"),
+ quote (info_script_option)));
+ }
+ else
+ change_tape_menu (read_file);
+ }
+
+ if (strcmp (archive_name_cursor[0], "-") == 0)
+ {
+ read_full_records = true;
+ archive = STDIN_FILENO;
+ }
+ else if (verify_option)
+ archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
+ rsh_command_option);
+ else
+ switch (mode)
+ {
+ case ACCESS_READ:
+ archive = rmtopen (*archive_name_cursor, O_RDONLY, MODE_RW,
+ rsh_command_option);
+ break;
+
+ case ACCESS_WRITE:
+ if (backup_option)
+ maybe_backup_file (*archive_name_cursor, 1);
+ archive = rmtcreat (*archive_name_cursor, MODE_RW,
+ rsh_command_option);
+ break;
+
+ case ACCESS_UPDATE:
+ archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
+ rsh_command_option);
+ break;
+ }
+
+ if (archive < 0)
+ {
+ open_warn (*archive_name_cursor);
+ if (!verify_option && mode == ACCESS_WRITE && backup_option)
+ undo_last_backup ();
+ prompt = 1;
+ goto tryagain;
+ }
+
+ SET_BINARY_MODE (archive);
+
+ return true;
+}
+
+static bool
+read_header0 (struct tar_stat_info *info)
+{
+ enum read_header rc;
+
+ tar_stat_init (info);
+ rc = read_header_primitive (false, info);
+ if (rc == HEADER_SUCCESS)
+ {
+ set_next_block_after (current_header);
+ return true;
+ }
+ ERROR ((0, 0, _("This does not look like a tar archive")));
+ return false;
+}
+
+bool
+try_new_volume ()
+{
+ size_t status;
+ union block *header;
+ int access;
+
+ switch (subcommand_option)
+ {
+ case APPEND_SUBCOMMAND:
+ case CAT_SUBCOMMAND:
+ case UPDATE_SUBCOMMAND:
+ access = ACCESS_UPDATE;
+ break;
+
+ default:
+ access = ACCESS_READ;
+ break;
+ }
+
+ if (!new_volume (access))
+ return true;
+
+ while ((status = rmtread (archive, record_start->buffer, record_size))
+ == SAFE_READ_ERROR)
+ archive_read_error ();
+
+ if (status != record_size)
+ short_read (status);
+
+ header = find_next_block ();
+ if (!header)
+ return false;
+
+ switch (header->header.typeflag)
+ {
+ case XGLTYPE:
+ {
+ if (!read_header0 (&dummy))
+ return false;
+ xheader_decode (&dummy); /* decodes values from the global header */
+ tar_stat_destroy (&dummy);
+ if (!real_s_name)
+ {
+ /* We have read the extended header of the first member in
+ this volume. Put it back, so next read_header works as
+ expected. */
+ current_block = record_start;
+ }
+ break;
+ }
+
+ case GNUTYPE_VOLHDR:
+ if (!read_header0 (&dummy))
+ return false;
+ tar_stat_destroy (&dummy);
+ assign_string (&volume_label, current_header->header.name);
+ set_next_block_after (header);
+ header = find_next_block ();
+ if (header->header.typeflag != GNUTYPE_MULTIVOL)
+ break;
+ /* FALL THROUGH */
+
+ case GNUTYPE_MULTIVOL:
+ if (!read_header0 (&dummy))
+ return false;
+ tar_stat_destroy (&dummy);
+ assign_string (&continued_file_name, current_header->header.name);
+ continued_file_size =
+ UINTMAX_FROM_HEADER (current_header->header.size);
+ continued_file_offset =
+ UINTMAX_FROM_HEADER (current_header->oldgnu_header.offset);
+ break;
+
+ default:
+ break;
+ }
+
+ if (real_s_name)
+ {
+ uintmax_t s;
+ if (!continued_file_name
+ || strcmp (continued_file_name, real_s_name))
+ {
+ if ((archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
+ && strlen (real_s_name) >= NAME_FIELD_SIZE
+ && strncmp (continued_file_name, real_s_name,
+ NAME_FIELD_SIZE) == 0)
+ WARN ((0, 0,
+ _("%s is possibly continued on this volume: header contains truncated name"),
+ quote (real_s_name)));
+ else
+ {
+ WARN ((0, 0, _("%s is not continued on this volume"),
+ quote (real_s_name)));
+ return false;
+ }
+ }
+
+ s = continued_file_size + continued_file_offset;
+
+ if (real_s_totsize != s || s < continued_file_offset)
+ {
+ char totsizebuf[UINTMAX_STRSIZE_BOUND];
+ char s1buf[UINTMAX_STRSIZE_BOUND];
+ char s2buf[UINTMAX_STRSIZE_BOUND];
+
+ WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
+ quote (continued_file_name),
+ STRINGIFY_BIGINT (save_totsize, totsizebuf),
+ STRINGIFY_BIGINT (continued_file_size, s1buf),
+ STRINGIFY_BIGINT (continued_file_offset, s2buf)));
+ return false;
+ }
+
+ if (real_s_totsize - real_s_sizeleft != continued_file_offset)
+ {
+ WARN ((0, 0, _("This volume is out of sequence")));
+ return false;
+ }
+ }
+
+ increase_volume_number ();
+ return true;
+}
+
+
+/* Check the LABEL block against the volume label, seen as a globbing
+ pattern. Return true if the pattern matches. In case of failure,
+ retry matching a volume sequence number before giving up in
+ multi-volume mode. */
+static bool
+check_label_pattern (union block *label)
+{
+ char *string;
+ bool result;
+
+ if (! memchr (label->header.name, '\0', sizeof label->header.name))
+ return false;
+
+ if (fnmatch (volume_label_option, label->header.name, 0) == 0)
+ return true;
+
+ if (!multi_volume_option)
+ return false;
+
+ string = xmalloc (strlen (volume_label_option)
+ + sizeof VOLUME_LABEL_APPEND + 1);
+ strcpy (string, volume_label_option);
+ strcat (string, VOLUME_LABEL_APPEND);
+ result = fnmatch (string, label->header.name, 0) == 0;
+ free (string);
+ return result;
+}
+
+/* Check if the next block contains a volume label and if this matches
+ the one given in the command line */
+static void
+match_volume_label (void)
+{
+ union block *label = find_next_block ();
+
+ if (!label)
+ FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
+ quote (volume_label_option)));
+ if (!check_label_pattern (label))
+ FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
+ quote_n (0, label->header.name),
+ quote_n (1, volume_label_option)));
+}
+
+/* Mark the archive with volume label STR. */
+static void
+_write_volume_label (const char *str)
+{
+ if (archive_format == POSIX_FORMAT)
+ xheader_store ("GNU.volume.label", &dummy, str);
+ else
+ {
+ union block *label = find_next_block ();
+
+ memset (label, 0, BLOCKSIZE);
+
+ strcpy (label->header.name, volume_label_option);
+ assign_string (&current_stat_info.file_name,
+ label->header.name);
+ current_stat_info.had_trailing_slash =
+ strip_trailing_slashes (current_stat_info.file_name);
+
+ label->header.typeflag = GNUTYPE_VOLHDR;
+ TIME_TO_CHARS (start_time.tv_sec, label->header.mtime);
+ finish_header (&current_stat_info, label, -1);
+ set_next_block_after (label);
+ }
+}
+
+#define VOL_SUFFIX "Volume"
+
+/* Add a volume label to a part of multi-volume archive */
+static void
+add_volume_label (void)
+{
+ char buf[UINTMAX_STRSIZE_BOUND];
+ char *p = STRINGIFY_BIGINT (volno, buf);
+ char *s = xmalloc (strlen (volume_label_option) + sizeof VOL_SUFFIX
+ + strlen (p) + 2);
+ sprintf (s, "%s %s %s", volume_label_option, VOL_SUFFIX, p);
+ _write_volume_label (s);
+ free (s);
+}
+
+static void
+add_chunk_header ()
+{
+ if (archive_format == POSIX_FORMAT)
+ {
+ off_t block_ordinal;
+ union block *blk;
+ struct tar_stat_info st;
+ static size_t real_s_part_no; /* FIXME */
+
+ real_s_part_no++;
+ memset (&st, 0, sizeof st);
+ st.orig_file_name = st.file_name = real_s_name;
+ st.stat.st_mode = S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
+ st.stat.st_uid = getuid ();
+ st.stat.st_gid = getgid ();
+ st.orig_file_name = xheader_format_name (&st,
+ "%d/GNUFileParts.%p/%f.%n",
+ real_s_part_no);
+ st.file_name = st.orig_file_name;
+ st.archive_file_size = st.stat.st_size = real_s_sizeleft;
+
+ block_ordinal = current_block_ordinal ();
+ blk = start_header (&st);
+ if (!blk)
+ abort (); /* FIXME */
+ finish_header (&st, blk, block_ordinal);
+ free (st.orig_file_name);
+ }
+}
+
+
+/* Add a volume label to the current archive */
+static void
+write_volume_label (void)
+{
+ if (multi_volume_option)
+ add_volume_label ();
+ else
+ _write_volume_label (volume_label_option);
+}
+
+/* Write GNU multi-volume header */
+static void
+gnu_add_multi_volume_header (void)
+{
+ int tmp;
+ union block *block = find_next_block ();
+
+ if (strlen (real_s_name) > NAME_FIELD_SIZE)
+ WARN ((0, 0,
+ _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
+ quotearg_colon (real_s_name)));
+
+ memset (block, 0, BLOCKSIZE);
+
+ /* FIXME: Michael P Urban writes: [a long name file] is being written
+ when a new volume rolls around [...] Looks like the wrong value is
+ being preserved in real_s_name, though. */
+
+ strncpy (block->header.name, real_s_name, NAME_FIELD_SIZE);
+ block->header.typeflag = GNUTYPE_MULTIVOL;
+
+ OFF_TO_CHARS (real_s_sizeleft, block->header.size);
+ OFF_TO_CHARS (real_s_totsize - real_s_sizeleft,
+ block->oldgnu_header.offset);
+
+ tmp = verbose_option;
+ verbose_option = 0;
+ finish_header (&current_stat_info, block, -1);
+ verbose_option = tmp;
+ set_next_block_after (block);
+}
+
+/* Add a multi volume header to the current archive. The exact header format
+ depends on the archive format. */
+static void
+add_multi_volume_header (void)
+{
+ if (archive_format == POSIX_FORMAT)
+ {
+ off_t d = real_s_totsize - real_s_sizeleft;
+ xheader_store ("GNU.volume.filename", &dummy, real_s_name);
+ xheader_store ("GNU.volume.size", &dummy, &real_s_sizeleft);
+ xheader_store ("GNU.volume.offset", &dummy, &d);
+ }
+ else
+ gnu_add_multi_volume_header ();
+}
+
+/* Synchronize multi-volume globals */
+static void
+multi_volume_sync ()
+{
+ if (multi_volume_option)
+ {
+ if (save_name)
+ {
+ assign_string (&real_s_name,
+ safer_name_suffix (save_name, false,
+ absolute_names_option));
+ real_s_totsize = save_totsize;
+ real_s_sizeleft = save_sizeleft;
+ }
+ else
+ {
+ assign_string (&real_s_name, 0);
+ real_s_totsize = 0;
+ real_s_sizeleft = 0;
+ }
+ }
+}
+
+
+/* Low-level flush functions */
+
+/* Simple flush read (no multi-volume or label extensions) */
+static void
+simple_flush_read (void)
+{
+ size_t status; /* result from system call */
+
+ do_checkpoint (false);
+
+ /* Clear the count of errors. This only applies to a single call to
+ flush_read. */
+
+ read_error_count = 0; /* clear error count */
+
+ if (write_archive_to_stdout && record_start_block != 0)
+ {
+ archive = STDOUT_FILENO;
+ status = sys_write_archive_buffer ();
+ archive = STDIN_FILENO;
+ if (status != record_size)
+ archive_write_error (status);
+ }
+
+ for (;;)
+ {
+ status = rmtread (archive, record_start->buffer, record_size);
+ if (status == record_size)
+ {
+ records_read++;
+ return;
+ }
+ if (status == SAFE_READ_ERROR)
+ {
+ archive_read_error ();
+ continue; /* try again */
+ }
+ break;
+ }
+ short_read (status);
+}
+
+/* Simple flush write (no multi-volume or label extensions) */
+static void
+simple_flush_write (size_t level __attribute__((unused)))
+{
+ ssize_t status;
+
+ status = _flush_write ();
+ if (status != record_size)
+ archive_write_error (status);
+ else
+ {
+ records_written++;
+ bytes_written += status;
+ }
+}
+
+
+/* GNU flush functions. These support multi-volume and archive labels in
+ GNU and PAX archive formats. */
+
+static void
+_gnu_flush_read (void)
+{
+ size_t status; /* result from system call */
+
+ do_checkpoint (false);
+
+ /* Clear the count of errors. This only applies to a single call to
+ flush_read. */
+
+ read_error_count = 0; /* clear error count */
+
+ if (write_archive_to_stdout && record_start_block != 0)
+ {
+ archive = STDOUT_FILENO;
+ status = sys_write_archive_buffer ();
+ archive = STDIN_FILENO;
+ if (status != record_size)
+ archive_write_error (status);
+ }
+
+ multi_volume_sync ();
+
+ for (;;)
+ {
+ status = rmtread (archive, record_start->buffer, record_size);
+ if (status == record_size)
+ {
+ records_read++;
+ return;
+ }
+
+ /* The condition below used to include
+ || (status > 0 && !read_full_records)
+ This is incorrect since even if new_volume() succeeds, the
+ subsequent call to rmtread will overwrite the chunk of data
+ already read in the buffer, so the processing will fail */
+ if ((status == 0
+ || (status == SAFE_READ_ERROR && errno == ENOSPC))
+ && multi_volume_option)
+ {
+ while (!try_new_volume ())
+ ;
+ return;
+ }
+ else if (status == SAFE_READ_ERROR)
+ {
+ archive_read_error ();
+ continue;
+ }
+ break;
+ }
+ short_read (status);
+}
+
+static void
+gnu_flush_read (void)
+{
+ flush_read_ptr = simple_flush_read; /* Avoid recursion */
+ _gnu_flush_read ();
+ flush_read_ptr = gnu_flush_read;
+}
+
+static void
+_gnu_flush_write (size_t buffer_level)
+{
+ ssize_t status;
+ union block *header;
+ char *copy_ptr;
+ size_t copy_size;
+ size_t bufsize;
+
+ status = _flush_write ();
+ if (status != record_size && !multi_volume_option)
+ archive_write_error (status);
+ else
+ {
+ records_written++;
+ bytes_written += status;
+ }
+
+ if (status == record_size)
+ {
+ multi_volume_sync ();
+ return;
+ }
+
+ /* In multi-volume mode. */
+ /* ENXIO is for the UNIX PC. */
+ if (status < 0 && errno != ENOSPC && errno != EIO && errno != ENXIO)
+ archive_write_error (status);
+
+ if (!new_volume (ACCESS_WRITE))
+ return;
+
+ tar_stat_destroy (&dummy);
+
+ increase_volume_number ();
+ prev_written += bytes_written;
+ bytes_written = 0;
+
+ copy_ptr = record_start->buffer + status;
+ copy_size = buffer_level - status;
+ /* Switch to the next buffer */
+ record_index = !record_index;
+ init_buffer ();
+
+ if (volume_label_option)
+ add_volume_label ();
+
+ if (real_s_name)
+ add_multi_volume_header ();
+
+ write_extended (true, &dummy, find_next_block ());
+ tar_stat_destroy (&dummy);
+
+ if (real_s_name)
+ add_chunk_header ();
+ header = find_next_block ();
+ bufsize = available_space_after (header);
+ while (bufsize < copy_size)
+ {
+ memcpy (header->buffer, copy_ptr, bufsize);
+ copy_ptr += bufsize;
+ copy_size -= bufsize;
+ set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
+ header = find_next_block ();
+ bufsize = available_space_after (header);
+ }
+ memcpy (header->buffer, copy_ptr, copy_size);
+ memset (header->buffer + copy_size, 0, bufsize - copy_size);
+ set_next_block_after (header + (copy_size - 1) / BLOCKSIZE);
+ find_next_block ();
+}
+
+static void
+gnu_flush_write (size_t buffer_level)
+{
+ flush_write_ptr = simple_flush_write; /* Avoid recursion */
+ _gnu_flush_write (buffer_level);
+ flush_write_ptr = gnu_flush_write;
+}
+
+void
+flush_read ()
+{
+ flush_read_ptr ();
+}
+
+void
+flush_write ()
+{
+ flush_write_ptr (record_size);
+}
+
+void
+open_archive (enum access_mode wanted_access)
+{
+ flush_read_ptr = gnu_flush_read;
+ flush_write_ptr = gnu_flush_write;
+
+ _open_archive (wanted_access);
+ switch (wanted_access)
+ {
+ case ACCESS_READ:
+ if (volume_label_option)
+ match_volume_label ();
+ break;
+
+ case ACCESS_WRITE:
+ records_written = 0;
+ if (volume_label_option)
+ write_volume_label ();
+ break;
+
+ default:
+ break;
+ }
+ set_volume_start_time ();
+}
diff --git a/src/common.h b/src/common.h
new file mode 100644
index 0000000..6dd1abd
--- /dev/null
+++ b/src/common.h
@@ -0,0 +1,738 @@
+/* Common declarations for the tar program.
+
+ Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
+ 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Declare the GNU tar archive format. */
+#include "tar.h"
+
+/* The checksum field is filled with this while the checksum is computed. */
+#define CHKBLANKS " " /* 8 blanks, no null */
+
+/* Some constants from POSIX are given names. */
+#define NAME_FIELD_SIZE 100
+#define PREFIX_FIELD_SIZE 155
+#define UNAME_FIELD_SIZE 32
+#define GNAME_FIELD_SIZE 32
+
+
+
+/* Some various global definitions. */
+
+/* Name of file to use for interacting with user. */
+
+/* GLOBAL is defined to empty in tar.c only, and left alone in other *.c
+ modules. Here, we merely set it to "extern" if it is not already set.
+ GNU tar does depend on the system loader to preset all GLOBAL variables to
+ neutral (or zero) values, explicit initialization is usually not done. */
+#ifndef GLOBAL
+# define GLOBAL extern
+#endif
+
+#define TAREXIT_SUCCESS PAXEXIT_SUCCESS
+#define TAREXIT_DIFFERS PAXEXIT_DIFFERS
+#define TAREXIT_FAILURE PAXEXIT_FAILURE
+
+
+#include "arith.h"
+#include <backupfile.h>
+#include <exclude.h>
+#include <full-write.h>
+#include <modechange.h>
+#include <quote.h>
+#include <safe-read.h>
+#include <stat-time.h>
+#include <timespec.h>
+#define obstack_chunk_alloc xmalloc
+#define obstack_chunk_free free
+#include <obstack.h>
+
+#include <paxlib.h>
+
+/* Log base 2 of common values. */
+#define LG_8 3
+#define LG_64 6
+#define LG_256 8
+
+/* Information gleaned from the command line. */
+
+/* Name of this program. */
+GLOBAL const char *program_name;
+
+/* Main command option. */
+
+enum subcommand
+{
+ UNKNOWN_SUBCOMMAND, /* none of the following */
+ APPEND_SUBCOMMAND, /* -r */
+ CAT_SUBCOMMAND, /* -A */
+ CREATE_SUBCOMMAND, /* -c */
+ DELETE_SUBCOMMAND, /* -D */
+ DIFF_SUBCOMMAND, /* -d */
+ EXTRACT_SUBCOMMAND, /* -x */
+ LIST_SUBCOMMAND, /* -t */
+ UPDATE_SUBCOMMAND /* -u */
+};
+
+GLOBAL enum subcommand subcommand_option;
+
+/* Selected format for output archive. */
+GLOBAL enum archive_format archive_format;
+
+/* Either NL or NUL, as decided by the --null option. */
+GLOBAL char filename_terminator;
+
+/* Size of each record, once in blocks, once in bytes. Those two variables
+ are always related, the second being BLOCKSIZE times the first. They do
+ not have _option in their name, even if their values is derived from
+ option decoding, as these are especially important in tar. */
+GLOBAL int blocking_factor;
+GLOBAL size_t record_size;
+
+GLOBAL bool absolute_names_option;
+
+/* Display file times in UTC */
+GLOBAL bool utc_option;
+
+/* This variable tells how to interpret newer_mtime_option, below. If zero,
+ files get archived if their mtime is not less than newer_mtime_option.
+ If nonzero, files get archived if *either* their ctime or mtime is not less
+ than newer_mtime_option. */
+GLOBAL int after_date_option;
+
+enum atime_preserve
+{
+ no_atime_preserve,
+ replace_atime_preserve,
+ system_atime_preserve
+};
+GLOBAL enum atime_preserve atime_preserve_option;
+
+GLOBAL bool backup_option;
+
+/* Type of backups being made. */
+GLOBAL enum backup_type backup_type;
+
+GLOBAL bool block_number_option;
+
+GLOBAL unsigned checkpoint_option;
+
+enum checkpoint_style
+ {
+ checkpoint_text,
+ checkpoint_dot
+ };
+
+GLOBAL enum checkpoint_style checkpoint_style;
+
+/* Specified name of compression program, or "gzip" as implied by -z. */
+GLOBAL const char *use_compress_program_option;
+
+GLOBAL bool dereference_option;
+
+/* Print a message if not all links are dumped */
+GLOBAL int check_links_option;
+
+/* Patterns that match file names to be excluded. */
+GLOBAL struct exclude *excluded;
+
+enum exclusion_tag_type
+ {
+ exclusion_tag_none,
+ /* Exclude the directory contents, but preserve the directory
+ itself and the exclusion tag file */
+ exclusion_tag_contents,
+ /* Exclude everything below the directory, preserving the directory
+ itself */
+ exclusion_tag_under,
+ /* Exclude entire directory */
+ exclusion_tag_all,
+ };
+
+/* Specified value to be put into tar file in place of stat () results, or
+ just -1 if such an override should not take place. */
+GLOBAL gid_t group_option;
+
+GLOBAL bool ignore_failed_read_option;
+
+GLOBAL bool ignore_zeros_option;
+
+GLOBAL bool incremental_option;
+
+/* Specified name of script to run at end of each tape change. */
+GLOBAL const char *info_script_option;
+
+GLOBAL bool interactive_option;
+
+/* If nonzero, extract only Nth occurrence of each named file */
+GLOBAL uintmax_t occurrence_option;
+
+enum old_files
+{
+ DEFAULT_OLD_FILES, /* default */
+ NO_OVERWRITE_DIR_OLD_FILES, /* --no-overwrite-dir */
+ OVERWRITE_OLD_FILES, /* --overwrite */
+ UNLINK_FIRST_OLD_FILES, /* --unlink-first */
+ KEEP_OLD_FILES, /* --keep-old-files */
+ KEEP_NEWER_FILES /* --keep-newer-files */
+};
+GLOBAL enum old_files old_files_option;
+
+/* Specified file name for incremental list. */
+GLOBAL const char *listed_incremental_option;
+
+/* Specified mode change string. */
+GLOBAL struct mode_change *mode_option;
+
+/* Initial umask, if needed for mode change string. */
+GLOBAL mode_t initial_umask;
+
+GLOBAL bool multi_volume_option;
+
+/* Specified threshold date and time. Files having an older time stamp
+ do not get archived (also see after_date_option above). */
+GLOBAL struct timespec newer_mtime_option;
+
+/* If true, override actual mtime (see below) */
+GLOBAL bool set_mtime_option;
+/* Value to be put in mtime header field instead of the actual mtime */
+GLOBAL struct timespec mtime_option;
+
+/* Return true if newer_mtime_option is initialized. */
+#define NEWER_OPTION_INITIALIZED(opt) (0 <= (opt).tv_nsec)
+
+/* Return true if the struct stat ST's M time is less than
+ newer_mtime_option. */
+#define OLDER_STAT_TIME(st, m) \
+ (timespec_cmp (get_stat_##m##time (&(st)), newer_mtime_option) < 0)
+
+/* Likewise, for struct tar_stat_info ST. */
+#define OLDER_TAR_STAT_TIME(st, m) \
+ (timespec_cmp ((st).m##time, newer_mtime_option) < 0)
+
+/* Zero if there is no recursion, otherwise FNM_LEADING_DIR. */
+GLOBAL int recursion_option;
+
+GLOBAL bool numeric_owner_option;
+
+GLOBAL bool one_file_system_option;
+
+/* Specified value to be put into tar file in place of stat () results, or
+ just -1 if such an override should not take place. */
+GLOBAL uid_t owner_option;
+
+GLOBAL bool recursive_unlink_option;
+
+GLOBAL bool read_full_records_option;
+
+GLOBAL bool remove_files_option;
+
+/* Specified rmt command. */
+GLOBAL const char *rmt_command_option;
+
+/* Specified remote shell command. */
+GLOBAL const char *rsh_command_option;
+
+GLOBAL bool same_order_option;
+
+/* If positive, preserve ownership when extracting. */
+GLOBAL int same_owner_option;
+
+/* If positive, preserve permissions when extracting. */
+GLOBAL int same_permissions_option;
+
+/* When set, strip the given number of file name components from the file name
+ before extracting */
+GLOBAL size_t strip_name_components;
+
+GLOBAL bool show_omitted_dirs_option;
+
+GLOBAL bool sparse_option;
+GLOBAL unsigned tar_sparse_major;
+GLOBAL unsigned tar_sparse_minor;
+
+GLOBAL bool starting_file_option;
+
+/* Specified maximum byte length of each tape volume (multiple of 1024). */
+GLOBAL tarlong tape_length_option;
+
+GLOBAL bool to_stdout_option;
+
+GLOBAL bool totals_option;
+
+GLOBAL bool touch_option;
+
+GLOBAL char *to_command_option;
+GLOBAL bool ignore_command_error_option;
+
+/* Restrict some potentially harmful tar options */
+GLOBAL bool restrict_option;
+
+/* Return true if the extracted files are not being written to disk */
+#define EXTRACT_OVER_PIPE (to_stdout_option || to_command_option)
+
+/* Count how many times the option has been set, multiple setting yields
+ more verbose behavior. Value 0 means no verbosity, 1 means file name
+ only, 2 means file name and all attributes. More than 2 is just like 2. */
+GLOBAL int verbose_option;
+
+GLOBAL bool verify_option;
+
+/* Specified name of file containing the volume number. */
+GLOBAL const char *volno_file_option;
+
+/* Specified value or pattern. */
+GLOBAL const char *volume_label_option;
+
+/* Other global variables. */
+
+/* File descriptor for archive file. */
+GLOBAL int archive;
+
+/* Nonzero when outputting to /dev/null. */
+GLOBAL bool dev_null_output;
+
+/* Timestamps: */
+GLOBAL struct timespec start_time; /* when we started execution */
+GLOBAL struct timespec volume_start_time; /* when the current volume was
+ opened*/
+GLOBAL struct timespec last_stat_time; /* when the statistics was last
+ computed */
+
+GLOBAL struct tar_stat_info current_stat_info;
+
+/* List of tape drive names, number of such tape drives, allocated number,
+ and current cursor in list. */
+GLOBAL const char **archive_name_array;
+GLOBAL size_t archive_names;
+GLOBAL size_t allocated_archive_names;
+GLOBAL const char **archive_name_cursor;
+
+/* Output index file name. */
+GLOBAL char const *index_file_name;
+
+/* Structure for keeping track of filenames and lists thereof. */
+struct name
+ {
+ struct name *next; /* Link to the next element */
+ int change_dir; /* Number of the directory to change to.
+ Set with the -C option. */
+ uintmax_t found_count; /* number of times a matching file has
+ been found */
+ int matching_flags; /* this name is a regexp, not literal */
+ char const *dir_contents; /* for incremental_option */
+
+ size_t length; /* cached strlen(name) */
+ char name[1];
+ };
+
+/* Obnoxious test to see if dimwit is trying to dump the archive. */
+GLOBAL dev_t ar_dev;
+GLOBAL ino_t ar_ino;
+
+GLOBAL bool seekable_archive;
+
+GLOBAL dev_t root_device;
+
+/* Unquote filenames */
+GLOBAL bool unquote_option;
+
+GLOBAL bool test_label_option; /* Test archive volume label and exit */
+
+/* Show file or archive names after transformation.
+ In particular, when creating archive in verbose mode, list member names
+ as stored in the archive */
+GLOBAL bool show_transformed_names_option;
+
+/* Delay setting modification times and permissions of extracted directories
+ until the end of extraction. This variable helps correctly restore directory
+ timestamps from archives with an unusual member order. It is automatically
+ set for incremental archives. */
+GLOBAL bool delay_directory_restore_option;
+
+/* Warn about implicit use of the wildcards in command line arguments.
+ (Default for tar prior to 1.15.91, but changed afterwards */
+GLOBAL bool warn_regex_usage;
+
+/* Declarations for each module. */
+
+/* FIXME: compare.c should not directly handle the following variable,
+ instead, this should be done in buffer.c only. */
+
+enum access_mode
+{
+ ACCESS_READ,
+ ACCESS_WRITE,
+ ACCESS_UPDATE
+};
+extern enum access_mode access_mode;
+
+/* Module buffer.c. */
+
+extern FILE *stdlis;
+extern bool write_archive_to_stdout;
+extern char *volume_label;
+extern char *continued_file_name;
+extern uintmax_t continued_file_size;
+extern uintmax_t continued_file_offset;
+
+size_t available_space_after (union block *pointer);
+off_t current_block_ordinal (void);
+void close_archive (void);
+void closeout_volume_number (void);
+void compute_duration (void);
+union block *find_next_block (void);
+void flush_read (void);
+void flush_write (void);
+void flush_archive (void);
+void init_volume_number (void);
+void open_archive (enum access_mode mode);
+void print_total_stats (void);
+void reset_eof (void);
+void set_next_block_after (union block *block);
+void clear_read_error_count (void);
+void xclose (int fd);
+void archive_write_error (ssize_t status) __attribute__ ((noreturn));
+void archive_read_error (void);
+off_t seek_archive (off_t size);
+void set_start_time (void);
+
+void mv_begin (struct tar_stat_info *st);
+void mv_end (void);
+void mv_total_size (off_t size);
+void mv_size_left (off_t size);
+
+void buffer_write_global_xheader (void);
+
+/* Module create.c. */
+
+enum dump_status
+ {
+ dump_status_ok,
+ dump_status_short,
+ dump_status_fail,
+ dump_status_not_implemented
+ };
+
+void add_exclusion_tag (const char *name, enum exclusion_tag_type type,
+ bool (*)(const char*));
+bool cachedir_file_p (const char *name);
+
+bool file_dumpable_p (struct tar_stat_info *st);
+void create_archive (void);
+void pad_archive (off_t size_left);
+void dump_file (const char *st, int top_level, dev_t parent_device);
+union block *start_header (struct tar_stat_info *st);
+void finish_header (struct tar_stat_info *st, union block *header,
+ off_t block_ordinal);
+void simple_finish_header (union block *header);
+union block * write_extended (bool global, struct tar_stat_info *st,
+ union block *old_header);
+union block *start_private_header (const char *name, size_t size);
+void write_eot (void);
+void check_links (void);
+
+#define GID_TO_CHARS(val, where) gid_to_chars (val, where, sizeof (where))
+#define MAJOR_TO_CHARS(val, where) major_to_chars (val, where, sizeof (where))
+#define MINOR_TO_CHARS(val, where) minor_to_chars (val, where, sizeof (where))
+#define MODE_TO_CHARS(val, where) mode_to_chars (val, where, sizeof (where))
+#define OFF_TO_CHARS(val, where) off_to_chars (val, where, sizeof (where))
+#define SIZE_TO_CHARS(val, where) size_to_chars (val, where, sizeof (where))
+#define TIME_TO_CHARS(val, where) time_to_chars (val, where, sizeof (where))
+#define UID_TO_CHARS(val, where) uid_to_chars (val, where, sizeof (where))
+#define UINTMAX_TO_CHARS(val, where) uintmax_to_chars (val, where, sizeof (where))
+#define UNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
+#define GNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
+
+bool gid_to_chars (gid_t gid, char *buf, size_t size);
+bool major_to_chars (major_t m, char *buf, size_t size);
+bool minor_to_chars (minor_t m, char *buf, size_t size);
+bool mode_to_chars (mode_t m, char *buf, size_t size);
+bool off_to_chars (off_t off, char *buf, size_t size);
+bool size_to_chars (size_t v, char *buf, size_t size);
+bool time_to_chars (time_t t, char *buf, size_t size);
+bool uid_to_chars (uid_t uid, char *buf, size_t size);
+bool uintmax_to_chars (uintmax_t v, char *buf, size_t size);
+void string_to_chars (char const *s, char *buf, size_t size);
+
+/* Module diffarch.c. */
+
+extern bool now_verifying;
+
+void diff_archive (void);
+void diff_init (void);
+void verify_volume (void);
+
+/* Module extract.c. */
+
+void extr_init (void);
+void extract_archive (void);
+void extract_finish (void);
+bool rename_directory (char *src, char *dst);
+
+/* Module delete.c. */
+
+void delete_archive_members (void);
+
+/* Module incremen.c. */
+
+char *get_directory_contents (char *dir_name, dev_t device);
+const char *append_incremental_renames (const char *dump);
+void read_directory_file (void);
+void write_directory_file (void);
+void purge_directory (char const *directory_name);
+void list_dumpdir (char *buffer, size_t size);
+void update_parent_directory (const char *name);
+
+size_t dumpdir_size (const char *p);
+bool is_dumpdir (struct tar_stat_info *stat_info);
+
+/* Module list.c. */
+
+enum read_header
+{
+ HEADER_STILL_UNREAD, /* for when read_header has not been called */
+ HEADER_SUCCESS, /* header successfully read and checksummed */
+ HEADER_SUCCESS_EXTENDED, /* likewise, but we got an extended header */
+ HEADER_ZERO_BLOCK, /* zero block where header expected */
+ HEADER_END_OF_FILE, /* true end of file while header expected */
+ HEADER_FAILURE /* ill-formed header, or bad checksum */
+};
+
+extern union block *current_header;
+extern enum archive_format current_format;
+extern size_t recent_long_name_blocks;
+extern size_t recent_long_link_blocks;
+
+void decode_header (union block *header, struct tar_stat_info *stat_info,
+ enum archive_format *format_pointer, int do_user_group);
+char const *tartime (struct timespec t, bool full_time);
+
+#define GID_FROM_HEADER(where) gid_from_header (where, sizeof (where))
+#define MAJOR_FROM_HEADER(where) major_from_header (where, sizeof (where))
+#define MINOR_FROM_HEADER(where) minor_from_header (where, sizeof (where))
+#define MODE_FROM_HEADER(where) mode_from_header (where, sizeof (where))
+#define OFF_FROM_HEADER(where) off_from_header (where, sizeof (where))
+#define SIZE_FROM_HEADER(where) size_from_header (where, sizeof (where))
+#define TIME_FROM_HEADER(where) time_from_header (where, sizeof (where))
+#define UID_FROM_HEADER(where) uid_from_header (where, sizeof (where))
+#define UINTMAX_FROM_HEADER(where) uintmax_from_header (where, sizeof (where))
+
+gid_t gid_from_header (const char *buf, size_t size);
+major_t major_from_header (const char *buf, size_t size);
+minor_t minor_from_header (const char *buf, size_t size);
+mode_t mode_from_header (const char *buf, size_t size);
+off_t off_from_header (const char *buf, size_t size);
+size_t size_from_header (const char *buf, size_t size);
+time_t time_from_header (const char *buf, size_t size);
+uid_t uid_from_header (const char *buf, size_t size);
+uintmax_t uintmax_from_header (const char * buf, size_t size);
+
+void list_archive (void);
+void print_for_mkdir (char *dirname, int length, mode_t mode);
+void print_header (struct tar_stat_info *st, off_t block_ordinal);
+void read_and (void (*do_something) (void));
+enum read_header read_header_primitive (bool raw_extended_headers,
+ struct tar_stat_info *info);
+enum read_header read_header (bool raw_extended_headers);
+enum read_header tar_checksum (union block *header, bool silent);
+void skip_file (off_t size);
+void skip_member (void);
+
+/* Module misc.c. */
+
+void assign_string (char **dest, const char *src);
+char *quote_copy_string (const char *str);
+int unquote_string (char *str);
+
+void code_ns_fraction (int ns, char *p);
+char const *code_timespec (struct timespec ts, char *sbuf);
+enum { BILLION = 1000000000, LOG10_BILLION = 9 };
+enum { TIMESPEC_STRSIZE_BOUND =
+ UINTMAX_STRSIZE_BOUND + LOG10_BILLION + sizeof "-." - 1 };
+
+enum remove_option
+{
+ ORDINARY_REMOVE_OPTION,
+ RECURSIVE_REMOVE_OPTION,
+
+ /* FIXME: The following value is never used. It seems to be intended
+ as a placeholder for a hypothetical option that should instruct tar
+ to recursively remove subdirectories in purge_directory(),
+ as opposed to the functionality of --recursive-unlink
+ (RECURSIVE_REMOVE_OPTION value), which removes them in
+ prepare_to_extract() phase. However, with the addition of more
+ meta-info to the incremental dumps, this should become unnecessary */
+ WANT_DIRECTORY_REMOVE_OPTION
+};
+int remove_any_file (const char *file_name, enum remove_option option);
+bool maybe_backup_file (const char *file_name, bool this_is_the_archive);
+void undo_last_backup (void);
+
+int deref_stat (bool deref, char const *name, struct stat *buf);
+
+int chdir_arg (char const *dir);
+void chdir_do (int dir);
+
+void close_diag (char const *name);
+void open_diag (char const *name);
+void read_diag_details (char const *name, off_t offset, size_t size);
+void readlink_diag (char const *name);
+void savedir_diag (char const *name);
+void seek_diag_details (char const *name, off_t offset);
+void stat_diag (char const *name);
+void write_error_details (char const *name, size_t status, size_t size);
+void write_fatal (char const *name) __attribute__ ((noreturn));
+void write_fatal_details (char const *name, ssize_t status, size_t size)
+ __attribute__ ((noreturn));
+
+pid_t xfork (void);
+void xpipe (int fd[2]);
+
+void *page_aligned_alloc (void **ptr, size_t size);
+int set_file_atime (int fd, char const *file,
+ struct timespec const timespec[2]);
+
+/* Module names.c. */
+
+extern struct name *gnu_list_name;
+
+void gid_to_gname (gid_t gid, char **gname);
+int gname_to_gid (char const *gname, gid_t *pgid);
+void uid_to_uname (uid_t uid, char **uname);
+int uname_to_uid (char const *uname, uid_t *puid);
+
+void name_init (void);
+void name_add_name (const char *name, int matching_flags);
+void name_add_dir (const char *name);
+void name_term (void);
+const char *name_next (int change_dirs);
+void name_gather (void);
+struct name *addname (char const *string, int change_dir);
+bool name_match (const char *name);
+void names_notfound (void);
+void collect_and_sort_names (void);
+struct name *name_scan (const char *name);
+char *name_from_list (void);
+void blank_name_list (void);
+char *new_name (const char *dir_name, const char *name);
+size_t stripped_prefix_len (char const *file_name, size_t num);
+bool all_names_found (struct tar_stat_info *st);
+
+bool excluded_name (char const *name);
+
+void add_avoided_name (char const *name);
+bool is_avoided_name (char const *name);
+bool is_individual_file (char const *name);
+
+bool contains_dot_dot (char const *name);
+
+#define ISFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
+ (c)->found_count == occurrence_option)
+#define WASFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
+ (c)->found_count >= occurrence_option)
+
+/* Module tar.c. */
+
+void usage (int);
+
+int confirm (const char *message_action, const char *name);
+void request_stdin (const char *option);
+
+void tar_stat_init (struct tar_stat_info *st);
+void tar_stat_destroy (struct tar_stat_info *st);
+void usage (int) __attribute__ ((noreturn));
+int tar_timespec_cmp (struct timespec a, struct timespec b);
+const char *archive_format_string (enum archive_format fmt);
+const char *subcommand_string (enum subcommand c);
+
+/* Module update.c. */
+
+extern char *output_start;
+
+void update_archive (void);
+
+/* Module xheader.c. */
+
+void xheader_init (struct xheader *xhdr);
+void xheader_decode (struct tar_stat_info *stat);
+void xheader_decode_global (struct xheader *xhdr);
+void xheader_store (char const *keyword, struct tar_stat_info *st,
+ void const *data);
+void xheader_read (struct xheader *xhdr, union block *header, size_t size);
+void xheader_write (char type, char *name, struct xheader *xhdr);
+void xheader_write_global (struct xheader *xhdr);
+void xheader_finish (struct xheader *hdr);
+void xheader_destroy (struct xheader *hdr);
+char *xheader_xhdr_name (struct tar_stat_info *st);
+char *xheader_ghdr_name (void);
+void xheader_set_option (char *string);
+void xheader_string_begin (struct xheader *xhdr);
+void xheader_string_add (struct xheader *xhdr, char const *s);
+bool xheader_string_end (struct xheader *xhdr, char const *keyword);
+bool xheader_keyword_deleted_p (const char *kw);
+char *xheader_format_name (struct tar_stat_info *st, const char *fmt,
+ size_t n);
+
+/* Module system.c */
+
+void sys_detect_dev_null_output (void);
+void sys_save_archive_dev_ino (void);
+void sys_drain_input_pipe (void);
+void sys_wait_for_child (pid_t);
+void sys_spawn_shell (void);
+bool sys_compare_uid (struct stat *a, struct stat *b);
+bool sys_compare_gid (struct stat *a, struct stat *b);
+bool sys_file_is_archive (struct tar_stat_info *p);
+bool sys_compare_links (struct stat *link_data, struct stat *stat_data);
+int sys_truncate (int fd);
+pid_t sys_child_open_for_compress (void);
+pid_t sys_child_open_for_uncompress (void);
+size_t sys_write_archive_buffer (void);
+bool sys_get_archive_stat (void);
+int sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st);
+void sys_wait_command (void);
+int sys_exec_info_script (const char **archive_name, int volume_number);
+
+/* Module compare.c */
+void report_difference (struct tar_stat_info *st, const char *message, ...);
+
+/* Module sparse.c */
+bool sparse_member_p (struct tar_stat_info *st);
+bool sparse_fixup_header (struct tar_stat_info *st);
+enum dump_status sparse_dump_file (int, struct tar_stat_info *st);
+enum dump_status sparse_extract_file (int fd, struct tar_stat_info *st,
+ off_t *size);
+enum dump_status sparse_skip_file (struct tar_stat_info *st);
+bool sparse_diff_file (int, struct tar_stat_info *st);
+
+/* Module utf8.c */
+bool string_ascii_p (const char *str);
+bool utf8_convert (bool to_utf, char const *input, char **output);
+
+/* Module transform.c */
+typedef enum
+ {
+ xform_regfile,
+ xform_link,
+ xform_symlink
+ } xform_type;
+
+void set_transform_expr (const char *expr);
+bool transform_name (char **pinput);
+bool transform_member_name (char **pinput, xform_type type);
+bool transform_name_fp (char **pinput, char *(*fun)(char *, void *), void *);
diff --git a/src/compare.c b/src/compare.c
new file mode 100644
index 0000000..7df3d98
--- /dev/null
+++ b/src/compare.c
@@ -0,0 +1,609 @@
+/* Diff files from a tar archive.
+
+ Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
+ 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ Written by John Gilmore, on 1987-04-30.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <system-ioctl.h>
+
+#if HAVE_LINUX_FD_H
+# include <linux/fd.h>
+#endif
+
+#include "common.h"
+#include <quotearg.h>
+#include <rmt.h>
+#include <stdarg.h>
+
+/* Nonzero if we are verifying at the moment. */
+bool now_verifying;
+
+/* File descriptor for the file we are diffing. */
+static int diff_handle;
+
+/* Area for reading file contents into. */
+static char *diff_buffer;
+
+/* Initialize for a diff operation. */
+void
+diff_init (void)
+{
+ void *ptr;
+ diff_buffer = page_aligned_alloc (&ptr, record_size);
+ if (listed_incremental_option)
+ read_directory_file ();
+}
+
+/* Sigh about something that differs by writing a MESSAGE to stdlis,
+ given MESSAGE is nonzero. Also set the exit status if not already. */
+void
+report_difference (struct tar_stat_info *st, const char *fmt, ...)
+{
+ if (fmt)
+ {
+ va_list ap;
+
+ fprintf (stdlis, "%s: ", quotearg_colon (st->file_name));
+ va_start (ap, fmt);
+ vfprintf (stdlis, fmt, ap);
+ va_end (ap);
+ fprintf (stdlis, "\n");
+ }
+
+ if (exit_status == TAREXIT_SUCCESS)
+ exit_status = TAREXIT_DIFFERS;
+}
+
+/* Take a buffer returned by read_and_process and do nothing with it. */
+static int
+process_noop (size_t size __attribute__ ((unused)),
+ char *data __attribute__ ((unused)))
+{
+ return 1;
+}
+
+static int
+process_rawdata (size_t bytes, char *buffer)
+{
+ size_t status = safe_read (diff_handle, diff_buffer, bytes);
+
+ if (status != bytes)
+ {
+ if (status == SAFE_READ_ERROR)
+ {
+ read_error (current_stat_info.file_name);
+ report_difference (&current_stat_info, NULL);
+ }
+ else
+ {
+ report_difference (&current_stat_info,
+ ngettext ("Could only read %lu of %lu byte",
+ "Could only read %lu of %lu bytes",
+ bytes),
+ (unsigned long) status, (unsigned long) bytes);
+ }
+ return 0;
+ }
+
+ if (memcmp (buffer, diff_buffer, bytes))
+ {
+ report_difference (&current_stat_info, _("Contents differ"));
+ return 0;
+ }
+
+ return 1;
+}
+
+/* Some other routine wants SIZE bytes in the archive. For each chunk
+ of the archive, call PROCESSOR with the size of the chunk, and the
+ address of the chunk it can work with. The PROCESSOR should return
+ nonzero for success. Once it returns error, continue skipping
+ without calling PROCESSOR anymore. */
+
+static void
+read_and_process (struct tar_stat_info *st, int (*processor) (size_t, char *))
+{
+ union block *data_block;
+ size_t data_size;
+ off_t size = st->stat.st_size;
+
+ mv_begin (st);
+ while (size)
+ {
+ data_block = find_next_block ();
+ if (! data_block)
+ {
+ ERROR ((0, 0, _("Unexpected EOF in archive")));
+ return;
+ }
+
+ data_size = available_space_after (data_block);
+ if (data_size > size)
+ data_size = size;
+ if (!(*processor) (data_size, data_block->buffer))
+ processor = process_noop;
+ set_next_block_after ((union block *)
+ (data_block->buffer + data_size - 1));
+ size -= data_size;
+ mv_size_left (size);
+ }
+ mv_end ();
+}
+
+/* Call either stat or lstat over STAT_DATA, depending on
+ --dereference (-h), for a file which should exist. Diagnose any
+ problem. Return nonzero for success, zero otherwise. */
+static int
+get_stat_data (char const *file_name, struct stat *stat_data)
+{
+ int status = deref_stat (dereference_option, file_name, stat_data);
+
+ if (status != 0)
+ {
+ if (errno == ENOENT)
+ stat_warn (file_name);
+ else
+ stat_error (file_name);
+ report_difference (&current_stat_info, NULL);
+ return 0;
+ }
+
+ return 1;
+}
+
+
+static void
+diff_dir (void)
+{
+ struct stat stat_data;
+
+ if (!get_stat_data (current_stat_info.file_name, &stat_data))
+ return;
+
+ if (!S_ISDIR (stat_data.st_mode))
+ report_difference (&current_stat_info, _("File type differs"));
+ else if ((current_stat_info.stat.st_mode & MODE_ALL) !=
+ (stat_data.st_mode & MODE_ALL))
+ report_difference (&current_stat_info, _("Mode differs"));
+}
+
+static void
+diff_file (void)
+{
+ char const *file_name = current_stat_info.file_name;
+ struct stat stat_data;
+
+ if (!get_stat_data (file_name, &stat_data))
+ skip_member ();
+ else if (!S_ISREG (stat_data.st_mode))
+ {
+ report_difference (&current_stat_info, _("File type differs"));
+ skip_member ();
+ }
+ else
+ {
+ if ((current_stat_info.stat.st_mode & MODE_ALL) !=
+ (stat_data.st_mode & MODE_ALL))
+ report_difference (&current_stat_info, _("Mode differs"));
+
+ if (!sys_compare_uid (&stat_data, &current_stat_info.stat))
+ report_difference (&current_stat_info, _("Uid differs"));
+ if (!sys_compare_gid (&stat_data, &current_stat_info.stat))
+ report_difference (&current_stat_info, _("Gid differs"));
+
+ if (tar_timespec_cmp (get_stat_mtime (&stat_data),
+ current_stat_info.mtime))
+ report_difference (&current_stat_info, _("Mod time differs"));
+ if (current_header->header.typeflag != GNUTYPE_SPARSE
+ && stat_data.st_size != current_stat_info.stat.st_size)
+ {
+ report_difference (&current_stat_info, _("Size differs"));
+ skip_member ();
+ }
+ else
+ {
+ int atime_flag =
+ (atime_preserve_option == system_atime_preserve
+ ? O_NOATIME
+ : 0);
+
+ diff_handle = open (file_name, O_RDONLY | O_BINARY | atime_flag);
+
+ if (diff_handle < 0)
+ {
+ open_error (file_name);
+ skip_member ();
+ report_difference (&current_stat_info, NULL);
+ }
+ else
+ {
+ int status;
+
+ if (current_stat_info.is_sparse)
+ sparse_diff_file (diff_handle, &current_stat_info);
+ else
+ read_and_process (&current_stat_info, process_rawdata);
+
+ if (atime_preserve_option == replace_atime_preserve)
+ {
+ struct timespec ts[2];
+ ts[0] = get_stat_atime (&stat_data);
+ ts[1] = get_stat_mtime (&stat_data);
+ if (set_file_atime (diff_handle, file_name, ts) != 0)
+ utime_error (file_name);
+ }
+
+ status = close (diff_handle);
+ if (status != 0)
+ close_error (file_name);
+ }
+ }
+ }
+}
+
+static void
+diff_link (void)
+{
+ struct stat file_data;
+ struct stat link_data;
+
+ if (get_stat_data (current_stat_info.file_name, &file_data)
+ && get_stat_data (current_stat_info.link_name, &link_data)
+ && !sys_compare_links (&file_data, &link_data))
+ report_difference (&current_stat_info,
+ _("Not linked to %s"),
+ quote (current_stat_info.link_name));
+}
+
+#ifdef HAVE_READLINK
+static void
+diff_symlink (void)
+{
+ size_t len = strlen (current_stat_info.link_name);
+ char *linkbuf = alloca (len + 1);
+
+ int status = readlink (current_stat_info.file_name, linkbuf, len + 1);
+
+ if (status < 0)
+ {
+ if (errno == ENOENT)
+ readlink_warn (current_stat_info.file_name);
+ else
+ readlink_error (current_stat_info.file_name);
+ report_difference (&current_stat_info, NULL);
+ }
+ else if (status != len
+ || strncmp (current_stat_info.link_name, linkbuf, len) != 0)
+ report_difference (&current_stat_info, _("Symlink differs"));
+}
+#endif
+
+static void
+diff_special (void)
+{
+ struct stat stat_data;
+
+ /* FIXME: deal with umask. */
+
+ if (!get_stat_data (current_stat_info.file_name, &stat_data))
+ return;
+
+ if (current_header->header.typeflag == CHRTYPE
+ ? !S_ISCHR (stat_data.st_mode)
+ : current_header->header.typeflag == BLKTYPE
+ ? !S_ISBLK (stat_data.st_mode)
+ : /* current_header->header.typeflag == FIFOTYPE */
+ !S_ISFIFO (stat_data.st_mode))
+ {
+ report_difference (&current_stat_info, _("File type differs"));
+ return;
+ }
+
+ if ((current_header->header.typeflag == CHRTYPE
+ || current_header->header.typeflag == BLKTYPE)
+ && current_stat_info.stat.st_rdev != stat_data.st_rdev)
+ {
+ report_difference (&current_stat_info, _("Device number differs"));
+ return;
+ }
+
+ if ((current_stat_info.stat.st_mode & MODE_ALL) !=
+ (stat_data.st_mode & MODE_ALL))
+ report_difference (&current_stat_info, _("Mode differs"));
+}
+
+static int
+dumpdir_cmp (const char *a, const char *b)
+{
+ size_t len;
+
+ while (*a)
+ switch (*a)
+ {
+ case 'Y':
+ case 'N':
+ if (!strchr ("YN", *b))
+ return 1;
+ if (strcmp(a + 1, b + 1))
+ return 1;
+ len = strlen (a) + 1;
+ a += len;
+ b += len;
+ break;
+
+ case 'D':
+ if (strcmp(a, b))
+ return 1;
+ len = strlen (a) + 1;
+ a += len;
+ b += len;
+ break;
+
+ case 'R':
+ case 'T':
+ case 'X':
+ return *b;
+ }
+ return *b;
+}
+
+static void
+diff_dumpdir (void)
+{
+ char *dumpdir_buffer;
+ dev_t dev = 0;
+ struct stat stat;
+
+ if (deref_stat (true, current_stat_info.file_name, &stat))
+ {
+ if (errno == ENOENT)
+ stat_warn (current_stat_info.file_name);
+ else
+ stat_error (current_stat_info.file_name);
+ }
+ else
+ dev = stat.st_dev;
+
+ dumpdir_buffer = get_directory_contents (current_stat_info.file_name, dev);
+
+ if (dumpdir_buffer)
+ {
+ if (dumpdir_cmp (current_stat_info.dumpdir, dumpdir_buffer))
+ report_difference (&current_stat_info, _("Contents differ"));
+ }
+ else
+ read_and_process (&current_stat_info, process_noop);
+}
+
+static void
+diff_multivol (void)
+{
+ struct stat stat_data;
+ int fd, status;
+ off_t offset;
+
+ if (current_stat_info.had_trailing_slash)
+ {
+ diff_dir ();
+ return;
+ }
+
+ if (!get_stat_data (current_stat_info.file_name, &stat_data))
+ return;
+
+ if (!S_ISREG (stat_data.st_mode))
+ {
+ report_difference (&current_stat_info, _("File type differs"));
+ skip_member ();
+ return;
+ }
+
+ offset = OFF_FROM_HEADER (current_header->oldgnu_header.offset);
+ if (stat_data.st_size != current_stat_info.stat.st_size + offset)
+ {
+ report_difference (&current_stat_info, _("Size differs"));
+ skip_member ();
+ return;
+ }
+
+ fd = open (current_stat_info.file_name, O_RDONLY | O_BINARY);
+
+ if (fd < 0)
+ {
+ open_error (current_stat_info.file_name);
+ report_difference (&current_stat_info, NULL);
+ skip_member ();
+ return;
+ }
+
+ if (lseek (fd, offset, SEEK_SET) < 0)
+ {
+ seek_error_details (current_stat_info.file_name, offset);
+ report_difference (&current_stat_info, NULL);
+ return;
+ }
+
+ read_and_process (&current_stat_info, process_rawdata);
+
+ status = close (fd);
+ if (status != 0)
+ close_error (current_stat_info.file_name);
+}
+
+/* Diff a file against the archive. */
+void
+diff_archive (void)
+{
+
+ set_next_block_after (current_header);
+ decode_header (current_header, &current_stat_info, &current_format, 1);
+
+ /* Print the block from current_header and current_stat_info. */
+
+ if (verbose_option)
+ {
+ if (now_verifying)
+ fprintf (stdlis, _("Verify "));
+ print_header (&current_stat_info, -1);
+ }
+
+ switch (current_header->header.typeflag)
+ {
+ default:
+ ERROR ((0, 0, _("%s: Unknown file type `%c', diffed as normal file"),
+ quotearg_colon (current_stat_info.file_name),
+ current_header->header.typeflag));
+ /* Fall through. */
+
+ case AREGTYPE:
+ case REGTYPE:
+ case GNUTYPE_SPARSE:
+ case CONTTYPE:
+
+ /* Appears to be a file. See if it's really a directory. */
+
+ if (current_stat_info.had_trailing_slash)
+ diff_dir ();
+ else
+ diff_file ();
+ break;
+
+ case LNKTYPE:
+ diff_link ();
+ break;
+
+#ifdef HAVE_READLINK
+ case SYMTYPE:
+ diff_symlink ();
+ break;
+#endif
+
+ case CHRTYPE:
+ case BLKTYPE:
+ case FIFOTYPE:
+ diff_special ();
+ break;
+
+ case GNUTYPE_DUMPDIR:
+ case DIRTYPE:
+ if (is_dumpdir (&current_stat_info))
+ diff_dumpdir ();
+ diff_dir ();
+ break;
+
+ case GNUTYPE_VOLHDR:
+ break;
+
+ case GNUTYPE_MULTIVOL:
+ diff_multivol ();
+ }
+}
+
+void
+verify_volume (void)
+{
+ if (removed_prefixes_p ())
+ {
+ WARN((0, 0,
+ _("Archive contains file names with leading prefixes removed.")));
+ WARN((0, 0,
+ _("Verification may fail to locate original files.")));
+ }
+
+ if (!diff_buffer)
+ diff_init ();
+
+ /* Verifying an archive is meant to check if the physical media got it
+ correctly, so try to defeat clever in-memory buffering pertaining to
+ this particular media. On Linux, for example, the floppy drive would
+ not even be accessed for the whole verification.
+
+ The code was using fsync only when the ioctl is unavailable, but
+ Marty Leisner says that the ioctl does not work when not preceded by
+ fsync. So, until we know better, or maybe to please Marty, let's do it
+ the unbelievable way :-). */
+
+#if HAVE_FSYNC
+ fsync (archive);
+#endif
+#ifdef FDFLUSH
+ ioctl (archive, FDFLUSH);
+#endif
+
+#ifdef MTIOCTOP
+ {
+ struct mtop operation;
+ int status;
+
+ operation.mt_op = MTBSF;
+ operation.mt_count = 1;
+ if (status = rmtioctl (archive, MTIOCTOP, (char *) &operation), status < 0)
+ {
+ if (errno != EIO
+ || (status = rmtioctl (archive, MTIOCTOP, (char *) &operation),
+ status < 0))
+ {
+#endif
+ if (rmtlseek (archive, (off_t) 0, SEEK_SET) != 0)
+ {
+ /* Lseek failed. Try a different method. */
+ seek_warn (archive_name_array[0]);
+ return;
+ }
+#ifdef MTIOCTOP
+ }
+ }
+ }
+#endif
+
+ access_mode = ACCESS_READ;
+ now_verifying = 1;
+
+ flush_read ();
+ while (1)
+ {
+ enum read_header status = read_header (false);
+
+ if (status == HEADER_FAILURE)
+ {
+ int counter = 0;
+
+ do
+ {
+ counter++;
+ set_next_block_after (current_header);
+ status = read_header (false);
+ }
+ while (status == HEADER_FAILURE);
+
+ ERROR ((0, 0,
+ ngettext ("VERIFY FAILURE: %d invalid header detected",
+ "VERIFY FAILURE: %d invalid headers detected",
+ counter), counter));
+ }
+ if (status == HEADER_ZERO_BLOCK || status == HEADER_END_OF_FILE)
+ break;
+
+ diff_archive ();
+ tar_stat_destroy (&current_stat_info);
+ }
+
+ access_mode = ACCESS_WRITE;
+ now_verifying = 0;
+}
diff --git a/src/create.c b/src/create.c
new file mode 100644
index 0000000..1b31a3d
--- /dev/null
+++ b/src/create.c
@@ -0,0 +1,1785 @@
+/* Create a tar archive.
+
+ Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
+ 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ Written by John Gilmore, on 1985-08-25.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+
+#include <quotearg.h>
+
+#include "common.h"
+#include <hash.h>
+
+struct link
+ {
+ dev_t dev;
+ ino_t ino;
+ size_t nlink;
+ char name[1];
+ };
+
+struct exclusion_tag
+{
+ const char *name;
+ size_t length;
+ enum exclusion_tag_type type;
+ bool (*predicate) (const char *name);
+ struct exclusion_tag *next;
+};
+
+static struct exclusion_tag *exclusion_tags;
+
+void
+add_exclusion_tag (const char *name, enum exclusion_tag_type type,
+ bool (*predicate) (const char *name))
+{
+ struct exclusion_tag *tag = xmalloc (sizeof tag[0]);
+ tag->next = exclusion_tags;
+ tag->name = name;
+ tag->type = type;
+ tag->predicate = predicate;
+ tag->length = strlen (name);
+ exclusion_tags = tag;
+}
+
+static void
+exclusion_tag_warning (const char *dirname, const char *tagname,
+ const char *message)
+{
+ if (verbose_option)
+ WARN ((0, 0,
+ _("%s: contains a cache directory tag %s; %s"),
+ quotearg_colon (dirname),
+ quotearg_n (1, tagname),
+ message));
+}
+
+static enum exclusion_tag_type
+check_exclusion_tags (char *dirname, const char **tag_file_name)
+{
+ static char *tagname;
+ static size_t tagsize;
+ struct exclusion_tag *tag;
+ size_t dlen = strlen (dirname);
+ char *nptr = NULL;
+ char *ret = NULL;
+
+ for (tag = exclusion_tags; tag; tag = tag->next)
+ {
+ size_t size = dlen + tag->length + 1;
+ if (size > tagsize)
+ {
+ tagsize = size;
+ tagname = xrealloc (tagname, tagsize);
+ }
+
+ if (!nptr)
+ {
+ strcpy (tagname, dirname);
+ nptr = tagname + dlen;
+ }
+ strcpy (nptr, tag->name);
+ if (access (tagname, F_OK) == 0
+ && (!tag->predicate || tag->predicate (tagname)))
+ {
+ if (tag_file_name)
+ *tag_file_name = tag->name;
+ return tag->type;
+ }
+ }
+
+ return exclusion_tag_none;
+}
+
+/* Exclusion predicate to test if the named file (usually "CACHEDIR.TAG")
+ contains a valid header, as described at:
+ http://www.brynosaurus.com/cachedir
+ Applications can write this file into directories they create
+ for use as caches containing purely regenerable, non-precious data,
+ allowing us to avoid archiving them if --exclude-caches is specified. */
+
+#define CACHEDIR_SIGNATURE "Signature: 8a477f597d28d172789f06886806bc55"
+#define CACHEDIR_SIGNATURE_SIZE (sizeof CACHEDIR_SIGNATURE - 1)
+
+bool
+cachedir_file_p (const char *name)
+{
+ bool tag_present = false;
+ int fd = open (name, O_RDONLY);
+ if (fd >= 0)
+ {
+ static char tagbuf[CACHEDIR_SIGNATURE_SIZE];
+
+ if (read (fd, tagbuf, CACHEDIR_SIGNATURE_SIZE)
+ == CACHEDIR_SIGNATURE_SIZE
+ && memcmp (tagbuf, CACHEDIR_SIGNATURE, CACHEDIR_SIGNATURE_SIZE) == 0)
+ tag_present = true;
+
+ close (fd);
+ }
+ return tag_present;
+}
+
+
+/* The maximum uintmax_t value that can be represented with DIGITS digits,
+ assuming that each digit is BITS_PER_DIGIT wide. */
+#define MAX_VAL_WITH_DIGITS(digits, bits_per_digit) \
+ ((digits) * (bits_per_digit) < sizeof (uintmax_t) * CHAR_BIT \
+ ? ((uintmax_t) 1 << ((digits) * (bits_per_digit))) - 1 \
+ : (uintmax_t) -1)
+
+/* The maximum uintmax_t value that can be represented with octal
+ digits and a trailing NUL in BUFFER. */
+#define MAX_OCTAL_VAL(buffer) MAX_VAL_WITH_DIGITS (sizeof (buffer) - 1, LG_8)
+
+/* Convert VALUE to an octal representation suitable for tar headers.
+ Output to buffer WHERE with size SIZE.
+ The result is undefined if SIZE is 0 or if VALUE is too large to fit. */
+
+static void
+to_octal (uintmax_t value, char *where, size_t size)
+{
+ uintmax_t v = value;
+ size_t i = size;
+
+ do
+ {
+ where[--i] = '0' + (v & ((1 << LG_8) - 1));
+ v >>= LG_8;
+ }
+ while (i);
+}
+
+/* Copy at most LEN bytes from the string SRC to DST. Terminate with
+ NUL unless SRC is LEN or more bytes long. */
+
+static void
+tar_copy_str (char *dst, const char *src, size_t len)
+{
+ size_t i;
+ for (i = 0; i < len; i++)
+ if (! (dst[i] = src[i]))
+ break;
+}
+
+/* Same as tar_copy_str, but always terminate with NUL if using
+ is OLDGNU format */
+
+static void
+tar_name_copy_str (char *dst, const char *src, size_t len)
+{
+ tar_copy_str (dst, src, len);
+ if (archive_format == OLDGNU_FORMAT)
+ dst[len-1] = 0;
+}
+
+/* Convert NEGATIVE VALUE to a base-256 representation suitable for
+ tar headers. NEGATIVE is 1 if VALUE was negative before being cast
+ to uintmax_t, 0 otherwise. Output to buffer WHERE with size SIZE.
+ The result is undefined if SIZE is 0 or if VALUE is too large to
+ fit. */
+
+static void
+to_base256 (int negative, uintmax_t value, char *where, size_t size)
+{
+ uintmax_t v = value;
+ uintmax_t propagated_sign_bits =
+ ((uintmax_t) - negative << (CHAR_BIT * sizeof v - LG_256));
+ size_t i = size;
+
+ do
+ {
+ where[--i] = v & ((1 << LG_256) - 1);
+ v = propagated_sign_bits | (v >> LG_256);
+ }
+ while (i);
+}
+
+
+static bool
+to_chars (int negative, uintmax_t value, size_t valsize,
+ uintmax_t (*substitute) (int *),
+ char *where, size_t size, const char *type);
+
+static bool
+to_chars_subst (int negative, int gnu_format, uintmax_t value, size_t valsize,
+ uintmax_t (*substitute) (int *),
+ char *where, size_t size, const char *type)
+{
+ uintmax_t maxval = (gnu_format
+ ? MAX_VAL_WITH_DIGITS (size - 1, LG_256)
+ : MAX_VAL_WITH_DIGITS (size - 1, LG_8));
+ char valbuf[UINTMAX_STRSIZE_BOUND + 1];
+ char maxbuf[UINTMAX_STRSIZE_BOUND];
+ char minbuf[UINTMAX_STRSIZE_BOUND + 1];
+ char const *minval_string;
+ char const *maxval_string = STRINGIFY_BIGINT (maxval, maxbuf);
+ char const *value_string;
+
+ if (gnu_format)
+ {
+ uintmax_t m = maxval + 1 ? maxval + 1 : maxval / 2 + 1;
+ char *p = STRINGIFY_BIGINT (m, minbuf + 1);
+ *--p = '-';
+ minval_string = p;
+ }
+ else
+ minval_string = "0";
+
+ if (negative)
+ {
+ char *p = STRINGIFY_BIGINT (- value, valbuf + 1);
+ *--p = '-';
+ value_string = p;
+ }
+ else
+ value_string = STRINGIFY_BIGINT (value, valbuf);
+
+ if (substitute)
+ {
+ int negsub;
+ uintmax_t sub = substitute (&negsub) & maxval;
+ /* NOTE: This is one of the few places where GNU_FORMAT differs from
+ OLDGNU_FORMAT. The actual differences are:
+
+ 1. In OLDGNU_FORMAT all strings in a tar header end in \0
+ 2. Incremental archives use oldgnu_header.
+
+ Apart from this they are completely identical. */
+ uintmax_t s = (negsub &= archive_format == GNU_FORMAT) ? - sub : sub;
+ char subbuf[UINTMAX_STRSIZE_BOUND + 1];
+ char *sub_string = STRINGIFY_BIGINT (s, subbuf + 1);
+ if (negsub)
+ *--sub_string = '-';
+ WARN ((0, 0, _("value %s out of %s range %s..%s; substituting %s"),
+ value_string, type, minval_string, maxval_string,
+ sub_string));
+ return to_chars (negsub, s, valsize, 0, where, size, type);
+ }
+ else
+ ERROR ((0, 0, _("value %s out of %s range %s..%s"),
+ value_string, type, minval_string, maxval_string));
+ return false;
+}
+
+/* Convert NEGATIVE VALUE (which was originally of size VALSIZE) to
+ external form, using SUBSTITUTE (...) if VALUE won't fit. Output
+ to buffer WHERE with size SIZE. NEGATIVE is 1 iff VALUE was
+ negative before being cast to uintmax_t; its original bitpattern
+ can be deduced from VALSIZE, its original size before casting.
+ TYPE is the kind of value being output (useful for diagnostics).
+ Prefer the POSIX format of SIZE - 1 octal digits (with leading zero
+ digits), followed by '\0'. If this won't work, and if GNU or
+ OLDGNU format is allowed, use '\200' followed by base-256, or (if
+ NEGATIVE is nonzero) '\377' followed by two's complement base-256.
+ If neither format works, use SUBSTITUTE (...) instead. Pass to
+ SUBSTITUTE the address of an 0-or-1 flag recording whether the
+ substitute value is negative. */
+
+static bool
+to_chars (int negative, uintmax_t value, size_t valsize,
+ uintmax_t (*substitute) (int *),
+ char *where, size_t size, const char *type)
+{
+ int gnu_format = (archive_format == GNU_FORMAT
+ || archive_format == OLDGNU_FORMAT);
+
+ /* Generate the POSIX octal representation if the number fits. */
+ if (! negative && value <= MAX_VAL_WITH_DIGITS (size - 1, LG_8))
+ {
+ where[size - 1] = '\0';
+ to_octal (value, where, size - 1);
+ return true;
+ }
+ else if (gnu_format)
+ {
+ /* Try to cope with the number by using traditional GNU format
+ methods */
+
+ /* Generate the base-256 representation if the number fits. */
+ if (((negative ? -1 - value : value)
+ <= MAX_VAL_WITH_DIGITS (size - 1, LG_256)))
+ {
+ where[0] = negative ? -1 : 1 << (LG_256 - 1);
+ to_base256 (negative, value, where + 1, size - 1);
+ return true;
+ }
+
+ /* Otherwise, if the number is negative, and if it would not cause
+ ambiguity on this host by confusing positive with negative
+ values, then generate the POSIX octal representation of the value
+ modulo 2**(field bits). The resulting tar file is
+ machine-dependent, since it depends on the host word size. Yuck!
+ But this is the traditional behavior. */
+ else if (negative && valsize * CHAR_BIT <= (size - 1) * LG_8)
+ {
+ static int warned_once;
+ if (! warned_once)
+ {
+ warned_once = 1;
+ WARN ((0, 0, _("Generating negative octal headers")));
+ }
+ where[size - 1] = '\0';
+ to_octal (value & MAX_VAL_WITH_DIGITS (valsize * CHAR_BIT, 1),
+ where, size - 1);
+ return true;
+ }
+ /* Otherwise fall back to substitution, if possible: */
+ }
+ else
+ substitute = NULL; /* No substitution for formats, other than GNU */
+
+ return to_chars_subst (negative, gnu_format, value, valsize, substitute,
+ where, size, type);
+}
+
+static uintmax_t
+gid_substitute (int *negative)
+{
+ gid_t r;
+#ifdef GID_NOBODY
+ r = GID_NOBODY;
+#else
+ static gid_t gid_nobody;
+ if (!gid_nobody && !gname_to_gid ("nobody", &gid_nobody))
+ gid_nobody = -2;
+ r = gid_nobody;
+#endif
+ *negative = r < 0;
+ return r;
+}
+
+bool
+gid_to_chars (gid_t v, char *p, size_t s)
+{
+ return to_chars (v < 0, (uintmax_t) v, sizeof v, gid_substitute, p, s, "gid_t");
+}
+
+bool
+major_to_chars (major_t v, char *p, size_t s)
+{
+ return to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "major_t");
+}
+
+bool
+minor_to_chars (minor_t v, char *p, size_t s)
+{
+ return to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "minor_t");
+}
+
+bool
+mode_to_chars (mode_t v, char *p, size_t s)
+{
+ /* In the common case where the internal and external mode bits are the same,
+ and we are not using POSIX or GNU format,
+ propagate all unknown bits to the external mode.
+ This matches historical practice.
+ Otherwise, just copy the bits we know about. */
+ int negative;
+ uintmax_t u;
+ if (S_ISUID == TSUID && S_ISGID == TSGID && S_ISVTX == TSVTX
+ && S_IRUSR == TUREAD && S_IWUSR == TUWRITE && S_IXUSR == TUEXEC
+ && S_IRGRP == TGREAD && S_IWGRP == TGWRITE && S_IXGRP == TGEXEC
+ && S_IROTH == TOREAD && S_IWOTH == TOWRITE && S_IXOTH == TOEXEC
+ && archive_format != POSIX_FORMAT
+ && archive_format != USTAR_FORMAT
+ && archive_format != GNU_FORMAT
+ && archive_format != OLDGNU_FORMAT)
+ {
+ negative = v < 0;
+ u = v;
+ }
+ else
+ {
+ negative = 0;
+ u = ((v & S_ISUID ? TSUID : 0)
+ | (v & S_ISGID ? TSGID : 0)
+ | (v & S_ISVTX ? TSVTX : 0)
+ | (v & S_IRUSR ? TUREAD : 0)
+ | (v & S_IWUSR ? TUWRITE : 0)
+ | (v & S_IXUSR ? TUEXEC : 0)
+ | (v & S_IRGRP ? TGREAD : 0)
+ | (v & S_IWGRP ? TGWRITE : 0)
+ | (v & S_IXGRP ? TGEXEC : 0)
+ | (v & S_IROTH ? TOREAD : 0)
+ | (v & S_IWOTH ? TOWRITE : 0)
+ | (v & S_IXOTH ? TOEXEC : 0));
+ }
+ return to_chars (negative, u, sizeof v, 0, p, s, "mode_t");
+}
+
+bool
+off_to_chars (off_t v, char *p, size_t s)
+{
+ return to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "off_t");
+}
+
+bool
+size_to_chars (size_t v, char *p, size_t s)
+{
+ return to_chars (0, (uintmax_t) v, sizeof v, 0, p, s, "size_t");
+}
+
+bool
+time_to_chars (time_t v, char *p, size_t s)
+{
+ return to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "time_t");
+}
+
+static uintmax_t
+uid_substitute (int *negative)
+{
+ uid_t r;
+#ifdef UID_NOBODY
+ r = UID_NOBODY;
+#else
+ static uid_t uid_nobody;
+ if (!uid_nobody && !uname_to_uid ("nobody", &uid_nobody))
+ uid_nobody = -2;
+ r = uid_nobody;
+#endif
+ *negative = r < 0;
+ return r;
+}
+
+bool
+uid_to_chars (uid_t v, char *p, size_t s)
+{
+ return to_chars (v < 0, (uintmax_t) v, sizeof v, uid_substitute, p, s, "uid_t");
+}
+
+bool
+uintmax_to_chars (uintmax_t v, char *p, size_t s)
+{
+ return to_chars (0, v, sizeof v, 0, p, s, "uintmax_t");
+}
+
+void
+string_to_chars (char const *str, char *p, size_t s)
+{
+ tar_copy_str (p, str, s);
+ p[s - 1] = '\0';
+}
+
+
+/* A file is considered dumpable if it is sparse and both --sparse and --totals
+ are specified.
+ Otherwise, it is dumpable unless any of the following conditions occur:
+
+ a) it is empty *and* world-readable, or
+ b) current archive is /dev/null */
+
+bool
+file_dumpable_p (struct tar_stat_info *st)
+{
+ if (dev_null_output)
+ return totals_option && sparse_option && ST_IS_SPARSE (st->stat);
+ return !(st->archive_file_size == 0
+ && (st->stat.st_mode & MODE_R) == MODE_R);
+}
+
+
+/* Writing routines. */
+
+/* Write the EOT block(s). Zero at least two blocks, through the end
+ of the record. Old tar, as previous versions of GNU tar, writes
+ garbage after two zeroed blocks. */
+void
+write_eot (void)
+{
+ union block *pointer = find_next_block ();
+ memset (pointer->buffer, 0, BLOCKSIZE);
+ set_next_block_after (pointer);
+ pointer = find_next_block ();
+ memset (pointer->buffer, 0, available_space_after (pointer));
+ set_next_block_after (pointer);
+}
+
+/* Write a "private" header */
+union block *
+start_private_header (const char *name, size_t size)
+{
+ time_t t;
+ union block *header = find_next_block ();
+
+ memset (header->buffer, 0, sizeof (union block));
+
+ tar_name_copy_str (header->header.name, name, NAME_FIELD_SIZE);
+ OFF_TO_CHARS (size, header->header.size);
+
+ time (&t);
+ TIME_TO_CHARS (t, header->header.mtime);
+ MODE_TO_CHARS (S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, header->header.mode);
+ UID_TO_CHARS (getuid (), header->header.uid);
+ GID_TO_CHARS (getgid (), header->header.gid);
+ MAJOR_TO_CHARS (0, header->header.devmajor);
+ MINOR_TO_CHARS (0, header->header.devminor);
+ strncpy (header->header.magic, TMAGIC, TMAGLEN);
+ strncpy (header->header.version, TVERSION, TVERSLEN);
+ return header;
+}
+
+/* Create a new header and store there at most NAME_FIELD_SIZE bytes of
+ the file name */
+
+static union block *
+write_short_name (struct tar_stat_info *st)
+{
+ union block *header = find_next_block ();
+ memset (header->buffer, 0, sizeof (union block));
+ tar_name_copy_str (header->header.name, st->file_name, NAME_FIELD_SIZE);
+ return header;
+}
+
+#define FILL(field,byte) do { \
+ memset(field, byte, sizeof(field)-1); \
+ (field)[sizeof(field)-1] = 0; \
+} while (0)
+
+/* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
+static void
+write_gnu_long_link (struct tar_stat_info *st, const char *p, char type)
+{
+ size_t size = strlen (p) + 1;
+ size_t bufsize;
+ union block *header;
+ char *tmpname;
+
+ header = start_private_header ("././@LongLink", size);
+ FILL(header->header.mtime, '0');
+ FILL(header->header.mode, '0');
+ FILL(header->header.uid, '0');
+ FILL(header->header.gid, '0');
+ FILL(header->header.devmajor, 0);
+ FILL(header->header.devminor, 0);
+ uid_to_uname (0, &tmpname);
+ UNAME_TO_CHARS (tmpname, header->header.uname);
+ free (tmpname);
+ gid_to_gname (0, &tmpname);
+ GNAME_TO_CHARS (tmpname, header->header.gname);
+ free (tmpname);
+
+ strcpy (header->header.magic, OLDGNU_MAGIC);
+ header->header.typeflag = type;
+ finish_header (st, header, -1);
+
+ header = find_next_block ();
+
+ bufsize = available_space_after (header);
+
+ while (bufsize < size)
+ {
+ memcpy (header->buffer, p, bufsize);
+ p += bufsize;
+ size -= bufsize;
+ set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
+ header = find_next_block ();
+ bufsize = available_space_after (header);
+ }
+ memcpy (header->buffer, p, size);
+ memset (header->buffer + size, 0, bufsize - size);
+ set_next_block_after (header + (size - 1) / BLOCKSIZE);
+}
+
+static size_t
+split_long_name (const char *name, size_t length)
+{
+ size_t i;
+
+ if (length > PREFIX_FIELD_SIZE)
+ length = PREFIX_FIELD_SIZE + 1;
+ for (i = length - 1; i > 0; i--)
+ if (ISSLASH (name[i]))
+ break;
+ return i;
+}
+
+static union block *
+write_ustar_long_name (const char *name)
+{
+ size_t length = strlen (name);
+ size_t i;
+ union block *header;
+
+ if (length > PREFIX_FIELD_SIZE + NAME_FIELD_SIZE + 1)
+ {
+ ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
+ quotearg_colon (name),
+ PREFIX_FIELD_SIZE + NAME_FIELD_SIZE + 1));
+ return NULL;
+ }
+
+ i = split_long_name (name, length);
+ if (i == 0 || length - i - 1 > NAME_FIELD_SIZE)
+ {
+ ERROR ((0, 0,
+ _("%s: file name is too long (cannot be split); not dumped"),
+ quotearg_colon (name)));
+ return NULL;
+ }
+
+ header = find_next_block ();
+ memset (header->buffer, 0, sizeof (header->buffer));
+ memcpy (header->header.prefix, name, i);
+ memcpy (header->header.name, name + i + 1, length - i - 1);
+
+ return header;
+}
+
+/* Write a long link name, depending on the current archive format */
+static void
+write_long_link (struct tar_stat_info *st)
+{
+ switch (archive_format)
+ {
+ case POSIX_FORMAT:
+ xheader_store ("linkpath", st, NULL);
+ break;
+
+ case V7_FORMAT: /* old V7 tar format */
+ case USTAR_FORMAT:
+ case STAR_FORMAT:
+ ERROR ((0, 0,
+ _("%s: link name is too long; not dumped"),
+ quotearg_colon (st->link_name)));
+ break;
+
+ case OLDGNU_FORMAT:
+ case GNU_FORMAT:
+ write_gnu_long_link (st, st->link_name, GNUTYPE_LONGLINK);
+ break;
+
+ default:
+ abort(); /*FIXME*/
+ }
+}
+
+static union block *
+write_long_name (struct tar_stat_info *st)
+{
+ switch (archive_format)
+ {
+ case POSIX_FORMAT:
+ xheader_store ("path", st, NULL);
+ break;
+
+ case V7_FORMAT:
+ if (strlen (st->file_name) > NAME_FIELD_SIZE-1)
+ {
+ ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
+ quotearg_colon (st->file_name),
+ NAME_FIELD_SIZE - 1));
+ return NULL;
+ }
+ break;
+
+ case USTAR_FORMAT:
+ case STAR_FORMAT:
+ return write_ustar_long_name (st->file_name);
+
+ case OLDGNU_FORMAT:
+ case GNU_FORMAT:
+ write_gnu_long_link (st, st->file_name, GNUTYPE_LONGNAME);
+ break;
+
+ default:
+ abort(); /*FIXME*/
+ }
+ return write_short_name (st);
+}
+
+union block *
+write_extended (bool global, struct tar_stat_info *st, union block *old_header)
+{
+ union block *header, hp;
+ char *p;
+ int type;
+
+ if (st->xhdr.buffer || st->xhdr.stk == NULL)
+ return old_header;
+
+ xheader_finish (&st->xhdr);
+ memcpy (hp.buffer, old_header, sizeof (hp));
+ if (global)
+ {
+ type = XGLTYPE;
+ p = xheader_ghdr_name ();
+ }
+ else
+ {
+ type = XHDTYPE;
+ p = xheader_xhdr_name (st);
+ }
+ xheader_write (type, p, &st->xhdr);
+ free (p);
+ header = find_next_block ();
+ memcpy (header, &hp.buffer, sizeof (hp.buffer));
+ return header;
+}
+
+static union block *
+write_header_name (struct tar_stat_info *st)
+{
+ if (archive_format == POSIX_FORMAT && !string_ascii_p (st->file_name))
+ {
+ xheader_store ("path", st, NULL);
+ return write_short_name (st);
+ }
+ else if (NAME_FIELD_SIZE - (archive_format == OLDGNU_FORMAT)
+ < strlen (st->file_name))
+ return write_long_name (st);
+ else
+ return write_short_name (st);
+}
+
+
+/* Header handling. */
+
+/* Make a header block for the file whose stat info is st,
+ and return its address. */
+
+union block *
+start_header (struct tar_stat_info *st)
+{
+ union block *header;
+
+ header = write_header_name (st);
+ if (!header)
+ return NULL;
+
+ /* Override some stat fields, if requested to do so. */
+
+ if (owner_option != (uid_t) -1)
+ st->stat.st_uid = owner_option;
+ if (group_option != (gid_t) -1)
+ st->stat.st_gid = group_option;
+ if (mode_option)
+ st->stat.st_mode =
+ ((st->stat.st_mode & ~MODE_ALL)
+ | mode_adjust (st->stat.st_mode, S_ISDIR (st->stat.st_mode) != 0,
+ initial_umask, mode_option, NULL));
+
+ /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
+ for a few tars and came up with the following interoperability
+ matrix:
+
+ WRITER
+ 1 2 3 4 5 6 7 8 9 READER
+ . . . . . . . . . 1 = SunOS 4.2 tar
+ # . . # # . . # # 2 = NEC SVR4.0.2 tar
+ . . . # # . . # . 3 = Solaris 2.1 tar
+ . . . . . . . . . 4 = GNU tar 1.11.1
+ . . . . . . . . . 5 = HP-UX 8.07 tar
+ . . . . . . . . . 6 = Ultrix 4.1
+ . . . . . . . . . 7 = AIX 3.2
+ . . . . . . . . . 8 = Hitachi HI-UX 1.03
+ . . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
+
+ . = works
+ # = ``impossible file type''
+
+ The following mask for old archive removes the `#'s in column 4
+ above, thus making GNU tar both a universal donor and a universal
+ acceptor for Paul's test. */
+
+ if (archive_format == V7_FORMAT || archive_format == USTAR_FORMAT)
+ MODE_TO_CHARS (st->stat.st_mode & MODE_ALL, header->header.mode);
+ else
+ MODE_TO_CHARS (st->stat.st_mode, header->header.mode);
+
+ {
+ uid_t uid = st->stat.st_uid;
+ if (archive_format == POSIX_FORMAT
+ && MAX_OCTAL_VAL (header->header.uid) < uid)
+ {
+ xheader_store ("uid", st, NULL);
+ uid = 0;
+ }
+ if (!UID_TO_CHARS (uid, header->header.uid))
+ return NULL;
+ }
+
+ {
+ gid_t gid = st->stat.st_gid;
+ if (archive_format == POSIX_FORMAT
+ && MAX_OCTAL_VAL (header->header.gid) < gid)
+ {
+ xheader_store ("gid", st, NULL);
+ gid = 0;
+ }
+ if (!GID_TO_CHARS (gid, header->header.gid))
+ return NULL;
+ }
+
+ {
+ off_t size = st->stat.st_size;
+ if (archive_format == POSIX_FORMAT
+ && MAX_OCTAL_VAL (header->header.size) < size)
+ {
+ xheader_store ("size", st, NULL);
+ size = 0;
+ }
+ if (!OFF_TO_CHARS (size, header->header.size))
+ return NULL;
+ }
+
+ {
+ struct timespec mtime = set_mtime_option ? mtime_option : st->mtime;
+ if (archive_format == POSIX_FORMAT)
+ {
+ if (MAX_OCTAL_VAL (header->header.mtime) < mtime.tv_sec
+ || mtime.tv_nsec != 0)
+ xheader_store ("mtime", st, &mtime);
+ if (MAX_OCTAL_VAL (header->header.mtime) < mtime.tv_sec)
+ mtime.tv_sec = 0;
+ }
+ if (!TIME_TO_CHARS (mtime.tv_sec, header->header.mtime))
+ return NULL;
+ }
+
+ /* FIXME */
+ if (S_ISCHR (st->stat.st_mode)
+ || S_ISBLK (st->stat.st_mode))
+ {
+ major_t devmajor = major (st->stat.st_rdev);
+ minor_t devminor = minor (st->stat.st_rdev);
+
+ if (archive_format == POSIX_FORMAT
+ && MAX_OCTAL_VAL (header->header.devmajor) < devmajor)
+ {
+ xheader_store ("devmajor", st, NULL);
+ devmajor = 0;
+ }
+ if (!MAJOR_TO_CHARS (devmajor, header->header.devmajor))
+ return NULL;
+
+ if (archive_format == POSIX_FORMAT
+ && MAX_OCTAL_VAL (header->header.devminor) < devminor)
+ {
+ xheader_store ("devminor", st, NULL);
+ devminor = 0;
+ }
+ if (!MINOR_TO_CHARS (devminor, header->header.devminor))
+ return NULL;
+ }
+ else if (archive_format != GNU_FORMAT && archive_format != OLDGNU_FORMAT)
+ {
+ if (!(MAJOR_TO_CHARS (0, header->header.devmajor)
+ && MINOR_TO_CHARS (0, header->header.devminor)))
+ return NULL;
+ }
+
+ if (archive_format == POSIX_FORMAT)
+ {
+ xheader_store ("atime", st, NULL);
+ xheader_store ("ctime", st, NULL);
+ }
+ else if (incremental_option)
+ if (archive_format == OLDGNU_FORMAT || archive_format == GNU_FORMAT)
+ {
+ TIME_TO_CHARS (st->atime.tv_sec, header->oldgnu_header.atime);
+ TIME_TO_CHARS (st->ctime.tv_sec, header->oldgnu_header.ctime);
+ }
+
+ header->header.typeflag = archive_format == V7_FORMAT ? AREGTYPE : REGTYPE;
+
+ switch (archive_format)
+ {
+ case V7_FORMAT:
+ break;
+
+ case OLDGNU_FORMAT:
+ case GNU_FORMAT: /*FIXME?*/
+ /* Overwrite header->header.magic and header.version in one blow. */
+ strcpy (header->header.magic, OLDGNU_MAGIC);
+ break;
+
+ case POSIX_FORMAT:
+ case USTAR_FORMAT:
+ strncpy (header->header.magic, TMAGIC, TMAGLEN);
+ strncpy (header->header.version, TVERSION, TVERSLEN);
+ break;
+
+ default:
+ abort ();
+ }
+
+ if (archive_format == V7_FORMAT || numeric_owner_option)
+ {
+ /* header->header.[ug]name are left as the empty string. */
+ }
+ else
+ {
+ uid_to_uname (st->stat.st_uid, &st->uname);
+ gid_to_gname (st->stat.st_gid, &st->gname);
+
+ if (archive_format == POSIX_FORMAT
+ && (strlen (st->uname) > UNAME_FIELD_SIZE
+ || !string_ascii_p (st->uname)))
+ xheader_store ("uname", st, NULL);
+ UNAME_TO_CHARS (st->uname, header->header.uname);
+
+ if (archive_format == POSIX_FORMAT
+ && (strlen (st->gname) > GNAME_FIELD_SIZE
+ || !string_ascii_p (st->gname)))
+ xheader_store ("gname", st, NULL);
+ GNAME_TO_CHARS (st->gname, header->header.gname);
+ }
+
+ return header;
+}
+
+void
+simple_finish_header (union block *header)
+{
+ size_t i;
+ int sum;
+ char *p;
+
+ memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
+
+ sum = 0;
+ p = header->buffer;
+ for (i = sizeof *header; i-- != 0; )
+ /* We can't use unsigned char here because of old compilers, e.g. V7. */
+ sum += 0xFF & *p++;
+
+ /* Fill in the checksum field. It's formatted differently from the
+ other fields: it has [6] digits, a null, then a space -- rather than
+ digits, then a null. We use to_chars.
+ The final space is already there, from
+ checksumming, and to_chars doesn't modify it.
+
+ This is a fast way to do:
+
+ sprintf(header->header.chksum, "%6o", sum); */
+
+ uintmax_to_chars ((uintmax_t) sum, header->header.chksum, 7);
+
+ set_next_block_after (header);
+}
+
+/* Finish off a filled-in header block and write it out. We also
+ print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
+ is not negative, is the block ordinal of the first record for this
+ file, which may be a preceding long name or long link record. */
+void
+finish_header (struct tar_stat_info *st,
+ union block *header, off_t block_ordinal)
+{
+ /* Note: It is important to do this before the call to write_extended(),
+ so that the actual ustar header is printed */
+ if (verbose_option
+ && header->header.typeflag != GNUTYPE_LONGLINK
+ && header->header.typeflag != GNUTYPE_LONGNAME
+ && header->header.typeflag != XHDTYPE
+ && header->header.typeflag != XGLTYPE)
+ {
+ /* These globals are parameters to print_header, sigh. */
+
+ current_header = header;
+ current_format = archive_format;
+ print_header (st, block_ordinal);
+ }
+
+ header = write_extended (false, st, header);
+ simple_finish_header (header);
+}
+
+
+void
+pad_archive (off_t size_left)
+{
+ union block *blk;
+ while (size_left > 0)
+ {
+ mv_size_left (size_left);
+ blk = find_next_block ();
+ memset (blk->buffer, 0, BLOCKSIZE);
+ set_next_block_after (blk);
+ size_left -= BLOCKSIZE;
+ }
+}
+
+static enum dump_status
+dump_regular_file (int fd, struct tar_stat_info *st)
+{
+ off_t size_left = st->stat.st_size;
+ off_t block_ordinal;
+ union block *blk;
+
+ block_ordinal = current_block_ordinal ();
+ blk = start_header (st);
+ if (!blk)
+ return dump_status_fail;
+
+ /* Mark contiguous files, if we support them. */
+ if (archive_format != V7_FORMAT && S_ISCTG (st->stat.st_mode))
+ blk->header.typeflag = CONTTYPE;
+
+ finish_header (st, blk, block_ordinal);
+
+ mv_begin (st);
+ while (size_left > 0)
+ {
+ size_t bufsize, count;
+
+ mv_size_left (size_left);
+
+ blk = find_next_block ();
+
+ bufsize = available_space_after (blk);
+
+ if (size_left < bufsize)
+ {
+ /* Last read -- zero out area beyond. */
+ bufsize = size_left;
+ count = bufsize % BLOCKSIZE;
+ if (count)
+ memset (blk->buffer + size_left, 0, BLOCKSIZE - count);
+ }
+
+ count = (fd < 0) ? bufsize : safe_read (fd, blk->buffer, bufsize);
+ if (count == SAFE_READ_ERROR)
+ {
+ read_diag_details (st->orig_file_name,
+ st->stat.st_size - size_left, bufsize);
+ pad_archive (size_left);
+ return dump_status_short;
+ }
+ size_left -= count;
+ if (count)
+ set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE);
+
+ if (count != bufsize)
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ memset (blk->buffer + count, 0, bufsize - count);
+ WARN ((0, 0,
+ ngettext ("%s: File shrank by %s byte; padding with zeros",
+ "%s: File shrank by %s bytes; padding with zeros",
+ size_left),
+ quotearg_colon (st->orig_file_name),
+ STRINGIFY_BIGINT (size_left, buf)));
+ if (! ignore_failed_read_option)
+ exit_status = TAREXIT_DIFFERS;
+ pad_archive (size_left - (bufsize-count));
+ return dump_status_short;
+ }
+ }
+ return dump_status_ok;
+}
+
+
+static void
+dump_dir0 (char *directory,
+ struct tar_stat_info *st, int top_level, dev_t parent_device)
+{
+ dev_t our_device = st->stat.st_dev;
+ const char *tag_file_name;
+
+ if (!is_avoided_name (st->orig_file_name))
+ {
+ union block *blk = NULL;
+ off_t block_ordinal = current_block_ordinal ();
+ st->stat.st_size = 0; /* force 0 size on dir */
+
+ blk = start_header (st);
+ if (!blk)
+ return;
+
+ if (incremental_option && archive_format != POSIX_FORMAT)
+ blk->header.typeflag = GNUTYPE_DUMPDIR;
+ else /* if (standard_option) */
+ blk->header.typeflag = DIRTYPE;
+
+ /* If we're gnudumping, we aren't done yet so don't close it. */
+
+ if (!incremental_option)
+ finish_header (st, blk, block_ordinal);
+ else if (gnu_list_name->dir_contents)
+ {
+ if (archive_format == POSIX_FORMAT)
+ {
+ xheader_store ("GNU.dumpdir", st, gnu_list_name->dir_contents);
+ finish_header (st, blk, block_ordinal);
+ }
+ else
+ {
+ off_t size_left;
+ off_t totsize;
+ size_t bufsize;
+ ssize_t count;
+ const char *buffer, *p_buffer;
+
+ block_ordinal = current_block_ordinal ();
+ buffer = gnu_list_name->dir_contents;
+ if (buffer)
+ totsize = dumpdir_size (buffer);
+ else
+ totsize = 0;
+ OFF_TO_CHARS (totsize, blk->header.size);
+ finish_header (st, blk, block_ordinal);
+ p_buffer = buffer;
+ size_left = totsize;
+
+ mv_begin (st);
+ mv_total_size (totsize);
+ while (size_left > 0)
+ {
+ mv_size_left (size_left);
+ blk = find_next_block ();
+ bufsize = available_space_after (blk);
+ if (size_left < bufsize)
+ {
+ bufsize = size_left;
+ count = bufsize % BLOCKSIZE;
+ if (count)
+ memset (blk->buffer + size_left, 0, BLOCKSIZE - count);
+ }
+ memcpy (blk->buffer, p_buffer, bufsize);
+ size_left -= bufsize;
+ p_buffer += bufsize;
+ set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE);
+ }
+ mv_end ();
+ }
+ return;
+ }
+ }
+
+ if (!recursion_option)
+ return;
+
+ if (one_file_system_option
+ && !top_level
+ && parent_device != st->stat.st_dev)
+ {
+ if (verbose_option)
+ WARN ((0, 0,
+ _("%s: file is on a different filesystem; not dumped"),
+ quotearg_colon (st->orig_file_name)));
+ }
+ else
+ {
+ char *name_buf;
+ size_t name_size;
+
+ switch (check_exclusion_tags (st->orig_file_name, &tag_file_name))
+ {
+ case exclusion_tag_none:
+ case exclusion_tag_all:
+ {
+ char const *entry;
+ size_t entry_len;
+ size_t name_len;
+
+ name_buf = xstrdup (st->orig_file_name);
+ name_size = name_len = strlen (name_buf);
+
+ /* Now output all the files in the directory. */
+ /* FIXME: Should speed this up by cd-ing into the dir. */
+ for (entry = directory; (entry_len = strlen (entry)) != 0;
+ entry += entry_len + 1)
+ {
+ if (name_size < name_len + entry_len)
+ {
+ name_size = name_len + entry_len;
+ name_buf = xrealloc (name_buf, name_size + 1);
+ }
+ strcpy (name_buf + name_len, entry);
+ if (!excluded_name (name_buf))
+ dump_file (name_buf, 0, our_device);
+ }
+
+ free (name_buf);
+ }
+ break;
+
+ case exclusion_tag_contents:
+ exclusion_tag_warning (st->orig_file_name, tag_file_name,
+ _("contents not dumped"));
+ name_size = strlen (st->orig_file_name) + strlen (tag_file_name) + 1;
+ name_buf = xmalloc (name_size);
+ strcpy (name_buf, st->orig_file_name);
+ strcat (name_buf, tag_file_name);
+ dump_file (name_buf, 0, our_device);
+ free (name_buf);
+ break;
+
+ case exclusion_tag_under:
+ exclusion_tag_warning (st->orig_file_name, tag_file_name,
+ _("contents not dumped"));
+ break;
+ }
+ }
+}
+
+/* Ensure exactly one trailing slash. */
+static void
+ensure_slash (char **pstr)
+{
+ size_t len = strlen (*pstr);
+ while (len >= 1 && ISSLASH ((*pstr)[len - 1]))
+ len--;
+ if (!ISSLASH ((*pstr)[len]))
+ *pstr = xrealloc (*pstr, len + 2);
+ (*pstr)[len++] = '/';
+ (*pstr)[len] = '\0';
+}
+
+static bool
+dump_dir (int fd, struct tar_stat_info *st, int top_level, dev_t parent_device)
+{
+ char *directory = fdsavedir (fd);
+ if (!directory)
+ {
+ savedir_diag (st->orig_file_name);
+ return false;
+ }
+
+ dump_dir0 (directory, st, top_level, parent_device);
+
+ free (directory);
+ return true;
+}
+
+
+/* Main functions of this module. */
+
+void
+create_archive (void)
+{
+ const char *p;
+
+ open_archive (ACCESS_WRITE);
+ buffer_write_global_xheader ();
+
+ if (incremental_option)
+ {
+ size_t buffer_size = 1000;
+ char *buffer = xmalloc (buffer_size);
+ const char *q;
+
+ collect_and_sort_names ();
+
+ while ((p = name_from_list ()) != NULL)
+ if (!excluded_name (p))
+ dump_file (p, -1, (dev_t) 0);
+
+ blank_name_list ();
+ while ((p = name_from_list ()) != NULL)
+ if (!excluded_name (p))
+ {
+ size_t plen = strlen (p);
+ if (buffer_size <= plen)
+ {
+ while ((buffer_size *= 2) <= plen)
+ continue;
+ buffer = xrealloc (buffer, buffer_size);
+ }
+ memcpy (buffer, p, plen);
+ if (! ISSLASH (buffer[plen - 1]))
+ buffer[plen++] = '/';
+ q = gnu_list_name->dir_contents;
+ if (q)
+ while (*q)
+ {
+ size_t qlen = strlen (q);
+ if (*q == 'Y')
+ {
+ if (buffer_size < plen + qlen)
+ {
+ while ((buffer_size *=2 ) < plen + qlen)
+ continue;
+ buffer = xrealloc (buffer, buffer_size);
+ }
+ strcpy (buffer + plen, q + 1);
+ dump_file (buffer, -1, (dev_t) 0);
+ }
+ q += qlen + 1;
+ }
+ }
+ free (buffer);
+ }
+ else
+ {
+ while ((p = name_next (1)) != NULL)
+ if (!excluded_name (p))
+ dump_file (p, 1, (dev_t) 0);
+ }
+
+ write_eot ();
+ close_archive ();
+
+ if (listed_incremental_option)
+ write_directory_file ();
+}
+
+
+/* Calculate the hash of a link. */
+static size_t
+hash_link (void const *entry, size_t n_buckets)
+{
+ struct link const *l = entry;
+ uintmax_t num = l->dev ^ l->ino;
+ return num % n_buckets;
+}
+
+/* Compare two links for equality. */
+static bool
+compare_links (void const *entry1, void const *entry2)
+{
+ struct link const *link1 = entry1;
+ struct link const *link2 = entry2;
+ return ((link1->dev ^ link2->dev) | (link1->ino ^ link2->ino)) == 0;
+}
+
+static void
+unknown_file_error (char const *p)
+{
+ WARN ((0, 0, _("%s: Unknown file type; file ignored"),
+ quotearg_colon (p)));
+ if (!ignore_failed_read_option)
+ exit_status = TAREXIT_FAILURE;
+}
+
+
+/* Handling of hard links */
+
+/* Table of all non-directories that we've written so far. Any time
+ we see another, we check the table and avoid dumping the data
+ again if we've done it once already. */
+static Hash_table *link_table;
+
+/* Try to dump stat as a hard link to another file in the archive.
+ Return true if successful. */
+static bool
+dump_hard_link (struct tar_stat_info *st)
+{
+ if (link_table && st->stat.st_nlink > 1)
+ {
+ struct link lp;
+ struct link *duplicate;
+ off_t block_ordinal;
+ union block *blk;
+
+ lp.ino = st->stat.st_ino;
+ lp.dev = st->stat.st_dev;
+
+ if ((duplicate = hash_lookup (link_table, &lp)))
+ {
+ /* We found a link. */
+ char const *link_name = safer_name_suffix (duplicate->name, true,
+ absolute_names_option);
+
+ duplicate->nlink--;
+
+ block_ordinal = current_block_ordinal ();
+ assign_string (&st->link_name, link_name);
+ if (NAME_FIELD_SIZE - (archive_format == OLDGNU_FORMAT)
+ < strlen (link_name))
+ write_long_link (st);
+
+ st->stat.st_size = 0;
+ blk = start_header (st);
+ if (!blk)
+ return false;
+ tar_copy_str (blk->header.linkname, link_name, NAME_FIELD_SIZE);
+
+ blk->header.typeflag = LNKTYPE;
+ finish_header (st, blk, block_ordinal);
+
+ if (remove_files_option && unlink (st->orig_file_name) != 0)
+ unlink_error (st->orig_file_name);
+
+ return true;
+ }
+ }
+ return false;
+}
+
+static void
+file_count_links (struct tar_stat_info *st)
+{
+ if (st->stat.st_nlink > 1)
+ {
+ struct link *duplicate;
+ struct link *lp = xmalloc (offsetof (struct link, name)
+ + strlen (st->orig_file_name) + 1);
+ lp->ino = st->stat.st_ino;
+ lp->dev = st->stat.st_dev;
+ lp->nlink = st->stat.st_nlink;
+ strcpy (lp->name, st->orig_file_name);
+
+ if (! ((link_table
+ || (link_table = hash_initialize (0, 0, hash_link,
+ compare_links, 0)))
+ && (duplicate = hash_insert (link_table, lp))))
+ xalloc_die ();
+
+ if (duplicate != lp)
+ abort ();
+ lp->nlink--;
+ }
+}
+
+/* For each dumped file, check if all its links were dumped. Emit
+ warnings if it is not so. */
+void
+check_links (void)
+{
+ struct link *lp;
+
+ if (!link_table)
+ return;
+
+ for (lp = hash_get_first (link_table); lp;
+ lp = hash_get_next (link_table, lp))
+ {
+ if (lp->nlink)
+ {
+ WARN ((0, 0, _("Missing links to %s.\n"), quote (lp->name)));
+ }
+ }
+}
+
+
+/* Dump a single file, recursing on directories. P is the file name
+ to dump. TOP_LEVEL tells whether this is a top-level call; zero
+ means no, positive means yes, and negative means the top level
+ of an incremental dump. PARENT_DEVICE is the device of P's
+ parent directory; it is examined only if TOP_LEVEL is zero. */
+
+/* FIXME: One should make sure that for *every* path leading to setting
+ exit_status to failure, a clear diagnostic has been issued. */
+
+static void
+dump_file0 (struct tar_stat_info *st, const char *p,
+ int top_level, dev_t parent_device)
+{
+ union block *header;
+ char type;
+ off_t original_size;
+ struct timespec original_ctime;
+ struct timespec restore_times[2];
+ off_t block_ordinal = -1;
+ bool is_dir;
+
+ if (interactive_option && !confirm ("add", p))
+ return;
+
+ assign_string (&st->orig_file_name, p);
+ assign_string (&st->file_name,
+ safer_name_suffix (p, false, absolute_names_option));
+
+ transform_name (&st->file_name);
+
+ if (deref_stat (dereference_option, p, &st->stat) != 0)
+ {
+ stat_diag (p);
+ return;
+ }
+ st->archive_file_size = original_size = st->stat.st_size;
+ st->atime = restore_times[0] = get_stat_atime (&st->stat);
+ st->mtime = restore_times[1] = get_stat_mtime (&st->stat);
+ st->ctime = original_ctime = get_stat_ctime (&st->stat);
+
+#ifdef S_ISHIDDEN
+ if (S_ISHIDDEN (st->stat.st_mode))
+ {
+ char *new = (char *) alloca (strlen (p) + 2);
+ if (new)
+ {
+ strcpy (new, p);
+ strcat (new, "@");
+ p = new;
+ }
+ }
+#endif
+
+ /* See if we want only new files, and check if this one is too old to
+ put in the archive.
+
+ This check is omitted if incremental_option is set *and* the
+ requested file is not explicitely listed in the command line. */
+
+ if (!(incremental_option && !is_individual_file (p))
+ && !S_ISDIR (st->stat.st_mode)
+ && OLDER_TAR_STAT_TIME (*st, m)
+ && (!after_date_option || OLDER_TAR_STAT_TIME (*st, c)))
+ {
+ if (!incremental_option && verbose_option)
+ WARN ((0, 0, _("%s: file is unchanged; not dumped"),
+ quotearg_colon (p)));
+ return;
+ }
+
+ /* See if we are trying to dump the archive. */
+ if (sys_file_is_archive (st))
+ {
+ WARN ((0, 0, _("%s: file is the archive; not dumped"),
+ quotearg_colon (p)));
+ return;
+ }
+
+ if (is_avoided_name (p))
+ return;
+
+ is_dir = S_ISDIR (st->stat.st_mode) != 0;
+
+ if (!is_dir && dump_hard_link (st))
+ return;
+
+ if (is_dir || S_ISREG (st->stat.st_mode) || S_ISCTG (st->stat.st_mode))
+ {
+ bool ok;
+ int fd = -1;
+ struct stat final_stat;
+
+ if (is_dir || file_dumpable_p (st))
+ {
+ fd = open (p,
+ (O_RDONLY | O_BINARY
+ | (is_dir ? O_DIRECTORY | O_NONBLOCK : 0)
+ | (atime_preserve_option == system_atime_preserve
+ ? O_NOATIME
+ : 0)));
+ if (fd < 0)
+ {
+ if (!top_level && errno == ENOENT)
+ WARN ((0, 0, _("%s: File removed before we read it"),
+ quotearg_colon (p)));
+ else
+ open_diag (p);
+ return;
+ }
+ }
+
+ if (is_dir)
+ {
+ const char *tag_file_name;
+ ensure_slash (&st->orig_file_name);
+ ensure_slash (&st->file_name);
+
+ if (check_exclusion_tags (st->orig_file_name, &tag_file_name)
+ == exclusion_tag_all)
+ {
+ exclusion_tag_warning (st->orig_file_name, tag_file_name,
+ _("directory not dumped"));
+ return;
+ }
+
+ ok = dump_dir (fd, st, top_level, parent_device);
+
+ /* dump_dir consumes FD if successful. */
+ if (ok)
+ fd = -1;
+ }
+ else
+ {
+ enum dump_status status;
+
+ if (fd != -1 && sparse_option && ST_IS_SPARSE (st->stat))
+ {
+ status = sparse_dump_file (fd, st);
+ if (status == dump_status_not_implemented)
+ status = dump_regular_file (fd, st);
+ }
+ else
+ status = dump_regular_file (fd, st);
+
+ switch (status)
+ {
+ case dump_status_ok:
+ case dump_status_short:
+ mv_end ();
+ break;
+
+ case dump_status_fail:
+ break;
+
+ case dump_status_not_implemented:
+ abort ();
+ }
+
+ file_count_links (st);
+
+ ok = status == dump_status_ok;
+ }
+
+ if (ok)
+ {
+ /* If possible, reopen a directory if we are preserving
+ atimes, so that we can set just the atime on systems with
+ _FIOSATIME. */
+ if (fd < 0 && is_dir
+ && atime_preserve_option == replace_atime_preserve)
+ fd = open (p, O_RDONLY | O_BINARY | O_DIRECTORY | O_NONBLOCK);
+
+ if ((fd < 0
+ ? deref_stat (dereference_option, p, &final_stat)
+ : fstat (fd, &final_stat))
+ != 0)
+ {
+ stat_diag (p);
+ ok = false;
+ }
+ }
+
+ if (ok)
+ {
+ if ((timespec_cmp (get_stat_ctime (&final_stat), original_ctime) != 0
+ /* Original ctime will change if the file is a directory and
+ --remove-files is given */
+ && !(remove_files_option && is_dir))
+ || original_size < final_stat.st_size)
+ {
+ WARN ((0, 0, _("%s: file changed as we read it"),
+ quotearg_colon (p)));
+ if (exit_status == TAREXIT_SUCCESS)
+ exit_status = TAREXIT_DIFFERS;
+ }
+ else if (atime_preserve_option == replace_atime_preserve
+ && set_file_atime (fd, p, restore_times) != 0)
+ utime_error (p);
+ }
+
+ if (0 <= fd && close (fd) != 0)
+ {
+ close_diag (p);
+ ok = false;
+ }
+
+ if (ok && remove_files_option)
+ {
+ if (is_dir)
+ {
+ if (rmdir (p) != 0 && errno != ENOTEMPTY)
+ rmdir_error (p);
+ }
+ else
+ {
+ if (unlink (p) != 0)
+ unlink_error (p);
+ }
+ }
+
+ return;
+ }
+#ifdef HAVE_READLINK
+ else if (S_ISLNK (st->stat.st_mode))
+ {
+ char *buffer;
+ int size;
+ size_t linklen = st->stat.st_size;
+ if (linklen != st->stat.st_size || linklen + 1 == 0)
+ xalloc_die ();
+ buffer = (char *) alloca (linklen + 1);
+ size = readlink (p, buffer, linklen + 1);
+ if (size < 0)
+ {
+ readlink_diag (p);
+ return;
+ }
+ buffer[size] = '\0';
+ assign_string (&st->link_name, buffer);
+ if (NAME_FIELD_SIZE - (archive_format == OLDGNU_FORMAT) < size)
+ write_long_link (st);
+
+ block_ordinal = current_block_ordinal ();
+ st->stat.st_size = 0; /* force 0 size on symlink */
+ header = start_header (st);
+ if (!header)
+ return;
+ tar_copy_str (header->header.linkname, buffer, NAME_FIELD_SIZE);
+ header->header.typeflag = SYMTYPE;
+ finish_header (st, header, block_ordinal);
+ /* nothing more to do to it */
+
+ if (remove_files_option)
+ {
+ if (unlink (p) == -1)
+ unlink_error (p);
+ }
+ file_count_links (st);
+ return;
+ }
+#endif
+ else if (S_ISCHR (st->stat.st_mode))
+ type = CHRTYPE;
+ else if (S_ISBLK (st->stat.st_mode))
+ type = BLKTYPE;
+ else if (S_ISFIFO (st->stat.st_mode))
+ type = FIFOTYPE;
+ else if (S_ISSOCK (st->stat.st_mode))
+ {
+ WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p)));
+ return;
+ }
+ else if (S_ISDOOR (st->stat.st_mode))
+ {
+ WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p)));
+ return;
+ }
+ else
+ {
+ unknown_file_error (p);
+ return;
+ }
+
+ if (archive_format == V7_FORMAT)
+ {
+ unknown_file_error (p);
+ return;
+ }
+
+ block_ordinal = current_block_ordinal ();
+ st->stat.st_size = 0; /* force 0 size */
+ header = start_header (st);
+ if (!header)
+ return;
+ header->header.typeflag = type;
+
+ if (type != FIFOTYPE)
+ {
+ MAJOR_TO_CHARS (major (st->stat.st_rdev),
+ header->header.devmajor);
+ MINOR_TO_CHARS (minor (st->stat.st_rdev),
+ header->header.devminor);
+ }
+
+ finish_header (st, header, block_ordinal);
+ if (remove_files_option)
+ {
+ if (unlink (p) == -1)
+ unlink_error (p);
+ }
+}
+
+void
+dump_file (const char *p, int top_level, dev_t parent_device)
+{
+ struct tar_stat_info st;
+ tar_stat_init (&st);
+ dump_file0 (&st, p, top_level, parent_device);
+ if (listed_incremental_option)
+ update_parent_directory (p);
+ tar_stat_destroy (&st);
+}
diff --git a/src/delete.c b/src/delete.c
new file mode 100644
index 0000000..e649739
--- /dev/null
+++ b/src/delete.c
@@ -0,0 +1,391 @@
+/* Delete entries from a tar archive.
+
+ Copyright (C) 1988, 1992, 1994, 1996, 1997, 2000, 2001, 2003, 2004,
+ 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <system-ioctl.h>
+
+#include "common.h"
+#include <rmt.h>
+
+static union block *new_record;
+static int new_blocks;
+static bool acting_as_filter;
+
+/* FIXME: This module should not directly handle the following
+ variables, instead, the interface should be cleaned up. */
+extern union block *record_start;
+extern union block *record_end;
+extern union block *current_block;
+extern union block *recent_long_name;
+extern union block *recent_long_link;
+extern off_t records_read;
+extern off_t records_written;
+
+/* The number of records skipped at the start of the archive, when
+ passing over members that are not deleted. */
+off_t records_skipped;
+
+/* Move archive descriptor by COUNT records worth. If COUNT is
+ positive we move forward, else we move negative. If it's a tape,
+ MTIOCTOP had better work. If it's something else, we try to seek
+ on it. If we can't seek, we lose! */
+static void
+move_archive (off_t count)
+{
+ if (count == 0)
+ return;
+
+#ifdef MTIOCTOP
+ {
+ struct mtop operation;
+
+ if (count < 0
+ ? (operation.mt_op = MTBSR,
+ operation.mt_count = -count,
+ operation.mt_count == -count)
+ : (operation.mt_op = MTFSR,
+ operation.mt_count = count,
+ operation.mt_count == count))
+ {
+ if (0 <= rmtioctl (archive, MTIOCTOP, (char *) &operation))
+ return;
+
+ if (errno == EIO
+ && 0 <= rmtioctl (archive, MTIOCTOP, (char *) &operation))
+ return;
+ }
+ }
+#endif /* MTIOCTOP */
+
+ {
+ off_t position0 = rmtlseek (archive, (off_t) 0, SEEK_CUR);
+ off_t increment = record_size * (off_t) count;
+ off_t position = position0 + increment;
+
+ if (increment / count != record_size
+ || (position < position0) != (increment < 0)
+ || (position = position < 0 ? 0 : position,
+ rmtlseek (archive, position, SEEK_SET) != position))
+ seek_error_details (archive_name_array[0], position);
+
+ return;
+ }
+}
+
+/* Write out the record which has been filled. If MOVE_BACK_FLAG,
+ backspace to where we started. */
+static void
+write_record (int move_back_flag)
+{
+ union block *save_record = record_start;
+ record_start = new_record;
+
+ if (acting_as_filter)
+ {
+ archive = STDOUT_FILENO;
+ flush_write ();
+ archive = STDIN_FILENO;
+ }
+ else
+ {
+ move_archive ((records_written + records_skipped) - records_read);
+ flush_write ();
+ }
+
+ record_start = save_record;
+
+ if (move_back_flag)
+ {
+ /* Move the tape head back to where we were. */
+
+ if (! acting_as_filter)
+ move_archive (records_read - (records_written + records_skipped));
+ }
+
+ new_blocks = 0;
+}
+
+static void
+write_recent_blocks (union block *h, size_t blocks)
+{
+ size_t i;
+ for (i = 0; i < blocks; i++)
+ {
+ new_record[new_blocks++] = h[i];
+ if (new_blocks == blocking_factor)
+ write_record (1);
+ }
+}
+
+static void
+write_recent_bytes (char *data, size_t bytes)
+{
+ size_t blocks = bytes / BLOCKSIZE;
+ size_t rest = bytes - blocks * BLOCKSIZE;
+
+ write_recent_blocks ((union block *)data, blocks);
+ memcpy (new_record[new_blocks].buffer, data + blocks * BLOCKSIZE, rest);
+ if (rest < BLOCKSIZE)
+ memset (new_record[new_blocks].buffer + rest, 0, BLOCKSIZE - rest);
+ new_blocks++;
+ if (new_blocks == blocking_factor)
+ write_record (1);
+}
+
+void
+delete_archive_members (void)
+{
+ enum read_header logical_status = HEADER_STILL_UNREAD;
+ enum read_header previous_status = HEADER_STILL_UNREAD;
+
+ /* FIXME: Should clean the routine before cleaning these variables :-( */
+ struct name *name;
+ off_t blocks_to_skip = 0;
+ off_t blocks_to_keep = 0;
+ int kept_blocks_in_record;
+
+ name_gather ();
+ open_archive (ACCESS_UPDATE);
+ acting_as_filter = strcmp (archive_name_array[0], "-") == 0;
+
+ do
+ {
+ enum read_header status = read_header (true);
+
+ switch (status)
+ {
+ case HEADER_STILL_UNREAD:
+ abort ();
+
+ case HEADER_SUCCESS:
+ if ((name = name_scan (current_stat_info.file_name)) == NULL)
+ {
+ skip_member ();
+ break;
+ }
+ name->found_count++;
+ if (!ISFOUND(name))
+ {
+ skip_member ();
+ break;
+ }
+
+ /* Fall through. */
+ case HEADER_SUCCESS_EXTENDED:
+ logical_status = status;
+ break;
+
+ case HEADER_ZERO_BLOCK:
+ if (ignore_zeros_option)
+ {
+ set_next_block_after (current_header);
+ break;
+ }
+ /* Fall through. */
+ case HEADER_END_OF_FILE:
+ logical_status = HEADER_END_OF_FILE;
+ break;
+
+ case HEADER_FAILURE:
+ set_next_block_after (current_header);
+ switch (previous_status)
+ {
+ case HEADER_STILL_UNREAD:
+ WARN ((0, 0, _("This does not look like a tar archive")));
+ /* Fall through. */
+
+ case HEADER_SUCCESS:
+ case HEADER_SUCCESS_EXTENDED:
+ case HEADER_ZERO_BLOCK:
+ ERROR ((0, 0, _("Skipping to next header")));
+ /* Fall through. */
+
+ case HEADER_FAILURE:
+ break;
+
+ case HEADER_END_OF_FILE:
+ abort ();
+ }
+ break;
+ }
+
+ previous_status = status;
+ }
+ while (logical_status == HEADER_STILL_UNREAD);
+
+ records_skipped = records_read - 1;
+ new_record = xmalloc (record_size);
+
+ if (logical_status == HEADER_SUCCESS
+ || logical_status == HEADER_SUCCESS_EXTENDED)
+ {
+ write_archive_to_stdout = false;
+
+ /* Save away blocks before this one in this record. */
+
+ new_blocks = current_block - record_start;
+ if (new_blocks)
+ memcpy (new_record, record_start, new_blocks * BLOCKSIZE);
+
+ if (logical_status == HEADER_SUCCESS)
+ {
+ /* FIXME: Pheew! This is crufty code! */
+ logical_status = HEADER_STILL_UNREAD;
+ goto flush_file;
+ }
+
+ /* FIXME: Solaris 2.4 Sun cc (the ANSI one, not the old K&R) says:
+ "delete.c", line 223: warning: loop not entered at top
+ Reported by Bruno Haible. */
+ while (1)
+ {
+ enum read_header status;
+
+ /* Fill in a record. */
+
+ if (current_block == record_end)
+ flush_archive ();
+ status = read_header (false);
+
+ xheader_decode (&current_stat_info);
+
+ if (status == HEADER_ZERO_BLOCK && ignore_zeros_option)
+ {
+ set_next_block_after (current_header);
+ continue;
+ }
+ if (status == HEADER_END_OF_FILE || status == HEADER_ZERO_BLOCK)
+ {
+ logical_status = HEADER_END_OF_FILE;
+ break;
+ }
+
+ if (status == HEADER_FAILURE)
+ {
+ ERROR ((0, 0, _("Deleting non-header from archive")));
+ set_next_block_after (current_header);
+ continue;
+ }
+
+ /* Found another header. */
+
+ if ((name = name_scan (current_stat_info.file_name)) != NULL)
+ {
+ name->found_count++;
+ if (ISFOUND(name))
+ {
+ flush_file:
+ set_next_block_after (current_header);
+ blocks_to_skip = (current_stat_info.stat.st_size
+ + BLOCKSIZE - 1) / BLOCKSIZE;
+
+ while (record_end - current_block <= blocks_to_skip)
+ {
+ blocks_to_skip -= (record_end - current_block);
+ flush_archive ();
+ }
+ current_block += blocks_to_skip;
+ blocks_to_skip = 0;
+ continue;
+ }
+ }
+ /* Copy header. */
+
+ if (current_stat_info.xhdr.size)
+ {
+ write_recent_bytes (current_stat_info.xhdr.buffer,
+ current_stat_info.xhdr.size);
+ }
+ else
+ {
+ write_recent_blocks (recent_long_name, recent_long_name_blocks);
+ write_recent_blocks (recent_long_link, recent_long_link_blocks);
+ }
+ new_record[new_blocks] = *current_header;
+ new_blocks++;
+ blocks_to_keep
+ = (current_stat_info.stat.st_size + BLOCKSIZE - 1) / BLOCKSIZE;
+ set_next_block_after (current_header);
+ if (new_blocks == blocking_factor)
+ write_record (1);
+
+ /* Copy data. */
+
+ kept_blocks_in_record = record_end - current_block;
+ if (kept_blocks_in_record > blocks_to_keep)
+ kept_blocks_in_record = blocks_to_keep;
+
+ while (blocks_to_keep)
+ {
+ int count;
+
+ if (current_block == record_end)
+ {
+ flush_read ();
+ current_block = record_start;
+ kept_blocks_in_record = blocking_factor;
+ if (kept_blocks_in_record > blocks_to_keep)
+ kept_blocks_in_record = blocks_to_keep;
+ }
+ count = kept_blocks_in_record;
+ if (blocking_factor - new_blocks < count)
+ count = blocking_factor - new_blocks;
+
+ if (! count)
+ abort ();
+
+ memcpy (new_record + new_blocks, current_block, count * BLOCKSIZE);
+ new_blocks += count;
+ current_block += count;
+ blocks_to_keep -= count;
+ kept_blocks_in_record -= count;
+
+ if (new_blocks == blocking_factor)
+ write_record (1);
+ }
+ }
+
+ if (logical_status == HEADER_END_OF_FILE)
+ {
+ /* Write the end of tape. FIXME: we can't use write_eot here,
+ as it gets confused when the input is at end of file. */
+
+ int total_zero_blocks = 0;
+
+ do
+ {
+ int zero_blocks = blocking_factor - new_blocks;
+ memset (new_record + new_blocks, 0, BLOCKSIZE * zero_blocks);
+ total_zero_blocks += zero_blocks;
+ write_record (total_zero_blocks < 2);
+ }
+ while (total_zero_blocks < 2);
+ }
+
+ if (! acting_as_filter && ! _isrmt (archive))
+ {
+ if (sys_truncate (archive))
+ truncate_warn (archive_name_array[0]);
+ }
+ }
+ free (new_record);
+
+ close_archive ();
+ names_notfound ();
+}
diff --git a/src/extract.c b/src/extract.c
new file mode 100644
index 0000000..1f231e3
--- /dev/null
+++ b/src/extract.c
@@ -0,0 +1,1379 @@
+/* Extract files from a tar archive.
+
+ Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ Written by John Gilmore, on 1985-11-19.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <quotearg.h>
+#include <utimens.h>
+#include <errno.h>
+#include <xgetcwd.h>
+
+#include "common.h"
+
+static bool we_are_root; /* true if our effective uid == 0 */
+static mode_t newdir_umask; /* umask when creating new directories */
+static mode_t current_umask; /* current umask (which is set to 0 if -p) */
+
+/* Status of the permissions of a file that we are extracting. */
+enum permstatus
+{
+ /* This file may have existed already; its permissions are unknown. */
+ UNKNOWN_PERMSTATUS,
+
+ /* This file was created using the permissions from the archive,
+ except with S_IRWXG | S_IRWXO masked out if 0 < same_owner_option. */
+ ARCHIVED_PERMSTATUS,
+
+ /* This is an intermediate directory; the archive did not specify
+ its permissions. */
+ INTERDIR_PERMSTATUS
+};
+
+/* List of directories whose statuses we need to extract after we've
+ finished extracting their subsidiary files. If you consider each
+ contiguous subsequence of elements of the form [D]?[^D]*, where [D]
+ represents an element where AFTER_LINKS is nonzero and [^D]
+ represents an element where AFTER_LINKS is zero, then the head
+ of the subsequence has the longest name, and each non-head element
+ in the prefix is an ancestor (in the directory hierarchy) of the
+ preceding element. */
+
+struct delayed_set_stat
+ {
+ struct delayed_set_stat *next;
+ dev_t dev;
+ ino_t ino;
+ mode_t mode;
+ uid_t uid;
+ gid_t gid;
+ struct timespec atime;
+ struct timespec mtime;
+ size_t file_name_len;
+ mode_t invert_permissions;
+ enum permstatus permstatus;
+ bool after_links;
+ char file_name[1];
+ };
+
+static struct delayed_set_stat *delayed_set_stat_head;
+
+/* List of links whose creation we have delayed. */
+struct delayed_link
+ {
+ /* The next delayed link in the list. */
+ struct delayed_link *next;
+
+ /* The device, inode number and last-modified time of the placeholder. */
+ dev_t dev;
+ ino_t ino;
+ struct timespec mtime;
+
+ /* True if the link is symbolic. */
+ bool is_symlink;
+
+ /* The desired owner and group of the link, if it is a symlink. */
+ uid_t uid;
+ gid_t gid;
+
+ /* A list of sources for this link. The sources are all to be
+ hard-linked together. */
+ struct string_list *sources;
+
+ /* The desired target of the desired link. */
+ char target[1];
+ };
+
+static struct delayed_link *delayed_link_head;
+
+struct string_list
+ {
+ struct string_list *next;
+ char string[1];
+ };
+
+/* Set up to extract files. */
+void
+extr_init (void)
+{
+ we_are_root = geteuid () == 0;
+ same_permissions_option += we_are_root;
+ same_owner_option += we_are_root;
+
+ /* Option -p clears the kernel umask, so it does not affect proper
+ restoration of file permissions. New intermediate directories will
+ comply with umask at start of program. */
+
+ newdir_umask = umask (0);
+ if (0 < same_permissions_option)
+ current_umask = 0;
+ else
+ {
+ umask (newdir_umask); /* restore the kernel umask */
+ current_umask = newdir_umask;
+ }
+}
+
+/* If restoring permissions, restore the mode for FILE_NAME from
+ information given in *STAT_INFO (where *CUR_INFO gives
+ the current status if CUR_INFO is nonzero); otherwise invert the
+ INVERT_PERMISSIONS bits from the file's current permissions.
+ PERMSTATUS specifies the status of the file's permissions.
+ TYPEFLAG specifies the type of the file. */
+static void
+set_mode (char const *file_name,
+ struct stat const *stat_info,
+ struct stat const *cur_info,
+ mode_t invert_permissions, enum permstatus permstatus,
+ char typeflag)
+{
+ mode_t mode;
+
+ if (0 < same_permissions_option
+ && permstatus != INTERDIR_PERMSTATUS)
+ {
+ mode = stat_info->st_mode;
+
+ /* If we created the file and it has a mode that we set already
+ with O_CREAT, then its mode is often set correctly already.
+ But if we are changing ownership, the mode's group and and
+ other permission bits were omitted originally, so it's less
+ likely that the mode is OK now. Also, on many hosts, some
+ directories inherit the setgid bits from their parents, so we
+ we must set directories' modes explicitly. */
+ if ((permstatus == ARCHIVED_PERMSTATUS
+ && ! (mode & ~ (0 < same_owner_option ? S_IRWXU : MODE_RWX)))
+ && typeflag != DIRTYPE
+ && typeflag != GNUTYPE_DUMPDIR)
+ return;
+ }
+ else if (! invert_permissions)
+ return;
+ else
+ {
+ /* We must inspect a directory's current permissions, since the
+ directory may have inherited its setgid bit from its parent.
+
+ INVERT_PERMISSIONS happens to be nonzero only for directories
+ that we created, so there's no point optimizing this code for
+ other cases. */
+ struct stat st;
+ if (! cur_info)
+ {
+ if (stat (file_name, &st) != 0)
+ {
+ stat_error (file_name);
+ return;
+ }
+ cur_info = &st;
+ }
+ mode = cur_info->st_mode ^ invert_permissions;
+ }
+
+ if (chmod (file_name, mode) != 0)
+ chmod_error_details (file_name, mode);
+}
+
+/* Check time after successfully setting FILE_NAME's time stamp to T. */
+static void
+check_time (char const *file_name, struct timespec t)
+{
+ if (t.tv_sec <= 0)
+ WARN ((0, 0, _("%s: implausibly old time stamp %s"),
+ file_name, tartime (t, true)));
+ else if (timespec_cmp (volume_start_time, t) < 0)
+ {
+ struct timespec now;
+ gettime (&now);
+ if (timespec_cmp (now, t) < 0)
+ {
+ char buf[TIMESPEC_STRSIZE_BOUND];
+ struct timespec diff;
+ diff.tv_sec = t.tv_sec - now.tv_sec;
+ diff.tv_nsec = t.tv_nsec - now.tv_nsec;
+ if (diff.tv_nsec < 0)
+ {
+ diff.tv_nsec += BILLION;
+ diff.tv_sec--;
+ }
+ WARN ((0, 0, _("%s: time stamp %s is %s s in the future"),
+ file_name, tartime (t, true), code_timespec (diff, buf)));
+ }
+ }
+}
+
+/* Restore stat attributes (owner, group, mode and times) for
+ FILE_NAME, using information given in *ST.
+ If CUR_INFO is nonzero, *CUR_INFO is the
+ file's current status.
+ If not restoring permissions, invert the
+ INVERT_PERMISSIONS bits from the file's current permissions.
+ PERMSTATUS specifies the status of the file's permissions.
+ TYPEFLAG specifies the type of the file. */
+
+/* FIXME: About proper restoration of symbolic link attributes, we still do
+ not have it right. Pretesters' reports tell us we need further study and
+ probably more configuration. For now, just use lchown if it exists, and
+ punt for the rest. Sigh! */
+
+static void
+set_stat (char const *file_name,
+ struct tar_stat_info const *st,
+ struct stat const *cur_info,
+ mode_t invert_permissions, enum permstatus permstatus,
+ char typeflag)
+{
+ if (typeflag != SYMTYPE)
+ {
+ /* We do the utime before the chmod because some versions of utime are
+ broken and trash the modes of the file. */
+
+ if (! touch_option && permstatus != INTERDIR_PERMSTATUS)
+ {
+ /* We set the accessed time to `now', which is really the time we
+ started extracting files, unless incremental_option is used, in
+ which case .st_atime is used. */
+
+ /* FIXME: incremental_option should set ctime too, but how? */
+
+ struct timespec ts[2];
+ if (incremental_option)
+ ts[0] = st->atime;
+ else
+ ts[0] = start_time;
+ ts[1] = st->mtime;
+
+ if (utimens (file_name, ts) != 0)
+ utime_error (file_name);
+ else
+ {
+ check_time (file_name, ts[0]);
+ check_time (file_name, ts[1]);
+ }
+ }
+
+ /* Some systems allow non-root users to give files away. Once this
+ done, it is not possible anymore to change file permissions.
+ However, setting file permissions now would be incorrect, since
+ they would apply to the wrong user, and there would be a race
+ condition. So, don't use systems that allow non-root users to
+ give files away. */
+ }
+
+ if (0 < same_owner_option && permstatus != INTERDIR_PERMSTATUS)
+ {
+ /* When lchown exists, it should be used to change the attributes of
+ the symbolic link itself. In this case, a mere chown would change
+ the attributes of the file the symbolic link is pointing to, and
+ should be avoided. */
+ int chown_result = 1;
+
+ if (typeflag == SYMTYPE)
+ {
+#if HAVE_LCHOWN
+ chown_result = lchown (file_name, st->stat.st_uid, st->stat.st_gid);
+#endif
+ }
+ else
+ {
+ chown_result = chown (file_name, st->stat.st_uid, st->stat.st_gid);
+ }
+
+ if (chown_result == 0)
+ {
+ /* Changing the owner can flip st_mode bits in some cases, so
+ ignore cur_info if it might be obsolete now. */
+ if (cur_info
+ && cur_info->st_mode & S_IXUGO
+ && cur_info->st_mode & (S_ISUID | S_ISGID))
+ cur_info = NULL;
+ }
+ else if (chown_result < 0)
+ chown_error_details (file_name,
+ st->stat.st_uid, st->stat.st_gid);
+ }
+
+ if (typeflag != SYMTYPE)
+ set_mode (file_name, &st->stat, cur_info,
+ invert_permissions, permstatus, typeflag);
+}
+
+/* Remember to restore stat attributes (owner, group, mode and times)
+ for the directory FILE_NAME, using information given in *ST,
+ once we stop extracting files into that directory.
+ If not restoring permissions, remember to invert the
+ INVERT_PERMISSIONS bits from the file's current permissions.
+ PERMSTATUS specifies the status of the file's permissions.
+
+ NOTICE: this works only if the archive has usual member order, i.e.
+ directory, then the files in that directory. Incremental archive have
+ somewhat reversed order: first go subdirectories, then all other
+ members. To help cope with this case the variable
+ delay_directory_restore_option is set by prepare_to_extract.
+
+ If an archive was explicitely created so that its member order is
+ reversed, some directory timestamps can be restored incorrectly,
+ e.g.:
+ tar --no-recursion -cf archive dir dir/file1 foo dir/file2
+*/
+static void
+delay_set_stat (char const *file_name, struct tar_stat_info const *st,
+ mode_t invert_permissions, enum permstatus permstatus)
+{
+ size_t file_name_len = strlen (file_name);
+ struct delayed_set_stat *data =
+ xmalloc (offsetof (struct delayed_set_stat, file_name)
+ + file_name_len + 1);
+ data->next = delayed_set_stat_head;
+ data->dev = st->stat.st_dev;
+ data->ino = st->stat.st_ino;
+ data->mode = st->stat.st_mode;
+ data->uid = st->stat.st_uid;
+ data->gid = st->stat.st_gid;
+ data->atime = st->atime;
+ data->mtime = st->mtime;
+ data->file_name_len = file_name_len;
+ data->invert_permissions = invert_permissions;
+ data->permstatus = permstatus;
+ data->after_links = 0;
+ strcpy (data->file_name, file_name);
+ delayed_set_stat_head = data;
+}
+
+/* Update the delayed_set_stat info for an intermediate directory
+ created within the file name of DIR. The intermediate directory turned
+ out to be the same as this directory, e.g. due to ".." or symbolic
+ links. *DIR_STAT_INFO is the status of the directory. */
+static void
+repair_delayed_set_stat (char const *dir,
+ struct stat const *dir_stat_info)
+{
+ struct delayed_set_stat *data;
+ for (data = delayed_set_stat_head; data; data = data->next)
+ {
+ struct stat st;
+ if (stat (data->file_name, &st) != 0)
+ {
+ stat_error (data->file_name);
+ return;
+ }
+
+ if (st.st_dev == dir_stat_info->st_dev
+ && st.st_ino == dir_stat_info->st_ino)
+ {
+ data->dev = current_stat_info.stat.st_dev;
+ data->ino = current_stat_info.stat.st_ino;
+ data->mode = current_stat_info.stat.st_mode;
+ data->uid = current_stat_info.stat.st_uid;
+ data->gid = current_stat_info.stat.st_gid;
+ data->atime = current_stat_info.atime;
+ data->mtime = current_stat_info.mtime;
+ data->invert_permissions =
+ ((current_stat_info.stat.st_mode ^ st.st_mode)
+ & MODE_RWX & ~ current_umask);
+ data->permstatus = ARCHIVED_PERMSTATUS;
+ return;
+ }
+ }
+
+ ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
+ quotearg_colon (dir)));
+}
+
+/* After a file/link/directory creation has failed, see if
+ it's because some required directory was not present, and if so,
+ create all required directories. Return non-zero if a directory
+ was created. */
+static int
+make_directories (char *file_name)
+{
+ char *cursor0 = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
+ char *cursor; /* points into the file name */
+ int did_something = 0; /* did we do anything yet? */
+ int mode;
+ int invert_permissions;
+ int status;
+
+ for (cursor = cursor0; *cursor; cursor++)
+ {
+ if (! ISSLASH (*cursor))
+ continue;
+
+ /* Avoid mkdir of empty string, if leading or double '/'. */
+
+ if (cursor == cursor0 || ISSLASH (cursor[-1]))
+ continue;
+
+ /* Avoid mkdir where last part of file name is "." or "..". */
+
+ if (cursor[-1] == '.'
+ && (cursor == cursor0 + 1 || ISSLASH (cursor[-2])
+ || (cursor[-2] == '.'
+ && (cursor == cursor0 + 2 || ISSLASH (cursor[-3])))))
+ continue;
+
+ *cursor = '\0'; /* truncate the name there */
+ mode = MODE_RWX & ~ newdir_umask;
+ invert_permissions = we_are_root ? 0 : MODE_WXUSR & ~ mode;
+ status = mkdir (file_name, mode ^ invert_permissions);
+
+ if (status == 0)
+ {
+ /* Create a struct delayed_set_stat even if
+ invert_permissions is zero, because
+ repair_delayed_set_stat may need to update the struct. */
+ delay_set_stat (file_name,
+ &current_stat_info,
+ invert_permissions, INTERDIR_PERMSTATUS);
+
+ print_for_mkdir (file_name, cursor - file_name, mode);
+ did_something = 1;
+
+ *cursor = '/';
+ continue;
+ }
+
+ *cursor = '/';
+
+ if (errno == EEXIST)
+ continue; /* Directory already exists. */
+ else if ((errno == ENOSYS /* Automounted dirs on Solaris return
+ this. Reported by Warren Hyde
+ <Warren.Hyde@motorola.com> */
+ || ERRNO_IS_EACCES) /* Turbo C mkdir gives a funny errno. */
+ && access (file_name, W_OK) == 0)
+ continue;
+
+ /* Some other error in the mkdir. We return to the caller. */
+ break;
+ }
+
+ return did_something; /* tell them to retry if we made one */
+}
+
+static bool
+file_newer_p (const char *file_name, struct tar_stat_info *tar_stat)
+{
+ struct stat st;
+
+ if (stat (file_name, &st))
+ {
+ stat_warn (file_name);
+ /* Be on the safe side: if the file does exist assume it is newer */
+ return errno != ENOENT;
+ }
+ if (!S_ISDIR (st.st_mode)
+ && tar_timespec_cmp (tar_stat->mtime, get_stat_mtime (&st)) <= 0)
+ {
+ return true;
+ }
+ return false;
+}
+
+/* Attempt repairing what went wrong with the extraction. Delete an
+ already existing file or create missing intermediate directories.
+ Return nonzero if we somewhat increased our chances at a successful
+ extraction. errno is properly restored on zero return. */
+static int
+maybe_recoverable (char *file_name, int *interdir_made)
+{
+ int e = errno;
+
+ if (*interdir_made)
+ return 0;
+
+ switch (errno)
+ {
+ case EEXIST:
+ /* Remove an old file, if the options allow this. */
+
+ switch (old_files_option)
+ {
+ case KEEP_OLD_FILES:
+ return 0;
+
+ case KEEP_NEWER_FILES:
+ if (file_newer_p (file_name, &current_stat_info))
+ {
+ errno = e;
+ return 0;
+ }
+ /* FALL THROUGH */
+
+ case DEFAULT_OLD_FILES:
+ case NO_OVERWRITE_DIR_OLD_FILES:
+ case OVERWRITE_OLD_FILES:
+ {
+ int r = remove_any_file (file_name, ORDINARY_REMOVE_OPTION);
+ errno = EEXIST;
+ return r;
+ }
+
+ case UNLINK_FIRST_OLD_FILES:
+ break;
+ }
+
+ case ENOENT:
+ /* Attempt creating missing intermediate directories. */
+ if (! make_directories (file_name))
+ {
+ errno = ENOENT;
+ return 0;
+ }
+ *interdir_made = 1;
+ return 1;
+
+ default:
+ /* Just say we can't do anything about it... */
+
+ return 0;
+ }
+}
+
+/* Fix the statuses of all directories whose statuses need fixing, and
+ which are not ancestors of FILE_NAME. If AFTER_LINKS is
+ nonzero, do this for all such directories; otherwise, stop at the
+ first directory that is marked to be fixed up only after delayed
+ links are applied. */
+static void
+apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links)
+{
+ size_t file_name_len = strlen (file_name);
+ bool check_for_renamed_directories = 0;
+
+ while (delayed_set_stat_head)
+ {
+ struct delayed_set_stat *data = delayed_set_stat_head;
+ bool skip_this_one = 0;
+ struct stat st;
+ struct stat const *cur_info = 0;
+
+ check_for_renamed_directories |= data->after_links;
+
+ if (after_links < data->after_links
+ || (data->file_name_len < file_name_len
+ && file_name[data->file_name_len]
+ && (ISSLASH (file_name[data->file_name_len])
+ || ISSLASH (file_name[data->file_name_len - 1]))
+ && memcmp (file_name, data->file_name, data->file_name_len) == 0))
+ break;
+
+ if (check_for_renamed_directories)
+ {
+ cur_info = &st;
+ if (stat (data->file_name, &st) != 0)
+ {
+ stat_error (data->file_name);
+ skip_this_one = 1;
+ }
+ else if (! (st.st_dev == data->dev && st.st_ino == data->ino))
+ {
+ ERROR ((0, 0,
+ _("%s: Directory renamed before its status could be extracted"),
+ quotearg_colon (data->file_name)));
+ skip_this_one = 1;
+ }
+ }
+
+ if (! skip_this_one)
+ {
+ struct tar_stat_info st;
+ st.stat.st_mode = data->mode;
+ st.stat.st_uid = data->uid;
+ st.stat.st_gid = data->gid;
+ st.atime = data->atime;
+ st.mtime = data->mtime;
+ set_stat (data->file_name, &st, cur_info,
+ data->invert_permissions, data->permstatus, DIRTYPE);
+ }
+
+ delayed_set_stat_head = data->next;
+ free (data);
+ }
+}
+
+
+
+/* Extractor functions for various member types */
+
+static int
+extract_dir (char *file_name, int typeflag)
+{
+ int status;
+ mode_t mode;
+ int interdir_made = 0;
+
+ /* Save 'root device' to avoid purging mount points. */
+ if (one_file_system_option && root_device == 0)
+ {
+ struct stat st;
+ char *dir = xgetcwd ();
+
+ if (deref_stat (true, dir, &st))
+ stat_diag (dir);
+ else
+ root_device = st.st_dev;
+ free (dir);
+ }
+
+ if (incremental_option)
+ /* Read the entry and delete files that aren't listed in the archive. */
+ purge_directory (file_name);
+ else if (typeflag == GNUTYPE_DUMPDIR)
+ skip_member ();
+
+ mode = current_stat_info.stat.st_mode | (we_are_root ? 0 : MODE_WXUSR);
+ if (0 < same_owner_option || current_stat_info.stat.st_mode & ~ MODE_RWX)
+ mode &= S_IRWXU;
+
+ while ((status = mkdir (file_name, mode)))
+ {
+ if (errno == EEXIST
+ && (interdir_made
+ || old_files_option == DEFAULT_OLD_FILES
+ || old_files_option == OVERWRITE_OLD_FILES))
+ {
+ struct stat st;
+ if (stat (file_name, &st) == 0)
+ {
+ if (interdir_made)
+ {
+ repair_delayed_set_stat (file_name, &st);
+ return 0;
+ }
+ if (S_ISDIR (st.st_mode))
+ {
+ mode = st.st_mode;
+ break;
+ }
+ }
+ errno = EEXIST;
+ }
+
+ if (maybe_recoverable (file_name, &interdir_made))
+ continue;
+
+ if (errno != EEXIST)
+ {
+ mkdir_error (file_name);
+ return 1;
+ }
+ break;
+ }
+
+ if (status == 0
+ || old_files_option == DEFAULT_OLD_FILES
+ || old_files_option == OVERWRITE_OLD_FILES)
+ {
+ if (status == 0)
+ delay_set_stat (file_name, &current_stat_info,
+ ((mode ^ current_stat_info.stat.st_mode)
+ & MODE_RWX & ~ current_umask),
+ ARCHIVED_PERMSTATUS);
+ else /* For an already existing directory, invert_perms must be 0 */
+ delay_set_stat (file_name, &current_stat_info,
+ 0,
+ UNKNOWN_PERMSTATUS);
+ }
+ return status;
+}
+
+
+static int
+open_output_file (char *file_name, int typeflag, mode_t mode)
+{
+ int fd;
+ int openflag = (O_WRONLY | O_BINARY | O_CREAT
+ | (old_files_option == OVERWRITE_OLD_FILES
+ ? O_TRUNC
+ : O_EXCL));
+
+#if O_CTG
+ /* Contiguous files (on the Masscomp) have to specify the size in
+ the open call that creates them. */
+
+ if (typeflag == CONTTYPE)
+ fd = open (file_name, openflag | O_CTG, mode, current_stat_info.stat.st_size);
+ else
+ fd = open (file_name, openflag, mode);
+
+#else /* not O_CTG */
+ if (typeflag == CONTTYPE)
+ {
+ static int conttype_diagnosed;
+
+ if (!conttype_diagnosed)
+ {
+ conttype_diagnosed = 1;
+ WARN ((0, 0, _("Extracting contiguous files as regular files")));
+ }
+ }
+ fd = open (file_name, openflag, mode);
+
+#endif /* not O_CTG */
+
+ return fd;
+}
+
+static int
+extract_file (char *file_name, int typeflag)
+{
+ int fd;
+ off_t size;
+ union block *data_block;
+ int status;
+ size_t count;
+ size_t written;
+ int interdir_made = 0;
+ mode_t mode = current_stat_info.stat.st_mode & MODE_RWX & ~ current_umask;
+ mode_t invert_permissions =
+ 0 < same_owner_option ? mode & (S_IRWXG | S_IRWXO) : 0;
+
+ /* FIXME: deal with protection issues. */
+
+ if (to_stdout_option)
+ fd = STDOUT_FILENO;
+ else if (to_command_option)
+ {
+ fd = sys_exec_command (file_name, 'f', &current_stat_info);
+ if (fd < 0)
+ {
+ skip_member ();
+ return 0;
+ }
+ }
+ else
+ {
+ do
+ fd = open_output_file (file_name, typeflag, mode ^ invert_permissions);
+ while (fd < 0 && maybe_recoverable (file_name, &interdir_made));
+
+ if (fd < 0)
+ {
+ skip_member ();
+ open_error (file_name);
+ return 1;
+ }
+ }
+
+ mv_begin (&current_stat_info);
+ if (current_stat_info.is_sparse)
+ sparse_extract_file (fd, &current_stat_info, &size);
+ else
+ for (size = current_stat_info.stat.st_size; size > 0; )
+ {
+ mv_size_left (size);
+
+ /* Locate data, determine max length writeable, write it,
+ block that we have used the data, then check if the write
+ worked. */
+
+ data_block = find_next_block ();
+ if (! data_block)
+ {
+ ERROR ((0, 0, _("Unexpected EOF in archive")));
+ break; /* FIXME: What happens, then? */
+ }
+
+ written = available_space_after (data_block);
+
+ if (written > size)
+ written = size;
+ errno = 0;
+ count = full_write (fd, data_block->buffer, written);
+ size -= written;
+
+ set_next_block_after ((union block *)
+ (data_block->buffer + written - 1));
+ if (count != written)
+ {
+ if (!to_command_option)
+ write_error_details (file_name, count, written);
+ /* FIXME: shouldn't we restore from backup? */
+ break;
+ }
+ }
+
+ skip_file (size);
+
+ mv_end ();
+
+ /* If writing to stdout, don't try to do anything to the filename;
+ it doesn't exist, or we don't want to touch it anyway. */
+
+ if (to_stdout_option)
+ return 0;
+
+ status = close (fd);
+ if (status < 0)
+ close_error (file_name);
+
+ if (to_command_option)
+ sys_wait_command ();
+ else
+ set_stat (file_name, &current_stat_info, NULL, invert_permissions,
+ (old_files_option == OVERWRITE_OLD_FILES ?
+ UNKNOWN_PERMSTATUS : ARCHIVED_PERMSTATUS),
+ typeflag);
+
+ return status;
+}
+
+/* Create a placeholder file with name FILE_NAME, which will be
+ replaced after other extraction is done by a symbolic link if
+ IS_SYMLINK is true, and by a hard link otherwise. Set
+ *INTERDIR_MADE if an intermediate directory is made in the
+ process. */
+
+static int
+create_placeholder_file (char *file_name, bool is_symlink, int *interdir_made)
+{
+ int fd;
+ struct stat st;
+
+ while ((fd = open (file_name, O_WRONLY | O_CREAT | O_EXCL, 0)) < 0)
+ if (! maybe_recoverable (file_name, interdir_made))
+ break;
+
+ if (fd < 0)
+ open_error (file_name);
+ else if (fstat (fd, &st) != 0)
+ {
+ stat_error (file_name);
+ close (fd);
+ }
+ else if (close (fd) != 0)
+ close_error (file_name);
+ else
+ {
+ struct delayed_set_stat *h;
+ struct delayed_link *p =
+ xmalloc (offsetof (struct delayed_link, target)
+ + strlen (current_stat_info.link_name)
+ + 1);
+ p->next = delayed_link_head;
+ delayed_link_head = p;
+ p->dev = st.st_dev;
+ p->ino = st.st_ino;
+ p->mtime = get_stat_mtime (&st);
+ p->is_symlink = is_symlink;
+ if (is_symlink)
+ {
+ p->uid = current_stat_info.stat.st_uid;
+ p->gid = current_stat_info.stat.st_gid;
+ }
+ p->sources = xmalloc (offsetof (struct string_list, string)
+ + strlen (file_name) + 1);
+ p->sources->next = 0;
+ strcpy (p->sources->string, file_name);
+ strcpy (p->target, current_stat_info.link_name);
+
+ h = delayed_set_stat_head;
+ if (h && ! h->after_links
+ && strncmp (file_name, h->file_name, h->file_name_len) == 0
+ && ISSLASH (file_name[h->file_name_len])
+ && (last_component (file_name) == file_name + h->file_name_len + 1))
+ {
+ do
+ {
+ h->after_links = 1;
+
+ if (stat (h->file_name, &st) != 0)
+ stat_error (h->file_name);
+ else
+ {
+ h->dev = st.st_dev;
+ h->ino = st.st_ino;
+ }
+ }
+ while ((h = h->next) && ! h->after_links);
+ }
+
+ return 0;
+ }
+
+ return -1;
+}
+
+static int
+extract_link (char *file_name, int typeflag)
+{
+ int interdir_made = 0;
+ char const *link_name;
+
+ transform_member_name (&current_stat_info.link_name, xform_link);
+ link_name = current_stat_info.link_name;
+
+ if (! absolute_names_option && contains_dot_dot (link_name))
+ return create_placeholder_file (file_name, false, &interdir_made);
+
+ do
+ {
+ struct stat st1, st2;
+ int e;
+ int status = link (link_name, file_name);
+ e = errno;
+
+ if (status == 0)
+ {
+ struct delayed_link *ds = delayed_link_head;
+ if (ds && lstat (link_name, &st1) == 0)
+ for (; ds; ds = ds->next)
+ if (ds->dev == st1.st_dev
+ && ds->ino == st1.st_ino
+ && timespec_cmp (ds->mtime, get_stat_mtime (&st1)) == 0)
+ {
+ struct string_list *p = xmalloc (offsetof (struct string_list, string)
+ + strlen (file_name) + 1);
+ strcpy (p->string, file_name);
+ p->next = ds->sources;
+ ds->sources = p;
+ break;
+ }
+ return 0;
+ }
+ else if ((e == EEXIST && strcmp (link_name, file_name) == 0)
+ || (lstat (link_name, &st1) == 0
+ && lstat (file_name, &st2) == 0
+ && st1.st_dev == st2.st_dev
+ && st1.st_ino == st2.st_ino))
+ return 0;
+
+ errno = e;
+ }
+ while (maybe_recoverable (file_name, &interdir_made));
+
+ if (!(incremental_option && errno == EEXIST))
+ {
+ link_error (link_name, file_name);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+extract_symlink (char *file_name, int typeflag)
+{
+#ifdef HAVE_SYMLINK
+ int status;
+ int interdir_made = 0;
+
+ transform_member_name (&current_stat_info.link_name, xform_symlink);
+
+ if (! absolute_names_option
+ && (IS_ABSOLUTE_FILE_NAME (current_stat_info.link_name)
+ || contains_dot_dot (current_stat_info.link_name)))
+ return create_placeholder_file (file_name, true, &interdir_made);
+
+ while ((status = symlink (current_stat_info.link_name, file_name)))
+ if (!maybe_recoverable (file_name, &interdir_made))
+ break;
+
+ if (status == 0)
+ set_stat (file_name, &current_stat_info, NULL, 0, 0, SYMTYPE);
+ else
+ symlink_error (current_stat_info.link_name, file_name);
+ return status;
+
+#else
+ static int warned_once;
+
+ if (!warned_once)
+ {
+ warned_once = 1;
+ WARN ((0, 0, _("Attempting extraction of symbolic links as hard links")));
+ }
+ return extract_link (file_name, typeflag);
+#endif
+}
+
+#if S_IFCHR || S_IFBLK
+static int
+extract_node (char *file_name, int typeflag)
+{
+ int status;
+ int interdir_made = 0;
+ mode_t mode = current_stat_info.stat.st_mode & ~ current_umask;
+ mode_t invert_permissions =
+ 0 < same_owner_option ? mode & (S_IRWXG | S_IRWXO) : 0;
+
+ do
+ status = mknod (file_name, mode ^ invert_permissions,
+ current_stat_info.stat.st_rdev);
+ while (status && maybe_recoverable (file_name, &interdir_made));
+
+ if (status != 0)
+ mknod_error (file_name);
+ else
+ set_stat (file_name, &current_stat_info, NULL, invert_permissions,
+ ARCHIVED_PERMSTATUS, typeflag);
+ return status;
+}
+#endif
+
+#if HAVE_MKFIFO || defined mkfifo
+static int
+extract_fifo (char *file_name, int typeflag)
+{
+ int status;
+ int interdir_made = 0;
+ mode_t mode = current_stat_info.stat.st_mode & ~ current_umask;
+ mode_t invert_permissions =
+ 0 < same_owner_option ? mode & (S_IRWXG | S_IRWXO) : 0;
+
+ while ((status = mkfifo (file_name, mode)) != 0)
+ if (!maybe_recoverable (file_name, &interdir_made))
+ break;
+
+ if (status == 0)
+ set_stat (file_name, &current_stat_info, NULL, invert_permissions,
+ ARCHIVED_PERMSTATUS, typeflag);
+ else
+ mkfifo_error (file_name);
+ return status;
+}
+#endif
+
+static int
+extract_volhdr (char *file_name, int typeflag)
+{
+ if (verbose_option)
+ fprintf (stdlis, _("Reading %s\n"), quote (current_stat_info.file_name));
+ skip_member ();
+ return 0;
+}
+
+static int
+extract_failure (char *file_name, int typeflag)
+{
+ return 1;
+}
+
+typedef int (*tar_extractor_t) (char *file_name, int typeflag);
+
+
+
+/* Prepare to extract a file. Find extractor function.
+ Return zero if extraction should not proceed. */
+
+static int
+prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
+{
+ int rc = 1;
+
+ if (EXTRACT_OVER_PIPE)
+ rc = 0;
+
+ /* Select the extractor */
+ switch (typeflag)
+ {
+ case GNUTYPE_SPARSE:
+ *fun = extract_file;
+ rc = 1;
+ break;
+
+ case AREGTYPE:
+ case REGTYPE:
+ case CONTTYPE:
+ /* Appears to be a file. But BSD tar uses the convention that a slash
+ suffix means a directory. */
+ if (current_stat_info.had_trailing_slash)
+ *fun = extract_dir;
+ else
+ {
+ *fun = extract_file;
+ rc = 1;
+ }
+ break;
+
+ case SYMTYPE:
+ *fun = extract_symlink;
+ break;
+
+ case LNKTYPE:
+ *fun = extract_link;
+ break;
+
+#if S_IFCHR
+ case CHRTYPE:
+ current_stat_info.stat.st_mode |= S_IFCHR;
+ *fun = extract_node;
+ break;
+#endif
+
+#if S_IFBLK
+ case BLKTYPE:
+ current_stat_info.stat.st_mode |= S_IFBLK;
+ *fun = extract_node;
+ break;
+#endif
+
+#if HAVE_MKFIFO || defined mkfifo
+ case FIFOTYPE:
+ *fun = extract_fifo;
+ break;
+#endif
+
+ case DIRTYPE:
+ case GNUTYPE_DUMPDIR:
+ *fun = extract_dir;
+ if (current_stat_info.is_dumpdir)
+ delay_directory_restore_option = true;
+ break;
+
+ case GNUTYPE_VOLHDR:
+ *fun = extract_volhdr;
+ break;
+
+ case GNUTYPE_MULTIVOL:
+ ERROR ((0, 0,
+ _("%s: Cannot extract -- file is continued from another volume"),
+ quotearg_colon (current_stat_info.file_name)));
+ *fun = extract_failure;
+ break;
+
+ case GNUTYPE_LONGNAME:
+ case GNUTYPE_LONGLINK:
+ ERROR ((0, 0, _("Unexpected long name header")));
+ *fun = extract_failure;
+ break;
+
+ default:
+ WARN ((0, 0,
+ _("%s: Unknown file type `%c', extracted as normal file"),
+ quotearg_colon (file_name), typeflag));
+ *fun = extract_file;
+ }
+
+ /* Determine whether the extraction should proceed */
+ if (rc == 0)
+ return 0;
+
+ switch (old_files_option)
+ {
+ case UNLINK_FIRST_OLD_FILES:
+ if (!remove_any_file (file_name,
+ recursive_unlink_option ? RECURSIVE_REMOVE_OPTION
+ : ORDINARY_REMOVE_OPTION)
+ && errno && errno != ENOENT)
+ {
+ unlink_error (file_name);
+ return 0;
+ }
+ break;
+
+ case KEEP_NEWER_FILES:
+ if (file_newer_p (file_name, &current_stat_info))
+ {
+ WARN ((0, 0, _("Current %s is newer or same age"),
+ quote (file_name)));
+ return 0;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return 1;
+}
+
+/* Extract a file from the archive. */
+void
+extract_archive (void)
+{
+ char typeflag;
+ tar_extractor_t fun;
+
+ set_next_block_after (current_header);
+ decode_header (current_header, &current_stat_info, &current_format, 1);
+ if (!current_stat_info.file_name[0]
+ || (interactive_option
+ && !confirm ("extract", current_stat_info.file_name)))
+ {
+ skip_member ();
+ return;
+ }
+
+ /* Print the block from current_header and current_stat. */
+ if (verbose_option)
+ print_header (&current_stat_info, -1);
+
+ /* Restore stats for all non-ancestor directories, unless
+ it is an incremental archive.
+ (see NOTICE in the comment to delay_set_stat above) */
+ if (!delay_directory_restore_option)
+ apply_nonancestor_delayed_set_stat (current_stat_info.file_name, 0);
+
+ /* Take a safety backup of a previously existing file. */
+
+ if (backup_option)
+ if (!maybe_backup_file (current_stat_info.file_name, 0))
+ {
+ int e = errno;
+ ERROR ((0, e, _("%s: Was unable to backup this file"),
+ quotearg_colon (current_stat_info.file_name)));
+ skip_member ();
+ return;
+ }
+
+ /* Extract the archive entry according to its type. */
+ /* KLUDGE */
+ typeflag = sparse_member_p (&current_stat_info) ?
+ GNUTYPE_SPARSE : current_header->header.typeflag;
+
+ if (prepare_to_extract (current_stat_info.file_name, typeflag, &fun))
+ {
+ if (fun && (*fun) (current_stat_info.file_name, typeflag)
+ && backup_option)
+ undo_last_backup ();
+ }
+ else
+ skip_member ();
+
+}
+
+/* Extract the symbolic links whose final extraction were delayed. */
+static void
+apply_delayed_links (void)
+{
+ struct delayed_link *ds;
+
+ for (ds = delayed_link_head; ds; )
+ {
+ struct string_list *sources = ds->sources;
+ char const *valid_source = 0;
+
+ for (sources = ds->sources; sources; sources = sources->next)
+ {
+ char const *source = sources->string;
+ struct stat st;
+
+ /* Make sure the placeholder file is still there. If not,
+ don't create a link, as the placeholder was probably
+ removed by a later extraction. */
+ if (lstat (source, &st) == 0
+ && st.st_dev == ds->dev
+ && st.st_ino == ds->ino
+ && timespec_cmp (get_stat_mtime (&st), ds->mtime) == 0)
+ {
+ /* Unlink the placeholder, then create a hard link if possible,
+ a symbolic link otherwise. */
+ if (unlink (source) != 0)
+ unlink_error (source);
+ else if (valid_source && link (valid_source, source) == 0)
+ ;
+ else if (!ds->is_symlink)
+ {
+ if (link (ds->target, source) != 0)
+ link_error (ds->target, source);
+ }
+ else if (symlink (ds->target, source) != 0)
+ symlink_error (ds->target, source);
+ else
+ {
+ struct tar_stat_info st1;
+ st1.stat.st_uid = ds->uid;
+ st1.stat.st_gid = ds->gid;
+ set_stat (source, &st1, NULL, 0, 0, SYMTYPE);
+ valid_source = source;
+ }
+ }
+ }
+
+ for (sources = ds->sources; sources; )
+ {
+ struct string_list *next = sources->next;
+ free (sources);
+ sources = next;
+ }
+
+ {
+ struct delayed_link *next = ds->next;
+ free (ds);
+ ds = next;
+ }
+ }
+
+ delayed_link_head = 0;
+}
+
+/* Finish the extraction of an archive. */
+void
+extract_finish (void)
+{
+ /* First, fix the status of ordinary directories that need fixing. */
+ apply_nonancestor_delayed_set_stat ("", 0);
+
+ /* Then, apply delayed links, so that they don't affect delayed
+ directory status-setting for ordinary directories. */
+ apply_delayed_links ();
+
+ /* Finally, fix the status of directories that are ancestors
+ of delayed links. */
+ apply_nonancestor_delayed_set_stat ("", 1);
+}
+
+bool
+rename_directory (char *src, char *dst)
+{
+ if (rename (src, dst))
+ {
+ int e = errno;
+
+ switch (e)
+ {
+ case ENOENT:
+ if (make_directories (dst))
+ {
+ if (rename (src, dst) == 0)
+ return true;
+ e = errno;
+ }
+ break;
+
+ case EXDEV:
+ /* FIXME: Fall back to recursive copying */
+
+ default:
+ break;
+ }
+
+ ERROR ((0, e, _("Cannot rename %s to %s"),
+ quote_n (0, src),
+ quote_n (1, dst)));
+ return false;
+ }
+ return true;
+}
+
+void
+fatal_exit (void)
+{
+ extract_finish ();
+ error (TAREXIT_FAILURE, 0, _("Error is not recoverable: exiting now"));
+ abort ();
+}
+
+void
+xalloc_die (void)
+{
+ error (0, 0, "%s", _("memory exhausted"));
+ fatal_exit ();
+}
diff --git a/src/incremen.c b/src/incremen.c
new file mode 100644
index 0000000..59215e5
--- /dev/null
+++ b/src/incremen.c
@@ -0,0 +1,1473 @@
+/* GNU dump extensions to tar.
+
+ Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
+ 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <getline.h>
+#include <hash.h>
+#include <quotearg.h>
+#include "common.h"
+
+/* Incremental dump specialities. */
+
+/* Which child files to save under a directory. */
+enum children
+ {
+ NO_CHILDREN,
+ CHANGED_CHILDREN,
+ ALL_CHILDREN
+ };
+
+#define DIRF_INIT 0x0001 /* directory structure is initialized
+ (procdir called at least once) */
+#define DIRF_NFS 0x0002 /* directory is mounted on nfs */
+#define DIRF_FOUND 0x0004 /* directory is found on fs */
+#define DIRF_NEW 0x0008 /* directory is new (not found
+ in the previous dump) */
+#define DIRF_RENAMED 0x0010 /* directory is renamed */
+
+#define DIR_IS_INITED(d) ((d)->flags & DIRF_INIT)
+#define DIR_IS_NFS(d) ((d)->flags & DIRF_NFS)
+#define DIR_IS_FOUND(d) ((d)->flags & DIRF_FOUND)
+#define DIR_IS_NEW(d) ((d)->flags & DIRF_NEW)
+#define DIR_IS_RENAMED(d) ((d)->flags & DIRF_RENAMED)
+
+#define DIR_SET_FLAG(d,f) (d)->flags |= (f)
+#define DIR_CLEAR_FLAG(d,f) (d)->flags &= ~(f)
+
+/* Directory attributes. */
+struct directory
+ {
+ struct timespec mtime; /* Modification time */
+ dev_t device_number; /* device number for directory */
+ ino_t inode_number; /* inode number for directory */
+ char *contents; /* Directory contents */
+ char *icontents; /* Initial contents if the directory was
+ rescanned */
+ enum children children; /* What to save under this directory */
+ unsigned flags; /* See DIRF_ macros above */
+ struct directory *orig; /* If the directory was renamed, points to
+ the original directory structure */
+ char name[1]; /* file name of directory */
+ };
+
+static Hash_table *directory_table;
+static Hash_table *directory_meta_table;
+
+#if HAVE_ST_FSTYPE_STRING
+ static char const nfs_string[] = "nfs";
+# define NFS_FILE_STAT(st) (strcmp ((st).st_fstype, nfs_string) == 0)
+#else
+# define ST_DEV_MSB(st) (~ (dev_t) 0 << (sizeof (st).st_dev * CHAR_BIT - 1))
+# define NFS_FILE_STAT(st) (((st).st_dev & ST_DEV_MSB (st)) != 0)
+#endif
+
+/* Calculate the hash of a directory. */
+static size_t
+hash_directory_name (void const *entry, size_t n_buckets)
+{
+ struct directory const *directory = entry;
+ return hash_string (directory->name, n_buckets);
+}
+
+/* Compare two directories for equality of their names. */
+static bool
+compare_directory_names (void const *entry1, void const *entry2)
+{
+ struct directory const *directory1 = entry1;
+ struct directory const *directory2 = entry2;
+ return strcmp (directory1->name, directory2->name) == 0;
+}
+
+static size_t
+hash_directory_meta (void const *entry, size_t n_buckets)
+{
+ struct directory const *directory = entry;
+ /* FIXME: Work out a better algorytm */
+ return (directory->device_number + directory->inode_number) % n_buckets;
+}
+
+/* Compare two directories for equality of their device and inode numbers. */
+static bool
+compare_directory_meta (void const *entry1, void const *entry2)
+{
+ struct directory const *directory1 = entry1;
+ struct directory const *directory2 = entry2;
+ return directory1->device_number == directory2->device_number
+ && directory1->inode_number == directory2->inode_number;
+}
+
+/* Make a directory entry for given NAME */
+static struct directory *
+make_directory (const char *name)
+{
+ size_t namelen = strlen (name);
+ size_t size = offsetof (struct directory, name) + namelen + 1;
+ struct directory *directory = xmalloc (size);
+ directory->contents = directory->icontents = NULL;
+ directory->orig = NULL;
+ directory->flags = false;
+ strcpy (directory->name, name);
+ if (ISSLASH (directory->name[namelen-1]))
+ directory->name[namelen-1] = 0;
+ return directory;
+}
+
+/* Create and link a new directory entry for directory NAME, having a
+ device number DEV and an inode number INO, with NFS indicating
+ whether it is an NFS device and FOUND indicating whether we have
+ found that the directory exists. */
+static struct directory *
+note_directory (char const *name, struct timespec mtime,
+ dev_t dev, ino_t ino, bool nfs, bool found, char *contents)
+{
+ struct directory *directory = make_directory (name);
+
+ directory->mtime = mtime;
+ directory->device_number = dev;
+ directory->inode_number = ino;
+ directory->children = CHANGED_CHILDREN;
+ if (nfs)
+ DIR_SET_FLAG (directory, DIRF_NFS);
+ if (found)
+ DIR_SET_FLAG (directory, DIRF_FOUND);
+ if (contents)
+ {
+ size_t size = dumpdir_size (contents);
+ directory->contents = xmalloc (size);
+ memcpy (directory->contents, contents, size);
+ }
+ else
+ directory->contents = NULL;
+
+ if (! ((directory_table
+ || (directory_table = hash_initialize (0, 0,
+ hash_directory_name,
+ compare_directory_names, 0)))
+ && hash_insert (directory_table, directory)))
+ xalloc_die ();
+
+ if (! ((directory_meta_table
+ || (directory_meta_table = hash_initialize (0, 0,
+ hash_directory_meta,
+ compare_directory_meta,
+ 0)))
+ && hash_insert (directory_meta_table, directory)))
+ xalloc_die ();
+
+ return directory;
+}
+
+/* Return a directory entry for a given file NAME, or zero if none found. */
+static struct directory *
+find_directory (const char *name)
+{
+ if (! directory_table)
+ return 0;
+ else
+ {
+ struct directory *dir = make_directory (name);
+ struct directory *ret = hash_lookup (directory_table, dir);
+ free (dir);
+ return ret;
+ }
+}
+
+/* Return a directory entry for a given combination of device and inode
+ numbers, or zero if none found. */
+static struct directory *
+find_directory_meta (dev_t dev, ino_t ino)
+{
+ if (! directory_meta_table)
+ return 0;
+ else
+ {
+ struct directory *dir = make_directory ("");
+ struct directory *ret;
+ dir->device_number = dev;
+ dir->inode_number = ino;
+ ret = hash_lookup (directory_meta_table, dir);
+ free (dir);
+ return ret;
+ }
+}
+
+void
+update_parent_directory (const char *name)
+{
+ struct directory *directory;
+ char *p;
+
+ p = dir_name (name);
+ directory = find_directory (p);
+ if (directory)
+ {
+ struct stat st;
+ if (deref_stat (dereference_option, p, &st) != 0)
+ stat_diag (name);
+ else
+ directory->mtime = get_stat_mtime (&st);
+ }
+ free (p);
+}
+
+static struct directory *
+procdir (char *name_buffer, struct stat *stat_data,
+ dev_t device,
+ enum children children,
+ bool verbose)
+{
+ struct directory *directory;
+ bool nfs = NFS_FILE_STAT (*stat_data);
+
+ if ((directory = find_directory (name_buffer)) != NULL)
+ {
+ if (DIR_IS_INITED (directory))
+ return directory;
+
+ /* With NFS, the same file can have two different devices
+ if an NFS directory is mounted in multiple locations,
+ which is relatively common when automounting.
+ To avoid spurious incremental redumping of
+ directories, consider all NFS devices as equal,
+ relying on the i-node to establish differences. */
+
+ if (! (((DIR_IS_NFS (directory) & nfs)
+ || directory->device_number == stat_data->st_dev)
+ && directory->inode_number == stat_data->st_ino))
+ {
+ /* FIXME: find_directory_meta ignores nfs */
+ struct directory *d = find_directory_meta (stat_data->st_dev,
+ stat_data->st_ino);
+ if (d)
+ {
+ if (verbose_option)
+ WARN ((0, 0, _("%s: Directory has been renamed from %s"),
+ quotearg_colon (name_buffer),
+ quote_n (1, d->name)));
+ directory->orig = d;
+ DIR_SET_FLAG (directory, DIRF_RENAMED);
+ directory->children = CHANGED_CHILDREN;
+ }
+ else
+ {
+ if (verbose_option)
+ WARN ((0, 0, _("%s: Directory has been renamed"),
+ quotearg_colon (name_buffer)));
+ directory->children = ALL_CHILDREN;
+ directory->device_number = stat_data->st_dev;
+ directory->inode_number = stat_data->st_ino;
+ }
+ if (nfs)
+ DIR_SET_FLAG (directory, DIRF_NFS);
+ }
+ else
+ directory->children = CHANGED_CHILDREN;
+
+ DIR_SET_FLAG (directory, DIRF_FOUND);
+ }
+ else
+ {
+ struct directory *d = find_directory_meta (stat_data->st_dev,
+ stat_data->st_ino);
+
+ directory = note_directory (name_buffer,
+ get_stat_mtime(stat_data),
+ stat_data->st_dev,
+ stat_data->st_ino,
+ nfs,
+ true,
+ NULL);
+
+ if (d)
+ {
+ if (verbose)
+ WARN ((0, 0, _("%s: Directory has been renamed from %s"),
+ quotearg_colon (name_buffer),
+ quote_n (1, d->name)));
+ directory->orig = d;
+ DIR_SET_FLAG (directory, DIRF_RENAMED);
+ directory->children = CHANGED_CHILDREN;
+ }
+ else
+ {
+ DIR_SET_FLAG (directory, DIRF_NEW);
+ if (verbose)
+ WARN ((0, 0, _("%s: Directory is new"),
+ quotearg_colon (name_buffer)));
+ directory->children =
+ (listed_incremental_option
+ || (OLDER_STAT_TIME (*stat_data, m)
+ || (after_date_option
+ && OLDER_STAT_TIME (*stat_data, c))))
+ ? ALL_CHILDREN
+ : CHANGED_CHILDREN;
+ }
+ }
+
+ /* If the directory is on another device and --one-file-system was given,
+ omit it... */
+ if (one_file_system_option && device != stat_data->st_dev
+ /* ... except if it was explicitely given in the command line */
+ && !is_individual_file (name_buffer))
+ directory->children = NO_CHILDREN;
+ else if (children == ALL_CHILDREN)
+ directory->children = ALL_CHILDREN;
+
+ DIR_SET_FLAG (directory, DIRF_INIT);
+
+ return directory;
+}
+
+/* Locate NAME in the dumpdir array DUMP.
+ Return pointer to the slot in the array, or NULL if not found */
+const char *
+dumpdir_locate (const char *dump, const char *name)
+{
+ if (dump)
+ while (*dump)
+ {
+ /* Ignore 'R' (rename) and 'X' (tempname) entries, since they break
+ alphabetical ordering.
+ They normally do not occur in dumpdirs from the snapshot files,
+ but this function is also used by purge_directory, which operates
+ on a dumpdir from the archive, hence the need for this test. */
+ if (!strchr ("RX", *dump))
+ {
+ int rc = strcmp (dump + 1, name);
+ if (rc == 0)
+ return dump;
+ if (rc > 1)
+ break;
+ }
+ dump += strlen (dump) + 1;
+ }
+ return NULL;
+}
+
+/* Return size in bytes of the dumpdir array P */
+size_t
+dumpdir_size (const char *p)
+{
+ size_t totsize = 0;
+
+ while (*p)
+ {
+ size_t size = strlen (p) + 1;
+ totsize += size;
+ p += size;
+ }
+ return totsize + 1;
+}
+
+static int
+compare_dirnames (const void *first, const void *second)
+{
+ char const *const *name1 = first;
+ char const *const *name2 = second;
+ return strcmp (*name1, *name2);
+}
+
+/* Compare dumpdir array from DIRECTORY with directory listing DIR and
+ build a new dumpdir template.
+
+ DIR must be returned by a previous call to savedir().
+
+ File names in DIRECTORY->contents must be sorted
+ alphabetically.
+
+ DIRECTORY->contents is replaced with the created template. Each entry is
+ prefixed with ' ' if it was present in DUMP and with 'Y' otherwise. */
+
+void
+makedumpdir (struct directory *directory, const char *dir)
+{
+ size_t i,
+ dirsize, /* Number of elements in DIR */
+ len; /* Length of DIR, including terminating nul */
+ const char *p;
+ char const **array;
+ char *new_dump, *new_dump_ptr;
+ const char *dump;
+
+ if (directory->children == ALL_CHILDREN)
+ dump = NULL;
+ else if (DIR_IS_RENAMED (directory))
+ dump = directory->orig->icontents ?
+ directory->orig->icontents : directory->orig->contents;
+ else
+ dump = directory->contents;
+
+ /* Count the size of DIR and the number of elements it contains */
+ dirsize = 0;
+ len = 0;
+ for (p = dir; *p; p += strlen (p) + 1, dirsize++)
+ len += strlen (p) + 2;
+ len++;
+
+ /* Create a sorted directory listing */
+ array = xcalloc (dirsize, sizeof array[0]);
+ for (i = 0, p = dir; *p; p += strlen (p) + 1, i++)
+ array[i] = p;
+
+ qsort (array, dirsize, sizeof (array[0]), compare_dirnames);
+
+ /* Prepare space for new dumpdir */
+ new_dump = xmalloc (len);
+ new_dump_ptr = new_dump;
+
+ /* Fill in the dumpdir template */
+ for (i = 0; i < dirsize; i++)
+ {
+ const char *loc = dumpdir_locate (dump, array[i]);
+ if (loc)
+ {
+ *new_dump_ptr++ = ' ';
+ dump = loc + strlen (loc) + 1;
+ }
+ else
+ *new_dump_ptr++ = 'Y'; /* New entry */
+
+ /* Copy the file name */
+ for (p = array[i]; (*new_dump_ptr++ = *p++); )
+ ;
+ }
+ *new_dump_ptr = 0;
+ directory->icontents = directory->contents;
+ directory->contents = new_dump;
+ free (array);
+}
+
+/* Recursively scan the given directory. */
+static char *
+scan_directory (char *dir_name, dev_t device)
+{
+ char *dirp = savedir (dir_name); /* for scanning directory */
+ char *name_buffer; /* directory, `/', and directory member */
+ size_t name_buffer_size; /* allocated size of name_buffer, minus 2 */
+ size_t name_length; /* used length in name_buffer */
+ struct stat stat_data;
+ struct directory *directory;
+
+ if (! dirp)
+ savedir_error (dir_name);
+
+ name_buffer_size = strlen (dir_name) + NAME_FIELD_SIZE;
+ name_buffer = xmalloc (name_buffer_size + 2);
+ strcpy (name_buffer, dir_name);
+ if (! ISSLASH (dir_name[strlen (dir_name) - 1]))
+ strcat (name_buffer, "/");
+ name_length = strlen (name_buffer);
+
+ if (deref_stat (dereference_option, name_buffer, &stat_data))
+ {
+ stat_diag (name_buffer);
+ /* FIXME: used to be
+ children = CHANGED_CHILDREN;
+ but changed to: */
+ free (name_buffer);
+ free (dirp);
+ return NULL;
+ }
+
+ directory = procdir (name_buffer, &stat_data, device, NO_CHILDREN, false);
+
+ if (dirp && directory->children != NO_CHILDREN)
+ {
+ char *entry; /* directory entry being scanned */
+ size_t entrylen; /* length of directory entry */
+
+ makedumpdir (directory, dirp);
+
+ for (entry = directory->contents;
+ (entrylen = strlen (entry)) != 0;
+ entry += entrylen + 1)
+ {
+ if (name_buffer_size <= entrylen - 1 + name_length)
+ {
+ do
+ name_buffer_size += NAME_FIELD_SIZE;
+ while (name_buffer_size <= entrylen - 1 + name_length);
+ name_buffer = xrealloc (name_buffer, name_buffer_size + 2);
+ }
+ strcpy (name_buffer + name_length, entry + 1);
+
+ if (excluded_name (name_buffer))
+ *entry = 'N';
+ else
+ {
+ if (deref_stat (dereference_option, name_buffer, &stat_data))
+ {
+ stat_diag (name_buffer);
+ *entry = 'N';
+ continue;
+ }
+
+ if (S_ISDIR (stat_data.st_mode))
+ {
+ procdir (name_buffer, &stat_data, device,
+ directory->children,
+ verbose_option);
+ *entry = 'D';
+ }
+
+ else if (one_file_system_option && device != stat_data.st_dev)
+ *entry = 'N';
+
+ else if (*entry == 'Y')
+ /* New entry, skip further checks */;
+
+ /* FIXME: if (S_ISHIDDEN (stat_data.st_mode))?? */
+
+ else if (OLDER_STAT_TIME (stat_data, m)
+ && (!after_date_option
+ || OLDER_STAT_TIME (stat_data, c)))
+ *entry = 'N';
+ else
+ *entry = 'Y';
+ }
+ }
+ }
+
+ free (name_buffer);
+ if (dirp)
+ free (dirp);
+
+ return directory->contents;
+}
+
+char *
+get_directory_contents (char *dir_name, dev_t device)
+{
+ return scan_directory (dir_name, device);
+}
+
+
+static void
+obstack_code_rename (struct obstack *stk, char *from, char *to)
+{
+ obstack_1grow (stk, 'R');
+ obstack_grow (stk, from, strlen (from) + 1);
+ obstack_1grow (stk, 'T');
+ obstack_grow (stk, to, strlen (to) + 1);
+}
+
+static bool
+rename_handler (void *data, void *proc_data)
+{
+ struct directory *dir = data;
+ struct obstack *stk = proc_data;
+
+ if (DIR_IS_RENAMED (dir))
+ {
+ struct directory *prev, *p;
+
+ /* Detect eventual cycles and clear DIRF_RENAMED flag, so these entries
+ are ignored when hit by this function next time.
+ If the chain forms a cycle, prev points to the entry DIR is renamed
+ from. In this case it still retains DIRF_RENAMED flag, which will be
+ cleared in the `else' branch below */
+ for (prev = dir; prev && prev->orig != dir; prev = prev->orig)
+ DIR_CLEAR_FLAG (prev, DIRF_RENAMED);
+
+ if (prev == NULL)
+ {
+ for (p = dir; p && p->orig; p = p->orig)
+ obstack_code_rename (stk, p->orig->name, p->name);
+ }
+ else
+ {
+ char *temp_name;
+
+ DIR_CLEAR_FLAG (prev, DIRF_RENAMED);
+
+ /* Break the cycle by using a temporary name for one of its
+ elements.
+ First, create a temp name stub entry. */
+ temp_name = dir_name (dir->name);
+ obstack_1grow (stk, 'X');
+ obstack_grow (stk, temp_name, strlen (temp_name) + 1);
+
+ obstack_code_rename (stk, dir->name, "");
+
+ for (p = dir; p != prev; p = p->orig)
+ obstack_code_rename (stk, p->orig->name, p->name);
+
+ obstack_code_rename (stk, "", prev->name);
+ }
+ }
+ return true;
+}
+
+const char *
+append_incremental_renames (const char *dump)
+{
+ struct obstack stk;
+ size_t size;
+
+ if (directory_table == NULL)
+ return dump;
+
+ obstack_init (&stk);
+ if (dump)
+ {
+ size = dumpdir_size (dump) - 1;
+ obstack_grow (&stk, dump, size);
+ }
+ else
+ size = 0;
+
+ hash_do_for_each (directory_table, rename_handler, &stk);
+ if (obstack_object_size (&stk) != size)
+ {
+ obstack_1grow (&stk, 0);
+ dump = obstack_finish (&stk);
+ }
+ else
+ obstack_free (&stk, NULL);
+ return dump;
+}
+
+
+
+static FILE *listed_incremental_stream;
+
+/* Version of incremental format snapshots (directory files) used by this
+ tar. Currently it is supposed to be a single decimal number. 0 means
+ incremental snapshots as per tar version before 1.15.2.
+
+ The current tar version supports incremental versions from
+ 0 up to TAR_INCREMENTAL_VERSION, inclusive.
+ It is able to create only snapshots of TAR_INCREMENTAL_VERSION */
+
+#define TAR_INCREMENTAL_VERSION 2
+
+/* Read incremental snapshot formats 0 and 1 */
+static void
+read_incr_db_01 (int version, const char *initbuf)
+{
+ int n;
+ uintmax_t u;
+ time_t sec;
+ long int nsec;
+ char *buf = 0;
+ size_t bufsize;
+ char *ebuf;
+ long lineno = 1;
+
+ if (version == 1)
+ {
+ if (getline (&buf, &bufsize, listed_incremental_stream) <= 0)
+ {
+ read_error (listed_incremental_option);
+ free (buf);
+ return;
+ }
+ ++lineno;
+ }
+ else
+ {
+ buf = strdup (initbuf);
+ bufsize = strlen (buf) + 1;
+ }
+
+ sec = TYPE_MINIMUM (time_t);
+ nsec = -1;
+ errno = 0;
+ u = strtoumax (buf, &ebuf, 10);
+ if (!errno && TYPE_MAXIMUM (time_t) < u)
+ errno = ERANGE;
+ if (errno || buf == ebuf)
+ ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option),
+ lineno,
+ _("Invalid time stamp")));
+ else
+ {
+ sec = u;
+
+ if (version == 1 && *ebuf)
+ {
+ char const *buf_ns = ebuf + 1;
+ errno = 0;
+ u = strtoumax (buf_ns, &ebuf, 10);
+ if (!errno && BILLION <= u)
+ errno = ERANGE;
+ if (errno || buf_ns == ebuf)
+ {
+ ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option),
+ lineno,
+ _("Invalid time stamp")));
+ sec = TYPE_MINIMUM (time_t);
+ }
+ else
+ nsec = u;
+ }
+ else
+ {
+ /* pre-1 incremental format does not contain nanoseconds */
+ nsec = 0;
+ }
+ }
+ newer_mtime_option.tv_sec = sec;
+ newer_mtime_option.tv_nsec = nsec;
+
+
+ while (0 < (n = getline (&buf, &bufsize, listed_incremental_stream)))
+ {
+ dev_t dev;
+ ino_t ino;
+ bool nfs = buf[0] == '+';
+ char *strp = buf + nfs;
+ struct timespec mtime;
+
+ lineno++;
+
+ if (buf[n - 1] == '\n')
+ buf[n - 1] = '\0';
+
+ if (version == 1)
+ {
+ errno = 0;
+ u = strtoumax (strp, &ebuf, 10);
+ if (!errno && TYPE_MAXIMUM (time_t) < u)
+ errno = ERANGE;
+ if (errno || strp == ebuf || *ebuf != ' ')
+ {
+ ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option), lineno,
+ _("Invalid modification time (seconds)")));
+ sec = (time_t) -1;
+ }
+ else
+ sec = u;
+ strp = ebuf;
+
+ errno = 0;
+ u = strtoumax (strp, &ebuf, 10);
+ if (!errno && BILLION <= u)
+ errno = ERANGE;
+ if (errno || strp == ebuf || *ebuf != ' ')
+ {
+ ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option), lineno,
+ _("Invalid modification time (nanoseconds)")));
+ nsec = -1;
+ }
+ else
+ nsec = u;
+ mtime.tv_sec = sec;
+ mtime.tv_nsec = nsec;
+ strp = ebuf;
+ }
+ else
+ memset (&mtime, 0, sizeof mtime);
+
+ errno = 0;
+ u = strtoumax (strp, &ebuf, 10);
+ if (!errno && TYPE_MAXIMUM (dev_t) < u)
+ errno = ERANGE;
+ if (errno || strp == ebuf || *ebuf != ' ')
+ {
+ ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option), lineno,
+ _("Invalid device number")));
+ dev = (dev_t) -1;
+ }
+ else
+ dev = u;
+ strp = ebuf;
+
+ errno = 0;
+ u = strtoumax (strp, &ebuf, 10);
+ if (!errno && TYPE_MAXIMUM (ino_t) < u)
+ errno = ERANGE;
+ if (errno || strp == ebuf || *ebuf != ' ')
+ {
+ ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option), lineno,
+ _("Invalid inode number")));
+ ino = (ino_t) -1;
+ }
+ else
+ ino = u;
+ strp = ebuf;
+
+ strp++;
+ unquote_string (strp);
+ note_directory (strp, mtime, dev, ino, nfs, false, NULL);
+ }
+ free (buf);
+}
+
+/* Read a nul-terminated string from FP and store it in STK.
+ Store the number of bytes read (including nul terminator) in PCOUNT.
+
+ Return the last character read or EOF on end of file. */
+static int
+read_obstack (FILE *fp, struct obstack *stk, size_t *pcount)
+{
+ int c;
+ size_t i;
+
+ for (i = 0, c = getc (fp); c != EOF && c != 0; c = getc (fp), i++)
+ obstack_1grow (stk, c);
+ obstack_1grow (stk, 0);
+
+ *pcount = i;
+ return c;
+}
+
+/* Read from file FP a nul-terminated string and convert it to
+ intmax_t. Return the resulting value in PVAL. Assume '-' has
+ already been read.
+
+ Throw a fatal error if the string cannot be converted or if the
+ converted value is less than MIN_VAL. */
+
+static void
+read_negative_num (FILE *fp, intmax_t min_val, intmax_t *pval)
+{
+ int c;
+ size_t i;
+ char buf[INT_BUFSIZE_BOUND (intmax_t)];
+ char *ep;
+ buf[0] = '-';
+
+ for (i = 1; ISDIGIT (c = getc (fp)); i++)
+ {
+ if (i == sizeof buf - 1)
+ FATAL_ERROR ((0, 0, _("Field too long while reading snapshot file")));
+ buf[i] = c;
+ }
+
+ if (c < 0)
+ {
+ if (ferror (fp))
+ FATAL_ERROR ((0, errno, _("Read error in snapshot file")));
+ else
+ FATAL_ERROR ((0, 0, _("Unexpected EOF in snapshot file")));
+ }
+
+ buf[i] = 0;
+ errno = 0;
+ *pval = strtoimax (buf, &ep, 10);
+ if (c || errno || *pval < min_val)
+ FATAL_ERROR ((0, errno, _("Unexpected field value in snapshot file")));
+}
+
+/* Read from file FP a nul-terminated string and convert it to
+ uintmax_t. Return the resulting value in PVAL. Assume C has
+ already been read.
+
+ Throw a fatal error if the string cannot be converted or if the
+ converted value exceeds MAX_VAL.
+
+ Return the last character read or EOF on end of file. */
+
+static int
+read_unsigned_num (int c, FILE *fp, uintmax_t max_val, uintmax_t *pval)
+{
+ size_t i;
+ char buf[UINTMAX_STRSIZE_BOUND], *ep;
+
+ for (i = 0; ISDIGIT (c); i++)
+ {
+ if (i == sizeof buf - 1)
+ FATAL_ERROR ((0, 0, _("Field too long while reading snapshot file")));
+ buf[i] = c;
+ c = getc (fp);
+ }
+
+ if (c < 0)
+ {
+ if (ferror (fp))
+ FATAL_ERROR ((0, errno, _("Read error in snapshot file")));
+ else if (i == 0)
+ return c;
+ else
+ FATAL_ERROR ((0, 0, _("Unexpected EOF in snapshot file")));
+ }
+
+ buf[i] = 0;
+ errno = 0;
+ *pval = strtoumax (buf, &ep, 10);
+ if (c || errno || max_val < *pval)
+ FATAL_ERROR ((0, errno, _("Unexpected field value in snapshot file")));
+ return c;
+}
+
+/* Read from file FP a nul-terminated string and convert it to
+ uintmax_t. Return the resulting value in PVAL.
+
+ Throw a fatal error if the string cannot be converted or if the
+ converted value exceeds MAX_VAL.
+
+ Return the last character read or EOF on end of file. */
+
+static int
+read_num (FILE *fp, uintmax_t max_val, uintmax_t *pval)
+{
+ return read_unsigned_num (getc (fp), fp, max_val, pval);
+}
+
+/* Read from FP two NUL-terminated strings representing a struct
+ timespec. Return the resulting value in PVAL.
+
+ Throw a fatal error if the string cannot be converted. */
+
+static void
+read_timespec (FILE *fp, struct timespec *pval)
+{
+ int c = getc (fp);
+ intmax_t i;
+ uintmax_t u;
+
+ if (c == '-')
+ {
+ read_negative_num (fp, TYPE_MINIMUM (time_t), &i);
+ c = 0;
+ pval->tv_sec = i;
+ }
+ else
+ {
+ c = read_unsigned_num (c, fp, TYPE_MAXIMUM (time_t), &u);
+ pval->tv_sec = u;
+ }
+
+ if (c || read_num (fp, BILLION - 1, &u))
+ FATAL_ERROR ((0, 0, "%s: %s",
+ quotearg_colon (listed_incremental_option),
+ _("Unexpected EOF in snapshot file")));
+ pval->tv_nsec = u;
+}
+
+/* Read incremental snapshot format 2 */
+static void
+read_incr_db_2 ()
+{
+ uintmax_t u;
+ struct obstack stk;
+
+ obstack_init (&stk);
+
+ read_timespec (listed_incremental_stream, &newer_mtime_option);
+
+ for (;;)
+ {
+ struct timespec mtime;
+ dev_t dev;
+ ino_t ino;
+ bool nfs;
+ char *name;
+ char *content;
+ size_t s;
+
+ if (read_num (listed_incremental_stream, 1, &u))
+ return; /* Normal return */
+
+ nfs = u;
+
+ read_timespec (listed_incremental_stream, &mtime);
+
+ if (read_num (listed_incremental_stream, TYPE_MAXIMUM (dev_t), &u))
+ break;
+ dev = u;
+
+ if (read_num (listed_incremental_stream, TYPE_MAXIMUM (ino_t), &u))
+ break;
+ ino = u;
+
+ if (read_obstack (listed_incremental_stream, &stk, &s))
+ break;
+
+ name = obstack_finish (&stk);
+
+ while (read_obstack (listed_incremental_stream, &stk, &s) == 0 && s > 1)
+ ;
+ if (getc (listed_incremental_stream) != 0)
+ FATAL_ERROR ((0, 0, "%s: %s",
+ quotearg_colon (listed_incremental_option),
+ _("Missing record terminator")));
+
+ content = obstack_finish (&stk);
+ note_directory (name, mtime, dev, ino, nfs, false, content);
+ obstack_free (&stk, content);
+ }
+ FATAL_ERROR ((0, 0, "%s: %s",
+ quotearg_colon (listed_incremental_option),
+ _("Unexpected EOF in snapshot file")));
+}
+
+/* Read incremental snapshot file (directory file).
+ If the file has older incremental version, make sure that it is processed
+ correctly and that tar will use the most conservative backup method among
+ possible alternatives (i.e. prefer ALL_CHILDREN over CHANGED_CHILDREN,
+ etc.) This ensures that the snapshots are updated to the recent version
+ without any loss of data. */
+void
+read_directory_file (void)
+{
+ int fd;
+ char *buf = 0;
+ size_t bufsize;
+
+ /* Open the file for both read and write. That way, we can write
+ it later without having to reopen it, and don't have to worry if
+ we chdir in the meantime. */
+ fd = open (listed_incremental_option, O_RDWR | O_CREAT, MODE_RW);
+ if (fd < 0)
+ {
+ open_error (listed_incremental_option);
+ return;
+ }
+
+ listed_incremental_stream = fdopen (fd, "r+");
+ if (! listed_incremental_stream)
+ {
+ open_error (listed_incremental_option);
+ close (fd);
+ return;
+ }
+
+ if (0 < getline (&buf, &bufsize, listed_incremental_stream))
+ {
+ char *ebuf;
+ uintmax_t incremental_version;
+
+ if (strncmp (buf, PACKAGE_NAME, sizeof PACKAGE_NAME - 1) == 0)
+ {
+ ebuf = buf + sizeof PACKAGE_NAME - 1;
+ if (*ebuf++ != '-')
+ ERROR((1, 0, _("Bad incremental file format")));
+ for (; *ebuf != '-'; ebuf++)
+ if (!*ebuf)
+ ERROR((1, 0, _("Bad incremental file format")));
+
+ incremental_version = strtoumax (ebuf + 1, NULL, 10);
+ }
+ else
+ incremental_version = 0;
+
+ switch (incremental_version)
+ {
+ case 0:
+ case 1:
+ read_incr_db_01 (incremental_version, buf);
+ break;
+
+ case TAR_INCREMENTAL_VERSION:
+ read_incr_db_2 ();
+ break;
+
+ default:
+ ERROR ((1, 0, _("Unsupported incremental format version: %"PRIuMAX),
+ incremental_version));
+ }
+
+ }
+
+ if (ferror (listed_incremental_stream))
+ read_error (listed_incremental_option);
+ if (buf)
+ free (buf);
+}
+
+/* Output incremental data for the directory ENTRY to the file DATA.
+ Return nonzero if successful, preserving errno on write failure. */
+static bool
+write_directory_file_entry (void *entry, void *data)
+{
+ struct directory const *directory = entry;
+ FILE *fp = data;
+
+ if (DIR_IS_FOUND (directory))
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ char *s;
+
+ s = DIR_IS_NFS (directory) ? "1" : "0";
+ fwrite (s, 2, 1, fp);
+ s = (TYPE_SIGNED (time_t)
+ ? imaxtostr (directory->mtime.tv_sec, buf)
+ : umaxtostr (directory->mtime.tv_sec, buf));
+ fwrite (s, strlen (s) + 1, 1, fp);
+ s = umaxtostr (directory->mtime.tv_nsec, buf);
+ fwrite (s, strlen (s) + 1, 1, fp);
+ s = umaxtostr (directory->device_number, buf);
+ fwrite (s, strlen (s) + 1, 1, fp);
+ s = umaxtostr (directory->inode_number, buf);
+ fwrite (s, strlen (s) + 1, 1, fp);
+
+ fwrite (directory->name, strlen (directory->name) + 1, 1, fp);
+ if (directory->contents)
+ {
+ char *p;
+ for (p = directory->contents; *p; p += strlen (p) + 1)
+ {
+ if (strchr ("YND", *p))
+ fwrite (p, strlen (p) + 1, 1, fp);
+ }
+ }
+ fwrite ("\0\0", 2, 1, fp);
+ }
+
+ return ! ferror (fp);
+}
+
+void
+write_directory_file (void)
+{
+ FILE *fp = listed_incremental_stream;
+ char buf[UINTMAX_STRSIZE_BOUND];
+ char *s;
+
+ if (! fp)
+ return;
+
+ if (fseek (fp, 0L, SEEK_SET) != 0)
+ seek_error (listed_incremental_option);
+ if (sys_truncate (fileno (fp)) != 0)
+ truncate_error (listed_incremental_option);
+
+ fprintf (fp, "%s-%s-%d\n", PACKAGE_NAME, PACKAGE_VERSION,
+ TAR_INCREMENTAL_VERSION);
+
+ s = (TYPE_SIGNED (time_t)
+ ? imaxtostr (start_time.tv_sec, buf)
+ : umaxtostr (start_time.tv_sec, buf));
+ fwrite (s, strlen (s) + 1, 1, fp);
+ s = umaxtostr (start_time.tv_nsec, buf);
+ fwrite (s, strlen (s) + 1, 1, fp);
+
+ if (! ferror (fp) && directory_table)
+ hash_do_for_each (directory_table, write_directory_file_entry, fp);
+
+ if (ferror (fp))
+ write_error (listed_incremental_option);
+ if (fclose (fp) != 0)
+ close_error (listed_incremental_option);
+}
+
+
+/* Restoration of incremental dumps. */
+
+static void
+get_gnu_dumpdir (struct tar_stat_info *stat_info)
+{
+ size_t size;
+ size_t copied;
+ union block *data_block;
+ char *to;
+ char *archive_dir;
+
+ size = stat_info->stat.st_size;
+
+ archive_dir = xmalloc (size);
+ to = archive_dir;
+
+ set_next_block_after (current_header);
+ mv_begin (stat_info);
+
+ for (; size > 0; size -= copied)
+ {
+ mv_size_left (size);
+ data_block = find_next_block ();
+ if (!data_block)
+ ERROR ((1, 0, _("Unexpected EOF in archive")));
+ copied = available_space_after (data_block);
+ if (copied > size)
+ copied = size;
+ memcpy (to, data_block->buffer, copied);
+ to += copied;
+ set_next_block_after ((union block *)
+ (data_block->buffer + copied - 1));
+ }
+
+ mv_end ();
+
+ stat_info->dumpdir = archive_dir;
+ stat_info->skipped = true; /* For skip_member() and friends
+ to work correctly */
+}
+
+/* Return T if STAT_INFO represents a dumpdir archive member.
+ Note: can invalidate current_header. It happens if flush_archive()
+ gets called within get_gnu_dumpdir() */
+bool
+is_dumpdir (struct tar_stat_info *stat_info)
+{
+ if (stat_info->is_dumpdir && !stat_info->dumpdir)
+ get_gnu_dumpdir (stat_info);
+ return stat_info->is_dumpdir;
+}
+
+static bool
+dumpdir_ok (char *dumpdir)
+{
+ char *p;
+ int has_tempdir = 0;
+ int expect = 0;
+
+ for (p = dumpdir; *p; p += strlen (p) + 1)
+ {
+ if (expect && *p != expect)
+ {
+ ERROR ((0, 0,
+ _("Malformed dumpdir: expected '%c' but found %#3o"),
+ expect, *p));
+ return false;
+ }
+ switch (*p)
+ {
+ case 'X':
+ if (has_tempdir)
+ {
+ ERROR ((0, 0,
+ _("Malformed dumpdir: 'X' duplicated")));
+ return false;
+ }
+ else
+ has_tempdir = 1;
+ break;
+
+ case 'R':
+ if (p[1] == 0)
+ {
+ if (!has_tempdir)
+ {
+ ERROR ((0, 0,
+ _("Malformed dumpdir: empty name in 'R'")));
+ return false;
+ }
+ else
+ has_tempdir = 0;
+ }
+ expect = 'T';
+ break;
+
+ case 'T':
+ if (expect != 'T')
+ {
+ ERROR ((0, 0,
+ _("Malformed dumpdir: 'T' not preceeded by 'R'")));
+ return false;
+ }
+ if (p[1] == 0 && !has_tempdir)
+ {
+ ERROR ((0, 0,
+ _("Malformed dumpdir: empty name in 'T'")));
+ return false;
+ }
+ expect = 0;
+ break;
+
+ case 'N':
+ case 'Y':
+ case 'D':
+ break;
+
+ default:
+ /* FIXME: bail out? */
+ break;
+ }
+ }
+
+ if (expect)
+ {
+ ERROR ((0, 0,
+ _("Malformed dumpdir: expected '%c' but found end of data"),
+ expect));
+ return false;
+ }
+
+ if (has_tempdir)
+ WARN ((0, 0, _("Malformed dumpdir: 'X' never used")));
+
+ return true;
+}
+
+/* Examine the directories under directory_name and delete any
+ files that were not there at the time of the back-up. */
+static bool
+try_purge_directory (char const *directory_name)
+{
+ char *current_dir;
+ char *cur, *arc, *p;
+ char *temp_stub = NULL;
+
+ if (!is_dumpdir (&current_stat_info))
+ return false;
+
+ current_dir = savedir (directory_name);
+
+ if (!current_dir)
+ /* The directory doesn't exist now. It'll be created. In any
+ case, we don't have to delete any files out of it. */
+ return false;
+
+ /* Verify if dump directory is sane */
+ if (!dumpdir_ok (current_stat_info.dumpdir))
+ return false;
+
+ /* Process renames */
+ for (arc = current_stat_info.dumpdir; *arc; arc += strlen (arc) + 1)
+ {
+ if (*arc == 'X')
+ {
+#define TEMP_DIR_TEMPLATE "tar.XXXXXX"
+ size_t len = strlen (arc + 1);
+ temp_stub = xrealloc (temp_stub, len + 1 + sizeof TEMP_DIR_TEMPLATE);
+ memcpy (temp_stub, arc + 1, len);
+ temp_stub[len] = '/';
+ memcpy (temp_stub + len + 1, TEMP_DIR_TEMPLATE,
+ sizeof TEMP_DIR_TEMPLATE);
+ if (!mkdtemp (temp_stub))
+ {
+ ERROR ((0, errno,
+ _("Cannot create temporary directory using template %s"),
+ quote (temp_stub)));
+ free (temp_stub);
+ free (current_dir);
+ return false;
+ }
+ }
+ else if (*arc == 'R')
+ {
+ char *src, *dst;
+ src = arc + 1;
+ arc += strlen (arc) + 1;
+ dst = arc + 1;
+
+ if (*src == 0)
+ src = temp_stub;
+ else if (*dst == 0)
+ dst = temp_stub;
+
+ if (!rename_directory (src, dst))
+ {
+ free (temp_stub);
+ free (current_dir);
+ /* FIXME: Make sure purge_directory(dst) will return
+ immediately */
+ return false;
+ }
+ }
+ }
+
+ free (temp_stub);
+
+ /* Process deletes */
+ p = NULL;
+ for (cur = current_dir; *cur; cur += strlen (cur) + 1)
+ {
+ const char *entry;
+ struct stat st;
+ if (p)
+ free (p);
+ p = new_name (directory_name, cur);
+
+ if (deref_stat (false, p, &st))
+ {
+ if (errno != ENOENT) /* FIXME: Maybe keep a list of renamed
+ dirs and check it here? */
+ {
+ stat_diag (p);
+ WARN ((0, 0, _("%s: Not purging directory: unable to stat"),
+ quotearg_colon (p)));
+ }
+ continue;
+ }
+
+ if (!(entry = dumpdir_locate (current_stat_info.dumpdir, cur))
+ || (*entry == 'D' && !S_ISDIR (st.st_mode))
+ || (*entry == 'Y' && S_ISDIR (st.st_mode)))
+ {
+ if (one_file_system_option && st.st_dev != root_device)
+ {
+ WARN ((0, 0,
+ _("%s: directory is on a different device: not purging"),
+ quotearg_colon (p)));
+ continue;
+ }
+
+ if (! interactive_option || confirm ("delete", p))
+ {
+ if (verbose_option)
+ fprintf (stdlis, _("%s: Deleting %s\n"),
+ program_name, quote (p));
+ if (! remove_any_file (p, RECURSIVE_REMOVE_OPTION))
+ {
+ int e = errno;
+ ERROR ((0, e, _("%s: Cannot remove"), quotearg_colon (p)));
+ }
+ }
+ }
+ }
+ free (p);
+
+ free (current_dir);
+ return true;
+}
+
+void
+purge_directory (char const *directory_name)
+{
+ if (!try_purge_directory (directory_name))
+ skip_member ();
+}
+
+void
+list_dumpdir (char *buffer, size_t size)
+{
+ int state = 0;
+ while (size)
+ {
+ switch (*buffer)
+ {
+ case 'Y':
+ case 'N':
+ case 'D':
+ case 'R':
+ case 'T':
+ case 'X':
+ fprintf (stdlis, "%c", *buffer);
+ if (state == 0)
+ {
+ fprintf (stdlis, " ");
+ state = 1;
+ }
+ buffer++;
+ size--;
+ break;
+
+ case 0:
+ fputc ('\n', stdlis);
+ buffer++;
+ size--;
+ state = 0;
+ break;
+
+ default:
+ fputc (*buffer, stdlis);
+ buffer++;
+ size--;
+ }
+ }
+}
diff --git a/src/list.c b/src/list.c
new file mode 100644
index 0000000..75837f6
--- /dev/null
+++ b/src/list.c
@@ -0,0 +1,1341 @@
+/* List a tar archive, with support routines for reading a tar archive.
+
+ Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ Written by John Gilmore, on 1985-08-26.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <inttostr.h>
+#include <quotearg.h>
+
+#include "common.h"
+
+#define max(a, b) ((a) < (b) ? (b) : (a))
+
+union block *current_header; /* points to current archive header */
+enum archive_format current_format; /* recognized format */
+union block *recent_long_name; /* recent long name header and contents */
+union block *recent_long_link; /* likewise, for long link */
+size_t recent_long_name_blocks; /* number of blocks in recent_long_name */
+size_t recent_long_link_blocks; /* likewise, for long link */
+
+static uintmax_t from_header (const char *, size_t, const char *,
+ uintmax_t, uintmax_t, bool, bool);
+
+/* Base 64 digits; see Internet RFC 2045 Table 1. */
+static char const base_64_digits[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', '+', '/'
+};
+
+/* Table of base-64 digit values indexed by unsigned chars.
+ The value is 64 for unsigned chars that are not base-64 digits. */
+static char base64_map[UCHAR_MAX + 1];
+
+static void
+base64_init (void)
+{
+ int i;
+ memset (base64_map, 64, sizeof base64_map);
+ for (i = 0; i < 64; i++)
+ base64_map[(int) base_64_digits[i]] = i;
+}
+
+/* Main loop for reading an archive. */
+void
+read_and (void (*do_something) (void))
+{
+ enum read_header status = HEADER_STILL_UNREAD;
+ enum read_header prev_status;
+ struct timespec mtime;
+
+ base64_init ();
+ name_gather ();
+
+ open_archive (ACCESS_READ);
+ do
+ {
+ prev_status = status;
+ tar_stat_destroy (&current_stat_info);
+
+ status = read_header (false);
+ switch (status)
+ {
+ case HEADER_STILL_UNREAD:
+ case HEADER_SUCCESS_EXTENDED:
+ abort ();
+
+ case HEADER_SUCCESS:
+
+ /* Valid header. We should decode next field (mode) first.
+ Ensure incoming names are null terminated. */
+
+ if (! name_match (current_stat_info.file_name)
+ || (NEWER_OPTION_INITIALIZED (newer_mtime_option)
+ /* FIXME: We get mtime now, and again later; this causes
+ duplicate diagnostics if header.mtime is bogus. */
+ && ((mtime.tv_sec
+ = TIME_FROM_HEADER (current_header->header.mtime)),
+ /* FIXME: Grab fractional time stamps from
+ extended header. */
+ mtime.tv_nsec = 0,
+ current_stat_info.mtime = mtime,
+ OLDER_TAR_STAT_TIME (current_stat_info, m)))
+ || excluded_name (current_stat_info.file_name))
+ {
+ switch (current_header->header.typeflag)
+ {
+ case GNUTYPE_VOLHDR:
+ case GNUTYPE_MULTIVOL:
+ break;
+
+ case DIRTYPE:
+ if (show_omitted_dirs_option)
+ WARN ((0, 0, _("%s: Omitting"),
+ quotearg_colon (current_stat_info.file_name)));
+ /* Fall through. */
+ default:
+ decode_header (current_header,
+ &current_stat_info, &current_format, 0);
+ skip_member ();
+ continue;
+ }
+ }
+
+ (*do_something) ();
+ continue;
+
+ case HEADER_ZERO_BLOCK:
+ if (block_number_option)
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ fprintf (stdlis, _("block %s: ** Block of NULs **\n"),
+ STRINGIFY_BIGINT (current_block_ordinal (), buf));
+ }
+
+ set_next_block_after (current_header);
+
+ if (!ignore_zeros_option)
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+
+ status = read_header (false);
+ if (status == HEADER_ZERO_BLOCK)
+ break;
+ WARN ((0, 0, _("A lone zero block at %s"),
+ STRINGIFY_BIGINT (current_block_ordinal (), buf)));
+ break;
+ }
+ status = prev_status;
+ continue;
+
+ case HEADER_END_OF_FILE:
+ if (block_number_option)
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ fprintf (stdlis, _("block %s: ** End of File **\n"),
+ STRINGIFY_BIGINT (current_block_ordinal (), buf));
+ }
+ break;
+
+ case HEADER_FAILURE:
+ /* If the previous header was good, tell them that we are
+ skipping bad ones. */
+ set_next_block_after (current_header);
+ switch (prev_status)
+ {
+ case HEADER_STILL_UNREAD:
+ ERROR ((0, 0, _("This does not look like a tar archive")));
+ /* Fall through. */
+
+ case HEADER_ZERO_BLOCK:
+ case HEADER_SUCCESS:
+ if (block_number_option)
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ off_t block_ordinal = current_block_ordinal ();
+ block_ordinal -= recent_long_name_blocks;
+ block_ordinal -= recent_long_link_blocks;
+ fprintf (stdlis, _("block %s: "),
+ STRINGIFY_BIGINT (block_ordinal, buf));
+ }
+ ERROR ((0, 0, _("Skipping to next header")));
+ break;
+
+ case HEADER_END_OF_FILE:
+ case HEADER_FAILURE:
+ /* We are in the middle of a cascade of errors. */
+ break;
+
+ case HEADER_SUCCESS_EXTENDED:
+ abort ();
+ }
+ continue;
+ }
+ break;
+ }
+ while (!all_names_found (&current_stat_info));
+
+ close_archive ();
+ names_notfound (); /* print names not found */
+}
+
+/* Print a header block, based on tar options. */
+void
+list_archive (void)
+{
+ off_t block_ordinal = current_block_ordinal ();
+ /* Print the header block. */
+
+ decode_header (current_header, &current_stat_info, &current_format, 0);
+ if (verbose_option)
+ print_header (&current_stat_info, block_ordinal);
+
+ if (incremental_option)
+ {
+ if (verbose_option > 2)
+ {
+ if (is_dumpdir (&current_stat_info))
+ list_dumpdir (current_stat_info.dumpdir,
+ dumpdir_size (current_stat_info.dumpdir));
+ }
+ }
+
+ skip_member ();
+}
+
+/* Check header checksum */
+/* The standard BSD tar sources create the checksum by adding up the
+ bytes in the header as type char. I think the type char was unsigned
+ on the PDP-11, but it's signed on the Next and Sun. It looks like the
+ sources to BSD tar were never changed to compute the checksum
+ correctly, so both the Sun and Next add the bytes of the header as
+ signed chars. This doesn't cause a problem until you get a file with
+ a name containing characters with the high bit set. So tar_checksum
+ computes two checksums -- signed and unsigned. */
+
+enum read_header
+tar_checksum (union block *header, bool silent)
+{
+ size_t i;
+ int unsigned_sum = 0; /* the POSIX one :-) */
+ int signed_sum = 0; /* the Sun one :-( */
+ int recorded_sum;
+ uintmax_t parsed_sum;
+ char *p;
+
+ p = header->buffer;
+ for (i = sizeof *header; i-- != 0;)
+ {
+ unsigned_sum += (unsigned char) *p;
+ signed_sum += (signed char) (*p++);
+ }
+
+ if (unsigned_sum == 0)
+ return HEADER_ZERO_BLOCK;
+
+ /* Adjust checksum to count the "chksum" field as blanks. */
+
+ for (i = sizeof header->header.chksum; i-- != 0;)
+ {
+ unsigned_sum -= (unsigned char) header->header.chksum[i];
+ signed_sum -= (signed char) (header->header.chksum[i]);
+ }
+ unsigned_sum += ' ' * sizeof header->header.chksum;
+ signed_sum += ' ' * sizeof header->header.chksum;
+
+ parsed_sum = from_header (header->header.chksum,
+ sizeof header->header.chksum, 0,
+ (uintmax_t) 0,
+ (uintmax_t) TYPE_MAXIMUM (int), true, silent);
+ if (parsed_sum == (uintmax_t) -1)
+ return HEADER_FAILURE;
+
+ recorded_sum = parsed_sum;
+
+ if (unsigned_sum != recorded_sum && signed_sum != recorded_sum)
+ return HEADER_FAILURE;
+
+ return HEADER_SUCCESS;
+}
+
+/* Read a block that's supposed to be a header block. Return its
+ address in "current_header", and if it is good, the file's size
+ and names (file name, link name) in *info.
+
+ Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a
+ block full of zeros (EOF marker).
+
+ If RAW_EXTENDED_HEADERS is nonzero, do not automagically fold the
+ GNU long name and link headers into later headers.
+
+ You must always set_next_block_after(current_header) to skip past
+ the header which this routine reads. */
+
+enum read_header
+read_header_primitive (bool raw_extended_headers, struct tar_stat_info *info)
+{
+ union block *header;
+ union block *header_copy;
+ char *bp;
+ union block *data_block;
+ size_t size, written;
+ union block *next_long_name = 0;
+ union block *next_long_link = 0;
+ size_t next_long_name_blocks;
+ size_t next_long_link_blocks;
+
+ while (1)
+ {
+ enum read_header status;
+
+ header = find_next_block ();
+ current_header = header;
+ if (!header)
+ return HEADER_END_OF_FILE;
+
+ if ((status = tar_checksum (header, false)) != HEADER_SUCCESS)
+ return status;
+
+ /* Good block. Decode file size and return. */
+
+ if (header->header.typeflag == LNKTYPE)
+ info->stat.st_size = 0; /* links 0 size on tape */
+ else
+ info->stat.st_size = OFF_FROM_HEADER (header->header.size);
+
+ if (header->header.typeflag == GNUTYPE_LONGNAME
+ || header->header.typeflag == GNUTYPE_LONGLINK
+ || header->header.typeflag == XHDTYPE
+ || header->header.typeflag == XGLTYPE
+ || header->header.typeflag == SOLARIS_XHDTYPE)
+ {
+ if (raw_extended_headers)
+ return HEADER_SUCCESS_EXTENDED;
+ else if (header->header.typeflag == GNUTYPE_LONGNAME
+ || header->header.typeflag == GNUTYPE_LONGLINK)
+ {
+ size_t name_size = info->stat.st_size;
+ size_t n = name_size % BLOCKSIZE;
+ size = name_size + BLOCKSIZE;
+ if (n)
+ size += BLOCKSIZE - n;
+
+ if (name_size != info->stat.st_size || size < name_size)
+ xalloc_die ();
+
+ header_copy = xmalloc (size + 1);
+
+ if (header->header.typeflag == GNUTYPE_LONGNAME)
+ {
+ if (next_long_name)
+ free (next_long_name);
+ next_long_name = header_copy;
+ next_long_name_blocks = size / BLOCKSIZE;
+ }
+ else
+ {
+ if (next_long_link)
+ free (next_long_link);
+ next_long_link = header_copy;
+ next_long_link_blocks = size / BLOCKSIZE;
+ }
+
+ set_next_block_after (header);
+ *header_copy = *header;
+ bp = header_copy->buffer + BLOCKSIZE;
+
+ for (size -= BLOCKSIZE; size > 0; size -= written)
+ {
+ data_block = find_next_block ();
+ if (! data_block)
+ {
+ ERROR ((0, 0, _("Unexpected EOF in archive")));
+ break;
+ }
+ written = available_space_after (data_block);
+ if (written > size)
+ written = size;
+
+ memcpy (bp, data_block->buffer, written);
+ bp += written;
+ set_next_block_after ((union block *)
+ (data_block->buffer + written - 1));
+ }
+
+ *bp = '\0';
+ }
+ else if (header->header.typeflag == XHDTYPE
+ || header->header.typeflag == SOLARIS_XHDTYPE)
+ xheader_read (&info->xhdr, header,
+ OFF_FROM_HEADER (header->header.size));
+ else if (header->header.typeflag == XGLTYPE)
+ {
+ struct xheader xhdr;
+ memset (&xhdr, 0, sizeof xhdr);
+ xheader_read (&xhdr, header,
+ OFF_FROM_HEADER (header->header.size));
+ xheader_decode_global (&xhdr);
+ xheader_destroy (&xhdr);
+ }
+
+ /* Loop! */
+
+ }
+ else
+ {
+ char const *name;
+ struct posix_header const *h = &current_header->header;
+ char namebuf[sizeof h->prefix + 1 + NAME_FIELD_SIZE + 1];
+
+ if (recent_long_name)
+ free (recent_long_name);
+
+ if (next_long_name)
+ {
+ name = next_long_name->buffer + BLOCKSIZE;
+ recent_long_name = next_long_name;
+ recent_long_name_blocks = next_long_name_blocks;
+ }
+ else
+ {
+ /* Accept file names as specified by POSIX.1-1996
+ section 10.1.1. */
+ char *np = namebuf;
+
+ if (h->prefix[0] && strcmp (h->magic, TMAGIC) == 0)
+ {
+ memcpy (np, h->prefix, sizeof h->prefix);
+ np[sizeof h->prefix] = '\0';
+ np += strlen (np);
+ *np++ = '/';
+ }
+ memcpy (np, h->name, sizeof h->name);
+ np[sizeof h->name] = '\0';
+ name = namebuf;
+ recent_long_name = 0;
+ recent_long_name_blocks = 0;
+ }
+ assign_string (&info->orig_file_name, name);
+ assign_string (&info->file_name, name);
+ info->had_trailing_slash = strip_trailing_slashes (info->file_name);
+
+ if (recent_long_link)
+ free (recent_long_link);
+
+ if (next_long_link)
+ {
+ name = next_long_link->buffer + BLOCKSIZE;
+ recent_long_link = next_long_link;
+ recent_long_link_blocks = next_long_link_blocks;
+ }
+ else
+ {
+ memcpy (namebuf, h->linkname, sizeof h->linkname);
+ namebuf[sizeof h->linkname] = '\0';
+ name = namebuf;
+ recent_long_link = 0;
+ recent_long_link_blocks = 0;
+ }
+ assign_string (&info->link_name, name);
+
+ return HEADER_SUCCESS;
+ }
+ }
+}
+
+enum read_header
+read_header (bool raw_extended_headers)
+{
+ return read_header_primitive (raw_extended_headers, &current_stat_info);
+}
+
+static char *
+decode_xform (char *file_name, void *data)
+{
+ xform_type type = *(xform_type*)data;
+
+ switch (type)
+ {
+ case xform_symlink:
+ /* FIXME: It is not quite clear how and to which extent are the symbolic
+ links subject to filename transformation. In the absence of another
+ solution, symbolic links are exempt from component stripping and
+ name suffix normalization, but subject to filename transformation
+ proper. */
+ return file_name;
+
+ case xform_link:
+ file_name = safer_name_suffix (file_name, true, absolute_names_option);
+ break;
+
+ case xform_regfile:
+ file_name = safer_name_suffix (file_name, false, absolute_names_option);
+ break;
+ }
+
+ if (strip_name_components)
+ {
+ size_t prefix_len = stripped_prefix_len (file_name,
+ strip_name_components);
+ if (prefix_len == (size_t) -1)
+ prefix_len = strlen (file_name);
+ file_name += prefix_len;
+ }
+ return file_name;
+}
+
+bool
+transform_member_name (char **pinput, xform_type type)
+{
+ return transform_name_fp (pinput, decode_xform, &type);
+}
+
+#define ISOCTAL(c) ((c)>='0'&&(c)<='7')
+
+/* Decode things from a file HEADER block into STAT_INFO, also setting
+ *FORMAT_POINTER depending on the header block format. If
+ DO_USER_GROUP, decode the user/group information (this is useful
+ for extraction, but waste time when merely listing).
+
+ read_header() has already decoded the checksum and length, so we don't.
+
+ This routine should *not* be called twice for the same block, since
+ the two calls might use different DO_USER_GROUP values and thus
+ might end up with different uid/gid for the two calls. If anybody
+ wants the uid/gid they should decode it first, and other callers
+ should decode it without uid/gid before calling a routine,
+ e.g. print_header, that assumes decoded data. */
+void
+decode_header (union block *header, struct tar_stat_info *stat_info,
+ enum archive_format *format_pointer, int do_user_group)
+{
+ enum archive_format format;
+
+ if (strcmp (header->header.magic, TMAGIC) == 0)
+ {
+ if (header->star_header.prefix[130] == 0
+ && ISOCTAL (header->star_header.atime[0])
+ && header->star_header.atime[11] == ' '
+ && ISOCTAL (header->star_header.ctime[0])
+ && header->star_header.ctime[11] == ' ')
+ format = STAR_FORMAT;
+ else if (stat_info->xhdr.size)
+ format = POSIX_FORMAT;
+ else
+ format = USTAR_FORMAT;
+ }
+ else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0)
+ format = OLDGNU_FORMAT;
+ else
+ format = V7_FORMAT;
+ *format_pointer = format;
+
+ stat_info->stat.st_mode = MODE_FROM_HEADER (header->header.mode);
+ stat_info->mtime.tv_sec = TIME_FROM_HEADER (header->header.mtime);
+ stat_info->mtime.tv_nsec = 0;
+ assign_string (&stat_info->uname,
+ header->header.uname[0] ? header->header.uname : NULL);
+ assign_string (&stat_info->gname,
+ header->header.gname[0] ? header->header.gname : NULL);
+
+ if (format == OLDGNU_FORMAT && incremental_option)
+ {
+ stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
+ stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.ctime);
+ stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
+ }
+ else if (format == STAR_FORMAT)
+ {
+ stat_info->atime.tv_sec = TIME_FROM_HEADER (header->star_header.atime);
+ stat_info->ctime.tv_sec = TIME_FROM_HEADER (header->star_header.ctime);
+ stat_info->atime.tv_nsec = stat_info->ctime.tv_nsec = 0;
+ }
+ else
+ stat_info->atime = stat_info->ctime = start_time;
+
+ if (format == V7_FORMAT)
+ {
+ stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
+ stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
+ stat_info->stat.st_rdev = 0;
+ }
+ else
+ {
+ if (do_user_group)
+ {
+ /* FIXME: Decide if this should somewhat depend on -p. */
+
+ if (numeric_owner_option
+ || !*header->header.uname
+ || !uname_to_uid (header->header.uname, &stat_info->stat.st_uid))
+ stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
+
+ if (numeric_owner_option
+ || !*header->header.gname
+ || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
+ stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
+ }
+
+ switch (header->header.typeflag)
+ {
+ case BLKTYPE:
+ case CHRTYPE:
+ stat_info->stat.st_rdev =
+ makedev (MAJOR_FROM_HEADER (header->header.devmajor),
+ MINOR_FROM_HEADER (header->header.devminor));
+ break;
+
+ default:
+ stat_info->stat.st_rdev = 0;
+ }
+ }
+
+ stat_info->archive_file_size = stat_info->stat.st_size;
+ xheader_decode (stat_info);
+
+ if (sparse_member_p (stat_info))
+ {
+ sparse_fixup_header (stat_info);
+ stat_info->is_sparse = true;
+ }
+ else
+ {
+ stat_info->is_sparse = false;
+ if (((current_format == GNU_FORMAT
+ || current_format == OLDGNU_FORMAT)
+ && current_header->header.typeflag == GNUTYPE_DUMPDIR)
+ || stat_info->dumpdir)
+ stat_info->is_dumpdir = true;
+ }
+
+ transform_member_name (&stat_info->file_name, xform_regfile);
+}
+
+/* Convert buffer at WHERE0 of size DIGS from external format to
+ uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
+ are of type TYPE. The buffer must represent a value in the range
+ -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
+ numbers instead of the other GNU extensions. Return -1 on error,
+ diagnosing the error if TYPE is nonnull and if !SILENT. */
+static uintmax_t
+from_header (char const *where0, size_t digs, char const *type,
+ uintmax_t minus_minval, uintmax_t maxval,
+ bool octal_only, bool silent)
+{
+ uintmax_t value;
+ char const *where = where0;
+ char const *lim = where + digs;
+ int negative = 0;
+
+ /* Accommodate buggy tar of unknown vintage, which outputs leading
+ NUL if the previous field overflows. */
+ where += !*where;
+
+ /* Accommodate older tars, which output leading spaces. */
+ for (;;)
+ {
+ if (where == lim)
+ {
+ if (type && !silent)
+ ERROR ((0, 0,
+ /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
+ _("Blanks in header where numeric %s value expected"),
+ type));
+ return -1;
+ }
+ if (!ISSPACE ((unsigned char) *where))
+ break;
+ where++;
+ }
+
+ value = 0;
+ if (ISODIGIT (*where))
+ {
+ char const *where1 = where;
+ uintmax_t overflow = 0;
+
+ for (;;)
+ {
+ value += *where++ - '0';
+ if (where == lim || ! ISODIGIT (*where))
+ break;
+ overflow |= value ^ (value << LG_8 >> LG_8);
+ value <<= LG_8;
+ }
+
+ /* Parse the output of older, unportable tars, which generate
+ negative values in two's complement octal. If the leading
+ nonzero digit is 1, we can't recover the original value
+ reliably; so do this only if the digit is 2 or more. This
+ catches the common case of 32-bit negative time stamps. */
+ if ((overflow || maxval < value) && '2' <= *where1 && type)
+ {
+ /* Compute the negative of the input value, assuming two's
+ complement. */
+ int digit = (*where1 - '0') | 4;
+ overflow = 0;
+ value = 0;
+ where = where1;
+ for (;;)
+ {
+ value += 7 - digit;
+ where++;
+ if (where == lim || ! ISODIGIT (*where))
+ break;
+ digit = *where - '0';
+ overflow |= value ^ (value << LG_8 >> LG_8);
+ value <<= LG_8;
+ }
+ value++;
+ overflow |= !value;
+
+ if (!overflow && value <= minus_minval)
+ {
+ if (!silent)
+ WARN ((0, 0,
+ /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
+ _("Archive octal value %.*s is out of %s range; assuming two's complement"),
+ (int) (where - where1), where1, type));
+ negative = 1;
+ }
+ }
+
+ if (overflow)
+ {
+ if (type && !silent)
+ ERROR ((0, 0,
+ /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
+ _("Archive octal value %.*s is out of %s range"),
+ (int) (where - where1), where1, type));
+ return -1;
+ }
+ }
+ else if (octal_only)
+ {
+ /* Suppress the following extensions. */
+ }
+ else if (*where == '-' || *where == '+')
+ {
+ /* Parse base-64 output produced only by tar test versions
+ 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
+ Support for this will be withdrawn in future releases. */
+ int dig;
+ if (!silent)
+ {
+ static bool warned_once;
+ if (! warned_once)
+ {
+ warned_once = true;
+ WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
+ }
+ }
+ negative = *where++ == '-';
+ while (where != lim
+ && (dig = base64_map[(unsigned char) *where]) < 64)
+ {
+ if (value << LG_64 >> LG_64 != value)
+ {
+ char *string = alloca (digs + 1);
+ memcpy (string, where0, digs);
+ string[digs] = '\0';
+ if (type && !silent)
+ ERROR ((0, 0,
+ _("Archive signed base-64 string %s is out of %s range"),
+ quote (string), type));
+ return -1;
+ }
+ value = (value << LG_64) | dig;
+ where++;
+ }
+ }
+ else if (*where == '\200' /* positive base-256 */
+ || *where == '\377' /* negative base-256 */)
+ {
+ /* Parse base-256 output. A nonnegative number N is
+ represented as (256**DIGS)/2 + N; a negative number -N is
+ represented as (256**DIGS) - N, i.e. as two's complement.
+ The representation guarantees that the leading bit is
+ always on, so that we don't confuse this format with the
+ others (assuming ASCII bytes of 8 bits or more). */
+ int signbit = *where & (1 << (LG_256 - 2));
+ uintmax_t topbits = (((uintmax_t) - signbit)
+ << (CHAR_BIT * sizeof (uintmax_t)
+ - LG_256 - (LG_256 - 2)));
+ value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
+ for (;;)
+ {
+ value = (value << LG_256) + (unsigned char) *where++;
+ if (where == lim)
+ break;
+ if (((value << LG_256 >> LG_256) | topbits) != value)
+ {
+ if (type && !silent)
+ ERROR ((0, 0,
+ _("Archive base-256 value is out of %s range"),
+ type));
+ return -1;
+ }
+ }
+ negative = signbit;
+ if (negative)
+ value = -value;
+ }
+
+ if (where != lim && *where && !ISSPACE ((unsigned char) *where))
+ {
+ if (type)
+ {
+ char buf[1000]; /* Big enough to represent any header. */
+ static struct quoting_options *o;
+
+ if (!o)
+ {
+ o = clone_quoting_options (0);
+ set_quoting_style (o, locale_quoting_style);
+ }
+
+ while (where0 != lim && ! lim[-1])
+ lim--;
+ quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
+ if (!silent)
+ ERROR ((0, 0,
+ /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
+ _("Archive contains %.*s where numeric %s value expected"),
+ (int) sizeof buf, buf, type));
+ }
+
+ return -1;
+ }
+
+ if (value <= (negative ? minus_minval : maxval))
+ return negative ? -value : value;
+
+ if (type && !silent)
+ {
+ char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
+ char maxval_buf[UINTMAX_STRSIZE_BOUND];
+ char value_buf[UINTMAX_STRSIZE_BOUND + 1];
+ char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
+ char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
+ if (negative)
+ *--value_string = '-';
+ if (minus_minval)
+ *--minval_string = '-';
+ /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
+ ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
+ value_string, type,
+ minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
+ }
+
+ return -1;
+}
+
+gid_t
+gid_from_header (const char *p, size_t s)
+{
+ return from_header (p, s, "gid_t",
+ - (uintmax_t) TYPE_MINIMUM (gid_t),
+ (uintmax_t) TYPE_MAXIMUM (gid_t),
+ false, false);
+}
+
+major_t
+major_from_header (const char *p, size_t s)
+{
+ return from_header (p, s, "major_t",
+ - (uintmax_t) TYPE_MINIMUM (major_t),
+ (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
+}
+
+minor_t
+minor_from_header (const char *p, size_t s)
+{
+ return from_header (p, s, "minor_t",
+ - (uintmax_t) TYPE_MINIMUM (minor_t),
+ (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
+}
+
+mode_t
+mode_from_header (const char *p, size_t s)
+{
+ /* Do not complain about unrecognized mode bits. */
+ unsigned u = from_header (p, s, "mode_t",
+ - (uintmax_t) TYPE_MINIMUM (mode_t),
+ TYPE_MAXIMUM (uintmax_t), false, false);
+ return ((u & TSUID ? S_ISUID : 0)
+ | (u & TSGID ? S_ISGID : 0)
+ | (u & TSVTX ? S_ISVTX : 0)
+ | (u & TUREAD ? S_IRUSR : 0)
+ | (u & TUWRITE ? S_IWUSR : 0)
+ | (u & TUEXEC ? S_IXUSR : 0)
+ | (u & TGREAD ? S_IRGRP : 0)
+ | (u & TGWRITE ? S_IWGRP : 0)
+ | (u & TGEXEC ? S_IXGRP : 0)
+ | (u & TOREAD ? S_IROTH : 0)
+ | (u & TOWRITE ? S_IWOTH : 0)
+ | (u & TOEXEC ? S_IXOTH : 0));
+}
+
+off_t
+off_from_header (const char *p, size_t s)
+{
+ /* Negative offsets are not allowed in tar files, so invoke
+ from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
+ return from_header (p, s, "off_t", (uintmax_t) 0,
+ (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
+}
+
+size_t
+size_from_header (const char *p, size_t s)
+{
+ return from_header (p, s, "size_t", (uintmax_t) 0,
+ (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
+}
+
+time_t
+time_from_header (const char *p, size_t s)
+{
+ return from_header (p, s, "time_t",
+ - (uintmax_t) TYPE_MINIMUM (time_t),
+ (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
+}
+
+uid_t
+uid_from_header (const char *p, size_t s)
+{
+ return from_header (p, s, "uid_t",
+ - (uintmax_t) TYPE_MINIMUM (uid_t),
+ (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
+}
+
+uintmax_t
+uintmax_from_header (const char *p, size_t s)
+{
+ return from_header (p, s, "uintmax_t", (uintmax_t) 0,
+ TYPE_MAXIMUM (uintmax_t), false, false);
+}
+
+
+/* Return a printable representation of T. The result points to
+ static storage that can be reused in the next call to this
+ function, to ctime, or to asctime. If FULL_TIME, then output the
+ time stamp to its full resolution; otherwise, just output it to
+ 1-minute resolution. */
+char const *
+tartime (struct timespec t, bool full_time)
+{
+ enum { fraclen = sizeof ".FFFFFFFFF" - 1 };
+ static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
+ INT_STRLEN_BOUND (int) + 16)
+ + fraclen];
+ struct tm *tm;
+ time_t s = t.tv_sec;
+ int ns = t.tv_nsec;
+ bool negative = s < 0;
+ char *p;
+
+ if (negative && ns != 0)
+ {
+ s++;
+ ns = 1000000000 - ns;
+ }
+
+ tm = utc_option ? gmtime (&s) : localtime (&s);
+ if (tm)
+ {
+ if (full_time)
+ {
+ sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
+ tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec);
+ code_ns_fraction (ns, buffer + strlen (buffer));
+ }
+ else
+ sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
+ tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min);
+ return buffer;
+ }
+
+ /* The time stamp cannot be broken down, most likely because it
+ is out of range. Convert it as an integer,
+ right-adjusted in a field with the same width as the usual
+ 4-year ISO time format. */
+ p = umaxtostr (negative ? - (uintmax_t) s : s,
+ buffer + sizeof buffer - UINTMAX_STRSIZE_BOUND - fraclen);
+ if (negative)
+ *--p = '-';
+ while ((buffer + sizeof buffer - sizeof "YYYY-MM-DD HH:MM"
+ + (full_time ? sizeof ":SS.FFFFFFFFF" - 1 : 0))
+ < p)
+ *--p = ' ';
+ if (full_time)
+ code_ns_fraction (ns, buffer + sizeof buffer - 1 - fraclen);
+ return p;
+}
+
+/* Actually print it.
+
+ Plain and fancy file header block logging. Non-verbose just prints
+ the name, e.g. for "tar t" or "tar x". This should just contain
+ file names, so it can be fed back into tar with xargs or the "-T"
+ option. The verbose option can give a bunch of info, one line per
+ file. I doubt anybody tries to parse its format, or if they do,
+ they shouldn't. Unix tar is pretty random here anyway. */
+
+
+/* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
+ HEAD_STANDARD, which must be set up in advance. Not very clean.. */
+
+/* Width of "user/group size", with initial value chosen
+ heuristically. This grows as needed, though this may cause some
+ stairstepping in the output. Make it too small and the output will
+ almost always look ragged. Make it too large and the output will
+ be spaced out too far. */
+static int ugswidth = 19;
+
+/* Width of printed time stamps. It grows if longer time stamps are
+ found (typically, those with nanosecond resolution). Like
+ USGWIDTH, some stairstepping may occur. */
+static int datewidth = sizeof "YYYY-MM-DD HH:MM" - 1;
+
+void
+print_header (struct tar_stat_info *st, off_t block_ordinal)
+{
+ char modes[11];
+ char const *time_stamp;
+ int time_stamp_len;
+ char *temp_name;
+
+ /* These hold formatted ints. */
+ char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
+ char *user, *group;
+ char size[2 * UINTMAX_STRSIZE_BOUND];
+ /* holds formatted size or major,minor */
+ char uintbuf[UINTMAX_STRSIZE_BOUND];
+ int pad;
+ int sizelen;
+
+ if (test_label_option && current_header->header.typeflag != GNUTYPE_VOLHDR)
+ return;
+
+ if (show_transformed_names_option)
+ temp_name = st->file_name ? st->file_name : st->orig_file_name;
+ else
+ temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
+
+ if (block_number_option)
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ if (block_ordinal < 0)
+ block_ordinal = current_block_ordinal ();
+ block_ordinal -= recent_long_name_blocks;
+ block_ordinal -= recent_long_link_blocks;
+ fprintf (stdlis, _("block %s: "),
+ STRINGIFY_BIGINT (block_ordinal, buf));
+ }
+
+ if (verbose_option <= 1)
+ {
+ /* Just the fax, mam. */
+ fprintf (stdlis, "%s\n", quotearg (temp_name));
+ }
+ else
+ {
+ /* File type and modes. */
+
+ modes[0] = '?';
+ switch (current_header->header.typeflag)
+ {
+ case GNUTYPE_VOLHDR:
+ modes[0] = 'V';
+ break;
+
+ case GNUTYPE_MULTIVOL:
+ modes[0] = 'M';
+ break;
+
+ case GNUTYPE_LONGNAME:
+ case GNUTYPE_LONGLINK:
+ modes[0] = 'L';
+ ERROR ((0, 0, _("Unexpected long name header")));
+ break;
+
+ case GNUTYPE_SPARSE:
+ case REGTYPE:
+ case AREGTYPE:
+ modes[0] = '-';
+ if (temp_name[strlen (temp_name) - 1] == '/')
+ modes[0] = 'd';
+ break;
+ case LNKTYPE:
+ modes[0] = 'h';
+ break;
+ case GNUTYPE_DUMPDIR:
+ modes[0] = 'd';
+ break;
+ case DIRTYPE:
+ modes[0] = 'd';
+ break;
+ case SYMTYPE:
+ modes[0] = 'l';
+ break;
+ case BLKTYPE:
+ modes[0] = 'b';
+ break;
+ case CHRTYPE:
+ modes[0] = 'c';
+ break;
+ case FIFOTYPE:
+ modes[0] = 'p';
+ break;
+ case CONTTYPE:
+ modes[0] = 'C';
+ break;
+ }
+
+ pax_decode_mode (st->stat.st_mode, modes + 1);
+
+ /* Time stamp. */
+
+ time_stamp = tartime (st->mtime, false);
+ time_stamp_len = strlen (time_stamp);
+ if (datewidth < time_stamp_len)
+ datewidth = time_stamp_len;
+
+ /* User and group names. */
+
+ if (st->uname
+ && st->uname[0]
+ && current_format != V7_FORMAT
+ && !numeric_owner_option)
+ user = st->uname;
+ else
+ {
+ /* Try parsing it as an unsigned integer first, and as a
+ uid_t if that fails. This method can list positive user
+ ids that are too large to fit in a uid_t. */
+ uintmax_t u = from_header (current_header->header.uid,
+ sizeof current_header->header.uid, 0,
+ (uintmax_t) 0,
+ (uintmax_t) TYPE_MAXIMUM (uintmax_t),
+ false, false);
+ if (u != -1)
+ user = STRINGIFY_BIGINT (u, uform);
+ else
+ {
+ sprintf (uform, "%ld",
+ (long) UID_FROM_HEADER (current_header->header.uid));
+ user = uform;
+ }
+ }
+
+ if (st->gname
+ && st->gname[0]
+ && current_format != V7_FORMAT
+ && !numeric_owner_option)
+ group = st->gname;
+ else
+ {
+ /* Try parsing it as an unsigned integer first, and as a
+ gid_t if that fails. This method can list positive group
+ ids that are too large to fit in a gid_t. */
+ uintmax_t g = from_header (current_header->header.gid,
+ sizeof current_header->header.gid, 0,
+ (uintmax_t) 0,
+ (uintmax_t) TYPE_MAXIMUM (uintmax_t),
+ false, false);
+ if (g != -1)
+ group = STRINGIFY_BIGINT (g, gform);
+ else
+ {
+ sprintf (gform, "%ld",
+ (long) GID_FROM_HEADER (current_header->header.gid));
+ group = gform;
+ }
+ }
+
+ /* Format the file size or major/minor device numbers. */
+
+ switch (current_header->header.typeflag)
+ {
+ case CHRTYPE:
+ case BLKTYPE:
+ strcpy (size,
+ STRINGIFY_BIGINT (major (st->stat.st_rdev), uintbuf));
+ strcat (size, ",");
+ strcat (size,
+ STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
+ break;
+
+ default:
+ /* st->stat.st_size keeps stored file size */
+ strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
+ break;
+ }
+
+ /* Figure out padding and print the whole line. */
+
+ sizelen = strlen (size);
+ pad = strlen (user) + 1 + strlen (group) + 1 + sizelen;
+ if (pad > ugswidth)
+ ugswidth = pad;
+
+ fprintf (stdlis, "%s %s/%s %*s %-*s",
+ modes, user, group, ugswidth - pad + sizelen, size,
+ datewidth, time_stamp);
+
+ fprintf (stdlis, " %s", quotearg (temp_name));
+
+ switch (current_header->header.typeflag)
+ {
+ case SYMTYPE:
+ fprintf (stdlis, " -> %s\n", quotearg (st->link_name));
+ break;
+
+ case LNKTYPE:
+ fprintf (stdlis, _(" link to %s\n"), quotearg (st->link_name));
+ break;
+
+ default:
+ {
+ char type_string[2];
+ type_string[0] = current_header->header.typeflag;
+ type_string[1] = '\0';
+ fprintf (stdlis, _(" unknown file type %s\n"),
+ quote (type_string));
+ }
+ break;
+
+ case AREGTYPE:
+ case REGTYPE:
+ case GNUTYPE_SPARSE:
+ case CHRTYPE:
+ case BLKTYPE:
+ case DIRTYPE:
+ case FIFOTYPE:
+ case CONTTYPE:
+ case GNUTYPE_DUMPDIR:
+ putc ('\n', stdlis);
+ break;
+
+ case GNUTYPE_LONGLINK:
+ fprintf (stdlis, _("--Long Link--\n"));
+ break;
+
+ case GNUTYPE_LONGNAME:
+ fprintf (stdlis, _("--Long Name--\n"));
+ break;
+
+ case GNUTYPE_VOLHDR:
+ fprintf (stdlis, _("--Volume Header--\n"));
+ break;
+
+ case GNUTYPE_MULTIVOL:
+ strcpy (size,
+ STRINGIFY_BIGINT
+ (UINTMAX_FROM_HEADER (current_header->oldgnu_header.offset),
+ uintbuf));
+ fprintf (stdlis, _("--Continued at byte %s--\n"), size);
+ break;
+ }
+ }
+ fflush (stdlis);
+}
+
+/* Print a similar line when we make a directory automatically. */
+void
+print_for_mkdir (char *dirname, int length, mode_t mode)
+{
+ char modes[11];
+
+ if (verbose_option > 1)
+ {
+ /* File type and modes. */
+
+ modes[0] = 'd';
+ pax_decode_mode (mode, modes + 1);
+
+ if (block_number_option)
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ fprintf (stdlis, _("block %s: "),
+ STRINGIFY_BIGINT (current_block_ordinal (), buf));
+ }
+
+ fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + 1 + datewidth,
+ _("Creating directory:"), length, quotearg (dirname));
+ }
+}
+
+/* Skip over SIZE bytes of data in blocks in the archive. */
+void
+skip_file (off_t size)
+{
+ union block *x;
+
+ /* FIXME: Make sure mv_begin is always called before it */
+
+ if (seekable_archive)
+ {
+ off_t nblk = seek_archive (size);
+ if (nblk >= 0)
+ size -= nblk * BLOCKSIZE;
+ else
+ seekable_archive = false;
+ }
+
+ mv_size_left (size);
+
+ while (size > 0)
+ {
+ x = find_next_block ();
+ if (! x)
+ FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
+
+ set_next_block_after (x);
+ size -= BLOCKSIZE;
+ mv_size_left (size);
+ }
+}
+
+/* Skip the current member in the archive.
+ NOTE: Current header must be decoded before calling this function. */
+void
+skip_member (void)
+{
+ if (!current_stat_info.skipped)
+ {
+ char save_typeflag = current_header->header.typeflag;
+ set_next_block_after (current_header);
+
+ mv_begin (&current_stat_info);
+
+ if (current_stat_info.is_sparse)
+ sparse_skip_file (&current_stat_info);
+ else if (save_typeflag != DIRTYPE)
+ skip_file (current_stat_info.stat.st_size);
+
+ mv_end ();
+ }
+}
diff --git a/src/misc.c b/src/misc.c
new file mode 100644
index 0000000..a886b06
--- /dev/null
+++ b/src/misc.c
@@ -0,0 +1,748 @@
+/* Miscellaneous functions, not really specific to GNU tar.
+
+ Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
+ 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <rmt.h>
+#include "common.h"
+#include <quotearg.h>
+#include <save-cwd.h>
+#include <xgetcwd.h>
+#include <unlinkdir.h>
+#include <utimens.h>
+
+#if HAVE_STROPTS_H
+# include <stropts.h>
+#endif
+#if HAVE_SYS_FILIO_H
+# include <sys/filio.h>
+#endif
+
+
+/* Handling strings. */
+
+/* Assign STRING to a copy of VALUE if not zero, or to zero. If
+ STRING was nonzero, it is freed first. */
+void
+assign_string (char **string, const char *value)
+{
+ if (*string)
+ free (*string);
+ *string = value ? xstrdup (value) : 0;
+}
+
+/* Allocate a copy of the string quoted as in C, and returns that. If
+ the string does not have to be quoted, it returns a null pointer.
+ The allocated copy should normally be freed with free() after the
+ caller is done with it.
+
+ This is used in one context only: generating the directory file in
+ incremental dumps. The quoted string is not intended for human
+ consumption; it is intended only for unquote_string. The quoting
+ is locale-independent, so that users needn't worry about locale
+ when reading directory files. This means that we can't use
+ quotearg, as quotearg is locale-dependent and is meant for human
+ consumption. */
+char *
+quote_copy_string (const char *string)
+{
+ const char *source = string;
+ char *destination = 0;
+ char *buffer = 0;
+ int copying = 0;
+
+ while (*source)
+ {
+ int character = *source++;
+
+ switch (character)
+ {
+ case '\n': case '\\':
+ if (!copying)
+ {
+ size_t length = (source - string) - 1;
+
+ copying = 1;
+ buffer = xmalloc (length + 2 + 2 * strlen (source) + 1);
+ memcpy (buffer, string, length);
+ destination = buffer + length;
+ }
+ *destination++ = '\\';
+ *destination++ = character == '\\' ? '\\' : 'n';
+ break;
+
+ default:
+ if (copying)
+ *destination++ = character;
+ break;
+ }
+ }
+ if (copying)
+ {
+ *destination = '\0';
+ return buffer;
+ }
+ return 0;
+}
+
+/* Takes a quoted C string (like those produced by quote_copy_string)
+ and turns it back into the un-quoted original. This is done in
+ place. Returns 0 only if the string was not properly quoted, but
+ completes the unquoting anyway.
+
+ This is used for reading the saved directory file in incremental
+ dumps. It is used for decoding old `N' records (demangling names).
+ But also, it is used for decoding file arguments, would they come
+ from the shell or a -T file, and for decoding the --exclude
+ argument. */
+int
+unquote_string (char *string)
+{
+ int result = 1;
+ char *source = string;
+ char *destination = string;
+
+ /* Escape sequences other than \\ and \n are no longer generated by
+ quote_copy_string, but accept them for backwards compatibility,
+ and also because unquote_string is used for purposes other than
+ parsing the output of quote_copy_string. */
+
+ while (*source)
+ if (*source == '\\')
+ switch (*++source)
+ {
+ case '\\':
+ *destination++ = '\\';
+ source++;
+ break;
+
+ case 'a':
+ *destination++ = '\a';
+ source++;
+ break;
+
+ case 'b':
+ *destination++ = '\b';
+ source++;
+ break;
+
+ case 'f':
+ *destination++ = '\f';
+ source++;
+ break;
+
+ case 'n':
+ *destination++ = '\n';
+ source++;
+ break;
+
+ case 'r':
+ *destination++ = '\r';
+ source++;
+ break;
+
+ case 't':
+ *destination++ = '\t';
+ source++;
+ break;
+
+ case 'v':
+ *destination++ = '\v';
+ source++;
+ break;
+
+ case '?':
+ *destination++ = 0177;
+ source++;
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ {
+ int value = *source++ - '0';
+
+ if (*source < '0' || *source > '7')
+ {
+ *destination++ = value;
+ break;
+ }
+ value = value * 8 + *source++ - '0';
+ if (*source < '0' || *source > '7')
+ {
+ *destination++ = value;
+ break;
+ }
+ value = value * 8 + *source++ - '0';
+ *destination++ = value;
+ break;
+ }
+
+ default:
+ result = 0;
+ *destination++ = '\\';
+ if (*source)
+ *destination++ = *source++;
+ break;
+ }
+ else if (source != destination)
+ *destination++ = *source++;
+ else
+ source++, destination++;
+
+ if (source != destination)
+ *destination = '\0';
+ return result;
+}
+
+/* Handling numbers. */
+
+/* Output fraction and trailing digits appropriate for a nanoseconds
+ count equal to NS, but don't output unnecessary '.' or trailing
+ zeros. */
+
+void
+code_ns_fraction (int ns, char *p)
+{
+ if (ns == 0)
+ *p = '\0';
+ else
+ {
+ int i = 9;
+ *p++ = '.';
+
+ while (ns % 10 == 0)
+ {
+ ns /= 10;
+ i--;
+ }
+
+ p[i] = '\0';
+
+ for (;;)
+ {
+ p[--i] = '0' + ns % 10;
+ if (i == 0)
+ break;
+ ns /= 10;
+ }
+ }
+}
+
+char const *
+code_timespec (struct timespec t, char sbuf[TIMESPEC_STRSIZE_BOUND])
+{
+ time_t s = t.tv_sec;
+ int ns = t.tv_nsec;
+ char *np;
+ bool negative = s < 0;
+
+ if (negative && ns != 0)
+ {
+ s++;
+ ns = BILLION - ns;
+ }
+
+ np = umaxtostr (negative ? - (uintmax_t) s : (uintmax_t) s, sbuf + 1);
+ if (negative)
+ *--np = '-';
+ code_ns_fraction (ns, sbuf + UINTMAX_STRSIZE_BOUND);
+ return np;
+}
+
+/* File handling. */
+
+/* Saved names in case backup needs to be undone. */
+static char *before_backup_name;
+static char *after_backup_name;
+
+/* Return 1 if FILE_NAME is obviously "." or "/". */
+static bool
+must_be_dot_or_slash (char const *file_name)
+{
+ file_name += FILE_SYSTEM_PREFIX_LEN (file_name);
+
+ if (ISSLASH (file_name[0]))
+ {
+ for (;;)
+ if (ISSLASH (file_name[1]))
+ file_name++;
+ else if (file_name[1] == '.'
+ && ISSLASH (file_name[2 + (file_name[2] == '.')]))
+ file_name += 2 + (file_name[2] == '.');
+ else
+ return ! file_name[1];
+ }
+ else
+ {
+ while (file_name[0] == '.' && ISSLASH (file_name[1]))
+ {
+ file_name += 2;
+ while (ISSLASH (*file_name))
+ file_name++;
+ }
+
+ return ! file_name[0] || (file_name[0] == '.' && ! file_name[1]);
+ }
+}
+
+/* Some implementations of rmdir let you remove '.' or '/'.
+ Report an error with errno set to zero for obvious cases of this;
+ otherwise call rmdir. */
+static int
+safer_rmdir (const char *file_name)
+{
+ if (must_be_dot_or_slash (file_name))
+ {
+ errno = 0;
+ return -1;
+ }
+
+ return rmdir (file_name);
+}
+
+/* Remove FILE_NAME, returning 1 on success. If FILE_NAME is a directory,
+ then if OPTION is RECURSIVE_REMOVE_OPTION is set remove FILE_NAME
+ recursively; otherwise, remove it only if it is empty. If FILE_NAME is
+ a directory that cannot be removed (e.g., because it is nonempty)
+ and if OPTION is WANT_DIRECTORY_REMOVE_OPTION, then return -1.
+ Return 0 on error, with errno set; if FILE_NAME is obviously the working
+ directory return zero with errno set to zero. */
+int
+remove_any_file (const char *file_name, enum remove_option option)
+{
+ /* Try unlink first if we cannot unlink directories, as this saves
+ us a system call in the common case where we're removing a
+ non-directory. */
+ bool try_unlink_first = cannot_unlink_dir ();
+
+ if (try_unlink_first)
+ {
+ if (unlink (file_name) == 0)
+ return 1;
+
+ /* POSIX 1003.1-2001 requires EPERM when attempting to unlink a
+ directory without appropriate privileges, but many Linux
+ kernels return the more-sensible EISDIR. */
+ if (errno != EPERM && errno != EISDIR)
+ return 0;
+ }
+
+ if (safer_rmdir (file_name) == 0)
+ return 1;
+
+ switch (errno)
+ {
+ case ENOTDIR:
+ return !try_unlink_first && unlink (file_name) == 0;
+
+ case 0:
+ case EEXIST:
+#if defined ENOTEMPTY && ENOTEMPTY != EEXIST
+ case ENOTEMPTY:
+#endif
+ switch (option)
+ {
+ case ORDINARY_REMOVE_OPTION:
+ break;
+
+ case WANT_DIRECTORY_REMOVE_OPTION:
+ return -1;
+
+ case RECURSIVE_REMOVE_OPTION:
+ {
+ char *directory = savedir (file_name);
+ char const *entry;
+ size_t entrylen;
+
+ if (! directory)
+ return 0;
+
+ for (entry = directory;
+ (entrylen = strlen (entry)) != 0;
+ entry += entrylen + 1)
+ {
+ char *file_name_buffer = new_name (file_name, entry);
+ int r = remove_any_file (file_name_buffer,
+ RECURSIVE_REMOVE_OPTION);
+ int e = errno;
+ free (file_name_buffer);
+
+ if (! r)
+ {
+ free (directory);
+ errno = e;
+ return 0;
+ }
+ }
+
+ free (directory);
+ return safer_rmdir (file_name) == 0;
+ }
+ }
+ break;
+ }
+
+ return 0;
+}
+
+/* Check if FILE_NAME already exists and make a backup of it right now.
+ Return success (nonzero) only if the backup is either unneeded, or
+ successful. For now, directories are considered to never need
+ backup. If THIS_IS_THE_ARCHIVE is nonzero, this is the archive and
+ so, we do not have to backup block or character devices, nor remote
+ entities. */
+bool
+maybe_backup_file (const char *file_name, bool this_is_the_archive)
+{
+ struct stat file_stat;
+
+ /* Check if we really need to backup the file. */
+
+ if (this_is_the_archive && _remdev (file_name))
+ return true;
+
+ if (stat (file_name, &file_stat))
+ {
+ if (errno == ENOENT)
+ return true;
+
+ stat_error (file_name);
+ return false;
+ }
+
+ if (S_ISDIR (file_stat.st_mode))
+ return true;
+
+ if (this_is_the_archive
+ && (S_ISBLK (file_stat.st_mode) || S_ISCHR (file_stat.st_mode)))
+ return true;
+
+ assign_string (&before_backup_name, file_name);
+
+ /* A run situation may exist between Emacs or other GNU programs trying to
+ make a backup for the same file simultaneously. If theoretically
+ possible, real problems are unlikely. Doing any better would require a
+ convention, GNU-wide, for all programs doing backups. */
+
+ assign_string (&after_backup_name, 0);
+ after_backup_name = find_backup_file_name (file_name, backup_type);
+ if (! after_backup_name)
+ xalloc_die ();
+
+ if (rename (before_backup_name, after_backup_name) == 0)
+ {
+ if (verbose_option)
+ fprintf (stdlis, _("Renaming %s to %s\n"),
+ quote_n (0, before_backup_name),
+ quote_n (1, after_backup_name));
+ return true;
+ }
+ else
+ {
+ /* The backup operation failed. */
+ int e = errno;
+ ERROR ((0, e, _("%s: Cannot rename to %s"),
+ quotearg_colon (before_backup_name),
+ quote_n (1, after_backup_name)));
+ assign_string (&after_backup_name, 0);
+ return false;
+ }
+}
+
+/* Try to restore the recently backed up file to its original name.
+ This is usually only needed after a failed extraction. */
+void
+undo_last_backup (void)
+{
+ if (after_backup_name)
+ {
+ if (rename (after_backup_name, before_backup_name) != 0)
+ {
+ int e = errno;
+ ERROR ((0, e, _("%s: Cannot rename to %s"),
+ quotearg_colon (after_backup_name),
+ quote_n (1, before_backup_name)));
+ }
+ if (verbose_option)
+ fprintf (stdlis, _("Renaming %s back to %s\n"),
+ quote_n (0, after_backup_name),
+ quote_n (1, before_backup_name));
+ assign_string (&after_backup_name, 0);
+ }
+}
+
+/* Depending on DEREF, apply either stat or lstat to (NAME, BUF). */
+int
+deref_stat (bool deref, char const *name, struct stat *buf)
+{
+ return deref ? stat (name, buf) : lstat (name, buf);
+}
+
+/* Set FD's (i.e., FILE's) access time to TIMESPEC[0]. If that's not
+ possible to do by itself, set its access and data modification
+ times to TIMESPEC[0] and TIMESPEC[1], respectively. */
+int
+set_file_atime (int fd, char const *file, struct timespec const timespec[2])
+{
+#ifdef _FIOSATIME
+ if (0 <= fd)
+ {
+ struct timeval timeval;
+ timeval.tv_sec = timespec[0].tv_sec;
+ timeval.tv_usec = timespec[0].tv_nsec / 1000;
+ if (ioctl (fd, _FIOSATIME, &timeval) == 0)
+ return 0;
+ }
+#endif
+
+ return gl_futimens (fd, file, timespec);
+}
+
+/* A description of a working directory. */
+struct wd
+{
+ char const *name;
+ int saved;
+ struct saved_cwd saved_cwd;
+};
+
+/* A vector of chdir targets. wd[0] is the initial working directory. */
+static struct wd *wd;
+
+/* The number of working directories in the vector. */
+static size_t wds;
+
+/* The allocated size of the vector. */
+static size_t wd_alloc;
+
+/* DIR is the operand of a -C option; add it to vector of chdir targets,
+ and return the index of its location. */
+int
+chdir_arg (char const *dir)
+{
+ if (wds == wd_alloc)
+ {
+ if (wd_alloc == 0)
+ {
+ wd_alloc = 2;
+ wd = xmalloc (sizeof *wd * wd_alloc);
+ }
+ else
+ wd = x2nrealloc (wd, &wd_alloc, sizeof *wd);
+
+ if (! wds)
+ {
+ wd[wds].name = ".";
+ wd[wds].saved = 0;
+ wds++;
+ }
+ }
+
+ /* Optimize the common special case of the working directory,
+ or the working directory as a prefix. */
+ if (dir[0])
+ {
+ while (dir[0] == '.' && ISSLASH (dir[1]))
+ for (dir += 2; ISSLASH (*dir); dir++)
+ continue;
+ if (! dir[dir[0] == '.'])
+ return wds - 1;
+ }
+
+ wd[wds].name = dir;
+ wd[wds].saved = 0;
+ return wds++;
+}
+
+/* Change to directory I. If I is 0, change to the initial working
+ directory; otherwise, I must be a value returned by chdir_arg. */
+void
+chdir_do (int i)
+{
+ static int previous;
+
+ if (previous != i)
+ {
+ struct wd *prev = &wd[previous];
+ struct wd *curr = &wd[i];
+
+ if (! prev->saved)
+ {
+ int err = 0;
+ prev->saved = 1;
+ if (save_cwd (&prev->saved_cwd) != 0)
+ err = errno;
+ else if (0 <= prev->saved_cwd.desc)
+ {
+ /* Make sure we still have at least one descriptor available. */
+ int fd1 = prev->saved_cwd.desc;
+ int fd2 = dup (fd1);
+ if (0 <= fd2)
+ close (fd2);
+ else if (errno == EMFILE)
+ {
+ /* Force restore_cwd to use chdir_long. */
+ close (fd1);
+ prev->saved_cwd.desc = -1;
+ prev->saved_cwd.name = xgetcwd ();
+ }
+ else
+ err = errno;
+ }
+
+ if (err)
+ FATAL_ERROR ((0, err, _("Cannot save working directory")));
+ }
+
+ if (curr->saved)
+ {
+ if (restore_cwd (&curr->saved_cwd))
+ FATAL_ERROR ((0, 0, _("Cannot change working directory")));
+ }
+ else
+ {
+ if (i && ! ISSLASH (curr->name[0]))
+ chdir_do (i - 1);
+ if (chdir (curr->name) != 0)
+ chdir_fatal (curr->name);
+ }
+
+ previous = i;
+ }
+}
+
+void
+close_diag (char const *name)
+{
+ if (ignore_failed_read_option)
+ close_warn (name);
+ else
+ close_error (name);
+}
+
+void
+open_diag (char const *name)
+{
+ if (ignore_failed_read_option)
+ open_warn (name);
+ else
+ open_error (name);
+}
+
+void
+read_diag_details (char const *name, off_t offset, size_t size)
+{
+ if (ignore_failed_read_option)
+ read_warn_details (name, offset, size);
+ else
+ read_error_details (name, offset, size);
+}
+
+void
+readlink_diag (char const *name)
+{
+ if (ignore_failed_read_option)
+ readlink_warn (name);
+ else
+ readlink_error (name);
+}
+
+void
+savedir_diag (char const *name)
+{
+ if (ignore_failed_read_option)
+ savedir_warn (name);
+ else
+ savedir_error (name);
+}
+
+void
+seek_diag_details (char const *name, off_t offset)
+{
+ if (ignore_failed_read_option)
+ seek_warn_details (name, offset);
+ else
+ seek_error_details (name, offset);
+}
+
+void
+stat_diag (char const *name)
+{
+ if (ignore_failed_read_option)
+ stat_warn (name);
+ else
+ stat_error (name);
+}
+
+void
+write_fatal_details (char const *name, ssize_t status, size_t size)
+{
+ write_error_details (name, status, size);
+ fatal_exit ();
+}
+
+/* Fork, aborting if unsuccessful. */
+pid_t
+xfork (void)
+{
+ pid_t p = fork ();
+ if (p == (pid_t) -1)
+ call_arg_fatal ("fork", _("child process"));
+ return p;
+}
+
+/* Create a pipe, aborting if unsuccessful. */
+void
+xpipe (int fd[2])
+{
+ if (pipe (fd) < 0)
+ call_arg_fatal ("pipe", _("interprocess channel"));
+}
+
+/* Return PTR, aligned upward to the next multiple of ALIGNMENT.
+ ALIGNMENT must be nonzero. The caller must arrange for ((char *)
+ PTR) through ((char *) PTR + ALIGNMENT - 1) to be addressable
+ locations. */
+
+static inline void *
+ptr_align (void *ptr, size_t alignment)
+{
+ char *p0 = ptr;
+ char *p1 = p0 + alignment - 1;
+ return p1 - (size_t) p1 % alignment;
+}
+
+/* Return the address of a page-aligned buffer of at least SIZE bytes.
+ The caller should free *PTR when done with the buffer. */
+
+void *
+page_aligned_alloc (void **ptr, size_t size)
+{
+ size_t alignment = getpagesize ();
+ size_t size1 = size + alignment;
+ if (size1 < size)
+ xalloc_die ();
+ *ptr = xmalloc (size1);
+ return ptr_align (*ptr, alignment);
+}
diff --git a/src/names.c b/src/names.c
new file mode 100644
index 0000000..2eb7629
--- /dev/null
+++ b/src/names.c
@@ -0,0 +1,1022 @@
+/* Various processing of names.
+
+ Copyright (C) 1988, 1992, 1994, 1996, 1997, 1998, 1999, 2000, 2001,
+ 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+
+#include <fnmatch.h>
+#include <hash.h>
+#include <quotearg.h>
+
+#include "common.h"
+
+/* User and group names. */
+
+struct group *getgrnam ();
+struct passwd *getpwnam ();
+#if ! HAVE_DECL_GETPWUID
+struct passwd *getpwuid ();
+#endif
+#if ! HAVE_DECL_GETGRGID
+struct group *getgrgid ();
+#endif
+
+/* Make sure you link with the proper libraries if you are running the
+ Yellow Peril (thanks for the good laugh, Ian J.!), or, euh... NIS.
+ This code should also be modified for non-UNIX systems to do something
+ reasonable. */
+
+static char *cached_uname;
+static char *cached_gname;
+
+static uid_t cached_uid; /* valid only if cached_uname is not empty */
+static gid_t cached_gid; /* valid only if cached_gname is not empty */
+
+/* These variables are valid only if nonempty. */
+static char *cached_no_such_uname;
+static char *cached_no_such_gname;
+
+/* These variables are valid only if nonzero. It's not worth optimizing
+ the case for weird systems where 0 is not a valid uid or gid. */
+static uid_t cached_no_such_uid;
+static gid_t cached_no_such_gid;
+
+static void register_individual_file (char const *name);
+
+/* Given UID, find the corresponding UNAME. */
+void
+uid_to_uname (uid_t uid, char **uname)
+{
+ struct passwd *passwd;
+
+ if (uid != 0 && uid == cached_no_such_uid)
+ {
+ *uname = xstrdup ("");
+ return;
+ }
+
+ if (!cached_uname || uid != cached_uid)
+ {
+ passwd = getpwuid (uid);
+ if (passwd)
+ {
+ cached_uid = uid;
+ assign_string (&cached_uname, passwd->pw_name);
+ }
+ else
+ {
+ cached_no_such_uid = uid;
+ *uname = xstrdup ("");
+ return;
+ }
+ }
+ *uname = xstrdup (cached_uname);
+}
+
+/* Given GID, find the corresponding GNAME. */
+void
+gid_to_gname (gid_t gid, char **gname)
+{
+ struct group *group;
+
+ if (gid != 0 && gid == cached_no_such_gid)
+ {
+ *gname = xstrdup ("");
+ return;
+ }
+
+ if (!cached_gname || gid != cached_gid)
+ {
+ group = getgrgid (gid);
+ if (group)
+ {
+ cached_gid = gid;
+ assign_string (&cached_gname, group->gr_name);
+ }
+ else
+ {
+ cached_no_such_gid = gid;
+ *gname = xstrdup ("");
+ return;
+ }
+ }
+ *gname = xstrdup (cached_gname);
+}
+
+/* Given UNAME, set the corresponding UID and return 1, or else, return 0. */
+int
+uname_to_uid (char const *uname, uid_t *uidp)
+{
+ struct passwd *passwd;
+
+ if (cached_no_such_uname
+ && strcmp (uname, cached_no_such_uname) == 0)
+ return 0;
+
+ if (!cached_uname
+ || uname[0] != cached_uname[0]
+ || strcmp (uname, cached_uname) != 0)
+ {
+ passwd = getpwnam (uname);
+ if (passwd)
+ {
+ cached_uid = passwd->pw_uid;
+ assign_string (&cached_uname, passwd->pw_name);
+ }
+ else
+ {
+ assign_string (&cached_no_such_uname, uname);
+ return 0;
+ }
+ }
+ *uidp = cached_uid;
+ return 1;
+}
+
+/* Given GNAME, set the corresponding GID and return 1, or else, return 0. */
+int
+gname_to_gid (char const *gname, gid_t *gidp)
+{
+ struct group *group;
+
+ if (cached_no_such_gname
+ && strcmp (gname, cached_no_such_gname) == 0)
+ return 0;
+
+ if (!cached_gname
+ || gname[0] != cached_gname[0]
+ || strcmp (gname, cached_gname) != 0)
+ {
+ group = getgrnam (gname);
+ if (group)
+ {
+ cached_gid = group->gr_gid;
+ assign_string (&cached_gname, gname);
+ }
+ else
+ {
+ assign_string (&cached_no_such_gname, gname);
+ return 0;
+ }
+ }
+ *gidp = cached_gid;
+ return 1;
+}
+
+
+/* Names from the command call. */
+
+static struct name *namelist; /* first name in list, if any */
+static struct name **nametail = &namelist; /* end of name list */
+
+/* File name arguments are processed in two stages: first a
+ name_array (see below) is filled, then the names from it
+ are moved into the namelist.
+
+ This awkward process is needed only to implement --same-order option,
+ which is meant to help process large archives on machines with
+ limited memory. With this option on, namelist contains at most one
+ entry, which diminishes the memory consumption.
+
+ However, I very much doubt if we still need this -- Sergey */
+
+/* A name_array element contains entries of three types: */
+
+#define NELT_NAME 0 /* File name */
+#define NELT_CHDIR 1 /* Change directory request */
+#define NELT_FMASK 2 /* Change fnmatch options request */
+
+struct name_elt /* A name_array element. */
+{
+ char type; /* Element type, see NELT_* constants above */
+ union
+ {
+ const char *name; /* File or directory name */
+ int matching_flags;/* fnmatch options if type == NELT_FMASK */
+ } v;
+};
+
+static struct name_elt *name_array; /* store an array of names */
+static size_t allocated_names; /* how big is the array? */
+static size_t names; /* how many entries does it have? */
+static size_t name_index; /* how many of the entries have we scanned? */
+
+/* Check the size of name_array, reallocating it as necessary. */
+static void
+check_name_alloc ()
+{
+ if (names == allocated_names)
+ {
+ if (allocated_names == 0)
+ allocated_names = 10; /* Set initial allocation */
+ name_array = x2nrealloc (name_array, &allocated_names,
+ sizeof (name_array[0]));
+ }
+}
+
+/* Add to name_array the file NAME with fnmatch options MATCHING_FLAGS */
+void
+name_add_name (const char *name, int matching_flags)
+{
+ static int prev_flags = 0; /* FIXME: Or EXCLUDE_ANCHORED? */
+ struct name_elt *ep;
+
+ check_name_alloc ();
+ ep = &name_array[names++];
+ if (prev_flags != matching_flags)
+ {
+ ep->type = NELT_FMASK;
+ ep->v.matching_flags = matching_flags;
+ prev_flags = matching_flags;
+ check_name_alloc ();
+ ep = &name_array[names++];
+ }
+ ep->type = NELT_NAME;
+ ep->v.name = name;
+}
+
+/* Add to name_array a chdir request for the directory NAME */
+void
+name_add_dir (const char *name)
+{
+ struct name_elt *ep;
+ check_name_alloc ();
+ ep = &name_array[names++];
+ ep->type = NELT_CHDIR;
+ ep->v.name = name;
+}
+
+
+/* Names from external name file. */
+
+static char *name_buffer; /* buffer to hold the current file name */
+static size_t name_buffer_length; /* allocated length of name_buffer */
+
+/* Set up to gather file names for tar. They can either come from a
+ file or were saved from decoding arguments. */
+void
+name_init (void)
+{
+ name_buffer = xmalloc (NAME_FIELD_SIZE + 2);
+ name_buffer_length = NAME_FIELD_SIZE;
+}
+
+void
+name_term (void)
+{
+ free (name_buffer);
+ free (name_array);
+}
+
+static int matching_flags; /* exclude_fnmatch options */
+
+/* Get the next NELT_NAME element from name_array. Result is in
+ static storage and can't be relied upon across two calls.
+
+ If CHANGE_DIRS is true, treat any entries of type NELT_CHDIR as
+ the request to change to the given directory. If filename_terminator
+ is NUL, CHANGE_DIRS is effectively always false.
+
+ Entries of type NELT_FMASK cause updates of the matching_flags
+ value. */
+struct name_elt *
+name_next_elt (int change_dirs)
+{
+ static struct name_elt entry;
+ const char *source;
+ char *cursor;
+
+ if (filename_terminator == '\0')
+ change_dirs = 0;
+
+ while (name_index != names)
+ {
+ struct name_elt *ep;
+ size_t source_len;
+
+ ep = &name_array[name_index++];
+ if (ep->type == NELT_FMASK)
+ {
+ matching_flags = ep->v.matching_flags;
+ continue;
+ }
+
+ source = ep->v.name;
+ source_len = strlen (source);
+ if (name_buffer_length < source_len)
+ {
+ do
+ {
+ name_buffer_length *= 2;
+ if (! name_buffer_length)
+ xalloc_die ();
+ }
+ while (name_buffer_length < source_len);
+
+ free (name_buffer);
+ name_buffer = xmalloc (name_buffer_length + 2);
+ }
+ strcpy (name_buffer, source);
+
+ /* Zap trailing slashes. */
+
+ cursor = name_buffer + strlen (name_buffer) - 1;
+ while (cursor > name_buffer && ISSLASH (*cursor))
+ *cursor-- = '\0';
+
+ if (change_dirs && ep->type == NELT_CHDIR)
+ {
+ if (chdir (name_buffer) < 0)
+ chdir_fatal (name_buffer);
+ }
+ else
+ {
+ if (unquote_option)
+ unquote_string (name_buffer);
+ if (incremental_option)
+ register_individual_file (name_buffer);
+ entry.type = ep->type;
+ entry.v.name = name_buffer;
+ return &entry;
+ }
+ }
+
+ return NULL;
+}
+
+const char *
+name_next (int change_dirs)
+{
+ struct name_elt *nelt = name_next_elt (change_dirs);
+ return nelt ? nelt->v.name : NULL;
+}
+
+/* Gather names in a list for scanning. Could hash them later if we
+ really care.
+
+ If the names are already sorted to match the archive, we just read
+ them one by one. name_gather reads the first one, and it is called
+ by name_match as appropriate to read the next ones. At EOF, the
+ last name read is just left in the buffer. This option lets users
+ of small machines extract an arbitrary number of files by doing
+ "tar t" and editing down the list of files. */
+
+void
+name_gather (void)
+{
+ /* Buffer able to hold a single name. */
+ static struct name *buffer;
+ static size_t allocated_size;
+
+ struct name_elt *ep;
+
+ if (same_order_option)
+ {
+ static int change_dir;
+
+ if (allocated_size == 0)
+ {
+ allocated_size = offsetof (struct name, name) + NAME_FIELD_SIZE + 1;
+ buffer = xmalloc (allocated_size);
+ /* FIXME: This memset is overkill, and ugly... */
+ memset (buffer, 0, allocated_size);
+ }
+
+ while ((ep = name_next_elt (0)) && ep->type == NELT_CHDIR)
+ change_dir = chdir_arg (xstrdup (ep->v.name));
+
+ if (ep)
+ {
+ size_t needed_size;
+
+ buffer->length = strlen (ep->v.name);
+ needed_size = offsetof (struct name, name) + buffer->length + 1;
+ if (allocated_size < needed_size)
+ {
+ do
+ {
+ allocated_size *= 2;
+ if (! allocated_size)
+ xalloc_die ();
+ }
+ while (allocated_size < needed_size);
+
+ buffer = xrealloc (buffer, allocated_size);
+ }
+ buffer->change_dir = change_dir;
+ strcpy (buffer->name, ep->v.name);
+ buffer->next = 0;
+ buffer->found_count = 0;
+ buffer->matching_flags = matching_flags;
+
+ namelist = buffer;
+ nametail = &namelist->next;
+ }
+ else if (change_dir)
+ addname (0, change_dir);
+ }
+ else
+ {
+ /* Non sorted names -- read them all in. */
+ int change_dir = 0;
+
+ for (;;)
+ {
+ int change_dir0 = change_dir;
+ while ((ep = name_next_elt (0)) && ep->type == NELT_CHDIR)
+ change_dir = chdir_arg (xstrdup (ep->v.name));
+
+ if (ep)
+ addname (ep->v.name, change_dir);
+ else
+ {
+ if (change_dir != change_dir0)
+ addname (0, change_dir);
+ break;
+ }
+ }
+ }
+}
+
+/* Add a name to the namelist. */
+struct name *
+addname (char const *string, int change_dir)
+{
+ size_t length = string ? strlen (string) : 0;
+ struct name *name = xmalloc (offsetof (struct name, name) + length + 1);
+
+ if (string)
+ strcpy (name->name, string);
+ else
+ name->name[0] = 0;
+
+ name->next = NULL;
+ name->length = length;
+ name->found_count = 0;
+ name->matching_flags = matching_flags;
+ name->change_dir = change_dir;
+ name->dir_contents = NULL;
+
+ *nametail = name;
+ nametail = &name->next;
+ return name;
+}
+
+/* Find a match for FILE_NAME (whose string length is LENGTH) in the name
+ list. */
+static struct name *
+namelist_match (char const *file_name, size_t length)
+{
+ struct name *p;
+
+ for (p = namelist; p; p = p->next)
+ {
+ if (p->name[0]
+ && exclude_fnmatch (p->name, file_name, p->matching_flags))
+ return p;
+ }
+
+ return NULL;
+}
+
+/* Return true if and only if name FILE_NAME (from an archive) matches any
+ name from the namelist. */
+bool
+name_match (const char *file_name)
+{
+ size_t length = strlen (file_name);
+
+ while (1)
+ {
+ struct name *cursor = namelist;
+
+ if (!cursor)
+ return true;
+
+ if (cursor->name[0] == 0)
+ {
+ chdir_do (cursor->change_dir);
+ namelist = 0;
+ nametail = &namelist;
+ return true;
+ }
+
+ cursor = namelist_match (file_name, length);
+ if (cursor)
+ {
+ if (!(ISSLASH (file_name[cursor->length]) && recursion_option)
+ || cursor->found_count == 0)
+ cursor->found_count++; /* remember it matched */
+ if (starting_file_option)
+ {
+ free (namelist);
+ namelist = 0;
+ nametail = &namelist;
+ }
+ chdir_do (cursor->change_dir);
+
+ /* We got a match. */
+ return ISFOUND (cursor);
+ }
+
+ /* Filename from archive not found in namelist. If we have the whole
+ namelist here, just return 0. Otherwise, read the next name in and
+ compare it. If this was the last name, namelist->found_count will
+ remain on. If not, we loop to compare the newly read name. */
+
+ if (same_order_option && namelist->found_count)
+ {
+ name_gather (); /* read one more */
+ if (namelist->found_count)
+ return false;
+ }
+ else
+ return false;
+ }
+}
+
+/* Returns true if all names from the namelist were processed.
+ P is the stat_info of the most recently processed entry.
+ The decision is postponed until the next entry is read if:
+
+ 1) P ended with a slash (i.e. it was a directory)
+ 2) P matches any entry from the namelist *and* represents a subdirectory
+ or a file lying under this entry (in the terms of directory structure).
+
+ This is necessary to handle contents of directories. */
+bool
+all_names_found (struct tar_stat_info *p)
+{
+ struct name const *cursor;
+ size_t len;
+
+ if (test_label_option)
+ return true;
+ if (!p->file_name || occurrence_option == 0 || p->had_trailing_slash)
+ return false;
+ len = strlen (p->file_name);
+ for (cursor = namelist; cursor; cursor = cursor->next)
+ {
+ if ((cursor->name[0] && !WASFOUND (cursor))
+ || (len >= cursor->length && ISSLASH (p->file_name[cursor->length])))
+ return false;
+ }
+ return true;
+}
+
+static inline int
+is_pattern (const char *string)
+{
+ return strchr (string, '*') || strchr (string, '[') || strchr (string, '?');
+}
+
+static void
+regex_usage_warning (const char *name)
+{
+ static int warned_once = 0;
+
+ if (warn_regex_usage && is_pattern (name))
+ {
+ warned_once = 1;
+ WARN ((0, 0,
+ /* TRANSLATORS: The following three msgids form a single sentence.
+ */
+ _("Pattern matching characters used in file names. Please,")));
+ WARN ((0, 0,
+ _("use --wildcards to enable pattern matching, or --no-wildcards to")));
+ WARN ((0, 0,
+ _("suppress this warning.")));
+ }
+}
+
+/* Print the names of things in the namelist that were not matched. */
+void
+names_notfound (void)
+{
+ struct name const *cursor;
+
+ for (cursor = namelist; cursor; cursor = cursor->next)
+ if (!WASFOUND (cursor) && cursor->name[0])
+ {
+ regex_usage_warning (cursor->name);
+ if (cursor->found_count == 0)
+ ERROR ((0, 0, _("%s: Not found in archive"),
+ quotearg_colon (cursor->name)));
+ else
+ ERROR ((0, 0, _("%s: Required occurrence not found in archive"),
+ quotearg_colon (cursor->name)));
+ }
+
+ /* Don't bother freeing the name list; we're about to exit. */
+ namelist = 0;
+ nametail = &namelist;
+
+ if (same_order_option)
+ {
+ const char *name;
+
+ while ((name = name_next (1)) != NULL)
+ {
+ regex_usage_warning (name);
+ ERROR ((0, 0, _("%s: Not found in archive"),
+ quotearg_colon (name)));
+ }
+ }
+}
+
+/* Sorting name lists. */
+
+/* Sort linked LIST of names, of given LENGTH, using COMPARE to order
+ names. Return the sorted list. Apart from the type `struct name'
+ and the definition of SUCCESSOR, this is a generic list-sorting
+ function, but it's too painful to make it both generic and portable
+ in C. */
+
+static struct name *
+merge_sort (struct name *list, int length,
+ int (*compare) (struct name const*, struct name const*))
+{
+ struct name *first_list;
+ struct name *second_list;
+ int first_length;
+ int second_length;
+ struct name *result;
+ struct name **merge_point;
+ struct name *cursor;
+ int counter;
+
+# define SUCCESSOR(name) ((name)->next)
+
+ if (length == 1)
+ return list;
+
+ if (length == 2)
+ {
+ if ((*compare) (list, SUCCESSOR (list)) > 0)
+ {
+ result = SUCCESSOR (list);
+ SUCCESSOR (result) = list;
+ SUCCESSOR (list) = 0;
+ return result;
+ }
+ return list;
+ }
+
+ first_list = list;
+ first_length = (length + 1) / 2;
+ second_length = length / 2;
+ for (cursor = list, counter = first_length - 1;
+ counter;
+ cursor = SUCCESSOR (cursor), counter--)
+ continue;
+ second_list = SUCCESSOR (cursor);
+ SUCCESSOR (cursor) = 0;
+
+ first_list = merge_sort (first_list, first_length, compare);
+ second_list = merge_sort (second_list, second_length, compare);
+
+ merge_point = &result;
+ while (first_list && second_list)
+ if ((*compare) (first_list, second_list) < 0)
+ {
+ cursor = SUCCESSOR (first_list);
+ *merge_point = first_list;
+ merge_point = &SUCCESSOR (first_list);
+ first_list = cursor;
+ }
+ else
+ {
+ cursor = SUCCESSOR (second_list);
+ *merge_point = second_list;
+ merge_point = &SUCCESSOR (second_list);
+ second_list = cursor;
+ }
+ if (first_list)
+ *merge_point = first_list;
+ else
+ *merge_point = second_list;
+
+ return result;
+
+#undef SUCCESSOR
+}
+
+/* A comparison function for sorting names. Put found names last;
+ break ties by string comparison. */
+
+static int
+compare_names (struct name const *n1, struct name const *n2)
+{
+ int found_diff = WASFOUND(n2) - WASFOUND(n1);
+ return found_diff ? found_diff : strcmp (n1->name, n2->name);
+}
+
+/* Add all the dirs under NAME, which names a directory, to the namelist.
+ If any of the files is a directory, recurse on the subdirectory.
+ DEVICE is the device not to leave, if the -l option is specified. */
+
+static void
+add_hierarchy_to_namelist (struct name *name, dev_t device)
+{
+ char *file_name = name->name;
+ char *buffer = get_directory_contents (file_name, device);
+
+ if (! buffer)
+ name->dir_contents = "\0\0\0\0";
+ else
+ {
+ size_t name_length = name->length;
+ size_t allocated_length = (name_length >= NAME_FIELD_SIZE
+ ? name_length + NAME_FIELD_SIZE
+ : NAME_FIELD_SIZE);
+ char *namebuf = xmalloc (allocated_length + 1);
+ /* FIXME: + 2 above? */
+ char *string;
+ size_t string_length;
+ int change_dir = name->change_dir;
+
+ name->dir_contents = buffer;
+ strcpy (namebuf, file_name);
+ if (! ISSLASH (namebuf[name_length - 1]))
+ {
+ namebuf[name_length++] = '/';
+ namebuf[name_length] = '\0';
+ }
+
+ for (string = buffer; *string; string += string_length + 1)
+ {
+ string_length = strlen (string);
+ if (*string == 'D')
+ {
+ struct name *np;
+
+ if (allocated_length <= name_length + string_length)
+ {
+ do
+ {
+ allocated_length *= 2;
+ if (! allocated_length)
+ xalloc_die ();
+ }
+ while (allocated_length <= name_length + string_length);
+
+ namebuf = xrealloc (namebuf, allocated_length + 1);
+ }
+ strcpy (namebuf + name_length, string + 1);
+ np = addname (namebuf, change_dir);
+ add_hierarchy_to_namelist (np, device);
+ }
+ }
+
+ free (namebuf);
+ }
+}
+
+/* Collect all the names from argv[] (or whatever), expand them into a
+ directory tree, and sort them. This gets only subdirectories, not
+ all files. */
+
+void
+collect_and_sort_names (void)
+{
+ struct name *name;
+ struct name *next_name;
+ int num_names;
+ struct stat statbuf;
+
+ name_gather ();
+
+ if (listed_incremental_option)
+ read_directory_file ();
+
+ if (!namelist)
+ addname (".", 0);
+
+ for (name = namelist; name; name = next_name)
+ {
+ next_name = name->next;
+ if (name->found_count || name->dir_contents)
+ continue;
+ if (name->matching_flags & EXCLUDE_WILDCARDS)
+ /* NOTE: EXCLUDE_ANCHORED is not relevant here */
+ /* FIXME: just skip regexps for now */
+ continue;
+ chdir_do (name->change_dir);
+ if (name->name[0] == 0)
+ continue;
+
+ if (deref_stat (dereference_option, name->name, &statbuf) != 0)
+ {
+ stat_diag (name->name);
+ continue;
+ }
+ if (S_ISDIR (statbuf.st_mode))
+ {
+ name->found_count++;
+ add_hierarchy_to_namelist (name, statbuf.st_dev);
+ }
+ }
+
+ num_names = 0;
+ for (name = namelist; name; name = name->next)
+ num_names++;
+ namelist = merge_sort (namelist, num_names, compare_names);
+
+ for (name = namelist; name; name = name->next)
+ name->found_count = 0;
+
+ if (listed_incremental_option)
+ {
+ for (name = namelist; name && name->name[0] == 0; name++)
+ ;
+ if (name)
+ name->dir_contents = append_incremental_renames (name->dir_contents);
+ }
+}
+
+/* This is like name_match, except that
+ 1. It returns a pointer to the name it matched, and doesn't set FOUND
+ in structure. The caller will have to do that if it wants to.
+ 2. If the namelist is empty, it returns null, unlike name_match, which
+ returns TRUE. */
+struct name *
+name_scan (const char *file_name)
+{
+ size_t length = strlen (file_name);
+
+ while (1)
+ {
+ struct name *cursor = namelist_match (file_name, length);
+ if (cursor)
+ return cursor;
+
+ /* Filename from archive not found in namelist. If we have the whole
+ namelist here, just return 0. Otherwise, read the next name in and
+ compare it. If this was the last name, namelist->found_count will
+ remain on. If not, we loop to compare the newly read name. */
+
+ if (same_order_option && namelist && namelist->found_count)
+ {
+ name_gather (); /* read one more */
+ if (namelist->found_count)
+ return 0;
+ }
+ else
+ return 0;
+ }
+}
+
+/* This returns a name from the namelist which doesn't have ->found
+ set. It sets ->found before returning, so successive calls will
+ find and return all the non-found names in the namelist. */
+struct name *gnu_list_name;
+
+char *
+name_from_list (void)
+{
+ if (!gnu_list_name)
+ gnu_list_name = namelist;
+ while (gnu_list_name
+ && (gnu_list_name->found_count || gnu_list_name->name[0] == 0))
+ gnu_list_name = gnu_list_name->next;
+ if (gnu_list_name)
+ {
+ gnu_list_name->found_count++;
+ chdir_do (gnu_list_name->change_dir);
+ return gnu_list_name->name;
+ }
+ return 0;
+}
+
+void
+blank_name_list (void)
+{
+ struct name *name;
+
+ gnu_list_name = 0;
+ for (name = namelist; name; name = name->next)
+ name->found_count = 0;
+}
+
+/* Yield a newly allocated file name consisting of FILE_NAME concatenated to
+ NAME, with an intervening slash if FILE_NAME does not already end in one. */
+char *
+new_name (const char *file_name, const char *name)
+{
+ size_t file_name_len = strlen (file_name);
+ size_t namesize = strlen (name) + 1;
+ int slash = file_name_len && ! ISSLASH (file_name[file_name_len - 1]);
+ char *buffer = xmalloc (file_name_len + slash + namesize);
+ memcpy (buffer, file_name, file_name_len);
+ buffer[file_name_len] = '/';
+ memcpy (buffer + file_name_len + slash, name, namesize);
+ return buffer;
+}
+
+/* Return nonzero if file NAME is excluded. */
+bool
+excluded_name (char const *name)
+{
+ return excluded_file_name (excluded, name + FILE_SYSTEM_PREFIX_LEN (name));
+}
+
+/* Names to avoid dumping. */
+static Hash_table *avoided_name_table;
+
+/* Remember to not archive NAME. */
+void
+add_avoided_name (char const *name)
+{
+ hash_string_insert (&avoided_name_table, name);
+}
+
+/* Should NAME be avoided when archiving? */
+bool
+is_avoided_name (char const *name)
+{
+ return hash_string_lookup (avoided_name_table, name);
+}
+
+
+static Hash_table *individual_file_table;
+
+static void
+register_individual_file (char const *name)
+{
+ struct stat st;
+
+ if (deref_stat (dereference_option, name, &st) != 0)
+ return; /* Will be complained about later */
+ if (S_ISDIR (st.st_mode))
+ return;
+
+ hash_string_insert (&individual_file_table, name);
+}
+
+bool
+is_individual_file (char const *name)
+{
+ return hash_string_lookup (individual_file_table, name);
+}
+
+
+
+/* Return the size of the prefix of FILE_NAME that is removed after
+ stripping NUM leading file name components. NUM must be
+ positive. */
+
+size_t
+stripped_prefix_len (char const *file_name, size_t num)
+{
+ char const *p = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
+ while (ISSLASH (*p))
+ p++;
+ while (*p)
+ {
+ bool slash = ISSLASH (*p);
+ p++;
+ if (slash)
+ {
+ if (--num == 0)
+ return p - file_name;
+ while (ISSLASH (*p))
+ p++;
+ }
+ }
+ return -1;
+}
+
+/* Return nonzero if NAME contains ".." as a file name component. */
+bool
+contains_dot_dot (char const *name)
+{
+ char const *p = name + FILE_SYSTEM_PREFIX_LEN (name);
+
+ for (;; p++)
+ {
+ if (p[0] == '.' && p[1] == '.' && (ISSLASH (p[2]) || !p[2]))
+ return 1;
+
+ do
+ {
+ if (! *p++)
+ return 0;
+ }
+ while (! ISSLASH (*p));
+ }
+}
diff --git a/src/sparse.c b/src/sparse.c
new file mode 100644
index 0000000..aa76c61
--- /dev/null
+++ b/src/sparse.c
@@ -0,0 +1,1175 @@
+/* Functions for dealing with sparse files
+
+ Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <inttostr.h>
+#include <quotearg.h>
+#include "common.h"
+
+struct tar_sparse_file;
+static bool sparse_select_optab (struct tar_sparse_file *file);
+
+enum sparse_scan_state
+ {
+ scan_begin,
+ scan_block,
+ scan_end
+ };
+
+struct tar_sparse_optab
+{
+ bool (*init) (struct tar_sparse_file *);
+ bool (*done) (struct tar_sparse_file *);
+ bool (*sparse_member_p) (struct tar_sparse_file *);
+ bool (*dump_header) (struct tar_sparse_file *);
+ bool (*fixup_header) (struct tar_sparse_file *);
+ bool (*decode_header) (struct tar_sparse_file *);
+ bool (*scan_block) (struct tar_sparse_file *, enum sparse_scan_state,
+ void *);
+ bool (*dump_region) (struct tar_sparse_file *, size_t);
+ bool (*extract_region) (struct tar_sparse_file *, size_t);
+};
+
+struct tar_sparse_file
+{
+ int fd; /* File descriptor */
+ bool seekable; /* Is fd seekable? */
+ off_t offset; /* Current offset in fd if seekable==false.
+ Otherwise unused */
+ off_t dumped_size; /* Number of bytes actually written
+ to the archive */
+ struct tar_stat_info *stat_info; /* Information about the file */
+ struct tar_sparse_optab const *optab; /* Operation table */
+ void *closure; /* Any additional data optab calls might
+ require */
+};
+
+/* Dump zeros to file->fd until offset is reached. It is used instead of
+ lseek if the output file is not seekable */
+static bool
+dump_zeros (struct tar_sparse_file *file, off_t offset)
+{
+ static char const zero_buf[BLOCKSIZE];
+
+ if (offset < file->offset)
+ {
+ errno = EINVAL;
+ return false;
+ }
+
+ while (file->offset < offset)
+ {
+ size_t size = (BLOCKSIZE < offset - file->offset
+ ? BLOCKSIZE
+ : offset - file->offset);
+ ssize_t wrbytes;
+
+ wrbytes = write (file->fd, zero_buf, size);
+ if (wrbytes <= 0)
+ {
+ if (wrbytes == 0)
+ errno = EINVAL;
+ return false;
+ }
+ file->offset += wrbytes;
+ }
+
+ return true;
+}
+
+static bool
+tar_sparse_member_p (struct tar_sparse_file *file)
+{
+ if (file->optab->sparse_member_p)
+ return file->optab->sparse_member_p (file);
+ return false;
+}
+
+static bool
+tar_sparse_init (struct tar_sparse_file *file)
+{
+ memset (file, 0, sizeof *file);
+
+ if (!sparse_select_optab (file))
+ return false;
+
+ if (file->optab->init)
+ return file->optab->init (file);
+
+ return true;
+}
+
+static bool
+tar_sparse_done (struct tar_sparse_file *file)
+{
+ if (file->optab->done)
+ return file->optab->done (file);
+ return true;
+}
+
+static bool
+tar_sparse_scan (struct tar_sparse_file *file, enum sparse_scan_state state,
+ void *block)
+{
+ if (file->optab->scan_block)
+ return file->optab->scan_block (file, state, block);
+ return true;
+}
+
+static bool
+tar_sparse_dump_region (struct tar_sparse_file *file, size_t i)
+{
+ if (file->optab->dump_region)
+ return file->optab->dump_region (file, i);
+ return false;
+}
+
+static bool
+tar_sparse_extract_region (struct tar_sparse_file *file, size_t i)
+{
+ if (file->optab->extract_region)
+ return file->optab->extract_region (file, i);
+ return false;
+}
+
+static bool
+tar_sparse_dump_header (struct tar_sparse_file *file)
+{
+ if (file->optab->dump_header)
+ return file->optab->dump_header (file);
+ return false;
+}
+
+static bool
+tar_sparse_decode_header (struct tar_sparse_file *file)
+{
+ if (file->optab->decode_header)
+ return file->optab->decode_header (file);
+ return true;
+}
+
+static bool
+tar_sparse_fixup_header (struct tar_sparse_file *file)
+{
+ if (file->optab->fixup_header)
+ return file->optab->fixup_header (file);
+ return true;
+}
+
+
+static bool
+lseek_or_error (struct tar_sparse_file *file, off_t offset)
+{
+ if (file->seekable
+ ? lseek (file->fd, offset, SEEK_SET) < 0
+ : ! dump_zeros (file, offset))
+ {
+ seek_diag_details (file->stat_info->orig_file_name, offset);
+ return false;
+ }
+ return true;
+}
+
+/* Takes a blockful of data and basically cruises through it to see if
+ it's made *entirely* of zeros, returning a 0 the instant it finds
+ something that is a nonzero, i.e., useful data. */
+static bool
+zero_block_p (char const *buffer, size_t size)
+{
+ while (size--)
+ if (*buffer++)
+ return false;
+ return true;
+}
+
+static void
+sparse_add_map (struct tar_stat_info *st, struct sp_array const *sp)
+{
+ struct sp_array *sparse_map = st->sparse_map;
+ size_t avail = st->sparse_map_avail;
+ if (avail == st->sparse_map_size)
+ st->sparse_map = sparse_map =
+ x2nrealloc (sparse_map, &st->sparse_map_size, sizeof *sparse_map);
+ sparse_map[avail] = *sp;
+ st->sparse_map_avail = avail + 1;
+}
+
+/* Scan the sparse file and create its map */
+static bool
+sparse_scan_file (struct tar_sparse_file *file)
+{
+ struct tar_stat_info *st = file->stat_info;
+ int fd = file->fd;
+ char buffer[BLOCKSIZE];
+ size_t count;
+ off_t offset = 0;
+ struct sp_array sp = {0, 0};
+
+ if (!lseek_or_error (file, 0))
+ return false;
+
+ st->archive_file_size = 0;
+
+ if (!tar_sparse_scan (file, scan_begin, NULL))
+ return false;
+
+ while ((count = safe_read (fd, buffer, sizeof buffer)) != 0
+ && count != SAFE_READ_ERROR)
+ {
+ /* Analyze the block. */
+ if (zero_block_p (buffer, count))
+ {
+ if (sp.numbytes)
+ {
+ sparse_add_map (st, &sp);
+ sp.numbytes = 0;
+ if (!tar_sparse_scan (file, scan_block, NULL))
+ return false;
+ }
+ }
+ else
+ {
+ if (sp.numbytes == 0)
+ sp.offset = offset;
+ sp.numbytes += count;
+ st->archive_file_size += count;
+ if (!tar_sparse_scan (file, scan_block, buffer))
+ return false;
+ }
+
+ offset += count;
+ }
+
+ if (sp.numbytes == 0)
+ sp.offset = offset;
+
+ sparse_add_map (st, &sp);
+ st->archive_file_size += count;
+ return tar_sparse_scan (file, scan_end, NULL);
+}
+
+static struct tar_sparse_optab const oldgnu_optab;
+static struct tar_sparse_optab const star_optab;
+static struct tar_sparse_optab const pax_optab;
+
+static bool
+sparse_select_optab (struct tar_sparse_file *file)
+{
+ switch (current_format == DEFAULT_FORMAT ? archive_format : current_format)
+ {
+ case V7_FORMAT:
+ case USTAR_FORMAT:
+ return false;
+
+ case OLDGNU_FORMAT:
+ case GNU_FORMAT: /*FIXME: This one should disappear? */
+ file->optab = &oldgnu_optab;
+ break;
+
+ case POSIX_FORMAT:
+ file->optab = &pax_optab;
+ break;
+
+ case STAR_FORMAT:
+ file->optab = &star_optab;
+ break;
+
+ default:
+ return false;
+ }
+ return true;
+}
+
+static bool
+sparse_dump_region (struct tar_sparse_file *file, size_t i)
+{
+ union block *blk;
+ off_t bytes_left = file->stat_info->sparse_map[i].numbytes;
+
+ if (!lseek_or_error (file, file->stat_info->sparse_map[i].offset))
+ return false;
+
+ while (bytes_left > 0)
+ {
+ size_t bufsize = (bytes_left > BLOCKSIZE) ? BLOCKSIZE : bytes_left;
+ size_t bytes_read;
+
+ blk = find_next_block ();
+ bytes_read = safe_read (file->fd, blk->buffer, bufsize);
+ if (bytes_read == SAFE_READ_ERROR)
+ {
+ read_diag_details (file->stat_info->orig_file_name,
+ (file->stat_info->sparse_map[i].offset
+ + file->stat_info->sparse_map[i].numbytes
+ - bytes_left),
+ bufsize);
+ return false;
+ }
+
+ memset (blk->buffer + bytes_read, 0, BLOCKSIZE - bytes_read);
+ bytes_left -= bytes_read;
+ file->dumped_size += bytes_read;
+ mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
+ set_next_block_after (blk);
+ }
+
+ return true;
+}
+
+static bool
+sparse_extract_region (struct tar_sparse_file *file, size_t i)
+{
+ size_t write_size;
+
+ if (!lseek_or_error (file, file->stat_info->sparse_map[i].offset))
+ return false;
+
+ write_size = file->stat_info->sparse_map[i].numbytes;
+
+ if (write_size == 0)
+ {
+ /* Last block of the file is a hole */
+ if (file->seekable && sys_truncate (file->fd))
+ truncate_warn (file->stat_info->orig_file_name);
+ }
+ else while (write_size > 0)
+ {
+ size_t count;
+ size_t wrbytes = (write_size > BLOCKSIZE) ? BLOCKSIZE : write_size;
+ union block *blk = find_next_block ();
+ if (!blk)
+ {
+ ERROR ((0, 0, _("Unexpected EOF in archive")));
+ return false;
+ }
+ set_next_block_after (blk);
+ count = full_write (file->fd, blk->buffer, wrbytes);
+ write_size -= count;
+ file->dumped_size += count;
+ mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
+ file->offset += count;
+ if (count != wrbytes)
+ {
+ write_error_details (file->stat_info->orig_file_name,
+ count, wrbytes);
+ return false;
+ }
+ }
+ return true;
+}
+
+
+
+/* Interface functions */
+enum dump_status
+sparse_dump_file (int fd, struct tar_stat_info *st)
+{
+ bool rc;
+ struct tar_sparse_file file;
+
+ if (!tar_sparse_init (&file))
+ return dump_status_not_implemented;
+
+ file.stat_info = st;
+ file.fd = fd;
+ file.seekable = true; /* File *must* be seekable for dump to work */
+
+ rc = sparse_scan_file (&file);
+ if (rc && file.optab->dump_region)
+ {
+ tar_sparse_dump_header (&file);
+
+ if (fd >= 0)
+ {
+ size_t i;
+
+ mv_begin (file.stat_info);
+ for (i = 0; rc && i < file.stat_info->sparse_map_avail; i++)
+ rc = tar_sparse_dump_region (&file, i);
+ mv_end ();
+ }
+ }
+
+ pad_archive (file.stat_info->archive_file_size - file.dumped_size);
+ return (tar_sparse_done (&file) && rc) ? dump_status_ok : dump_status_short;
+}
+
+bool
+sparse_member_p (struct tar_stat_info *st)
+{
+ struct tar_sparse_file file;
+
+ if (!tar_sparse_init (&file))
+ return false;
+ file.stat_info = st;
+ return tar_sparse_member_p (&file);
+}
+
+bool
+sparse_fixup_header (struct tar_stat_info *st)
+{
+ struct tar_sparse_file file;
+
+ if (!tar_sparse_init (&file))
+ return false;
+ file.stat_info = st;
+ return tar_sparse_fixup_header (&file);
+}
+
+enum dump_status
+sparse_extract_file (int fd, struct tar_stat_info *st, off_t *size)
+{
+ bool rc = true;
+ struct tar_sparse_file file;
+ size_t i;
+
+ if (!tar_sparse_init (&file))
+ return dump_status_not_implemented;
+
+ file.stat_info = st;
+ file.fd = fd;
+ file.seekable = lseek (fd, 0, SEEK_SET) == 0;
+ file.offset = 0;
+
+ rc = tar_sparse_decode_header (&file);
+ for (i = 0; rc && i < file.stat_info->sparse_map_avail; i++)
+ rc = tar_sparse_extract_region (&file, i);
+ *size = file.stat_info->archive_file_size - file.dumped_size;
+ return (tar_sparse_done (&file) && rc) ? dump_status_ok : dump_status_short;
+}
+
+enum dump_status
+sparse_skip_file (struct tar_stat_info *st)
+{
+ bool rc = true;
+ struct tar_sparse_file file;
+
+ if (!tar_sparse_init (&file))
+ return dump_status_not_implemented;
+
+ file.stat_info = st;
+ file.fd = -1;
+
+ rc = tar_sparse_decode_header (&file);
+ skip_file (file.stat_info->archive_file_size - file.dumped_size);
+ return (tar_sparse_done (&file) && rc) ? dump_status_ok : dump_status_short;
+}
+
+
+static bool
+check_sparse_region (struct tar_sparse_file *file, off_t beg, off_t end)
+{
+ if (!lseek_or_error (file, beg))
+ return false;
+
+ while (beg < end)
+ {
+ size_t bytes_read;
+ size_t rdsize = BLOCKSIZE < end - beg ? BLOCKSIZE : end - beg;
+ char diff_buffer[BLOCKSIZE];
+
+ bytes_read = safe_read (file->fd, diff_buffer, rdsize);
+ if (bytes_read == SAFE_READ_ERROR)
+ {
+ read_diag_details (file->stat_info->orig_file_name,
+ beg,
+ rdsize);
+ return false;
+ }
+ if (!zero_block_p (diff_buffer, bytes_read))
+ {
+ char begbuf[INT_BUFSIZE_BOUND (off_t)];
+ report_difference (file->stat_info,
+ _("File fragment at %s is not a hole"),
+ offtostr (beg, begbuf));
+ return false;
+ }
+
+ beg += bytes_read;
+ }
+ return true;
+}
+
+static bool
+check_data_region (struct tar_sparse_file *file, size_t i)
+{
+ size_t size_left;
+
+ if (!lseek_or_error (file, file->stat_info->sparse_map[i].offset))
+ return false;
+ size_left = file->stat_info->sparse_map[i].numbytes;
+ mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
+
+ while (size_left > 0)
+ {
+ size_t bytes_read;
+ size_t rdsize = (size_left > BLOCKSIZE) ? BLOCKSIZE : size_left;
+ char diff_buffer[BLOCKSIZE];
+
+ union block *blk = find_next_block ();
+ if (!blk)
+ {
+ ERROR ((0, 0, _("Unexpected EOF in archive")));
+ return false;
+ }
+ set_next_block_after (blk);
+ bytes_read = safe_read (file->fd, diff_buffer, rdsize);
+ if (bytes_read == SAFE_READ_ERROR)
+ {
+ read_diag_details (file->stat_info->orig_file_name,
+ (file->stat_info->sparse_map[i].offset
+ + file->stat_info->sparse_map[i].numbytes
+ - size_left),
+ rdsize);
+ return false;
+ }
+ file->dumped_size += bytes_read;
+ size_left -= bytes_read;
+ mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
+ if (memcmp (blk->buffer, diff_buffer, rdsize))
+ {
+ report_difference (file->stat_info, _("Contents differ"));
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+sparse_diff_file (int fd, struct tar_stat_info *st)
+{
+ bool rc = true;
+ struct tar_sparse_file file;
+ size_t i;
+ off_t offset = 0;
+
+ if (!tar_sparse_init (&file))
+ return dump_status_not_implemented;
+
+ file.stat_info = st;
+ file.fd = fd;
+ file.seekable = true; /* File *must* be seekable for compare to work */
+
+ rc = tar_sparse_decode_header (&file);
+ mv_begin (st);
+ for (i = 0; rc && i < file.stat_info->sparse_map_avail; i++)
+ {
+ rc = check_sparse_region (&file,
+ offset, file.stat_info->sparse_map[i].offset)
+ && check_data_region (&file, i);
+ offset = file.stat_info->sparse_map[i].offset
+ + file.stat_info->sparse_map[i].numbytes;
+ }
+
+ if (!rc)
+ skip_file (file.stat_info->archive_file_size - file.dumped_size);
+ mv_end ();
+
+ tar_sparse_done (&file);
+ return rc;
+}
+
+
+/* Old GNU Format. The sparse file information is stored in the
+ oldgnu_header in the following manner:
+
+ The header is marked with type 'S'. Its `size' field contains
+ the cumulative size of all non-empty blocks of the file. The
+ actual file size is stored in `realsize' member of oldgnu_header.
+
+ The map of the file is stored in a list of `struct sparse'.
+ Each struct contains offset to the block of data and its
+ size (both as octal numbers). The first file header contains
+ at most 4 such structs (SPARSES_IN_OLDGNU_HEADER). If the map
+ contains more structs, then the field `isextended' of the main
+ header is set to 1 (binary) and the `struct sparse_header'
+ header follows, containing at most 21 following structs
+ (SPARSES_IN_SPARSE_HEADER). If more structs follow, `isextended'
+ field of the extended header is set and next next extension header
+ follows, etc... */
+
+enum oldgnu_add_status
+ {
+ add_ok,
+ add_finish,
+ add_fail
+ };
+
+static bool
+oldgnu_sparse_member_p (struct tar_sparse_file *file __attribute__ ((unused)))
+{
+ return current_header->header.typeflag == GNUTYPE_SPARSE;
+}
+
+/* Add a sparse item to the sparse file and its obstack */
+static enum oldgnu_add_status
+oldgnu_add_sparse (struct tar_sparse_file *file, struct sparse *s)
+{
+ struct sp_array sp;
+
+ if (s->numbytes[0] == '\0')
+ return add_finish;
+ sp.offset = OFF_FROM_HEADER (s->offset);
+ sp.numbytes = SIZE_FROM_HEADER (s->numbytes);
+ if (sp.offset < 0
+ || file->stat_info->stat.st_size < sp.offset + sp.numbytes
+ || file->stat_info->archive_file_size < 0)
+ return add_fail;
+
+ sparse_add_map (file->stat_info, &sp);
+ return add_ok;
+}
+
+static bool
+oldgnu_fixup_header (struct tar_sparse_file *file)
+{
+ /* NOTE! st_size was initialized from the header
+ which actually contains archived size. The following fixes it */
+ file->stat_info->archive_file_size = file->stat_info->stat.st_size;
+ file->stat_info->stat.st_size =
+ OFF_FROM_HEADER (current_header->oldgnu_header.realsize);
+ return true;
+}
+
+/* Convert old GNU format sparse data to internal representation */
+static bool
+oldgnu_get_sparse_info (struct tar_sparse_file *file)
+{
+ size_t i;
+ union block *h = current_header;
+ int ext_p;
+ enum oldgnu_add_status rc;
+
+ file->stat_info->sparse_map_avail = 0;
+ for (i = 0; i < SPARSES_IN_OLDGNU_HEADER; i++)
+ {
+ rc = oldgnu_add_sparse (file, &h->oldgnu_header.sp[i]);
+ if (rc != add_ok)
+ break;
+ }
+
+ for (ext_p = h->oldgnu_header.isextended;
+ rc == add_ok && ext_p; ext_p = h->sparse_header.isextended)
+ {
+ h = find_next_block ();
+ if (!h)
+ {
+ ERROR ((0, 0, _("Unexpected EOF in archive")));
+ return false;
+ }
+ set_next_block_after (h);
+ for (i = 0; i < SPARSES_IN_SPARSE_HEADER && rc == add_ok; i++)
+ rc = oldgnu_add_sparse (file, &h->sparse_header.sp[i]);
+ }
+
+ if (rc == add_fail)
+ {
+ ERROR ((0, 0, _("%s: invalid sparse archive member"),
+ file->stat_info->orig_file_name));
+ return false;
+ }
+ return true;
+}
+
+static void
+oldgnu_store_sparse_info (struct tar_sparse_file *file, size_t *pindex,
+ struct sparse *sp, size_t sparse_size)
+{
+ for (; *pindex < file->stat_info->sparse_map_avail
+ && sparse_size > 0; sparse_size--, sp++, ++*pindex)
+ {
+ OFF_TO_CHARS (file->stat_info->sparse_map[*pindex].offset,
+ sp->offset);
+ SIZE_TO_CHARS (file->stat_info->sparse_map[*pindex].numbytes,
+ sp->numbytes);
+ }
+}
+
+static bool
+oldgnu_dump_header (struct tar_sparse_file *file)
+{
+ off_t block_ordinal = current_block_ordinal ();
+ union block *blk;
+ size_t i;
+
+ blk = start_header (file->stat_info);
+ blk->header.typeflag = GNUTYPE_SPARSE;
+ if (file->stat_info->sparse_map_avail > SPARSES_IN_OLDGNU_HEADER)
+ blk->oldgnu_header.isextended = 1;
+
+ /* Store the real file size */
+ OFF_TO_CHARS (file->stat_info->stat.st_size, blk->oldgnu_header.realsize);
+ /* Store the effective (shrunken) file size */
+ OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
+
+ i = 0;
+ oldgnu_store_sparse_info (file, &i,
+ blk->oldgnu_header.sp,
+ SPARSES_IN_OLDGNU_HEADER);
+ blk->oldgnu_header.isextended = i < file->stat_info->sparse_map_avail;
+ finish_header (file->stat_info, blk, block_ordinal);
+
+ while (i < file->stat_info->sparse_map_avail)
+ {
+ blk = find_next_block ();
+ memset (blk->buffer, 0, BLOCKSIZE);
+ oldgnu_store_sparse_info (file, &i,
+ blk->sparse_header.sp,
+ SPARSES_IN_SPARSE_HEADER);
+ if (i < file->stat_info->sparse_map_avail)
+ blk->sparse_header.isextended = 1;
+ set_next_block_after (blk);
+ }
+ return true;
+}
+
+static struct tar_sparse_optab const oldgnu_optab = {
+ NULL, /* No init function */
+ NULL, /* No done function */
+ oldgnu_sparse_member_p,
+ oldgnu_dump_header,
+ oldgnu_fixup_header,
+ oldgnu_get_sparse_info,
+ NULL, /* No scan_block function */
+ sparse_dump_region,
+ sparse_extract_region,
+};
+
+
+/* Star */
+
+static bool
+star_sparse_member_p (struct tar_sparse_file *file __attribute__ ((unused)))
+{
+ return current_header->header.typeflag == GNUTYPE_SPARSE;
+}
+
+static bool
+star_fixup_header (struct tar_sparse_file *file)
+{
+ /* NOTE! st_size was initialized from the header
+ which actually contains archived size. The following fixes it */
+ file->stat_info->archive_file_size = file->stat_info->stat.st_size;
+ file->stat_info->stat.st_size =
+ OFF_FROM_HEADER (current_header->star_in_header.realsize);
+ return true;
+}
+
+/* Convert STAR format sparse data to internal representation */
+static bool
+star_get_sparse_info (struct tar_sparse_file *file)
+{
+ size_t i;
+ union block *h = current_header;
+ int ext_p;
+ enum oldgnu_add_status rc = add_ok;
+
+ file->stat_info->sparse_map_avail = 0;
+
+ if (h->star_in_header.prefix[0] == '\0'
+ && h->star_in_header.sp[0].offset[10] != '\0')
+ {
+ /* Old star format */
+ for (i = 0; i < SPARSES_IN_STAR_HEADER; i++)
+ {
+ rc = oldgnu_add_sparse (file, &h->star_in_header.sp[i]);
+ if (rc != add_ok)
+ break;
+ }
+ ext_p = h->star_in_header.isextended;
+ }
+ else
+ ext_p = 1;
+
+ for (; rc == add_ok && ext_p; ext_p = h->star_ext_header.isextended)
+ {
+ h = find_next_block ();
+ if (!h)
+ {
+ ERROR ((0, 0, _("Unexpected EOF in archive")));
+ return false;
+ }
+ set_next_block_after (h);
+ for (i = 0; i < SPARSES_IN_STAR_EXT_HEADER && rc == add_ok; i++)
+ rc = oldgnu_add_sparse (file, &h->star_ext_header.sp[i]);
+ }
+
+ if (rc == add_fail)
+ {
+ ERROR ((0, 0, _("%s: invalid sparse archive member"),
+ file->stat_info->orig_file_name));
+ return false;
+ }
+ return true;
+}
+
+
+static struct tar_sparse_optab const star_optab = {
+ NULL, /* No init function */
+ NULL, /* No done function */
+ star_sparse_member_p,
+ NULL,
+ star_fixup_header,
+ star_get_sparse_info,
+ NULL, /* No scan_block function */
+ NULL, /* No dump region function */
+ sparse_extract_region,
+};
+
+
+/* GNU PAX sparse file format. There are several versions:
+
+ * 0.0
+
+ The initial version of sparse format used by tar 1.14-1.15.1.
+ The sparse file map is stored in x header:
+
+ GNU.sparse.size Real size of the stored file
+ GNU.sparse.numblocks Number of blocks in the sparse map
+ repeat numblocks time
+ GNU.sparse.offset Offset of the next data block
+ GNU.sparse.numbytes Size of the next data block
+ end repeat
+
+ This has been reported as conflicting with the POSIX specs. The reason is
+ that offsets and sizes of non-zero data blocks were stored in multiple
+ instances of GNU.sparse.offset/GNU.sparse.numbytes variables, whereas
+ POSIX requires the latest occurrence of the variable to override all
+ previous occurrences.
+
+ To avoid this incompatibility two following versions were introduced.
+
+ * 0.1
+
+ Used by tar 1.15.2 -- 1.15.91 (alpha releases).
+
+ The sparse file map is stored in
+ x header:
+
+ GNU.sparse.size Real size of the stored file
+ GNU.sparse.numblocks Number of blocks in the sparse map
+ GNU.sparse.map Map of non-null data chunks. A string consisting
+ of comma-separated values "offset,size[,offset,size]..."
+
+ The resulting GNU.sparse.map string can be *very* long. While POSIX does not
+ impose any limit on the length of a x header variable, this can confuse some
+ tars.
+
+ * 1.0
+
+ Starting from this version, the exact sparse format version is specified
+ explicitely in the header using the following variables:
+
+ GNU.sparse.major Major version
+ GNU.sparse.minor Minor version
+
+ X header keeps the following variables:
+
+ GNU.sparse.name Real file name of the sparse file
+ GNU.sparse.realsize Real size of the stored file (corresponds to the old
+ GNU.sparse.size variable)
+
+ The name field of the ustar header is constructed using the pattern
+ "%d/GNUSparseFile.%p/%f".
+
+ The sparse map itself is stored in the file data block, preceding the actual
+ file data. It consists of a series of octal numbers of arbitrary length,
+ delimited by newlines. The map is padded with nulls to the nearest block
+ boundary.
+
+ The first number gives the number of entries in the map. Following are map
+ entries, each one consisting of two numbers giving the offset and size of
+ the data block it describes.
+
+ The format is designed in such a way that non-posix aware tars and tars not
+ supporting GNU.sparse.* keywords will extract each sparse file in its
+ condensed form with the file map attached and will place it into a separate
+ directory. Then, using a simple program it would be possible to expand the
+ file to its original form even without GNU tar.
+
+ Bu default, v.1.0 archives are created. To use other formats,
+ --sparse-version option is provided. Additionally, v.0.0 can be obtained
+ by deleting GNU.sparse.map from 0.1 format: --sparse-version 0.1
+ --pax-option delete=GNU.sparse.map
+*/
+
+static bool
+pax_sparse_member_p (struct tar_sparse_file *file)
+{
+ return file->stat_info->sparse_map_avail > 0
+ || file->stat_info->sparse_major > 0;
+}
+
+static bool
+pax_dump_header_0 (struct tar_sparse_file *file)
+{
+ off_t block_ordinal = current_block_ordinal ();
+ union block *blk;
+ size_t i;
+ char nbuf[UINTMAX_STRSIZE_BOUND];
+ struct sp_array *map = file->stat_info->sparse_map;
+ char *save_file_name = NULL;
+
+ /* Store the real file size */
+ xheader_store ("GNU.sparse.size", file->stat_info, NULL);
+ xheader_store ("GNU.sparse.numblocks", file->stat_info, NULL);
+
+ if (xheader_keyword_deleted_p ("GNU.sparse.map")
+ || tar_sparse_minor == 0)
+ {
+ for (i = 0; i < file->stat_info->sparse_map_avail; i++)
+ {
+ xheader_store ("GNU.sparse.offset", file->stat_info, &i);
+ xheader_store ("GNU.sparse.numbytes", file->stat_info, &i);
+ }
+ }
+ else
+ {
+ xheader_store ("GNU.sparse.name", file->stat_info, NULL);
+ save_file_name = file->stat_info->file_name;
+ file->stat_info->file_name = xheader_format_name (file->stat_info,
+ "%d/GNUSparseFile.%p/%f", 0);
+
+ xheader_string_begin (&file->stat_info->xhdr);
+ for (i = 0; i < file->stat_info->sparse_map_avail; i++)
+ {
+ if (i)
+ xheader_string_add (&file->stat_info->xhdr, ",");
+ xheader_string_add (&file->stat_info->xhdr,
+ umaxtostr (map[i].offset, nbuf));
+ xheader_string_add (&file->stat_info->xhdr, ",");
+ xheader_string_add (&file->stat_info->xhdr,
+ umaxtostr (map[i].numbytes, nbuf));
+ }
+ if (!xheader_string_end (&file->stat_info->xhdr,
+ "GNU.sparse.map"))
+ {
+ free (file->stat_info->file_name);
+ file->stat_info->file_name = save_file_name;
+ return false;
+ }
+ }
+ blk = start_header (file->stat_info);
+ /* Store the effective (shrunken) file size */
+ OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
+ finish_header (file->stat_info, blk, block_ordinal);
+ if (save_file_name)
+ {
+ free (file->stat_info->file_name);
+ file->stat_info->file_name = save_file_name;
+ }
+ return true;
+}
+
+static bool
+pax_dump_header_1 (struct tar_sparse_file *file)
+{
+ off_t block_ordinal = current_block_ordinal ();
+ union block *blk;
+ char *p, *q;
+ size_t i;
+ char nbuf[UINTMAX_STRSIZE_BOUND];
+ off_t size = 0;
+ struct sp_array *map = file->stat_info->sparse_map;
+ char *save_file_name = file->stat_info->file_name;
+
+#define COPY_STRING(b,dst,src) do \
+ { \
+ char *endp = b->buffer + BLOCKSIZE; \
+ char *srcp = src; \
+ while (*srcp) \
+ { \
+ if (dst == endp) \
+ { \
+ set_next_block_after (b); \
+ b = find_next_block (); \
+ dst = b->buffer; \
+ endp = b->buffer + BLOCKSIZE; \
+ } \
+ *dst++ = *srcp++; \
+ } \
+ } while (0)
+
+ /* Compute stored file size */
+ p = umaxtostr (file->stat_info->sparse_map_avail, nbuf);
+ size += strlen (p) + 1;
+ for (i = 0; i < file->stat_info->sparse_map_avail; i++)
+ {
+ p = umaxtostr (map[i].offset, nbuf);
+ size += strlen (p) + 1;
+ p = umaxtostr (map[i].numbytes, nbuf);
+ size += strlen (p) + 1;
+ }
+ size = (size + BLOCKSIZE - 1) / BLOCKSIZE;
+ file->stat_info->archive_file_size += size * BLOCKSIZE;
+ file->dumped_size += size * BLOCKSIZE;
+
+ /* Store sparse file identification */
+ xheader_store ("GNU.sparse.major", file->stat_info, NULL);
+ xheader_store ("GNU.sparse.minor", file->stat_info, NULL);
+ xheader_store ("GNU.sparse.name", file->stat_info, NULL);
+ xheader_store ("GNU.sparse.realsize", file->stat_info, NULL);
+
+ file->stat_info->file_name = xheader_format_name (file->stat_info,
+ "%d/GNUSparseFile.%p/%f", 0);
+
+ blk = start_header (file->stat_info);
+ /* Store the effective (shrunken) file size */
+ OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
+ finish_header (file->stat_info, blk, block_ordinal);
+ free (file->stat_info->file_name);
+ file->stat_info->file_name = save_file_name;
+
+ blk = find_next_block ();
+ q = blk->buffer;
+ p = umaxtostr (file->stat_info->sparse_map_avail, nbuf);
+ COPY_STRING (blk, q, p);
+ COPY_STRING (blk, q, "\n");
+ for (i = 0; i < file->stat_info->sparse_map_avail; i++)
+ {
+ p = umaxtostr (map[i].offset, nbuf);
+ COPY_STRING (blk, q, p);
+ COPY_STRING (blk, q, "\n");
+ p = umaxtostr (map[i].numbytes, nbuf);
+ COPY_STRING (blk, q, p);
+ COPY_STRING (blk, q, "\n");
+ }
+ memset (q, 0, BLOCKSIZE - (q - blk->buffer));
+ set_next_block_after (blk);
+ return true;
+}
+
+static bool
+pax_dump_header (struct tar_sparse_file *file)
+{
+ file->stat_info->sparse_major = tar_sparse_major;
+ file->stat_info->sparse_minor = tar_sparse_minor;
+
+ return (file->stat_info->sparse_major == 0) ?
+ pax_dump_header_0 (file) : pax_dump_header_1 (file);
+}
+
+static bool
+decode_num (uintmax_t *num, char const *arg, uintmax_t maxval)
+{
+ uintmax_t u;
+ char *arg_lim;
+
+ if (!ISDIGIT (*arg))
+ return false;
+
+ u = strtoumax (arg, &arg_lim, 10);
+
+ if (! (u <= maxval && errno != ERANGE) || *arg_lim)
+ return false;
+
+ *num = u;
+ return true;
+}
+
+static bool
+pax_decode_header (struct tar_sparse_file *file)
+{
+ if (file->stat_info->sparse_major > 0)
+ {
+ uintmax_t u;
+ char nbuf[UINTMAX_STRSIZE_BOUND];
+ union block *blk;
+ char *p;
+ size_t i;
+
+#define COPY_BUF(b,buf,src) do \
+ { \
+ char *endp = b->buffer + BLOCKSIZE; \
+ char *dst = buf; \
+ do \
+ { \
+ if (dst == buf + UINTMAX_STRSIZE_BOUND -1) \
+ { \
+ ERROR ((0, 0, _("%s: numeric overflow in sparse archive member"), \
+ file->stat_info->orig_file_name)); \
+ return false; \
+ } \
+ if (src == endp) \
+ { \
+ set_next_block_after (b); \
+ file->dumped_size += BLOCKSIZE; \
+ b = find_next_block (); \
+ src = b->buffer; \
+ endp = b->buffer + BLOCKSIZE; \
+ } \
+ *dst = *src++; \
+ } \
+ while (*dst++ != '\n'); \
+ dst[-1] = 0; \
+ } while (0)
+
+ set_next_block_after (current_header);
+ file->dumped_size += BLOCKSIZE;
+ blk = find_next_block ();
+ p = blk->buffer;
+ COPY_BUF (blk,nbuf,p);
+ if (!decode_num (&u, nbuf, TYPE_MAXIMUM (size_t)))
+ {
+ ERROR ((0, 0, _("%s: malformed sparse archive member"),
+ file->stat_info->orig_file_name));
+ return false;
+ }
+ file->stat_info->sparse_map_size = u;
+ file->stat_info->sparse_map = xcalloc (file->stat_info->sparse_map_size,
+ sizeof (*file->stat_info->sparse_map));
+ file->stat_info->sparse_map_avail = 0;
+ for (i = 0; i < file->stat_info->sparse_map_size; i++)
+ {
+ struct sp_array sp;
+
+ COPY_BUF (blk,nbuf,p);
+ if (!decode_num (&u, nbuf, TYPE_MAXIMUM (off_t)))
+ {
+ ERROR ((0, 0, _("%s: malformed sparse archive member"),
+ file->stat_info->orig_file_name));
+ return false;
+ }
+ sp.offset = u;
+ COPY_BUF (blk,nbuf,p);
+ if (!decode_num (&u, nbuf, TYPE_MAXIMUM (size_t)))
+ {
+ ERROR ((0, 0, _("%s: malformed sparse archive member"),
+ file->stat_info->orig_file_name));
+ return false;
+ }
+ sp.numbytes = u;
+ sparse_add_map (file->stat_info, &sp);
+ }
+ set_next_block_after (blk);
+ }
+
+ return true;
+}
+
+static struct tar_sparse_optab const pax_optab = {
+ NULL, /* No init function */
+ NULL, /* No done function */
+ pax_sparse_member_p,
+ pax_dump_header,
+ NULL,
+ pax_decode_header,
+ NULL, /* No scan_block function */
+ sparse_dump_region,
+ sparse_extract_region,
+};
diff --git a/src/system.c b/src/system.c
new file mode 100644
index 0000000..e2d0431
--- /dev/null
+++ b/src/system.c
@@ -0,0 +1,844 @@
+/* System-dependent calls for tar.
+
+ Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <getline.h>
+#include <setenv.h>
+
+#include "common.h"
+#include <rmt.h>
+#include <signal.h>
+
+#if MSDOS
+
+bool
+sys_get_archive_stat (void)
+{
+ return 0;
+}
+
+bool
+sys_file_is_archive (struct tar_stat_info *p)
+{
+ return false;
+}
+
+void
+sys_save_archive_dev_ino (void)
+{
+}
+
+void
+sys_detect_dev_null_output (void)
+{
+ static char const dev_null[] = "nul";
+
+ dev_null_output = (strcmp (archive_name_array[0], dev_null) == 0
+ || (! _isrmt (archive)));
+}
+
+void
+sys_drain_input_pipe (void)
+{
+}
+
+void
+sys_wait_for_child (pid_t child_pid)
+{
+}
+
+void
+sys_spawn_shell (void)
+{
+ spawnl (P_WAIT, getenv ("COMSPEC"), "-", 0);
+}
+
+/* stat() in djgpp's C library gives a constant number of 42 as the
+ uid and gid of a file. So, comparing an FTP'ed archive just after
+ unpack would fail on MSDOS. */
+
+bool
+sys_compare_uid (struct stat *a, struct stat *b)
+{
+ return true;
+}
+
+bool
+sys_compare_gid (struct stat *a, struct stat *b)
+{
+ return true;
+}
+
+void
+sys_compare_links (struct stat *link_data, struct stat *stat_data)
+{
+ return true;
+}
+
+int
+sys_truncate (int fd)
+{
+ return write (fd, "", 0);
+}
+
+size_t
+sys_write_archive_buffer (void)
+{
+ return full_write (archive, record_start->buffer, record_size);
+}
+
+/* Set ARCHIVE for writing, then compressing an archive. */
+void
+sys_child_open_for_compress (void)
+{
+ FATAL_ERROR ((0, 0, _("Cannot use compressed or remote archives")));
+}
+
+/* Set ARCHIVE for uncompressing, then reading an archive. */
+void
+sys_child_open_for_uncompress (void)
+{
+ FATAL_ERROR ((0, 0, _("Cannot use compressed or remote archives")));
+}
+
+#else
+
+extern union block *record_start; /* FIXME */
+
+static struct stat archive_stat; /* stat block for archive file */
+
+bool
+sys_get_archive_stat (void)
+{
+ return fstat (archive, &archive_stat) == 0;
+}
+
+bool
+sys_file_is_archive (struct tar_stat_info *p)
+{
+ return (ar_dev && p->stat.st_dev == ar_dev && p->stat.st_ino == ar_ino);
+}
+
+/* Save archive file inode and device numbers */
+void
+sys_save_archive_dev_ino (void)
+{
+ if (!_isrmt (archive) && S_ISREG (archive_stat.st_mode))
+ {
+ ar_dev = archive_stat.st_dev;
+ ar_ino = archive_stat.st_ino;
+ }
+ else
+ ar_dev = 0;
+}
+
+/* Detect if outputting to "/dev/null". */
+void
+sys_detect_dev_null_output (void)
+{
+ static char const dev_null[] = "/dev/null";
+ struct stat dev_null_stat;
+
+ dev_null_output = (strcmp (archive_name_array[0], dev_null) == 0
+ || (! _isrmt (archive)
+ && S_ISCHR (archive_stat.st_mode)
+ && stat (dev_null, &dev_null_stat) == 0
+ && archive_stat.st_dev == dev_null_stat.st_dev
+ && archive_stat.st_ino == dev_null_stat.st_ino));
+}
+
+/* Manage to fully drain a pipe we might be reading, so to not break it on
+ the producer after the EOF block. FIXME: one of these days, GNU tar
+ might become clever enough to just stop working, once there is no more
+ work to do, we might have to revise this area in such time. */
+
+void
+sys_drain_input_pipe (void)
+{
+ size_t r;
+
+ if (access_mode == ACCESS_READ
+ && ! _isrmt (archive)
+ && (S_ISFIFO (archive_stat.st_mode) || S_ISSOCK (archive_stat.st_mode)))
+ while ((r = rmtread (archive, record_start->buffer, record_size)) != 0
+ && r != SAFE_READ_ERROR)
+ continue;
+}
+
+void
+sys_wait_for_child (pid_t child_pid)
+{
+ if (child_pid)
+ {
+ int wait_status;
+
+ while (waitpid (child_pid, &wait_status, 0) == -1)
+ if (errno != EINTR)
+ {
+ waitpid_error (use_compress_program_option);
+ break;
+ }
+
+ if (WIFSIGNALED (wait_status))
+ ERROR ((0, 0, _("Child died with signal %d"),
+ WTERMSIG (wait_status)));
+ else if (WEXITSTATUS (wait_status) != 0)
+ ERROR ((0, 0, _("Child returned status %d"),
+ WEXITSTATUS (wait_status)));
+ }
+}
+
+void
+sys_spawn_shell (void)
+{
+ pid_t child;
+ const char *shell = getenv ("SHELL");
+ if (! shell)
+ shell = "/bin/sh";
+ child = xfork ();
+ if (child == 0)
+ {
+ execlp (shell, "-sh", "-i", (char *) 0);
+ exec_fatal (shell);
+ }
+ else
+ {
+ int wait_status;
+ while (waitpid (child, &wait_status, 0) == -1)
+ if (errno != EINTR)
+ {
+ waitpid_error (shell);
+ break;
+ }
+ }
+}
+
+bool
+sys_compare_uid (struct stat *a, struct stat *b)
+{
+ return a->st_uid == b->st_uid;
+}
+
+bool
+sys_compare_gid (struct stat *a, struct stat *b)
+{
+ return a->st_gid == b->st_gid;
+}
+
+bool
+sys_compare_links (struct stat *link_data, struct stat *stat_data)
+{
+ return stat_data->st_dev == link_data->st_dev
+ && stat_data->st_ino == link_data->st_ino;
+}
+
+int
+sys_truncate (int fd)
+{
+ off_t pos = lseek (fd, (off_t) 0, SEEK_CUR);
+ return pos < 0 ? -1 : ftruncate (fd, pos);
+}
+
+/* Return nonzero if NAME is the name of a regular file, or if the file
+ does not exist (so it would be created as a regular file). */
+static int
+is_regular_file (const char *name)
+{
+ struct stat stbuf;
+
+ if (stat (name, &stbuf) == 0)
+ return S_ISREG (stbuf.st_mode);
+ else
+ return errno == ENOENT;
+}
+
+size_t
+sys_write_archive_buffer (void)
+{
+ return rmtwrite (archive, record_start->buffer, record_size);
+}
+
+#define PREAD 0 /* read file descriptor from pipe() */
+#define PWRITE 1 /* write file descriptor from pipe() */
+
+/* Duplicate file descriptor FROM into becoming INTO.
+ INTO is closed first and has to be the next available slot. */
+static void
+xdup2 (int from, int into)
+{
+ if (from != into)
+ {
+ int status = close (into);
+
+ if (status != 0 && errno != EBADF)
+ {
+ int e = errno;
+ FATAL_ERROR ((0, e, _("Cannot close")));
+ }
+ status = dup (from);
+ if (status != into)
+ {
+ if (status < 0)
+ {
+ int e = errno;
+ FATAL_ERROR ((0, e, _("Cannot dup")));
+ }
+ abort ();
+ }
+ xclose (from);
+ }
+}
+
+/* Set ARCHIVE for writing, then compressing an archive. */
+pid_t
+sys_child_open_for_compress (void)
+{
+ int parent_pipe[2];
+ int child_pipe[2];
+ pid_t grandchild_pid;
+ pid_t child_pid;
+ int wait_status;
+
+ xpipe (parent_pipe);
+ child_pid = xfork ();
+
+ if (child_pid > 0)
+ {
+ /* The parent tar is still here! Just clean up. */
+
+ archive = parent_pipe[PWRITE];
+ xclose (parent_pipe[PREAD]);
+ return child_pid;
+ }
+
+ /* The new born child tar is here! */
+
+ program_name = _("tar (child)");
+
+ xdup2 (parent_pipe[PREAD], STDIN_FILENO);
+ xclose (parent_pipe[PWRITE]);
+
+ /* Check if we need a grandchild tar. This happens only if either:
+ a) the file is to be accessed by rmt: compressor doesn't know how;
+ b) the file is not a plain file. */
+
+ if (!_remdev (archive_name_array[0])
+ && is_regular_file (archive_name_array[0]))
+ {
+ if (backup_option)
+ maybe_backup_file (archive_name_array[0], 1);
+
+ /* We don't need a grandchild tar. Open the archive and launch the
+ compressor. */
+ if (strcmp (archive_name_array[0], "-"))
+ {
+ archive = creat (archive_name_array[0], MODE_RW);
+ if (archive < 0)
+ {
+ int saved_errno = errno;
+
+ if (backup_option)
+ undo_last_backup ();
+ errno = saved_errno;
+ open_fatal (archive_name_array[0]);
+ }
+ xdup2 (archive, STDOUT_FILENO);
+ }
+ execlp (use_compress_program_option, use_compress_program_option, NULL);
+ exec_fatal (use_compress_program_option);
+ }
+
+ /* We do need a grandchild tar. */
+
+ xpipe (child_pipe);
+ grandchild_pid = xfork ();
+
+ if (grandchild_pid == 0)
+ {
+ /* The newborn grandchild tar is here! Launch the compressor. */
+
+ program_name = _("tar (grandchild)");
+
+ xdup2 (child_pipe[PWRITE], STDOUT_FILENO);
+ xclose (child_pipe[PREAD]);
+ execlp (use_compress_program_option, use_compress_program_option,
+ (char *) 0);
+ exec_fatal (use_compress_program_option);
+ }
+
+ /* The child tar is still here! */
+
+ /* Prepare for reblocking the data from the compressor into the archive. */
+
+ xdup2 (child_pipe[PREAD], STDIN_FILENO);
+ xclose (child_pipe[PWRITE]);
+
+ if (strcmp (archive_name_array[0], "-") == 0)
+ archive = STDOUT_FILENO;
+ else
+ {
+ archive = rmtcreat (archive_name_array[0], MODE_RW, rsh_command_option);
+ if (archive < 0)
+ open_fatal (archive_name_array[0]);
+ }
+
+ /* Let's read out of the stdin pipe and write an archive. */
+
+ while (1)
+ {
+ size_t status = 0;
+ char *cursor;
+ size_t length;
+
+ /* Assemble a record. */
+
+ for (length = 0, cursor = record_start->buffer;
+ length < record_size;
+ length += status, cursor += status)
+ {
+ size_t size = record_size - length;
+
+ status = safe_read (STDIN_FILENO, cursor, size);
+ if (status == SAFE_READ_ERROR)
+ read_fatal (use_compress_program_option);
+ if (status == 0)
+ break;
+ }
+
+ /* Copy the record. */
+
+ if (status == 0)
+ {
+ /* We hit the end of the file. Write last record at
+ full length, as the only role of the grandchild is
+ doing proper reblocking. */
+
+ if (length > 0)
+ {
+ memset (record_start->buffer + length, 0, record_size - length);
+ status = sys_write_archive_buffer ();
+ if (status != record_size)
+ archive_write_error (status);
+ }
+
+ /* There is nothing else to read, break out. */
+ break;
+ }
+
+ status = sys_write_archive_buffer ();
+ if (status != record_size)
+ archive_write_error (status);
+ }
+
+ /* Propagate any failure of the grandchild back to the parent. */
+
+ while (waitpid (grandchild_pid, &wait_status, 0) == -1)
+ if (errno != EINTR)
+ {
+ waitpid_error (use_compress_program_option);
+ break;
+ }
+
+ if (WIFSIGNALED (wait_status))
+ {
+ kill (child_pid, WTERMSIG (wait_status));
+ exit_status = TAREXIT_FAILURE;
+ }
+ else if (WEXITSTATUS (wait_status) != 0)
+ exit_status = WEXITSTATUS (wait_status);
+
+ exit (exit_status);
+}
+
+/* Set ARCHIVE for uncompressing, then reading an archive. */
+pid_t
+sys_child_open_for_uncompress (void)
+{
+ int parent_pipe[2];
+ int child_pipe[2];
+ pid_t grandchild_pid;
+ pid_t child_pid;
+ int wait_status;
+
+ xpipe (parent_pipe);
+ child_pid = xfork ();
+
+ if (child_pid > 0)
+ {
+ /* The parent tar is still here! Just clean up. */
+
+ archive = parent_pipe[PREAD];
+ xclose (parent_pipe[PWRITE]);
+ return child_pid;
+ }
+
+ /* The newborn child tar is here! */
+
+ program_name = _("tar (child)");
+
+ xdup2 (parent_pipe[PWRITE], STDOUT_FILENO);
+ xclose (parent_pipe[PREAD]);
+
+ /* Check if we need a grandchild tar. This happens only if either:
+ a) we're reading stdin: to force unblocking;
+ b) the file is to be accessed by rmt: compressor doesn't know how;
+ c) the file is not a plain file. */
+
+ if (strcmp (archive_name_array[0], "-") != 0
+ && !_remdev (archive_name_array[0])
+ && is_regular_file (archive_name_array[0]))
+ {
+ /* We don't need a grandchild tar. Open the archive and lauch the
+ uncompressor. */
+
+ archive = open (archive_name_array[0], O_RDONLY | O_BINARY, MODE_RW);
+ if (archive < 0)
+ open_fatal (archive_name_array[0]);
+ xdup2 (archive, STDIN_FILENO);
+ execlp (use_compress_program_option, use_compress_program_option,
+ "-d", (char *) 0);
+ exec_fatal (use_compress_program_option);
+ }
+
+ /* We do need a grandchild tar. */
+
+ xpipe (child_pipe);
+ grandchild_pid = xfork ();
+
+ if (grandchild_pid == 0)
+ {
+ /* The newborn grandchild tar is here! Launch the uncompressor. */
+
+ program_name = _("tar (grandchild)");
+
+ xdup2 (child_pipe[PREAD], STDIN_FILENO);
+ xclose (child_pipe[PWRITE]);
+ execlp (use_compress_program_option, use_compress_program_option,
+ "-d", (char *) 0);
+ exec_fatal (use_compress_program_option);
+ }
+
+ /* The child tar is still here! */
+
+ /* Prepare for unblocking the data from the archive into the
+ uncompressor. */
+
+ xdup2 (child_pipe[PWRITE], STDOUT_FILENO);
+ xclose (child_pipe[PREAD]);
+
+ if (strcmp (archive_name_array[0], "-") == 0)
+ archive = STDIN_FILENO;
+ else
+ archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
+ MODE_RW, rsh_command_option);
+ if (archive < 0)
+ open_fatal (archive_name_array[0]);
+
+ /* Let's read the archive and pipe it into stdout. */
+
+ while (1)
+ {
+ char *cursor;
+ size_t maximum;
+ size_t count;
+ size_t status;
+
+ clear_read_error_count ();
+
+ error_loop:
+ status = rmtread (archive, record_start->buffer, record_size);
+ if (status == SAFE_READ_ERROR)
+ {
+ archive_read_error ();
+ goto error_loop;
+ }
+ if (status == 0)
+ break;
+ cursor = record_start->buffer;
+ maximum = status;
+ while (maximum)
+ {
+ count = maximum < BLOCKSIZE ? maximum : BLOCKSIZE;
+ if (full_write (STDOUT_FILENO, cursor, count) != count)
+ write_error (use_compress_program_option);
+ cursor += count;
+ maximum -= count;
+ }
+ }
+
+ xclose (STDOUT_FILENO);
+
+ /* Propagate any failure of the grandchild back to the parent. */
+
+ while (waitpid (grandchild_pid, &wait_status, 0) == -1)
+ if (errno != EINTR)
+ {
+ waitpid_error (use_compress_program_option);
+ break;
+ }
+
+ if (WIFSIGNALED (wait_status))
+ {
+ kill (child_pid, WTERMSIG (wait_status));
+ exit_status = TAREXIT_FAILURE;
+ }
+ else if (WEXITSTATUS (wait_status) != 0)
+ exit_status = WEXITSTATUS (wait_status);
+
+ exit (exit_status);
+}
+
+
+
+static void
+dec_to_env (char *envar, uintmax_t num)
+{
+ char buf[UINTMAX_STRSIZE_BOUND];
+ char *numstr;
+
+ numstr = STRINGIFY_BIGINT (num, buf);
+ if (setenv (envar, numstr, 1) != 0)
+ xalloc_die ();
+}
+
+static void
+time_to_env (char *envar, struct timespec t)
+{
+ char buf[TIMESPEC_STRSIZE_BOUND];
+ if (setenv (envar, code_timespec (t, buf), 1) != 0)
+ xalloc_die ();
+}
+
+static void
+oct_to_env (char *envar, unsigned long num)
+{
+ char buf[1+1+(sizeof(unsigned long)*CHAR_BIT+2)/3];
+
+ snprintf (buf, sizeof buf, "0%lo", num);
+ if (setenv (envar, buf, 1) != 0)
+ xalloc_die ();
+}
+
+static void
+str_to_env (char *envar, char const *str)
+{
+ if (str)
+ {
+ if (setenv (envar, str, 1) != 0)
+ xalloc_die ();
+ }
+ else
+ unsetenv (envar);
+}
+
+static void
+chr_to_env (char *envar, char c)
+{
+ char buf[2];
+ buf[0] = c;
+ buf[1] = 0;
+ if (setenv (envar, buf, 1) != 0)
+ xalloc_die ();
+}
+
+static void
+stat_to_env (char *name, char type, struct tar_stat_info *st)
+{
+ str_to_env ("TAR_VERSION", PACKAGE_VERSION);
+ chr_to_env ("TAR_FILETYPE", type);
+ oct_to_env ("TAR_MODE", st->stat.st_mode);
+ str_to_env ("TAR_FILENAME", name);
+ str_to_env ("TAR_REALNAME", st->file_name);
+ str_to_env ("TAR_UNAME", st->uname);
+ str_to_env ("TAR_GNAME", st->gname);
+ time_to_env ("TAR_ATIME", st->atime);
+ time_to_env ("TAR_MTIME", st->mtime);
+ time_to_env ("TAR_CTIME", st->ctime);
+ dec_to_env ("TAR_SIZE", st->stat.st_size);
+ dec_to_env ("TAR_UID", st->stat.st_uid);
+ dec_to_env ("TAR_GID", st->stat.st_gid);
+
+ switch (type)
+ {
+ case 'b':
+ case 'c':
+ dec_to_env ("TAR_MINOR", minor (st->stat.st_rdev));
+ dec_to_env ("TAR_MAJOR", major (st->stat.st_rdev));
+ unsetenv ("TAR_LINKNAME");
+ break;
+
+ case 'l':
+ case 'h':
+ unsetenv ("TAR_MINOR");
+ unsetenv ("TAR_MAJOR");
+ str_to_env ("TAR_LINKNAME", st->link_name);
+ break;
+
+ default:
+ unsetenv ("TAR_MINOR");
+ unsetenv ("TAR_MAJOR");
+ unsetenv ("TAR_LINKNAME");
+ break;
+ }
+}
+
+static pid_t pid;
+static RETSIGTYPE (*pipe_handler) (int sig);
+
+int
+sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st)
+{
+ int p[2];
+ char *argv[4];
+
+ xpipe (p);
+ pipe_handler = signal (SIGPIPE, SIG_IGN);
+ pid = xfork ();
+
+ if (pid != 0)
+ {
+ xclose (p[PREAD]);
+ return p[PWRITE];
+ }
+
+ /* Child */
+ xdup2 (p[PREAD], STDIN_FILENO);
+ xclose (p[PWRITE]);
+
+ stat_to_env (file_name, typechar, st);
+
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = to_command_option;
+ argv[3] = NULL;
+
+ execv ("/bin/sh", argv);
+
+ exec_fatal (file_name);
+}
+
+void
+sys_wait_command (void)
+{
+ int status;
+
+ if (pid < 0)
+ return;
+
+ signal (SIGPIPE, pipe_handler);
+ while (waitpid (pid, &status, 0) == -1)
+ if (errno != EINTR)
+ {
+ pid = -1;
+ waitpid_error (to_command_option);
+ return;
+ }
+
+ if (WIFEXITED (status))
+ {
+ if (!ignore_command_error_option && WEXITSTATUS (status))
+ ERROR ((0, 0, _("%lu: Child returned status %d"),
+ (unsigned long) pid, WEXITSTATUS (status)));
+ }
+ else if (WIFSIGNALED (status))
+ {
+ WARN ((0, 0, _("%lu: Child terminated on signal %d"),
+ (unsigned long) pid, WTERMSIG (status)));
+ }
+ else
+ ERROR ((0, 0, _("%lu: Child terminated on unknown reason"),
+ (unsigned long) pid));
+
+ pid = -1;
+}
+
+int
+sys_exec_info_script (const char **archive_name, int volume_number)
+{
+ pid_t pid;
+ char *argv[4];
+ char uintbuf[UINTMAX_STRSIZE_BOUND];
+ int p[2];
+
+ xpipe (p);
+ pipe_handler = signal (SIGPIPE, SIG_IGN);
+
+ pid = xfork ();
+
+ if (pid != 0)
+ {
+ /* Master */
+
+ int rc;
+ int status;
+ char *buf;
+ size_t size = 0;
+ FILE *fp;
+
+ xclose (p[PWRITE]);
+ fp = fdopen (p[PREAD], "r");
+ rc = getline (&buf, &size, fp);
+ fclose (fp);
+
+ if (rc > 0 && buf[rc-1] == '\n')
+ buf[--rc] = 0;
+
+ while (waitpid (pid, &status, 0) == -1)
+ if (errno != EINTR)
+ {
+ waitpid_error (info_script_option);
+ return -1;
+ }
+
+ if (WIFEXITED (status))
+ {
+ if (WEXITSTATUS (status) == 0 && rc > 0)
+ *archive_name = buf;
+ else
+ free (buf);
+ return WEXITSTATUS (status);
+ }
+
+ free (buf);
+ return -1;
+ }
+
+ /* Child */
+ setenv ("TAR_VERSION", PACKAGE_VERSION, 1);
+ setenv ("TAR_ARCHIVE", *archive_name, 1);
+ setenv ("TAR_VOLUME", STRINGIFY_BIGINT (volume_number, uintbuf), 1);
+ setenv ("TAR_SUBCOMMAND", subcommand_string (subcommand_option), 1);
+ setenv ("TAR_FORMAT",
+ archive_format_string (current_format == DEFAULT_FORMAT ?
+ archive_format : current_format), 1);
+ setenv ("TAR_FD", STRINGIFY_BIGINT (p[PWRITE], uintbuf), 1);
+
+ xclose (p[PREAD]);
+
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = (char*) info_script_option;
+ argv[3] = NULL;
+
+ execv (argv[0], argv);
+
+ exec_fatal (info_script_option);
+}
+
+
+#endif /* not MSDOS */
diff --git a/src/tar.c b/src/tar.c
new file mode 100644
index 0000000..1b95ccf
--- /dev/null
+++ b/src/tar.c
@@ -0,0 +1,2427 @@
+/* A tar (tape archiver) program.
+
+ Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
+ 2001, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ Written by John Gilmore, starting 1985-08-25.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+
+#include <fnmatch.h>
+#include <getline.h>
+#include <argp.h>
+#include <argp-namefrob.h>
+#include <argp-fmtstream.h>
+
+#include <signal.h>
+#if ! defined SIGCHLD && defined SIGCLD
+# define SIGCHLD SIGCLD
+#endif
+
+/* The following causes "common.h" to produce definitions of all the global
+ variables, rather than just "extern" declarations of them. GNU tar does
+ depend on the system loader to preset all GLOBAL variables to neutral (or
+ zero) values; explicit initialization is usually not done. */
+#define GLOBAL
+#include "common.h"
+
+#include <argmatch.h>
+#include <closeout.h>
+#include <configmake.h>
+#include <exitfail.h>
+#include <getdate.h>
+#include <rmt.h>
+#include <rmt-command.h>
+#include <prepargs.h>
+#include <quotearg.h>
+#include <version-etc.h>
+#include <xstrtol.h>
+#include <stdopen.h>
+
+/* Local declarations. */
+
+#ifndef DEFAULT_ARCHIVE_FORMAT
+# define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
+#endif
+
+#ifndef DEFAULT_ARCHIVE
+# define DEFAULT_ARCHIVE "tar.out"
+#endif
+
+#ifndef DEFAULT_BLOCKING
+# define DEFAULT_BLOCKING 20
+#endif
+
+
+/* Miscellaneous. */
+
+/* Name of option using stdin. */
+static const char *stdin_used_by;
+
+/* Doesn't return if stdin already requested. */
+void
+request_stdin (const char *option)
+{
+ if (stdin_used_by)
+ USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
+ stdin_used_by, option));
+
+ stdin_used_by = option;
+}
+
+extern int rpmatch (char const *response);
+
+/* Returns true if and only if the user typed an affirmative response. */
+int
+confirm (const char *message_action, const char *message_name)
+{
+ static FILE *confirm_file;
+ static int confirm_file_EOF;
+ bool status = false;
+
+ if (!confirm_file)
+ {
+ if (archive == 0 || stdin_used_by)
+ {
+ confirm_file = fopen (TTY_NAME, "r");
+ if (! confirm_file)
+ open_fatal (TTY_NAME);
+ }
+ else
+ {
+ request_stdin ("-w");
+ confirm_file = stdin;
+ }
+ }
+
+ fprintf (stdlis, "%s %s?", message_action, quote (message_name));
+ fflush (stdlis);
+
+ if (!confirm_file_EOF)
+ {
+ char *response = NULL;
+ size_t response_size = 0;
+ if (getline (&response, &response_size, confirm_file) < 0)
+ confirm_file_EOF = 1;
+ else
+ status = rpmatch (response) > 0;
+ free (response);
+ }
+
+ if (confirm_file_EOF)
+ {
+ fputc ('\n', stdlis);
+ fflush (stdlis);
+ }
+
+ return status;
+}
+
+static struct fmttab {
+ char const *name;
+ enum archive_format fmt;
+} const fmttab[] = {
+ { "v7", V7_FORMAT },
+ { "oldgnu", OLDGNU_FORMAT },
+ { "ustar", USTAR_FORMAT },
+ { "posix", POSIX_FORMAT },
+#if 0 /* not fully supported yet */
+ { "star", STAR_FORMAT },
+#endif
+ { "gnu", GNU_FORMAT },
+ { "pax", POSIX_FORMAT }, /* An alias for posix */
+ { NULL, 0 }
+};
+
+static void
+set_archive_format (char const *name)
+{
+ struct fmttab const *p;
+
+ for (p = fmttab; strcmp (p->name, name) != 0; )
+ if (! (++p)->name)
+ USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
+ quotearg_colon (name)));
+
+ archive_format = p->fmt;
+}
+
+const char *
+archive_format_string (enum archive_format fmt)
+{
+ struct fmttab const *p;
+
+ for (p = fmttab; p->name; p++)
+ if (p->fmt == fmt)
+ return p->name;
+ return "unknown?";
+}
+
+#define FORMAT_MASK(n) (1<<(n))
+
+static void
+assert_format(unsigned fmt_mask)
+{
+ if ((FORMAT_MASK (archive_format) & fmt_mask) == 0)
+ USAGE_ERROR ((0, 0,
+ _("GNU features wanted on incompatible archive format")));
+}
+
+const char *
+subcommand_string (enum subcommand c)
+{
+ switch (c)
+ {
+ case UNKNOWN_SUBCOMMAND:
+ return "unknown?";
+
+ case APPEND_SUBCOMMAND:
+ return "-r";
+
+ case CAT_SUBCOMMAND:
+ return "-A";
+
+ case CREATE_SUBCOMMAND:
+ return "-c";
+
+ case DELETE_SUBCOMMAND:
+ return "-D";
+
+ case DIFF_SUBCOMMAND:
+ return "-d";
+
+ case EXTRACT_SUBCOMMAND:
+ return "-x";
+
+ case LIST_SUBCOMMAND:
+ return "-t";
+
+ case UPDATE_SUBCOMMAND:
+ return "-u";
+
+ default:
+ abort ();
+ }
+}
+
+void
+tar_list_quoting_styles (argp_fmtstream_t fs, char *prefix)
+{
+ int i;
+
+ for (i = 0; quoting_style_args[i]; i++)
+ argp_fmtstream_printf (fs, "%s%s\n", prefix, quoting_style_args[i]);
+}
+
+void
+tar_set_quoting_style (char *arg)
+{
+ int i;
+
+ for (i = 0; quoting_style_args[i]; i++)
+ if (strcmp (arg, quoting_style_args[i]) == 0)
+ {
+ set_quoting_style (NULL, i);
+ return;
+ }
+ FATAL_ERROR ((0, 0,
+ _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg, program_invocation_short_name));
+}
+
+
+/* Options. */
+
+enum
+{
+ ANCHORED_OPTION = CHAR_MAX + 1,
+ ATIME_PRESERVE_OPTION,
+ BACKUP_OPTION,
+ CHECKPOINT_OPTION,
+ DELAY_DIRECTORY_RESTORE_OPTION,
+ DELETE_OPTION,
+ EXCLUDE_CACHES_OPTION,
+ EXCLUDE_CACHES_UNDER_OPTION,
+ EXCLUDE_CACHES_ALL_OPTION,
+ EXCLUDE_OPTION,
+ EXCLUDE_TAG_OPTION,
+ EXCLUDE_TAG_UNDER_OPTION,
+ EXCLUDE_TAG_ALL_OPTION,
+ FORCE_LOCAL_OPTION,
+ GROUP_OPTION,
+ HANG_OPTION,
+ IGNORE_CASE_OPTION,
+ IGNORE_COMMAND_ERROR_OPTION,
+ IGNORE_FAILED_READ_OPTION,
+ INDEX_FILE_OPTION,
+ KEEP_NEWER_FILES_OPTION,
+ MODE_OPTION,
+ MTIME_OPTION,
+ NEWER_MTIME_OPTION,
+ NO_ANCHORED_OPTION,
+ NO_DELAY_DIRECTORY_RESTORE_OPTION,
+ NO_IGNORE_CASE_OPTION,
+ NO_IGNORE_COMMAND_ERROR_OPTION,
+ NO_OVERWRITE_DIR_OPTION,
+ NO_QUOTE_CHARS_OPTION,
+ NO_RECURSION_OPTION,
+ NO_SAME_OWNER_OPTION,
+ NO_SAME_PERMISSIONS_OPTION,
+ NO_UNQUOTE_OPTION,
+ NO_WILDCARDS_MATCH_SLASH_OPTION,
+ NO_WILDCARDS_OPTION,
+ NULL_OPTION,
+ NUMERIC_OWNER_OPTION,
+ OCCURRENCE_OPTION,
+ OLD_ARCHIVE_OPTION,
+ ONE_FILE_SYSTEM_OPTION,
+ OVERWRITE_DIR_OPTION,
+ OVERWRITE_OPTION,
+ OWNER_OPTION,
+ PAX_OPTION,
+ POSIX_OPTION,
+ PRESERVE_OPTION,
+ QUOTE_CHARS_OPTION,
+ QUOTING_STYLE_OPTION,
+ RECORD_SIZE_OPTION,
+ RECURSION_OPTION,
+ RECURSIVE_UNLINK_OPTION,
+ REMOVE_FILES_OPTION,
+ RESTRICT_OPTION,
+ RMT_COMMAND_OPTION,
+ RSH_COMMAND_OPTION,
+ SAME_OWNER_OPTION,
+ SHOW_DEFAULTS_OPTION,
+ SHOW_OMITTED_DIRS_OPTION,
+ SHOW_TRANSFORMED_NAMES_OPTION,
+ SPARSE_VERSION_OPTION,
+ STRIP_COMPONENTS_OPTION,
+ SUFFIX_OPTION,
+ TEST_LABEL_OPTION,
+ TOTALS_OPTION,
+ TO_COMMAND_OPTION,
+ TRANSFORM_OPTION,
+ UNQUOTE_OPTION,
+ USAGE_OPTION,
+ USE_COMPRESS_PROGRAM_OPTION,
+ UTC_OPTION,
+ VERSION_OPTION,
+ VOLNO_FILE_OPTION,
+ WILDCARDS_MATCH_SLASH_OPTION,
+ WILDCARDS_OPTION
+};
+
+const char *argp_program_version = "tar (" PACKAGE_NAME ") " VERSION;
+const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
+static char const doc[] = N_("\
+GNU `tar' saves many files together into a single tape or disk archive, \
+and can restore individual files from the archive.\n\
+\n\
+Examples:\n\
+ tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
+ tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
+ tar -xf archive.tar # Extract all files from archive.tar.\n")
+"\v"
+N_("The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
+The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
+ none, off never make backups\n\
+ t, numbered make numbered backups\n\
+ nil, existing numbered if numbered backups exist, simple otherwise\n\
+ never, simple always make simple backups\n");
+
+
+/* NOTE:
+
+ Available option letters are DEIJQY and aeqy. Consider the following
+ assignments:
+
+ [For Solaris tar compatibility =/= Is it important at all?]
+ e exit immediately with a nonzero exit status if unexpected errors occur
+ E use extended headers (--format=posix)
+
+ [q alias for --occurrence=1 =/= this would better be used for quiet?]
+ [I same as T =/= will harm star compatibility]
+
+ y per-file gzip compression
+ Y per-block gzip compression */
+
+static struct argp_option options[] = {
+#define GRID 10
+ {NULL, 0, NULL, 0,
+ N_("Main operation mode:"), GRID },
+
+ {"list", 't', 0, 0,
+ N_("list the contents of an archive"), GRID+1 },
+ {"extract", 'x', 0, 0,
+ N_("extract files from an archive"), GRID+1 },
+ {"get", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
+ {"create", 'c', 0, 0,
+ N_("create a new archive"), GRID+1 },
+ {"diff", 'd', 0, 0,
+ N_("find differences between archive and file system"), GRID+1 },
+ {"compare", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
+ {"append", 'r', 0, 0,
+ N_("append files to the end of an archive"), GRID+1 },
+ {"update", 'u', 0, 0,
+ N_("only append files newer than copy in archive"), GRID+1 },
+ {"catenate", 'A', 0, 0,
+ N_("append tar files to an archive"), GRID+1 },
+ {"concatenate", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
+ {"delete", DELETE_OPTION, 0, 0,
+ N_("delete from the archive (not on mag tapes!)"), GRID+1 },
+ {"test-label", TEST_LABEL_OPTION, NULL, 0,
+ N_("test the archive volume label and exit"), GRID+1 },
+#undef GRID
+
+#define GRID 20
+ {NULL, 0, NULL, 0,
+ N_("Operation modifiers:"), GRID },
+
+ {"sparse", 'S', 0, 0,
+ N_("handle sparse files efficiently"), GRID+1 },
+ {"sparse-version", SPARSE_VERSION_OPTION, N_("MAJOR[.MINOR]"), 0,
+ N_("set version of the sparse format to use (implies --sparse)"), GRID+1},
+ {"incremental", 'G', 0, 0,
+ N_("handle old GNU-format incremental backup"), GRID+1 },
+ {"listed-incremental", 'g', N_("FILE"), 0,
+ N_("handle new GNU-format incremental backup"), GRID+1 },
+ {"ignore-failed-read", IGNORE_FAILED_READ_OPTION, 0, 0,
+ N_("do not exit with nonzero on unreadable files"), GRID+1 },
+ {"occurrence", OCCURRENCE_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
+ N_("process only the NUMBERth occurrence of each file in the archive;"
+ " this option is valid only in conjunction with one of the subcommands"
+ " --delete, --diff, --extract or --list and when a list of files"
+ " is given either on the command line or via the -T option;"
+ " NUMBER defaults to 1"), GRID+1 },
+ {"seek", 'n', NULL, 0,
+ N_("archive is seekable"), GRID+1 },
+#undef GRID
+
+#define GRID 30
+ {NULL, 0, NULL, 0,
+ N_("Overwrite control:"), GRID },
+
+ {"verify", 'W', 0, 0,
+ N_("attempt to verify the archive after writing it"), GRID+1 },
+ {"remove-files", REMOVE_FILES_OPTION, 0, 0,
+ N_("remove files after adding them to the archive"), GRID+1 },
+ {"keep-old-files", 'k', 0, 0,
+ N_("don't replace existing files when extracting"), GRID+1 },
+ {"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
+ N_("don't replace existing files that are newer than their archive copies"), GRID+1 },
+ {"overwrite", OVERWRITE_OPTION, 0, 0,
+ N_("overwrite existing files when extracting"), GRID+1 },
+ {"unlink-first", 'U', 0, 0,
+ N_("remove each file prior to extracting over it"), GRID+1 },
+ {"recursive-unlink", RECURSIVE_UNLINK_OPTION, 0, 0,
+ N_("empty hierarchies prior to extracting directory"), GRID+1 },
+ {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION, 0, 0,
+ N_("preserve metadata of existing directories"), GRID+1 },
+ {"overwrite-dir", OVERWRITE_DIR_OPTION, 0, 0,
+ N_("overwrite metadata of existing directories when extracting (default)"),
+ GRID+1 },
+#undef GRID
+
+#define GRID 40
+ {NULL, 0, NULL, 0,
+ N_("Select output stream:"), GRID },
+
+ {"to-stdout", 'O', 0, 0,
+ N_("extract files to standard output"), GRID+1 },
+ {"to-command", TO_COMMAND_OPTION, N_("COMMAND"), 0,
+ N_("pipe extracted files to another program"), GRID+1 },
+ {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION, 0, 0,
+ N_("ignore exit codes of children"), GRID+1 },
+ {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION, 0, 0,
+ N_("treat non-zero exit codes of children as error"), GRID+1 },
+#undef GRID
+
+#define GRID 50
+ {NULL, 0, NULL, 0,
+ N_("Handling of file attributes:"), GRID },
+
+ {"owner", OWNER_OPTION, N_("NAME"), 0,
+ N_("force NAME as owner for added files"), GRID+1 },
+ {"group", GROUP_OPTION, N_("NAME"), 0,
+ N_("force NAME as group for added files"), GRID+1 },
+ {"mtime", MTIME_OPTION, N_("DATE-OR-FILE"), 0,
+ N_("set mtime for added files from DATE-OR-FILE"), GRID+1 },
+ {"mode", MODE_OPTION, N_("CHANGES"), 0,
+ N_("force (symbolic) mode CHANGES for added files"), GRID+1 },
+ {"atime-preserve", ATIME_PRESERVE_OPTION,
+ N_("METHOD"), OPTION_ARG_OPTIONAL,
+ N_("preserve access times on dumped files, either by restoring the times"
+ " after reading (METHOD='replace'; default) or by not setting the times"
+ " in the first place (METHOD='system')"), GRID+1 },
+ {"touch", 'm', 0, 0,
+ N_("don't extract file modified time"), GRID+1 },
+ {"same-owner", SAME_OWNER_OPTION, 0, 0,
+ N_("try extracting files with the same ownership"), GRID+1 },
+ {"no-same-owner", NO_SAME_OWNER_OPTION, 0, 0,
+ N_("extract files as yourself"), GRID+1 },
+ {"numeric-owner", NUMERIC_OWNER_OPTION, 0, 0,
+ N_("always use numbers for user/group names"), GRID+1 },
+ {"preserve-permissions", 'p', 0, 0,
+ N_("extract information about file permissions (default for superuser)"),
+ GRID+1 },
+ {"same-permissions", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
+ {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
+ N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID+1 },
+ {"preserve-order", 's', 0, 0,
+ N_("sort names to extract to match archive"), GRID+1 },
+ {"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
+ {"preserve", PRESERVE_OPTION, 0, 0,
+ N_("same as both -p and -s"), GRID+1 },
+ {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
+ N_("delay setting modification times and permissions of extracted"
+ " directories until the end of extraction"), GRID+1 },
+ {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
+ N_("cancel the effect of --delay-directory-restore option"), GRID+1 },
+#undef GRID
+
+#define GRID 60
+ {NULL, 0, NULL, 0,
+ N_("Device selection and switching:"), GRID },
+
+ {"file", 'f', N_("ARCHIVE"), 0,
+ N_("use archive file or device ARCHIVE"), GRID+1 },
+ {"force-local", FORCE_LOCAL_OPTION, 0, 0,
+ N_("archive file is local even if it has a colon"), GRID+1 },
+ {"rmt-command", RMT_COMMAND_OPTION, N_("COMMAND"), 0,
+ N_("use given rmt COMMAND instead of rmt"), GRID+1 },
+ {"rsh-command", RSH_COMMAND_OPTION, N_("COMMAND"), 0,
+ N_("use remote COMMAND instead of rsh"), GRID+1 },
+#ifdef DEVICE_PREFIX
+ {"-[0-7][lmh]", 0, NULL, OPTION_DOC, /* It is OK, since `name' will never be
+ translated */
+ N_("specify drive and density"), GRID+1 },
+#endif
+ {NULL, '0', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+ {NULL, '1', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+ {NULL, '2', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+ {NULL, '3', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+ {NULL, '4', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+ {NULL, '5', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+ {NULL, '6', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+ {NULL, '7', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+ {NULL, '8', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+ {NULL, '9', NULL, OPTION_HIDDEN, NULL, GRID+1 },
+
+ {"multi-volume", 'M', 0, 0,
+ N_("create/list/extract multi-volume archive"), GRID+1 },
+ {"tape-length", 'L', N_("NUMBER"), 0,
+ N_("change tape after writing NUMBER x 1024 bytes"), GRID+1 },
+ {"info-script", 'F', N_("NAME"), 0,
+ N_("run script at end of each tape (implies -M)"), GRID+1 },
+ {"new-volume-script", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
+ {"volno-file", VOLNO_FILE_OPTION, N_("FILE"), 0,
+ N_("use/update the volume number in FILE"), GRID+1 },
+#undef GRID
+
+#define GRID 70
+ {NULL, 0, NULL, 0,
+ N_("Device blocking:"), GRID },
+
+ {"blocking-factor", 'b', N_("BLOCKS"), 0,
+ N_("BLOCKS x 512 bytes per record"), GRID+1 },
+ {"record-size", RECORD_SIZE_OPTION, N_("NUMBER"), 0,
+ N_("NUMBER of bytes per record, multiple of 512"), GRID+1 },
+ {"ignore-zeros", 'i', 0, 0,
+ N_("ignore zeroed blocks in archive (means EOF)"), GRID+1 },
+ {"read-full-records", 'B', 0, 0,
+ N_("reblock as we read (for 4.2BSD pipes)"), GRID+1 },
+#undef GRID
+
+#define GRID 80
+ {NULL, 0, NULL, 0,
+ N_("Archive format selection:"), GRID },
+
+ {"format", 'H', N_("FORMAT"), 0,
+ N_("create archive of the given format"), GRID+1 },
+
+ {NULL, 0, NULL, 0, N_("FORMAT is one of the following:"), GRID+2 },
+ {" v7", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("old V7 tar format"),
+ GRID+3 },
+ {" oldgnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
+ N_("GNU format as per tar <= 1.12"), GRID+3 },
+ {" gnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
+ N_("GNU tar 1.13.x format"), GRID+3 },
+ {" ustar", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
+ N_("POSIX 1003.1-1988 (ustar) format"), GRID+3 },
+ {" pax", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
+ N_("POSIX 1003.1-2001 (pax) format"), GRID+3 },
+ {" posix", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("same as pax"), GRID+3 },
+
+ {"old-archive", OLD_ARCHIVE_OPTION, 0, 0, /* FIXME */
+ N_("same as --format=v7"), GRID+8 },
+ {"portability", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
+ {"posix", POSIX_OPTION, 0, 0,
+ N_("same as --format=posix"), GRID+8 },
+ {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
+ N_("control pax keywords"), GRID+8 },
+ {"label", 'V', N_("TEXT"), 0,
+ N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID+8 },
+ {"bzip2", 'j', 0, 0,
+ N_("filter the archive through bzip2"), GRID+8 },
+ {"gzip", 'z', 0, 0,
+ N_("filter the archive through gzip"), GRID+8 },
+ {"gunzip", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
+ {"ungzip", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
+ {"compress", 'Z', 0, 0,
+ N_("filter the archive through compress"), GRID+8 },
+ {"uncompress", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
+ {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION, N_("PROG"), 0,
+ N_("filter through PROG (must accept -d)"), GRID+8 },
+#undef GRID
+
+#define GRID 90
+ {NULL, 0, NULL, 0,
+ N_("Local file selection:"), GRID },
+
+ {"add-file", ARGP_KEY_ARG, N_("FILE"), 0,
+ N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID+1 },
+ {"directory", 'C', N_("DIR"), 0,
+ N_("change to directory DIR"), GRID+1 },
+ {"files-from", 'T', N_("FILE"), 0,
+ N_("get names to extract or create from FILE"), GRID+1 },
+ {"null", NULL_OPTION, 0, 0,
+ N_("-T reads null-terminated names, disable -C"), GRID+1 },
+ {"unquote", UNQUOTE_OPTION, 0, 0,
+ N_("unquote filenames read with -T (default)"), GRID+1 },
+ {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
+ N_("do not unquote filenames read with -T"), GRID+1 },
+ {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0,
+ N_("exclude files, given as a PATTERN"), GRID+1 },
+ {"exclude-from", 'X', N_("FILE"), 0,
+ N_("exclude patterns listed in FILE"), GRID+1 },
+ {"exclude-caches", EXCLUDE_CACHES_OPTION, 0, 0,
+ N_("exclude contents of directories containing CACHEDIR.TAG, "
+ "except for the tag file itself"), GRID+1 },
+ {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION, 0, 0,
+ N_("exclude everything under directories containing CACHEDIR.TAG"),
+ GRID+1 },
+ {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION, 0, 0,
+ N_("exclude directories containing CACHEDIR.TAG"), GRID+1 },
+ {"exclude-tag", EXCLUDE_TAG_OPTION, N_("FILE"), 0,
+ N_("exclude contents of directories containing FILE, except"
+ " for FILE itself"), GRID+1 },
+ {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION, N_("FILE"), 0,
+ N_("exclude everything under directories containing FILE"), GRID+1 },
+ {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION, N_("FILE"), 0,
+ N_("exclude directories containing FILE"), GRID+1 },
+ {"no-recursion", NO_RECURSION_OPTION, 0, 0,
+ N_("avoid descending automatically in directories"), GRID+1 },
+ {"one-file-system", ONE_FILE_SYSTEM_OPTION, 0, 0,
+ N_("stay in local file system when creating archive"), GRID+1 },
+ {"recursion", RECURSION_OPTION, 0, 0,
+ N_("recurse into directories (default)"), GRID+1 },
+ {"absolute-names", 'P', 0, 0,
+ N_("don't strip leading `/'s from file names"), GRID+1 },
+ {"dereference", 'h', 0, 0,
+ N_("follow symlinks; archive and dump the files they point to"), GRID+1 },
+ {"starting-file", 'K', N_("MEMBER-NAME"), 0,
+ N_("begin at member MEMBER-NAME in the archive"), GRID+1 },
+ {"newer", 'N', N_("DATE-OR-FILE"), 0,
+ N_("only store files newer than DATE-OR-FILE"), GRID+1 },
+ {"after-date", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
+ {"newer-mtime", NEWER_MTIME_OPTION, N_("DATE"), 0,
+ N_("compare date and time when data changed only"), GRID+1 },
+ {"backup", BACKUP_OPTION, N_("CONTROL"), OPTION_ARG_OPTIONAL,
+ N_("backup before removal, choose version CONTROL"), GRID+1 },
+ {"suffix", SUFFIX_OPTION, N_("STRING"), 0,
+ N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID+1 },
+#undef GRID
+
+#define GRID 92
+ {NULL, 0, NULL, 0,
+ N_("File name transformations:"), GRID },
+ {"strip-components", STRIP_COMPONENTS_OPTION, N_("NUMBER"), 0,
+ N_("strip NUMBER leading components from file names on extraction"),
+ GRID+1 },
+ {"transform", TRANSFORM_OPTION, N_("EXPRESSION"), 0,
+ N_("use sed replace EXPRESSION to transform file names"), GRID+1 },
+#undef GRID
+
+#define GRID 95
+ {NULL, 0, NULL, 0,
+ N_("File name matching options (affect both exclude and include patterns):"),
+ GRID },
+ {"ignore-case", IGNORE_CASE_OPTION, 0, 0,
+ N_("ignore case"), GRID+1 },
+ {"anchored", ANCHORED_OPTION, 0, 0,
+ N_("patterns match file name start"), GRID+1 },
+ {"no-anchored", NO_ANCHORED_OPTION, 0, 0,
+ N_("patterns match after any `/' (default for exclusion)"), GRID+1 },
+ {"no-ignore-case", NO_IGNORE_CASE_OPTION, 0, 0,
+ N_("case sensitive matching (default)"), GRID+1 },
+ {"wildcards", WILDCARDS_OPTION, 0, 0,
+ N_("use wildcards (default for exclusion)"), GRID+1 },
+ {"no-wildcards", NO_WILDCARDS_OPTION, 0, 0,
+ N_("verbatim string matching"), GRID+1 },
+ {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
+ N_("wildcards do not match `/'"), GRID+1 },
+ {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
+ N_("wildcards match `/' (default for exclusion)"), GRID+1 },
+#undef GRID
+
+#define GRID 100
+ {NULL, 0, NULL, 0,
+ N_("Informative output:"), GRID },
+
+ {"verbose", 'v', 0, 0,
+ N_("verbosely list files processed"), GRID+1 },
+ {"checkpoint", CHECKPOINT_OPTION, N_("[.]NUMBER"), OPTION_ARG_OPTIONAL,
+ N_("display progress messages every NUMBERth record (default 10)"),
+ GRID+1 },
+ {"check-links", 'l', 0, 0,
+ N_("print a message if not all links are dumped"), GRID+1 },
+ {"totals", TOTALS_OPTION, N_("SIGNAL"), OPTION_ARG_OPTIONAL,
+ N_("print total bytes after processing the archive; "
+ "with an argument - print total bytes when this SIGNAL is delivered; "
+ "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
+ "the names without SIG prefix are also accepted"), GRID+1 },
+ {"utc", UTC_OPTION, 0, 0,
+ N_("print file modification dates in UTC"), GRID+1 },
+ {"index-file", INDEX_FILE_OPTION, N_("FILE"), 0,
+ N_("send verbose output to FILE"), GRID+1 },
+ {"block-number", 'R', 0, 0,
+ N_("show block number within archive with each message"), GRID+1 },
+ {"interactive", 'w', 0, 0,
+ N_("ask for confirmation for every action"), GRID+1 },
+ {"confirmation", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
+ {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0,
+ N_("show tar defaults"), GRID+1 },
+ {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0,
+ N_("when listing or extracting, list each directory that does not match search criteria"), GRID+1 },
+ {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION, 0, 0,
+ N_("show file or archive names after transformation"),
+ GRID+1 },
+ {"show-stored-names", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
+ {"quoting-style", QUOTING_STYLE_OPTION, N_("STYLE"), 0,
+ N_("set name quoting style; see below for valid STYLE values"), GRID+1 },
+ {"quote-chars", QUOTE_CHARS_OPTION, N_("STRING"), 0,
+ N_("additionally quote characters from STRING"), GRID+1 },
+ {"no-quote-chars", NO_QUOTE_CHARS_OPTION, N_("STRING"), 0,
+ N_("disable quoting for characters from STRING"), GRID+1 },
+#undef GRID
+
+#define GRID 110
+ {NULL, 0, NULL, 0,
+ N_("Compatibility options:"), GRID },
+
+ {NULL, 'o', 0, 0,
+ N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID+1 },
+#undef GRID
+
+#define GRID 120
+ {NULL, 0, NULL, 0,
+ N_("Other options:"), GRID },
+
+ {"restrict", RESTRICT_OPTION, 0, 0,
+ N_("disable use of some potentially harmful options"), -1 },
+
+ {"help", '?', 0, 0, N_("give this help list"), -1},
+ {"usage", USAGE_OPTION, 0, 0, N_("give a short usage message"), -1},
+ {"version", VERSION_OPTION, 0, 0, N_("print program version"), -1},
+ /* FIXME -V (--label) conflicts with the default short option for
+ --version */
+ {"HANG", HANG_OPTION, "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
+ N_("hang for SECS seconds (default 3600)"), 0},
+#undef GRID
+
+ {0, 0, 0, 0, 0, 0}
+};
+
+static char const *const atime_preserve_args[] =
+{
+ "replace", "system", NULL
+};
+
+static enum atime_preserve const atime_preserve_types[] =
+{
+ replace_atime_preserve, system_atime_preserve
+};
+
+/* Make sure atime_preserve_types has as much entries as atime_preserve_args
+ (minus 1 for NULL guard) */
+ARGMATCH_VERIFY (atime_preserve_args, atime_preserve_types);
+
+/* Wildcard matching settings */
+enum wildcards
+ {
+ default_wildcards, /* For exclusion == enable_wildcards,
+ for inclusion == disable_wildcards */
+ disable_wildcards,
+ enable_wildcards
+ };
+
+struct tar_args /* Variables used during option parsing */
+{
+ struct textual_date *textual_date; /* Keeps the arguments to --newer-mtime
+ and/or --date option if they are
+ textual dates */
+ enum wildcards wildcards; /* Wildcard settings (--wildcards/
+ --no-wildcards) */
+ int matching_flags; /* exclude_fnmatch options */
+ int include_anchored; /* Pattern anchoring options used for
+ file inclusion */
+ bool o_option; /* True if -o option was given */
+ bool pax_option; /* True if --pax-option was given */
+ char const *backup_suffix_string; /* --suffix option argument */
+ char const *version_control_string; /* --backup option argument */
+ bool input_files; /* True if some input files where given */
+};
+
+#define MAKE_EXCL_OPTIONS(args) \
+ ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
+ | (args)->matching_flags \
+ | recursion_option)
+
+#define MAKE_INCL_OPTIONS(args) \
+ ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
+ | (args)->include_anchored \
+ | (args)->matching_flags \
+ | recursion_option)
+
+#ifdef REMOTE_SHELL
+# define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
+{ \
+ printer (stream, \
+ "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
+ archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
+ DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
+ quoting_style_args[DEFAULT_QUOTING_STYLE], \
+ DEFAULT_RMT_COMMAND); \
+ printer (stream, " --rsh-command=%s", REMOTE_SHELL); \
+ printer (stream, "\n"); \
+}
+#else
+# define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
+{ \
+ printer (stream, \
+ "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
+ archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
+ DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
+ quoting_style_args[DEFAULT_QUOTING_STYLE], \
+ DEFAULT_RMT_COMMAND); \
+ printer (stream, "\n"); \
+}
+#endif
+
+static void
+show_default_settings (FILE *fp)
+ DECL_SHOW_DEFAULT_SETTINGS(fp, fprintf)
+
+static void
+show_default_settings_fs (argp_fmtstream_t fs)
+ DECL_SHOW_DEFAULT_SETTINGS(fs, argp_fmtstream_printf)
+
+static void
+set_subcommand_option (enum subcommand subcommand)
+{
+ if (subcommand_option != UNKNOWN_SUBCOMMAND
+ && subcommand_option != subcommand)
+ USAGE_ERROR ((0, 0,
+ _("You may not specify more than one `-Acdtrux' option")));
+
+ subcommand_option = subcommand;
+}
+
+static void
+set_use_compress_program_option (const char *string)
+{
+ if (use_compress_program_option
+ && strcmp (use_compress_program_option, string) != 0)
+ USAGE_ERROR ((0, 0, _("Conflicting compression options")));
+
+ use_compress_program_option = string;
+}
+
+static RETSIGTYPE
+sigstat (int signo)
+{
+ compute_duration ();
+ print_total_stats ();
+#ifndef HAVE_SIGACTION
+ signal (signo, sigstat);
+#endif
+}
+
+static void
+stat_on_signal (int signo)
+{
+#ifdef HAVE_SIGACTION
+ struct sigaction act;
+ act.sa_handler = sigstat;
+ sigemptyset (&act.sa_mask);
+ act.sa_flags = 0;
+ sigaction (signo, &act, NULL);
+#else
+ signal (signo, sigstat);
+#endif
+}
+
+void
+set_stat_signal (const char *name)
+{
+ static struct sigtab
+ {
+ char *name;
+ int signo;
+ } sigtab[] = {
+ { "SIGUSR1", SIGUSR1 },
+ { "USR1", SIGUSR1 },
+ { "SIGUSR2", SIGUSR2 },
+ { "USR2", SIGUSR2 },
+ { "SIGHUP", SIGHUP },
+ { "HUP", SIGHUP },
+ { "SIGINT", SIGINT },
+ { "INT", SIGINT },
+ { "SIGQUIT", SIGQUIT },
+ { "QUIT", SIGQUIT }
+ };
+ struct sigtab *p;
+
+ for (p = sigtab; p < sigtab + sizeof (sigtab) / sizeof (sigtab[0]); p++)
+ if (strcmp (p->name, name) == 0)
+ {
+ stat_on_signal (p->signo);
+ return;
+ }
+ FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name));
+}
+
+
+struct textual_date
+{
+ struct textual_date *next;
+ struct timespec *ts;
+ const char *option;
+ const char *date;
+};
+
+static void
+get_date_or_file (struct tar_args *args, const char *option,
+ const char *str, struct timespec *ts)
+{
+ if (FILE_SYSTEM_PREFIX_LEN (str) != 0
+ || ISSLASH (*str)
+ || *str == '.')
+ {
+ struct stat st;
+ if (deref_stat (dereference_option, str, &st) != 0)
+ {
+ stat_error (str);
+ USAGE_ERROR ((0, 0, _("Date sample file not found")));
+ }
+ *ts = get_stat_mtime (&st);
+ }
+ else
+ {
+ if (! get_date (ts, str, NULL))
+ {
+ WARN ((0, 0, _("Substituting %s for unknown date format %s"),
+ tartime (*ts, false), quote (str)));
+ ts->tv_nsec = 0;
+ }
+ else
+ {
+ struct textual_date *p = xmalloc (sizeof (*p));
+ p->ts = ts;
+ p->option = option;
+ p->date = str;
+ p->next = args->textual_date;
+ args->textual_date = p;
+ }
+ }
+}
+
+static void
+report_textual_dates (struct tar_args *args)
+{
+ struct textual_date *p;
+ for (p = args->textual_date; p; )
+ {
+ struct textual_date *next = p->next;
+ char const *treated_as = tartime (*p->ts, true);
+ if (strcmp (p->date, treated_as) != 0)
+ WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
+ p->option, p->date, treated_as));
+ free (p);
+ p = next;
+ }
+}
+
+
+static volatile int _argp_hang;
+
+enum read_file_list_state /* Result of reading file name from the list file */
+ {
+ file_list_success, /* OK, name read successfully */
+ file_list_end, /* End of list file */
+ file_list_zero, /* Zero separator encountered where it should not */
+ file_list_skip /* Empty (zero-length) entry encountered, skip it */
+ };
+
+/* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
+ into STK.
+ */
+static enum read_file_list_state
+read_name_from_file (FILE *fp, struct obstack *stk)
+{
+ int c;
+ size_t counter = 0;
+
+ for (c = getc (fp); c != EOF && c != filename_terminator; c = getc (fp))
+ {
+ if (c == 0)
+ {
+ /* We have read a zero separator. The file possibly is
+ zero-separated */
+ return file_list_zero;
+ }
+ obstack_1grow (stk, c);
+ counter++;
+ }
+
+ if (counter == 0 && c != EOF)
+ return file_list_skip;
+
+ obstack_1grow (stk, 0);
+
+ return (counter == 0 && c == EOF) ? file_list_end : file_list_success;
+}
+
+
+static bool files_from_option; /* When set, tar will not refuse to create
+ empty archives */
+static struct obstack argv_stk; /* Storage for additional command line options
+ read using -T option */
+
+/* Prevent recursive inclusion of the same file */
+struct file_id_list
+{
+ struct file_id_list *next;
+ ino_t ino;
+ dev_t dev;
+};
+
+static struct file_id_list *file_id_list;
+
+static void
+add_file_id (const char *filename)
+{
+ struct file_id_list *p;
+ struct stat st;
+
+ if (stat (filename, &st))
+ stat_fatal (filename);
+ for (p = file_id_list; p; p = p->next)
+ if (p->ino == st.st_ino && p->dev == st.st_dev)
+ {
+ FATAL_ERROR ((0, 0, _("%s: file list already read"),
+ quotearg_colon (filename)));
+ }
+ p = xmalloc (sizeof *p);
+ p->next = file_id_list;
+ p->ino = st.st_ino;
+ p->dev = st.st_dev;
+ file_id_list = p;
+}
+
+/* Default density numbers for [0-9][lmh] device specifications */
+
+#ifndef LOW_DENSITY_NUM
+# define LOW_DENSITY_NUM 0
+#endif
+
+#ifndef MID_DENSITY_NUM
+# define MID_DENSITY_NUM 8
+#endif
+
+#ifndef HIGH_DENSITY_NUM
+# define HIGH_DENSITY_NUM 16
+#endif
+
+static void
+update_argv (const char *filename, struct argp_state *state)
+{
+ FILE *fp;
+ size_t count = 0, i;
+ char *start, *p;
+ char **new_argv;
+ size_t new_argc;
+ bool is_stdin = false;
+ enum read_file_list_state read_state;
+
+ if (!strcmp (filename, "-"))
+ {
+ is_stdin = true;
+ request_stdin ("-T");
+ fp = stdin;
+ }
+ else
+ {
+ add_file_id (filename);
+ if ((fp = fopen (filename, "r")) == NULL)
+ open_fatal (filename);
+ }
+
+ while ((read_state = read_name_from_file (fp, &argv_stk)) != file_list_end)
+ {
+ switch (read_state)
+ {
+ case file_list_success:
+ count++;
+ break;
+
+ case file_list_end: /* won't happen, just to pacify gcc */
+ break;
+
+ case file_list_zero:
+ {
+ size_t size;
+
+ WARN ((0, 0, N_("%s: file name read contains nul character"),
+ quotearg_colon (filename)));
+
+ /* Prepare new stack contents */
+ size = obstack_object_size (&argv_stk);
+ p = obstack_finish (&argv_stk);
+ for (; size > 0; size--, p++)
+ if (*p)
+ obstack_1grow (&argv_stk, *p);
+ else
+ obstack_1grow (&argv_stk, '\n');
+ obstack_1grow (&argv_stk, 0);
+ count = 1;
+ /* Read rest of files using new filename terminator */
+ filename_terminator = 0;
+ break;
+ }
+
+ case file_list_skip:
+ break;
+ }
+ }
+
+ if (!is_stdin)
+ fclose (fp);
+
+ if (count == 0)
+ return;
+
+ start = obstack_finish (&argv_stk);
+
+ if (filename_terminator == 0)
+ for (p = start; *p; p += strlen (p) + 1)
+ if (p[0] == '-')
+ count++;
+
+ new_argc = state->argc + count;
+ new_argv = xmalloc (sizeof (state->argv[0]) * (new_argc + 1));
+ memcpy (new_argv, state->argv, sizeof (state->argv[0]) * (state->argc + 1));
+ state->argv = new_argv;
+ memmove (&state->argv[state->next + count], &state->argv[state->next],
+ (state->argc - state->next + 1) * sizeof (state->argv[0]));
+
+ state->argc = new_argc;
+
+ for (i = state->next, p = start; *p; p += strlen (p) + 1, i++)
+ {
+ if (filename_terminator == 0 && p[0] == '-')
+ state->argv[i++] = "--add-file";
+ state->argv[i] = p;
+ }
+}
+
+
+static void
+tar_help (struct argp_state *state)
+{
+ argp_fmtstream_t fs;
+ state->flags |= ARGP_NO_EXIT;
+ argp_state_help (state, state->out_stream,
+ ARGP_HELP_STD_HELP & ~ARGP_HELP_BUG_ADDR);
+ /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
+ fs = argp_make_fmtstream (state->out_stream, 0, 79, 0);
+
+ argp_fmtstream_printf (fs, "\n%s\n\n",
+ _("Valid arguments for --quoting-style options are:"));
+ tar_list_quoting_styles (fs, " ");
+
+ argp_fmtstream_puts (fs, _("\n*This* tar defaults to:\n"));
+ show_default_settings_fs (fs);
+ argp_fmtstream_putc (fs, '\n');
+ argp_fmtstream_printf (fs, _("Report bugs to %s.\n"),
+ argp_program_bug_address);
+ argp_fmtstream_free (fs);
+}
+
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+ struct tar_args *args = state->input;
+
+ switch (key)
+ {
+ case ARGP_KEY_ARG:
+ /* File name or non-parsed option, because of ARGP_IN_ORDER */
+ name_add_name (arg, MAKE_INCL_OPTIONS (args));
+ args->input_files = true;
+ break;
+
+ case 'A':
+ set_subcommand_option (CAT_SUBCOMMAND);
+ break;
+
+ case 'b':
+ {
+ uintmax_t u;
+ if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
+ && u == (blocking_factor = u)
+ && 0 < blocking_factor
+ && u == (record_size = u * BLOCKSIZE) / BLOCKSIZE))
+ USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
+ _("Invalid blocking factor")));
+ }
+ break;
+
+ case 'B':
+ /* Try to reblock input records. For reading 4.2BSD pipes. */
+
+ /* It would surely make sense to exchange -B and -R, but it seems
+ that -B has been used for a long while in Sun tar and most
+ BSD-derived systems. This is a consequence of the block/record
+ terminology confusion. */
+
+ read_full_records_option = true;
+ break;
+
+ case 'c':
+ set_subcommand_option (CREATE_SUBCOMMAND);
+ break;
+
+ case 'C':
+ name_add_dir (arg);
+ break;
+
+ case 'd':
+ set_subcommand_option (DIFF_SUBCOMMAND);
+ break;
+
+ case 'f':
+ if (archive_names == allocated_archive_names)
+ archive_name_array = x2nrealloc (archive_name_array,
+ &allocated_archive_names,
+ sizeof (archive_name_array[0]));
+
+ archive_name_array[archive_names++] = arg;
+ break;
+
+ case 'F':
+ /* Since -F is only useful with -M, make it implied. Run this
+ script at the end of each tape. */
+
+ info_script_option = arg;
+ multi_volume_option = true;
+ break;
+
+ case 'g':
+ listed_incremental_option = arg;
+ after_date_option = true;
+ /* Fall through. */
+
+ case 'G':
+ /* We are making an incremental dump (FIXME: are we?); save
+ directories at the beginning of the archive, and include in each
+ directory its contents. */
+
+ incremental_option = true;
+ break;
+
+ case 'h':
+ /* Follow symbolic links. */
+ dereference_option = true;
+ break;
+
+ case 'i':
+ /* Ignore zero blocks (eofs). This can't be the default,
+ because Unix tar writes two blocks of zeros, then pads out
+ the record with garbage. */
+
+ ignore_zeros_option = true;
+ break;
+
+ case 'I':
+ USAGE_ERROR ((0, 0,
+ _("Warning: the -I option is not supported;"
+ " perhaps you meant -j or -T?")));
+ break;
+
+ case 'j':
+ set_use_compress_program_option ("bzip2");
+ break;
+
+ case 'k':
+ /* Don't replace existing files. */
+ old_files_option = KEEP_OLD_FILES;
+ break;
+
+ case 'K':
+ starting_file_option = true;
+ addname (arg, 0);
+ break;
+
+ case ONE_FILE_SYSTEM_OPTION:
+ /* When dumping directories, don't dump files/subdirectories
+ that are on other filesystems. */
+ one_file_system_option = true;
+ break;
+
+ case 'l':
+ check_links_option = 1;
+ break;
+
+ case 'L':
+ {
+ uintmax_t u;
+ if (xstrtoumax (arg, 0, 10, &u, "") != LONGINT_OK)
+ USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
+ _("Invalid tape length")));
+ tape_length_option = 1024 * (tarlong) u;
+ multi_volume_option = true;
+ }
+ break;
+
+ case 'm':
+ touch_option = true;
+ break;
+
+ case 'M':
+ /* Make multivolume archive: when we can't write any more into
+ the archive, re-open it, and continue writing. */
+
+ multi_volume_option = true;
+ break;
+
+ case MTIME_OPTION:
+ get_date_or_file (args, "--mtime", arg, &mtime_option);
+ set_mtime_option = true;
+ break;
+
+ case 'n':
+ seekable_archive = true;
+ break;
+
+ case 'N':
+ after_date_option = true;
+ /* Fall through. */
+
+ case NEWER_MTIME_OPTION:
+ if (NEWER_OPTION_INITIALIZED (newer_mtime_option))
+ USAGE_ERROR ((0, 0, _("More than one threshold date")));
+ get_date_or_file (args,
+ key == NEWER_MTIME_OPTION ? "--newer-mtime"
+ : "--after-date", arg, &newer_mtime_option);
+ break;
+
+ case 'o':
+ args->o_option = true;
+ break;
+
+ case 'O':
+ to_stdout_option = true;
+ break;
+
+ case 'p':
+ same_permissions_option = true;
+ break;
+
+ case 'P':
+ absolute_names_option = true;
+ break;
+
+ case 'r':
+ set_subcommand_option (APPEND_SUBCOMMAND);
+ break;
+
+ case 'R':
+ /* Print block numbers for debugging bad tar archives. */
+
+ /* It would surely make sense to exchange -B and -R, but it seems
+ that -B has been used for a long while in Sun tar and most
+ BSD-derived systems. This is a consequence of the block/record
+ terminology confusion. */
+
+ block_number_option = true;
+ break;
+
+ case 's':
+ /* Names to extract are sorted. */
+
+ same_order_option = true;
+ break;
+
+ case 'S':
+ sparse_option = true;
+ break;
+
+ case SPARSE_VERSION_OPTION:
+ sparse_option = true;
+ {
+ char *p;
+ tar_sparse_major = strtoul (arg, &p, 10);
+ if (*p)
+ {
+ if (*p != '.')
+ USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
+ tar_sparse_minor = strtoul (p + 1, &p, 10);
+ if (*p)
+ USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
+ }
+ }
+ break;
+
+ case 't':
+ set_subcommand_option (LIST_SUBCOMMAND);
+ verbose_option++;
+ break;
+
+ case TEST_LABEL_OPTION:
+ set_subcommand_option (LIST_SUBCOMMAND);
+ test_label_option = true;
+ break;
+
+ case 'T':
+ update_argv (arg, state);
+ /* Indicate we've been given -T option. This is for backward
+ compatibility only, so that `tar cfT archive /dev/null will
+ succeed */
+ files_from_option = true;
+ break;
+
+ case 'u':
+ set_subcommand_option (UPDATE_SUBCOMMAND);
+ break;
+
+ case 'U':
+ old_files_option = UNLINK_FIRST_OLD_FILES;
+ break;
+
+ case UTC_OPTION:
+ utc_option = true;
+ break;
+
+ case 'v':
+ verbose_option++;
+ break;
+
+ case 'V':
+ volume_label_option = arg;
+ break;
+
+ case 'w':
+ interactive_option = true;
+ break;
+
+ case 'W':
+ verify_option = true;
+ break;
+
+ case 'x':
+ set_subcommand_option (EXTRACT_SUBCOMMAND);
+ break;
+
+ case 'X':
+ if (add_exclude_file (add_exclude, excluded, arg,
+ MAKE_EXCL_OPTIONS (args), '\n')
+ != 0)
+ {
+ int e = errno;
+ FATAL_ERROR ((0, e, "%s", quotearg_colon (arg)));
+ }
+ break;
+
+ case 'z':
+ set_use_compress_program_option ("gzip");
+ break;
+
+ case 'Z':
+ set_use_compress_program_option ("compress");
+ break;
+
+ case ANCHORED_OPTION:
+ args->matching_flags |= EXCLUDE_ANCHORED;
+ break;
+
+ case ATIME_PRESERVE_OPTION:
+ atime_preserve_option =
+ (arg
+ ? XARGMATCH ("--atime-preserve", arg,
+ atime_preserve_args, atime_preserve_types)
+ : replace_atime_preserve);
+ if (! O_NOATIME && atime_preserve_option == system_atime_preserve)
+ FATAL_ERROR ((0, 0,
+ _("--atime-preserve='system' is not supported"
+ " on this platform")));
+ break;
+
+ case CHECKPOINT_OPTION:
+ if (arg)
+ {
+ char *p;
+
+ if (*arg == '.')
+ {
+ checkpoint_style = checkpoint_dot;
+ arg++;
+ }
+ checkpoint_option = strtoul (arg, &p, 0);
+ if (*p)
+ FATAL_ERROR ((0, 0,
+ _("--checkpoint value is not an integer")));
+ }
+ else
+ checkpoint_option = 10;
+ break;
+
+ case BACKUP_OPTION:
+ backup_option = true;
+ if (arg)
+ args->version_control_string = arg;
+ break;
+
+ case DELAY_DIRECTORY_RESTORE_OPTION:
+ delay_directory_restore_option = true;
+ break;
+
+ case NO_DELAY_DIRECTORY_RESTORE_OPTION:
+ delay_directory_restore_option = false;
+ break;
+
+ case DELETE_OPTION:
+ set_subcommand_option (DELETE_SUBCOMMAND);
+ break;
+
+ case EXCLUDE_OPTION:
+ add_exclude (excluded, arg, MAKE_EXCL_OPTIONS (args));
+ break;
+
+ case EXCLUDE_CACHES_OPTION:
+ add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents,
+ cachedir_file_p);
+ break;
+
+ case EXCLUDE_CACHES_UNDER_OPTION:
+ add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under,
+ cachedir_file_p);
+ break;
+
+ case EXCLUDE_CACHES_ALL_OPTION:
+ add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all,
+ cachedir_file_p);
+ break;
+
+ case EXCLUDE_TAG_OPTION:
+ add_exclusion_tag (arg, exclusion_tag_contents, NULL);
+ break;
+
+ case EXCLUDE_TAG_UNDER_OPTION:
+ add_exclusion_tag (arg, exclusion_tag_under, NULL);
+ break;
+
+ case EXCLUDE_TAG_ALL_OPTION:
+ add_exclusion_tag (arg, exclusion_tag_all, NULL);
+ break;
+
+ case FORCE_LOCAL_OPTION:
+ force_local_option = true;
+ break;
+
+ case 'H':
+ set_archive_format (arg);
+ break;
+
+ case INDEX_FILE_OPTION:
+ index_file_name = arg;
+ break;
+
+ case IGNORE_CASE_OPTION:
+ args->matching_flags |= FNM_CASEFOLD;
+ break;
+
+ case IGNORE_COMMAND_ERROR_OPTION:
+ ignore_command_error_option = true;
+ break;
+
+ case IGNORE_FAILED_READ_OPTION:
+ ignore_failed_read_option = true;
+ break;
+
+ case KEEP_NEWER_FILES_OPTION:
+ old_files_option = KEEP_NEWER_FILES;
+ break;
+
+ case GROUP_OPTION:
+ if (! (strlen (arg) < GNAME_FIELD_SIZE
+ && gname_to_gid (arg, &group_option)))
+ {
+ uintmax_t g;
+ if (xstrtoumax (arg, 0, 10, &g, "") == LONGINT_OK
+ && g == (gid_t) g)
+ group_option = g;
+ else
+ FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
+ _("%s: Invalid group")));
+ }
+ break;
+
+ case MODE_OPTION:
+ mode_option = mode_compile (arg);
+ if (!mode_option)
+ FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
+ initial_umask = umask (0);
+ umask (initial_umask);
+ break;
+
+ case NO_ANCHORED_OPTION:
+ args->include_anchored = 0; /* Clear the default for comman line args */
+ args->matching_flags &= ~ EXCLUDE_ANCHORED;
+ break;
+
+ case NO_IGNORE_CASE_OPTION:
+ args->matching_flags &= ~ FNM_CASEFOLD;
+ break;
+
+ case NO_IGNORE_COMMAND_ERROR_OPTION:
+ ignore_command_error_option = false;
+ break;
+
+ case NO_OVERWRITE_DIR_OPTION:
+ old_files_option = NO_OVERWRITE_DIR_OLD_FILES;
+ break;
+
+ case NO_QUOTE_CHARS_OPTION:
+ for (;*arg; arg++)
+ set_char_quoting (NULL, *arg, 0);
+ break;
+
+ case NO_WILDCARDS_OPTION:
+ args->wildcards = disable_wildcards;
+ break;
+
+ case NO_WILDCARDS_MATCH_SLASH_OPTION:
+ args->matching_flags |= FNM_FILE_NAME;
+ break;
+
+ case NULL_OPTION:
+ filename_terminator = '\0';
+ break;
+
+ case NUMERIC_OWNER_OPTION:
+ numeric_owner_option = true;
+ break;
+
+ case OCCURRENCE_OPTION:
+ if (!arg)
+ occurrence_option = 1;
+ else
+ {
+ uintmax_t u;
+ if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK)
+ occurrence_option = u;
+ else
+ FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
+ _("Invalid number")));
+ }
+ break;
+
+ case OVERWRITE_DIR_OPTION:
+ old_files_option = DEFAULT_OLD_FILES;
+ break;
+
+ case OVERWRITE_OPTION:
+ old_files_option = OVERWRITE_OLD_FILES;
+ break;
+
+ case OWNER_OPTION:
+ if (! (strlen (arg) < UNAME_FIELD_SIZE
+ && uname_to_uid (arg, &owner_option)))
+ {
+ uintmax_t u;
+ if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
+ && u == (uid_t) u)
+ owner_option = u;
+ else
+ FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
+ _("Invalid owner")));
+ }
+ break;
+
+ case QUOTE_CHARS_OPTION:
+ for (;*arg; arg++)
+ set_char_quoting (NULL, *arg, 1);
+ break;
+
+ case QUOTING_STYLE_OPTION:
+ tar_set_quoting_style (arg);
+ break;
+
+ case PAX_OPTION:
+ args->pax_option = true;
+ xheader_set_option (arg);
+ break;
+
+ case POSIX_OPTION:
+ set_archive_format ("posix");
+ break;
+
+ case PRESERVE_OPTION:
+ /* FIXME: What it is good for? */
+ same_permissions_option = true;
+ same_order_option = true;
+ break;
+
+ case RECORD_SIZE_OPTION:
+ {
+ uintmax_t u;
+ if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
+ && u == (size_t) u))
+ USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
+ _("Invalid record size")));
+ record_size = u;
+ if (record_size % BLOCKSIZE != 0)
+ USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
+ BLOCKSIZE));
+ blocking_factor = record_size / BLOCKSIZE;
+ }
+ break;
+
+ case RECURSIVE_UNLINK_OPTION:
+ recursive_unlink_option = true;
+ break;
+
+ case REMOVE_FILES_OPTION:
+ remove_files_option = true;
+ break;
+
+ case RESTRICT_OPTION:
+ restrict_option = true;
+ break;
+
+ case RMT_COMMAND_OPTION:
+ rmt_command = arg;
+ break;
+
+ case RSH_COMMAND_OPTION:
+ rsh_command_option = arg;
+ break;
+
+ case SHOW_DEFAULTS_OPTION:
+ show_default_settings (stdout);
+ close_stdout ();
+ exit (0);
+
+ case STRIP_COMPONENTS_OPTION:
+ {
+ uintmax_t u;
+ if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
+ && u == (size_t) u))
+ USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
+ _("Invalid number of elements")));
+ strip_name_components = u;
+ }
+ break;
+
+ case SHOW_OMITTED_DIRS_OPTION:
+ show_omitted_dirs_option = true;
+ break;
+
+ case SHOW_TRANSFORMED_NAMES_OPTION:
+ show_transformed_names_option = true;
+ break;
+
+ case SUFFIX_OPTION:
+ backup_option = true;
+ args->backup_suffix_string = arg;
+ break;
+
+ case TO_COMMAND_OPTION:
+ if (to_command_option)
+ USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
+ to_command_option = arg;
+ break;
+
+ case TOTALS_OPTION:
+ if (arg)
+ set_stat_signal (arg);
+ else
+ totals_option = true;
+ break;
+
+ case TRANSFORM_OPTION:
+ set_transform_expr (arg);
+ break;
+
+ case USE_COMPRESS_PROGRAM_OPTION:
+ set_use_compress_program_option (arg);
+ break;
+
+ case VOLNO_FILE_OPTION:
+ volno_file_option = arg;
+ break;
+
+ case WILDCARDS_OPTION:
+ args->wildcards = enable_wildcards;
+ break;
+
+ case WILDCARDS_MATCH_SLASH_OPTION:
+ args->matching_flags &= ~ FNM_FILE_NAME;
+ break;
+
+ case NO_RECURSION_OPTION:
+ recursion_option = 0;
+ break;
+
+ case NO_SAME_OWNER_OPTION:
+ same_owner_option = -1;
+ break;
+
+ case NO_SAME_PERMISSIONS_OPTION:
+ same_permissions_option = -1;
+ break;
+
+ case RECURSION_OPTION:
+ recursion_option = FNM_LEADING_DIR;
+ break;
+
+ case SAME_OWNER_OPTION:
+ same_owner_option = 1;
+ break;
+
+ case UNQUOTE_OPTION:
+ unquote_option = true;
+ break;
+
+ case NO_UNQUOTE_OPTION:
+ unquote_option = false;
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+
+#ifdef DEVICE_PREFIX
+ {
+ int device = key - '0';
+ int density;
+ static char buf[sizeof DEVICE_PREFIX + 10];
+ char *cursor;
+
+ if (arg[1])
+ argp_error (state, _("Malformed density argument: %s"), quote (arg));
+
+ strcpy (buf, DEVICE_PREFIX);
+ cursor = buf + strlen (buf);
+
+#ifdef DENSITY_LETTER
+
+ sprintf (cursor, "%d%c", device, arg[0]);
+
+#else /* not DENSITY_LETTER */
+
+ switch (arg[0])
+ {
+ case 'l':
+ device += LOW_DENSITY_NUM;
+ break;
+
+ case 'm':
+ device += MID_DENSITY_NUM;
+ break;
+
+ case 'h':
+ device += HIGH_DENSITY_NUM;
+ break;
+
+ default:
+ argp_error (state, _("Unknown density: `%c'"), arg[0]);
+ }
+ sprintf (cursor, "%d", device);
+
+#endif /* not DENSITY_LETTER */
+
+ if (archive_names == allocated_archive_names)
+ archive_name_array = x2nrealloc (archive_name_array,
+ &allocated_archive_names,
+ sizeof (archive_name_array[0]));
+ archive_name_array[archive_names++] = xstrdup (buf);
+ }
+ break;
+
+#else /* not DEVICE_PREFIX */
+
+ argp_error (state,
+ _("Options `-[0-7][lmh]' not supported by *this* tar"));
+
+#endif /* not DEVICE_PREFIX */
+
+ case '?':
+ tar_help (state);
+ close_stdout ();
+ exit (0);
+
+ case USAGE_OPTION:
+ argp_state_help (state, state->out_stream, ARGP_HELP_USAGE);
+ close_stdout ();
+ exit (0);
+
+ case VERSION_OPTION:
+ version_etc (state->out_stream, "tar", PACKAGE_NAME, VERSION,
+ "John Gilmore", "Jay Fenlason", (char *) NULL);
+ close_stdout ();
+ exit (0);
+
+ case HANG_OPTION:
+ _argp_hang = atoi (arg ? arg : "3600");
+ while (_argp_hang-- > 0)
+ sleep (1);
+ break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+static struct argp argp = {
+ options,
+ parse_opt,
+ N_("[FILE]..."),
+ doc,
+ NULL,
+ NULL,
+ NULL
+};
+
+void
+usage (int status)
+{
+ argp_help (&argp, stderr, ARGP_HELP_SEE, (char*) program_name);
+ close_stdout ();
+ exit (status);
+}
+
+/* Parse the options for tar. */
+
+static struct argp_option *
+find_argp_option (struct argp_option *options, int letter)
+{
+ for (;
+ !(options->name == NULL
+ && options->key == 0
+ && options->arg == 0
+ && options->flags == 0
+ && options->doc == NULL); options++)
+ if (options->key == letter)
+ return options;
+ return NULL;
+}
+
+static void
+decode_options (int argc, char **argv)
+{
+ int index;
+ struct tar_args args;
+
+ /* Set some default option values. */
+ args.textual_date = NULL;
+ args.wildcards = default_wildcards;
+ args.matching_flags = 0;
+ args.include_anchored = EXCLUDE_ANCHORED;
+ args.o_option = false;
+ args.pax_option = false;
+ args.backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
+ args.version_control_string = 0;
+ args.input_files = false;
+
+ subcommand_option = UNKNOWN_SUBCOMMAND;
+ archive_format = DEFAULT_FORMAT;
+ blocking_factor = DEFAULT_BLOCKING;
+ record_size = DEFAULT_BLOCKING * BLOCKSIZE;
+ excluded = new_exclude ();
+ newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t);
+ newer_mtime_option.tv_nsec = -1;
+ recursion_option = FNM_LEADING_DIR;
+ unquote_option = true;
+ tar_sparse_major = 1;
+ tar_sparse_minor = 0;
+
+ owner_option = -1;
+ group_option = -1;
+
+ /* Convert old-style tar call by exploding option element and rearranging
+ options accordingly. */
+
+ if (argc > 1 && argv[1][0] != '-')
+ {
+ int new_argc; /* argc value for rearranged arguments */
+ char **new_argv; /* argv value for rearranged arguments */
+ char *const *in; /* cursor into original argv */
+ char **out; /* cursor into rearranged argv */
+ const char *letter; /* cursor into old option letters */
+ char buffer[3]; /* constructed option buffer */
+
+ /* Initialize a constructed option. */
+
+ buffer[0] = '-';
+ buffer[2] = '\0';
+
+ /* Allocate a new argument array, and copy program name in it. */
+
+ new_argc = argc - 1 + strlen (argv[1]);
+ new_argv = xmalloc ((new_argc + 1) * sizeof (char *));
+ in = argv;
+ out = new_argv;
+ *out++ = *in++;
+
+ /* Copy each old letter option as a separate option, and have the
+ corresponding argument moved next to it. */
+
+ for (letter = *in++; *letter; letter++)
+ {
+ struct argp_option *opt;
+
+ buffer[1] = *letter;
+ *out++ = xstrdup (buffer);
+ opt = find_argp_option (options, *letter);
+ if (opt && opt->arg)
+ {
+ if (in < argv + argc)
+ *out++ = *in++;
+ else
+ USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
+ *letter));
+ }
+ }
+
+ /* Copy all remaining options. */
+
+ while (in < argv + argc)
+ *out++ = *in++;
+ *out = 0;
+
+ /* Replace the old option list by the new one. */
+
+ argc = new_argc;
+ argv = new_argv;
+ }
+
+ /* Parse all options and non-options as they appear. */
+
+ prepend_default_options (getenv ("TAR_OPTIONS"), &argc, &argv);
+
+ if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER|ARGP_NO_HELP,
+ &index, &args))
+ exit (TAREXIT_FAILURE);
+
+
+ /* Special handling for 'o' option:
+
+ GNU tar used to say "output old format".
+ UNIX98 tar says don't chown files after extracting (we use
+ "--no-same-owner" for this).
+
+ The old GNU tar semantics is retained when used with --create
+ option, otherwise UNIX98 semantics is assumed */
+
+ if (args.o_option)
+ {
+ if (subcommand_option == CREATE_SUBCOMMAND)
+ {
+ /* GNU Tar <= 1.13 compatibility */
+ set_archive_format ("v7");
+ }
+ else
+ {
+ /* UNIX98 compatibility */
+ same_owner_option = -1;
+ }
+ }
+
+ /* Handle operands after any "--" argument. */
+ for (; index < argc; index++)
+ {
+ name_add_name (argv[index], MAKE_INCL_OPTIONS (&args));
+ args.input_files = true;
+ }
+
+ /* Warn about implicit use of the wildcards in command line arguments.
+ See TODO */
+ warn_regex_usage = args.wildcards == default_wildcards;
+
+ /* Derive option values and check option consistency. */
+
+ if (archive_format == DEFAULT_FORMAT)
+ {
+ if (args.pax_option)
+ archive_format = POSIX_FORMAT;
+ else
+ archive_format = DEFAULT_ARCHIVE_FORMAT;
+ }
+
+ if ((volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
+ || incremental_option
+ || multi_volume_option
+ || sparse_option)
+ assert_format (FORMAT_MASK (OLDGNU_FORMAT)
+ | FORMAT_MASK (GNU_FORMAT)
+ | FORMAT_MASK (POSIX_FORMAT));
+
+ if (occurrence_option)
+ {
+ if (!args.input_files)
+ USAGE_ERROR ((0, 0,
+ _("--occurrence is meaningless without a file list")));
+ if (subcommand_option != DELETE_SUBCOMMAND
+ && subcommand_option != DIFF_SUBCOMMAND
+ && subcommand_option != EXTRACT_SUBCOMMAND
+ && subcommand_option != LIST_SUBCOMMAND)
+ USAGE_ERROR ((0, 0,
+ _("--occurrence cannot be used in the requested operation mode")));
+ }
+
+ if (seekable_archive && subcommand_option == DELETE_SUBCOMMAND)
+ {
+ /* The current code in delete.c is based on the assumption that
+ skip_member() reads all data from the archive. So, we should
+ make sure it won't use seeks. On the other hand, the same code
+ depends on the ability to backspace a record in the archive,
+ so setting seekable_archive to false is technically incorrect.
+ However, it is tested only in skip_member(), so it's not a
+ problem. */
+ seekable_archive = false;
+ }
+
+ if (archive_names == 0)
+ {
+ /* If no archive file name given, try TAPE from the environment, or
+ else, DEFAULT_ARCHIVE from the configuration process. */
+
+ archive_names = 1;
+ archive_name_array[0] = getenv ("TAPE");
+ if (! archive_name_array[0])
+ archive_name_array[0] = DEFAULT_ARCHIVE;
+ }
+
+ /* Allow multiple archives only with `-M'. */
+
+ if (archive_names > 1 && !multi_volume_option)
+ USAGE_ERROR ((0, 0,
+ _("Multiple archive files require `-M' option")));
+
+ if (listed_incremental_option
+ && NEWER_OPTION_INITIALIZED (newer_mtime_option))
+ USAGE_ERROR ((0, 0,
+ _("Cannot combine --listed-incremental with --newer")));
+
+ if (volume_label_option)
+ {
+ if (archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
+ {
+ size_t volume_label_max_len =
+ (sizeof current_header->header.name
+ - 1 /* for trailing '\0' */
+ - (multi_volume_option
+ ? (sizeof " Volume "
+ - 1 /* for null at end of " Volume " */
+ + INT_STRLEN_BOUND (int) /* for volume number */
+ - 1 /* for sign, as 0 <= volno */)
+ : 0));
+ if (volume_label_max_len < strlen (volume_label_option))
+ USAGE_ERROR ((0, 0,
+ ngettext ("%s: Volume label is too long (limit is %lu byte)",
+ "%s: Volume label is too long (limit is %lu bytes)",
+ volume_label_max_len),
+ quotearg_colon (volume_label_option),
+ (unsigned long) volume_label_max_len));
+ }
+ /* else FIXME
+ Label length in PAX format is limited by the volume size. */
+ }
+
+ if (verify_option)
+ {
+ if (multi_volume_option)
+ USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
+ if (use_compress_program_option)
+ USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
+ }
+
+ if (use_compress_program_option)
+ {
+ if (multi_volume_option)
+ USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
+ if (subcommand_option == UPDATE_SUBCOMMAND
+ || subcommand_option == APPEND_SUBCOMMAND
+ || subcommand_option == DELETE_SUBCOMMAND)
+ USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
+ if (subcommand_option == CAT_SUBCOMMAND)
+ USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
+ }
+
+ /* It is no harm to use --pax-option on non-pax archives in archive
+ reading mode. It may even be useful, since it allows to override
+ file attributes from tar headers. Therefore I allow such usage.
+ --gray */
+ if (args.pax_option
+ && archive_format != POSIX_FORMAT
+ && (subcommand_option != EXTRACT_SUBCOMMAND
+ || subcommand_option != DIFF_SUBCOMMAND
+ || subcommand_option != LIST_SUBCOMMAND))
+ USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
+
+ /* If ready to unlink hierarchies, so we are for simpler files. */
+ if (recursive_unlink_option)
+ old_files_option = UNLINK_FIRST_OLD_FILES;
+
+
+ if (test_label_option)
+ {
+ /* --test-label is silent if the user has specified the label name to
+ compare against. */
+ if (!args.input_files)
+ verbose_option++;
+ }
+ else if (utc_option)
+ verbose_option = 2;
+
+ /* Forbid using -c with no input files whatsoever. Check that `-f -',
+ explicit or implied, is used correctly. */
+
+ switch (subcommand_option)
+ {
+ case CREATE_SUBCOMMAND:
+ if (!args.input_files && !files_from_option)
+ USAGE_ERROR ((0, 0,
+ _("Cowardly refusing to create an empty archive")));
+ break;
+
+ case EXTRACT_SUBCOMMAND:
+ case LIST_SUBCOMMAND:
+ case DIFF_SUBCOMMAND:
+ for (archive_name_cursor = archive_name_array;
+ archive_name_cursor < archive_name_array + archive_names;
+ archive_name_cursor++)
+ if (!strcmp (*archive_name_cursor, "-"))
+ request_stdin ("-f");
+ break;
+
+ case CAT_SUBCOMMAND:
+ case UPDATE_SUBCOMMAND:
+ case APPEND_SUBCOMMAND:
+ for (archive_name_cursor = archive_name_array;
+ archive_name_cursor < archive_name_array + archive_names;
+ archive_name_cursor++)
+ if (!strcmp (*archive_name_cursor, "-"))
+ USAGE_ERROR ((0, 0,
+ _("Options `-Aru' are incompatible with `-f -'")));
+
+ default:
+ break;
+ }
+
+ /* Initialize stdlis */
+ if (index_file_name)
+ {
+ stdlis = fopen (index_file_name, "w");
+ if (! stdlis)
+ open_error (index_file_name);
+ }
+ else
+ stdlis = to_stdout_option ? stderr : stdout;
+
+ archive_name_cursor = archive_name_array;
+
+ /* Prepare for generating backup names. */
+
+ if (args.backup_suffix_string)
+ simple_backup_suffix = xstrdup (args.backup_suffix_string);
+
+ if (backup_option)
+ {
+ backup_type = xget_version ("--backup", args.version_control_string);
+ /* No backup is needed either if explicitely disabled or if
+ the extracted files are not being written to disk. */
+ if (backup_type == no_backups || EXTRACT_OVER_PIPE)
+ backup_option = false;
+ }
+
+ if (verbose_option)
+ report_textual_dates (&args);
+}
+
+
+/* Tar proper. */
+
+/* Main routine for tar. */
+int
+main (int argc, char **argv)
+{
+ set_start_time ();
+ program_name = argv[0];
+
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ exit_failure = TAREXIT_FAILURE;
+ exit_status = TAREXIT_SUCCESS;
+ filename_terminator = '\n';
+ set_quoting_style (0, DEFAULT_QUOTING_STYLE);
+
+ /* Make sure we have first three descriptors available */
+ stdopen ();
+
+ /* Pre-allocate a few structures. */
+
+ allocated_archive_names = 10;
+ archive_name_array =
+ xmalloc (sizeof (const char *) * allocated_archive_names);
+ archive_names = 0;
+
+ obstack_init (&argv_stk);
+
+#ifdef SIGCHLD
+ /* System V fork+wait does not work if SIGCHLD is ignored. */
+ signal (SIGCHLD, SIG_DFL);
+#endif
+
+ /* Decode options. */
+
+ decode_options (argc, argv);
+
+ name_init ();
+
+ /* Main command execution. */
+
+ if (volno_file_option)
+ init_volume_number ();
+
+ switch (subcommand_option)
+ {
+ case UNKNOWN_SUBCOMMAND:
+ USAGE_ERROR ((0, 0,
+ _("You must specify one of the `-Acdtrux' options")));
+
+ case CAT_SUBCOMMAND:
+ case UPDATE_SUBCOMMAND:
+ case APPEND_SUBCOMMAND:
+ update_archive ();
+ break;
+
+ case DELETE_SUBCOMMAND:
+ delete_archive_members ();
+ break;
+
+ case CREATE_SUBCOMMAND:
+ create_archive ();
+ break;
+
+ case EXTRACT_SUBCOMMAND:
+ extr_init ();
+ read_and (extract_archive);
+
+ /* FIXME: should extract_finish () even if an ordinary signal is
+ received. */
+ extract_finish ();
+
+ break;
+
+ case LIST_SUBCOMMAND:
+ read_and (list_archive);
+ break;
+
+ case DIFF_SUBCOMMAND:
+ diff_init ();
+ read_and (diff_archive);
+ break;
+ }
+
+ if (totals_option)
+ print_total_stats ();
+
+ if (check_links_option)
+ check_links ();
+
+ if (volno_file_option)
+ closeout_volume_number ();
+
+ /* Dispose of allocated memory, and return. */
+
+ free (archive_name_array);
+ name_term ();
+
+ if (exit_status == TAREXIT_FAILURE)
+ error (0, 0, _("Error exit delayed from previous errors"));
+
+ if (stdlis == stdout)
+ close_stdout ();
+ else if (ferror (stderr) || fclose (stderr) != 0)
+ exit_status = TAREXIT_FAILURE;
+
+ return exit_status;
+}
+
+void
+tar_stat_init (struct tar_stat_info *st)
+{
+ memset (st, 0, sizeof (*st));
+}
+
+void
+tar_stat_destroy (struct tar_stat_info *st)
+{
+ free (st->orig_file_name);
+ free (st->file_name);
+ free (st->link_name);
+ free (st->uname);
+ free (st->gname);
+ free (st->sparse_map);
+ free (st->dumpdir);
+ xheader_destroy (&st->xhdr);
+ memset (st, 0, sizeof (*st));
+}
+
+/* Format mask for all available formats that support nanosecond
+ timestamp resolution. */
+#define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
+
+/* Same as timespec_cmp, but ignore nanoseconds if current archive
+ format does not provide sufficient resolution. */
+int
+tar_timespec_cmp (struct timespec a, struct timespec b)
+{
+ if (!(FORMAT_MASK (current_format) & NS_PRECISION_FORMAT_MASK))
+ a.tv_nsec = b.tv_nsec = 0;
+ return timespec_cmp (a, b);
+}
diff --git a/src/tar.h b/src/tar.h
new file mode 100644
index 0000000..439273e
--- /dev/null
+++ b/src/tar.h
@@ -0,0 +1,331 @@
+/* GNU tar Archive Format description.
+
+ Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+ 2000, 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* tar Header Block, from POSIX 1003.1-1990. */
+
+/* POSIX header. */
+
+struct posix_header
+{ /* byte offset */
+ char name[100]; /* 0 */
+ char mode[8]; /* 100 */
+ char uid[8]; /* 108 */
+ char gid[8]; /* 116 */
+ char size[12]; /* 124 */
+ char mtime[12]; /* 136 */
+ char chksum[8]; /* 148 */
+ char typeflag; /* 156 */
+ char linkname[100]; /* 157 */
+ char magic[6]; /* 257 */
+ char version[2]; /* 263 */
+ char uname[32]; /* 265 */
+ char gname[32]; /* 297 */
+ char devmajor[8]; /* 329 */
+ char devminor[8]; /* 337 */
+ char prefix[155]; /* 345 */
+ /* 500 */
+};
+
+#define TMAGIC "ustar" /* ustar and a null */
+#define TMAGLEN 6
+#define TVERSION "00" /* 00 and no null */
+#define TVERSLEN 2
+
+/* Values used in typeflag field. */
+#define REGTYPE '0' /* regular file */
+#define AREGTYPE '\0' /* regular file */
+#define LNKTYPE '1' /* link */
+#define SYMTYPE '2' /* reserved */
+#define CHRTYPE '3' /* character special */
+#define BLKTYPE '4' /* block special */
+#define DIRTYPE '5' /* directory */
+#define FIFOTYPE '6' /* FIFO special */
+#define CONTTYPE '7' /* reserved */
+
+#define XHDTYPE 'x' /* Extended header referring to the
+ next file in the archive */
+#define XGLTYPE 'g' /* Global extended header */
+
+/* Bits used in the mode field, values in octal. */
+#define TSUID 04000 /* set UID on execution */
+#define TSGID 02000 /* set GID on execution */
+#define TSVTX 01000 /* reserved */
+ /* file permissions */
+#define TUREAD 00400 /* read by owner */
+#define TUWRITE 00200 /* write by owner */
+#define TUEXEC 00100 /* execute/search by owner */
+#define TGREAD 00040 /* read by group */
+#define TGWRITE 00020 /* write by group */
+#define TGEXEC 00010 /* execute/search by group */
+#define TOREAD 00004 /* read by other */
+#define TOWRITE 00002 /* write by other */
+#define TOEXEC 00001 /* execute/search by other */
+
+/* tar Header Block, GNU extensions. */
+
+/* In GNU tar, SYMTYPE is for to symbolic links, and CONTTYPE is for
+ contiguous files, so maybe disobeying the `reserved' comment in POSIX
+ header description. I suspect these were meant to be used this way, and
+ should not have really been `reserved' in the published standards. */
+
+/* *BEWARE* *BEWARE* *BEWARE* that the following information is still
+ boiling, and may change. Even if the OLDGNU format description should be
+ accurate, the so-called GNU format is not yet fully decided. It is
+ surely meant to use only extensions allowed by POSIX, but the sketch
+ below repeats some ugliness from the OLDGNU format, which should rather
+ go away. Sparse files should be saved in such a way that they do *not*
+ require two passes at archive creation time. Huge files get some POSIX
+ fields to overflow, alternate solutions have to be sought for this. */
+
+/* Descriptor for a single file hole. */
+
+struct sparse
+{ /* byte offset */
+ char offset[12]; /* 0 */
+ char numbytes[12]; /* 12 */
+ /* 24 */
+};
+
+/* Sparse files are not supported in POSIX ustar format. For sparse files
+ with a POSIX header, a GNU extra header is provided which holds overall
+ sparse information and a few sparse descriptors. When an old GNU header
+ replaces both the POSIX header and the GNU extra header, it holds some
+ sparse descriptors too. Whether POSIX or not, if more sparse descriptors
+ are still needed, they are put into as many successive sparse headers as
+ necessary. The following constants tell how many sparse descriptors fit
+ in each kind of header able to hold them. */
+
+#define SPARSES_IN_EXTRA_HEADER 16
+#define SPARSES_IN_OLDGNU_HEADER 4
+#define SPARSES_IN_SPARSE_HEADER 21
+
+/* Extension header for sparse files, used immediately after the GNU extra
+ header, and used only if all sparse information cannot fit into that
+ extra header. There might even be many such extension headers, one after
+ the other, until all sparse information has been recorded. */
+
+struct sparse_header
+{ /* byte offset */
+ struct sparse sp[SPARSES_IN_SPARSE_HEADER];
+ /* 0 */
+ char isextended; /* 504 */
+ /* 505 */
+};
+
+/* The old GNU format header conflicts with POSIX format in such a way that
+ POSIX archives may fool old GNU tar's, and POSIX tar's might well be
+ fooled by old GNU tar archives. An old GNU format header uses the space
+ used by the prefix field in a POSIX header, and cumulates information
+ normally found in a GNU extra header. With an old GNU tar header, we
+ never see any POSIX header nor GNU extra header. Supplementary sparse
+ headers are allowed, however. */
+
+struct oldgnu_header
+{ /* byte offset */
+ char unused_pad1[345]; /* 0 */
+ char atime[12]; /* 345 Incr. archive: atime of the file */
+ char ctime[12]; /* 357 Incr. archive: ctime of the file */
+ char offset[12]; /* 369 Multivolume archive: the offset of
+ the start of this volume */
+ char longnames[4]; /* 381 Not used */
+ char unused_pad2; /* 385 */
+ struct sparse sp[SPARSES_IN_OLDGNU_HEADER];
+ /* 386 */
+ char isextended; /* 482 Sparse file: Extension sparse header
+ follows */
+ char realsize[12]; /* 483 Sparse file: Real size*/
+ /* 495 */
+};
+
+/* OLDGNU_MAGIC uses both magic and version fields, which are contiguous.
+ Found in an archive, it indicates an old GNU header format, which will be
+ hopefully become obsolescent. With OLDGNU_MAGIC, uname and gname are
+ valid, though the header is not truly POSIX conforming. */
+#define OLDGNU_MAGIC "ustar " /* 7 chars and a null */
+
+/* The standards committee allows only capital A through capital Z for
+ user-defined expansion. Other letters in use include:
+
+ 'A' Solaris Access Control List
+ 'E' Solaris Extended Attribute File
+ 'I' Inode only, as in 'star'
+ 'N' Obsolete GNU tar, for file names that do not fit into the main header.
+ 'X' POSIX 1003.1-2001 eXtended (VU version) */
+
+/* This is a dir entry that contains the names of files that were in the
+ dir at the time the dump was made. */
+#define GNUTYPE_DUMPDIR 'D'
+
+/* Identifies the *next* file on the tape as having a long linkname. */
+#define GNUTYPE_LONGLINK 'K'
+
+/* Identifies the *next* file on the tape as having a long name. */
+#define GNUTYPE_LONGNAME 'L'
+
+/* This is the continuation of a file that began on another volume. */
+#define GNUTYPE_MULTIVOL 'M'
+
+/* This is for sparse files. */
+#define GNUTYPE_SPARSE 'S'
+
+/* This file is a tape/volume header. Ignore it on extraction. */
+#define GNUTYPE_VOLHDR 'V'
+
+/* Solaris extended header */
+#define SOLARIS_XHDTYPE 'X'
+
+/* J@"org Schilling star header */
+
+struct star_header
+{ /* byte offset */
+ char name[100]; /* 0 */
+ char mode[8]; /* 100 */
+ char uid[8]; /* 108 */
+ char gid[8]; /* 116 */
+ char size[12]; /* 124 */
+ char mtime[12]; /* 136 */
+ char chksum[8]; /* 148 */
+ char typeflag; /* 156 */
+ char linkname[100]; /* 157 */
+ char magic[6]; /* 257 */
+ char version[2]; /* 263 */
+ char uname[32]; /* 265 */
+ char gname[32]; /* 297 */
+ char devmajor[8]; /* 329 */
+ char devminor[8]; /* 337 */
+ char prefix[131]; /* 345 */
+ char atime[12]; /* 476 */
+ char ctime[12]; /* 488 */
+ /* 500 */
+};
+
+#define SPARSES_IN_STAR_HEADER 4
+#define SPARSES_IN_STAR_EXT_HEADER 21
+
+struct star_in_header
+{
+ char fill[345]; /* 0 Everything that is before t_prefix */
+ char prefix[1]; /* 345 t_name prefix */
+ char fill2; /* 346 */
+ char fill3[8]; /* 347 */
+ char isextended; /* 355 */
+ struct sparse sp[SPARSES_IN_STAR_HEADER]; /* 356 */
+ char realsize[12]; /* 452 Actual size of the file */
+ char offset[12]; /* 464 Offset of multivolume contents */
+ char atime[12]; /* 476 */
+ char ctime[12]; /* 488 */
+ char mfill[8]; /* 500 */
+ char xmagic[4]; /* 508 "tar" */
+};
+
+struct star_ext_header
+{
+ struct sparse sp[SPARSES_IN_STAR_EXT_HEADER];
+ char isextended;
+};
+
+/* END */
+
+
+/* tar Header Block, overall structure. */
+
+/* tar files are made in basic blocks of this size. */
+#define BLOCKSIZE 512
+
+enum archive_format
+{
+ DEFAULT_FORMAT, /* format to be decided later */
+ V7_FORMAT, /* old V7 tar format */
+ OLDGNU_FORMAT, /* GNU format as per before tar 1.12 */
+ USTAR_FORMAT, /* POSIX.1-1988 (ustar) format */
+ POSIX_FORMAT, /* POSIX.1-2001 format */
+ STAR_FORMAT, /* Star format defined in 1994 */
+ GNU_FORMAT /* Same as OLDGNU_FORMAT with one exception:
+ see FIXME note for to_chars() function
+ (create.c:189) */
+};
+
+/* Information about a sparse file. */
+struct sp_array
+{
+ off_t offset;
+ size_t numbytes;
+};
+
+struct xheader
+{
+ struct obstack *stk;
+ size_t size;
+ char *buffer;
+ uintmax_t string_length;
+};
+
+struct tar_stat_info
+{
+ char *orig_file_name; /* name of file read from the archive header */
+ char *file_name; /* name of file for the current archive entry
+ after being normalized. */
+ bool had_trailing_slash; /* true if the current archive entry had a
+ trailing slash before it was normalized. */
+ char *link_name; /* name of link for the current archive entry. */
+
+ char *uname; /* user name of owner */
+ char *gname; /* group name of owner */
+ struct stat stat; /* regular filesystem stat */
+
+ /* STAT doesn't always have access, data modification, and status
+ change times in a convenient form, so store them separately. */
+ struct timespec atime;
+ struct timespec mtime;
+ struct timespec ctime;
+
+ off_t archive_file_size; /* Size of file as stored in the archive.
+ Equals stat.st_size for non-sparse files */
+
+ bool is_sparse; /* Is the file sparse */
+
+ /* For sparse files: */
+ unsigned sparse_major;
+ unsigned sparse_minor;
+ size_t sparse_map_avail; /* Index to the first unused element in
+ sparse_map array. Zero if the file is
+ not sparse */
+ size_t sparse_map_size; /* Size of the sparse map */
+ struct sp_array *sparse_map;
+
+ /* Extended headers */
+ struct xheader xhdr;
+
+ /* For dumpdirs */
+ bool is_dumpdir; /* Is the member a dumpdir? */
+ bool skipped; /* The member contents is already read
+ (for GNUTYPE_DUMPDIR) */
+ char *dumpdir; /* Contents of the dump directory */
+};
+
+union block
+{
+ char buffer[BLOCKSIZE];
+ struct posix_header header;
+ struct star_header star_header;
+ struct oldgnu_header oldgnu_header;
+ struct sparse_header sparse_header;
+ struct star_in_header star_in_header;
+ struct star_ext_header star_ext_header;
+};
diff --git a/src/transform.c b/src/transform.c
new file mode 100644
index 0000000..a74146b
--- /dev/null
+++ b/src/transform.c
@@ -0,0 +1,527 @@
+/* This file is part of GNU tar.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <regex.h>
+#include "common.h"
+
+static enum transform_type
+ {
+ transform_none,
+ transform_first,
+ transform_global
+ }
+transform_type = transform_none;
+static unsigned match_number = 0;
+static regex_t regex;
+static struct obstack stk;
+
+enum replace_segm_type
+ {
+ segm_literal, /* Literal segment */
+ segm_backref, /* Back-reference segment */
+ segm_case_ctl /* Case control segment (GNU extension) */
+ };
+
+enum case_ctl_type
+ {
+ ctl_stop, /* Stop case conversion */
+ ctl_upcase_next,/* Turn the next character to uppercase */
+ ctl_locase_next,/* Turn the next character to lowercase */
+ ctl_upcase, /* Turn the replacement to uppercase until ctl_stop */
+ ctl_locase /* Turn the replacement to lowercase until ctl_stop */
+ };
+
+struct replace_segm
+{
+ struct replace_segm *next;
+ enum replace_segm_type type;
+ union
+ {
+ struct
+ {
+ char *ptr;
+ size_t size;
+ } literal; /* type == segm_literal */
+ size_t ref; /* type == segm_backref */
+ enum case_ctl_type ctl; /* type == segm_case_ctl */
+ } v;
+};
+
+/* Compiled replacement expression */
+static struct replace_segm *repl_head, *repl_tail;
+static size_t segm_count; /* Number of elements in the above list */
+
+static struct replace_segm *
+add_segment (void)
+{
+ struct replace_segm *segm = xmalloc (sizeof *segm);
+ segm->next = NULL;
+ if (repl_tail)
+ repl_tail->next = segm;
+ else
+ repl_head = segm;
+ repl_tail = segm;
+ segm_count++;
+ return segm;
+}
+
+static void
+add_literal_segment (char *str, char *end)
+{
+ size_t len = end - str;
+ if (len)
+ {
+ struct replace_segm *segm = add_segment ();
+ segm->type = segm_literal;
+ segm->v.literal.ptr = xmalloc (len + 1);
+ memcpy (segm->v.literal.ptr, str, len);
+ segm->v.literal.ptr[len] = 0;
+ segm->v.literal.size = len;
+ }
+}
+
+static void
+add_char_segment (int chr)
+{
+ struct replace_segm *segm = add_segment ();
+ segm->type = segm_literal;
+ segm->v.literal.ptr = xmalloc (2);
+ segm->v.literal.ptr[0] = chr;
+ segm->v.literal.ptr[1] = 0;
+ segm->v.literal.size = 1;
+}
+
+static void
+add_backref_segment (size_t ref)
+{
+ struct replace_segm *segm = add_segment ();
+ segm->type = segm_backref;
+ segm->v.ref = ref;
+}
+
+static void
+add_case_ctl_segment (enum case_ctl_type ctl)
+{
+ struct replace_segm *segm = add_segment ();
+ segm->type = segm_case_ctl;
+ segm->v.ctl = ctl;
+}
+
+void
+set_transform_expr (const char *expr)
+{
+ int delim;
+ int i, j, rc;
+ char *str, *beg, *cur;
+ const char *p;
+ int cflags = 0;
+
+ if (transform_type == transform_none)
+ obstack_init (&stk);
+ else
+ {
+ /* Redefinition of the transform expression */
+ regfree (&regex);
+ }
+
+ if (expr[0] != 's')
+ USAGE_ERROR ((0, 0, _("Invalid transform expression")));
+
+ delim = expr[1];
+
+ /* Scan regular expression */
+ for (i = 2; expr[i] && expr[i] != delim; i++)
+ if (expr[i] == '\\' && expr[i+1])
+ i++;
+
+ if (expr[i] != delim)
+ USAGE_ERROR ((0, 0, _("Invalid transform expression")));
+
+ /* Scan replacement expression */
+ for (j = i + 1; expr[j] && expr[j] != delim; j++)
+ if (expr[j] == '\\' && expr[j+1])
+ j++;
+
+ if (expr[j] != delim)
+ USAGE_ERROR ((0, 0, _("Invalid transform expression")));
+
+ /* Check flags */
+ transform_type = transform_first;
+ for (p = expr + j + 1; *p; p++)
+ switch (*p)
+ {
+ case 'g':
+ transform_type = transform_global;
+ break;
+
+ case 'i':
+ cflags |= REG_ICASE;
+ break;
+
+ case 'x':
+ cflags |= REG_EXTENDED;
+ break;
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ match_number = strtoul (p, (char**) &p, 0);
+ p--;
+ break;
+
+ default:
+ USAGE_ERROR ((0, 0, _("Unknown flag in transform expression")));
+ }
+
+ /* Extract and compile regex */
+ str = xmalloc (i - 1);
+ memcpy (str, expr + 2, i - 2);
+ str[i - 2] = 0;
+
+ rc = regcomp (&regex, str, cflags);
+
+ if (rc)
+ {
+ char errbuf[512];
+ regerror (rc, &regex, errbuf, sizeof (errbuf));
+ USAGE_ERROR ((0, 0, _("Invalid transform expression: %s"), errbuf));
+ }
+
+ if (str[0] == '^' || str[strlen (str) - 1] == '$')
+ transform_type = transform_first;
+
+ free (str);
+
+ /* Extract and compile replacement expr */
+ i++;
+ str = xmalloc (j - i + 1);
+ memcpy (str, expr + i, j - i);
+ str[j - i] = 0;
+
+ for (cur = beg = str; *cur;)
+ {
+ if (*cur == '\\')
+ {
+ size_t n;
+
+ add_literal_segment (beg, cur);
+ switch (*++cur)
+ {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ n = strtoul (cur, &cur, 10);
+ if (n > regex.re_nsub)
+ USAGE_ERROR ((0, 0, _("Invalid transform replacement: back reference out of range")));
+ add_backref_segment (n);
+ break;
+
+ case '\\':
+ add_char_segment ('\\');
+ cur++;
+ break;
+
+ case 'a':
+ add_char_segment ('\a');
+ cur++;
+ break;
+
+ case 'b':
+ add_char_segment ('\b');
+ cur++;
+ break;
+
+ case 'f':
+ add_char_segment ('\f');
+ cur++;
+ break;
+
+ case 'n':
+ add_char_segment ('\n');
+ cur++;
+ break;
+
+ case 'r':
+ add_char_segment ('\r');
+ cur++;
+ break;
+
+ case 't':
+ add_char_segment ('\t');
+ cur++;
+ break;
+
+ case 'v':
+ add_char_segment ('\v');
+ cur++;
+ break;
+
+ case '&':
+ add_char_segment ('&');
+ cur++;
+ break;
+
+ case 'L':
+ /* Turn the replacement to lowercase until a `\U' or `\E'
+ is found, */
+ add_case_ctl_segment (ctl_locase);
+ cur++;
+ break;
+
+ case 'l':
+ /* Turn the next character to lowercase, */
+ add_case_ctl_segment (ctl_locase_next);
+ cur++;
+ break;
+
+ case 'U':
+ /* Turn the replacement to uppercase until a `\L' or `\E'
+ is found, */
+ add_case_ctl_segment (ctl_upcase);
+ cur++;
+ break;
+
+ case 'u':
+ /* Turn the next character to uppercase, */
+ add_case_ctl_segment (ctl_upcase_next);
+ cur++;
+ break;
+
+ case 'E':
+ /* Stop case conversion started by `\L' or `\U'. */
+ add_case_ctl_segment (ctl_stop);
+ cur++;
+ break;
+
+ default:
+ /* Try to be nice */
+ {
+ char buf[2];
+ buf[0] = '\\';
+ buf[1] = *cur;
+ add_literal_segment (buf, buf + 2);
+ }
+ cur++;
+ break;
+ }
+ beg = cur;
+ }
+ else if (*cur == '&')
+ {
+ add_literal_segment (beg, cur);
+ add_backref_segment (0);
+ beg = ++cur;
+ }
+ else
+ cur++;
+ }
+ add_literal_segment (beg, cur);
+
+}
+
+/* Run case conversion specified by CASE_CTL on array PTR of SIZE
+ characters. Returns pointer to statically allocated storage. */
+static char *
+run_case_conv (enum case_ctl_type case_ctl, char *ptr, size_t size)
+{
+ static char *case_ctl_buffer;
+ static size_t case_ctl_bufsize;
+ char *p;
+
+ if (case_ctl_bufsize < size)
+ {
+ case_ctl_bufsize = size;
+ case_ctl_buffer = xrealloc (case_ctl_buffer, case_ctl_bufsize);
+ }
+ memcpy (case_ctl_buffer, ptr, size);
+ switch (case_ctl)
+ {
+ case ctl_upcase_next:
+ case_ctl_buffer[0] = toupper (case_ctl_buffer[0]);
+ break;
+
+ case ctl_locase_next:
+ case_ctl_buffer[0] = tolower (case_ctl_buffer[0]);
+ break;
+
+ case ctl_upcase:
+ for (p = case_ctl_buffer; p < case_ctl_buffer + size; p++)
+ *p = toupper (*p);
+ break;
+
+ case ctl_locase:
+ for (p = case_ctl_buffer; p < case_ctl_buffer + size; p++)
+ *p = tolower (*p);
+ break;
+
+ case ctl_stop:
+ break;
+ }
+ return case_ctl_buffer;
+}
+
+bool
+_transform_name_to_obstack (char *input)
+{
+ regmatch_t *rmp;
+ int rc;
+ size_t nmatches = 0;
+ enum case_ctl_type case_ctl = ctl_stop, /* Current case conversion op */
+ save_ctl = ctl_stop; /* Saved case_ctl for \u and \l */
+
+ /* Reset case conversion after a single-char operation */
+#define CASE_CTL_RESET() if (case_ctl == ctl_upcase_next \
+ || case_ctl == ctl_locase_next) \
+ { \
+ case_ctl = save_ctl; \
+ save_ctl = ctl_stop; \
+ }
+
+ if (transform_type == transform_none)
+ return false;
+
+ rmp = xmalloc ((regex.re_nsub + 1) * sizeof (*rmp));
+
+ while (*input)
+ {
+ size_t disp;
+ char *ptr;
+
+ rc = regexec (&regex, input, regex.re_nsub + 1, rmp, 0);
+
+ if (rc == 0)
+ {
+ struct replace_segm *segm;
+
+ disp = rmp[0].rm_eo;
+
+ if (rmp[0].rm_so)
+ obstack_grow (&stk, input, rmp[0].rm_so);
+
+ nmatches++;
+ if (match_number && nmatches < match_number)
+ {
+ obstack_grow (&stk, input, disp);
+ input += disp;
+ continue;
+ }
+
+ for (segm = repl_head; segm; segm = segm->next)
+ {
+ switch (segm->type)
+ {
+ case segm_literal: /* Literal segment */
+ if (case_ctl == ctl_stop)
+ ptr = segm->v.literal.ptr;
+ else
+ {
+ ptr = run_case_conv (case_ctl,
+ segm->v.literal.ptr,
+ segm->v.literal.size);
+ CASE_CTL_RESET();
+ }
+ obstack_grow (&stk, ptr, segm->v.literal.size);
+ break;
+
+ case segm_backref: /* Back-reference segment */
+ if (rmp[segm->v.ref].rm_so != -1
+ && rmp[segm->v.ref].rm_eo != -1)
+ {
+ size_t size = rmp[segm->v.ref].rm_eo
+ - rmp[segm->v.ref].rm_so;
+ ptr = input + rmp[segm->v.ref].rm_so;
+ if (case_ctl != ctl_stop)
+ {
+ ptr = run_case_conv (case_ctl, ptr, size);
+ CASE_CTL_RESET();
+ }
+
+ obstack_grow (&stk, ptr, size);
+ }
+ break;
+
+ case segm_case_ctl:
+ switch (segm->v.ctl)
+ {
+ case ctl_upcase_next:
+ case ctl_locase_next:
+ switch (save_ctl)
+ {
+ case ctl_stop:
+ case ctl_upcase:
+ case ctl_locase:
+ save_ctl = case_ctl;
+ default:
+ break;
+ }
+ /*FALL THROUGH*/
+
+ case ctl_upcase:
+ case ctl_locase:
+ case ctl_stop:
+ case_ctl = segm->v.ctl;
+ }
+ }
+ }
+ }
+ else
+ {
+ disp = strlen (input);
+ obstack_grow (&stk, input, disp);
+ }
+
+ input += disp;
+
+ if (transform_type == transform_first)
+ {
+ obstack_grow (&stk, input, strlen (input));
+ break;
+ }
+ }
+
+ obstack_1grow (&stk, 0);
+ free (rmp);
+ return true;
+}
+
+bool
+transform_name_fp (char **pinput, char *(*fun)(char *, void *), void *dat)
+{
+ char *str;
+ bool ret = _transform_name_to_obstack (*pinput);
+ if (ret)
+ {
+ str = obstack_finish (&stk);
+ assign_string (pinput, fun ? fun (str, dat) : str);
+ obstack_free (&stk, str);
+ }
+ else if (fun)
+ {
+ str = *pinput;
+ *pinput = NULL;
+ assign_string (pinput, fun (str, dat));
+ free (str);
+ ret = true;
+ }
+ return ret;
+}
+
+bool
+transform_name (char **pinput)
+{
+ return transform_name_fp (pinput, NULL, NULL);
+}
+
diff --git a/src/update.c b/src/update.c
new file mode 100644
index 0000000..fa18c1d
--- /dev/null
+++ b/src/update.c
@@ -0,0 +1,210 @@
+/* Update a tar archive.
+
+ Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
+ 2004, 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Implement the 'r', 'u' and 'A' options for tar. 'A' means that the
+ file names are tar files, and they should simply be appended to the end
+ of the archive. No attempt is made to record the reads from the args; if
+ they're on raw tape or something like that, it'll probably lose... */
+
+#include <system.h>
+#include <quotearg.h>
+#include "common.h"
+
+/* FIXME: This module should not directly handle the following variable,
+ instead, this should be done in buffer.c only. */
+extern union block *current_block;
+
+/* We've hit the end of the old stuff, and its time to start writing new
+ stuff to the tape. This involves seeking back one record and
+ re-writing the current record (which has been changed).
+ FIXME: Either eliminate it or move it to common.h.
+*/
+bool time_to_start_writing;
+
+/* Pointer to where we started to write in the first record we write out.
+ This is used if we can't backspace the output and have to null out the
+ first part of the record. */
+char *output_start;
+
+/* Catenate file FILE_NAME to the archive without creating a header for it.
+ It had better be a tar file or the archive is screwed. */
+static void
+append_file (char *file_name)
+{
+ int handle = open (file_name, O_RDONLY | O_BINARY);
+ struct stat stat_data;
+
+ if (handle < 0)
+ {
+ open_error (file_name);
+ return;
+ }
+
+ if (fstat (handle, &stat_data) != 0)
+ stat_error (file_name);
+ else
+ {
+ off_t bytes_left = stat_data.st_size;
+
+ while (bytes_left > 0)
+ {
+ union block *start = find_next_block ();
+ size_t buffer_size = available_space_after (start);
+ size_t status;
+ char buf[UINTMAX_STRSIZE_BOUND];
+
+ if (bytes_left < buffer_size)
+ {
+ buffer_size = bytes_left;
+ status = buffer_size % BLOCKSIZE;
+ if (status)
+ memset (start->buffer + bytes_left, 0, BLOCKSIZE - status);
+ }
+
+ status = safe_read (handle, start->buffer, buffer_size);
+ if (status == SAFE_READ_ERROR)
+ read_fatal_details (file_name, stat_data.st_size - bytes_left,
+ buffer_size);
+ if (status == 0)
+ FATAL_ERROR ((0, 0,
+ ngettext ("%s: File shrank by %s byte",
+ "%s: File shrank by %s bytes",
+ bytes_left),
+ quotearg_colon (file_name),
+ STRINGIFY_BIGINT (bytes_left, buf)));
+
+ bytes_left -= status;
+
+ set_next_block_after (start + (status - 1) / BLOCKSIZE);
+ }
+ }
+
+ if (close (handle) != 0)
+ close_error (file_name);
+}
+
+/* Implement the 'r' (add files to end of archive), and 'u' (add files
+ to end of archive if they aren't there, or are more up to date than
+ the version in the archive) commands. */
+void
+update_archive (void)
+{
+ enum read_header previous_status = HEADER_STILL_UNREAD;
+ bool found_end = false;
+
+ name_gather ();
+ open_archive (ACCESS_UPDATE);
+ buffer_write_global_xheader ();
+
+ while (!found_end)
+ {
+ enum read_header status = read_header (false);
+
+ switch (status)
+ {
+ case HEADER_STILL_UNREAD:
+ case HEADER_SUCCESS_EXTENDED:
+ abort ();
+
+ case HEADER_SUCCESS:
+ {
+ struct name *name;
+
+ decode_header (current_header, &current_stat_info,
+ &current_format, 0);
+ archive_format = current_format;
+
+ if (subcommand_option == UPDATE_SUBCOMMAND
+ && (name = name_scan (current_stat_info.file_name)) != NULL)
+ {
+ struct stat s;
+
+ chdir_do (name->change_dir);
+ if (deref_stat (dereference_option,
+ current_stat_info.file_name, &s) == 0
+ && (tar_timespec_cmp (get_stat_mtime (&s),
+ current_stat_info.mtime)
+ <= 0))
+ add_avoided_name (current_stat_info.file_name);
+ }
+
+ skip_member ();
+ break;
+ }
+
+ case HEADER_ZERO_BLOCK:
+ current_block = current_header;
+ found_end = true;
+ break;
+
+ case HEADER_END_OF_FILE:
+ found_end = true;
+ break;
+
+ case HEADER_FAILURE:
+ set_next_block_after (current_header);
+ switch (previous_status)
+ {
+ case HEADER_STILL_UNREAD:
+ WARN ((0, 0, _("This does not look like a tar archive")));
+ /* Fall through. */
+
+ case HEADER_SUCCESS:
+ case HEADER_ZERO_BLOCK:
+ ERROR ((0, 0, _("Skipping to next header")));
+ /* Fall through. */
+
+ case HEADER_FAILURE:
+ break;
+
+ case HEADER_END_OF_FILE:
+ case HEADER_SUCCESS_EXTENDED:
+ abort ();
+ }
+ break;
+ }
+
+ tar_stat_destroy (&current_stat_info);
+ previous_status = status;
+ }
+
+ reset_eof ();
+ time_to_start_writing = true;
+ output_start = current_block->buffer;
+
+ {
+ char *file_name;
+
+ while ((file_name = name_from_list ()) != NULL)
+ {
+ if (excluded_name (file_name))
+ continue;
+ if (interactive_option && !confirm ("add", file_name))
+ continue;
+ if (subcommand_option == CAT_SUBCOMMAND)
+ append_file (file_name);
+ else
+ dump_file (file_name, 1, (dev_t) 0);
+ }
+ }
+
+ write_eot ();
+ close_archive ();
+ names_notfound ();
+}
diff --git a/src/utf8.c b/src/utf8.c
new file mode 100644
index 0000000..75b7c1d
--- /dev/null
+++ b/src/utf8.c
@@ -0,0 +1,97 @@
+/* Charset handling for GNU tar.
+
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+#include <quotearg.h>
+#include <localcharset.h>
+#include "common.h"
+#ifdef HAVE_ICONV_H
+# include <iconv.h>
+#endif
+
+#ifndef ICONV_CONST
+# define ICONV_CONST
+#endif
+
+#ifndef HAVE_ICONV
+
+# undef iconv_open
+# define iconv_open(tocode, fromcode) ((iconv_t) -1)
+
+# undef iconv
+# define iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft) ((size_t) 0)
+
+# undef iconv_close
+# define iconv_close(cd) 0
+
+#endif
+
+
+
+
+static iconv_t conv_desc[2] = { (iconv_t) -1, (iconv_t) -1 };
+
+static iconv_t
+utf8_init (bool to_utf)
+{
+ if (conv_desc[(int) to_utf] == (iconv_t) -1)
+ {
+ if (to_utf)
+ conv_desc[(int) to_utf] = iconv_open ("UTF-8", locale_charset ());
+ else
+ conv_desc[(int) to_utf] = iconv_open (locale_charset (), "UTF-8");
+ }
+ return conv_desc[(int) to_utf];
+}
+
+bool
+utf8_convert (bool to_utf, char const *input, char **output)
+{
+ char ICONV_CONST *ib;
+ char *ob;
+ size_t inlen;
+ size_t outlen;
+ size_t rc;
+ iconv_t cd = utf8_init (to_utf);
+
+ if (cd == 0)
+ {
+ *output = xstrdup (input);
+ return true;
+ }
+ else if (cd == (iconv_t)-1)
+ return false;
+
+ inlen = strlen (input) + 1;
+ outlen = inlen * MB_LEN_MAX + 1;
+ ob = *output = xmalloc (outlen);
+ ib = (char ICONV_CONST *) input;
+ rc = iconv (cd, &ib, &inlen, &ob, &outlen);
+ *ob = 0;
+ return rc != -1;
+}
+
+
+bool
+string_ascii_p (char const *p)
+{
+ for (; *p; p++)
+ if (! (0 <= *p && *p <= 127))
+ return false;
+ return true;
+}
diff --git a/src/xheader.c b/src/xheader.c
new file mode 100644
index 0000000..aed2eb0
--- /dev/null
+++ b/src/xheader.c
@@ -0,0 +1,1516 @@
+/* POSIX extended headers for tar.
+
+ Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <system.h>
+
+#include <fnmatch.h>
+#include <hash.h>
+#include <inttostr.h>
+#include <quotearg.h>
+
+#include "common.h"
+
+#include <fnmatch.h>
+
+static bool xheader_protected_pattern_p (char const *pattern);
+static bool xheader_protected_keyword_p (char const *keyword);
+static void xheader_set_single_keyword (char *) __attribute__ ((noreturn));
+
+/* Used by xheader_finish() */
+static void code_string (char const *string, char const *keyword,
+ struct xheader *xhdr);
+
+/* Number of global headers written so far. */
+static size_t global_header_count;
+/* FIXME: Possibly it should be reset after changing the volume.
+ POSIX %n specification says that it is expanded to the sequence
+ number of current global header in *the* archive. However, for
+ multi-volume archives this will yield duplicate header names
+ in different volumes, which I'd like to avoid. The best way
+ to solve this would be to use per-archive header count as required
+ by POSIX *and* set globexthdr.name to, say,
+ $TMPDIR/GlobalHead.%p.$NUMVOLUME.%n.
+
+ However it should wait until buffer.c is finally rewritten */
+
+
+/* Interface functions to obstacks */
+
+static void
+x_obstack_grow (struct xheader *xhdr, const char *ptr, size_t length)
+{
+ obstack_grow (xhdr->stk, ptr, length);
+ xhdr->size += length;
+}
+
+static void
+x_obstack_1grow (struct xheader *xhdr, char c)
+{
+ obstack_1grow (xhdr->stk, c);
+ xhdr->size++;
+}
+
+static void
+x_obstack_blank (struct xheader *xhdr, size_t length)
+{
+ obstack_blank (xhdr->stk, length);
+ xhdr->size += length;
+}
+
+
+/* Keyword options */
+
+struct keyword_list
+{
+ struct keyword_list *next;
+ char *pattern;
+ char *value;
+};
+
+
+/* List of keyword patterns set by delete= option */
+static struct keyword_list *keyword_pattern_list;
+
+/* List of keyword/value pairs set by `keyword=value' option */
+static struct keyword_list *keyword_global_override_list;
+
+/* List of keyword/value pairs set by `keyword:=value' option */
+static struct keyword_list *keyword_override_list;
+
+/* List of keyword/value pairs decoded from the last 'g' type header */
+static struct keyword_list *global_header_override_list;
+
+/* Template for the name field of an 'x' type header */
+static char *exthdr_name;
+
+/* Template for the name field of a 'g' type header */
+static char *globexthdr_name;
+
+bool
+xheader_keyword_deleted_p (const char *kw)
+{
+ struct keyword_list *kp;
+
+ for (kp = keyword_pattern_list; kp; kp = kp->next)
+ if (fnmatch (kp->pattern, kw, 0) == 0)
+ return true;
+ return false;
+}
+
+static bool
+xheader_keyword_override_p (const char *keyword)
+{
+ struct keyword_list *kp;
+
+ for (kp = keyword_override_list; kp; kp = kp->next)
+ if (strcmp (kp->pattern, keyword) == 0)
+ return true;
+ return false;
+}
+
+static void
+xheader_list_append (struct keyword_list **root, char const *kw,
+ char const *value)
+{
+ struct keyword_list *kp = xmalloc (sizeof *kp);
+ kp->pattern = xstrdup (kw);
+ kp->value = value ? xstrdup (value) : NULL;
+ kp->next = *root;
+ *root = kp;
+}
+
+static void
+xheader_list_destroy (struct keyword_list **root)
+{
+ if (root)
+ {
+ struct keyword_list *kw = *root;
+ while (kw)
+ {
+ struct keyword_list *next = kw->next;
+ free (kw->pattern);
+ free (kw->value);
+ free (kw);
+ kw = next;
+ }
+ *root = NULL;
+ }
+}
+
+static void
+xheader_set_single_keyword (char *kw)
+{
+ USAGE_ERROR ((0, 0, _("Keyword %s is unknown or not yet implemented"), kw));
+}
+
+static void
+xheader_set_keyword_equal (char *kw, char *eq)
+{
+ bool global = true;
+ char *p = eq;
+
+ if (eq[-1] == ':')
+ {
+ p--;
+ global = false;
+ }
+
+ while (p > kw && isspace (*p))
+ p--;
+
+ *p = 0;
+
+ for (p = eq + 1; *p && isspace (*p); p++)
+ ;
+
+ if (strcmp (kw, "delete") == 0)
+ {
+ if (xheader_protected_pattern_p (p))
+ USAGE_ERROR ((0, 0, _("Pattern %s cannot be used"), quote (p)));
+ xheader_list_append (&keyword_pattern_list, p, NULL);
+ }
+ else if (strcmp (kw, "exthdr.name") == 0)
+ assign_string (&exthdr_name, p);
+ else if (strcmp (kw, "globexthdr.name") == 0)
+ assign_string (&globexthdr_name, p);
+ else
+ {
+ if (xheader_protected_keyword_p (kw))
+ USAGE_ERROR ((0, 0, _("Keyword %s cannot be overridden"), kw));
+ if (global)
+ xheader_list_append (&keyword_global_override_list, kw, p);
+ else
+ xheader_list_append (&keyword_override_list, kw, p);
+ }
+}
+
+void
+xheader_set_option (char *string)
+{
+ char *token;
+ for (token = strtok (string, ","); token; token = strtok (NULL, ","))
+ {
+ char *p = strchr (token, '=');
+ if (!p)
+ xheader_set_single_keyword (token);
+ else
+ xheader_set_keyword_equal (token, p);
+ }
+}
+
+/*
+ string Includes: Replaced By:
+ %d The directory name of the file,
+ equivalent to the result of the
+ dirname utility on the translated
+ file name.
+ %f The filename of the file, equivalent
+ to the result of the basename
+ utility on the translated file name.
+ %p The process ID of the pax process.
+ %n The value of the 3rd argument.
+ %% A '%' character. */
+
+char *
+xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n)
+{
+ char *buf;
+ size_t len = strlen (fmt);
+ char *q;
+ const char *p;
+ char *dirp = NULL;
+ char *dir = NULL;
+ char *base = NULL;
+ char pidbuf[UINTMAX_STRSIZE_BOUND];
+ char const *pptr;
+ char nbuf[UINTMAX_STRSIZE_BOUND];
+ char const *nptr = NULL;
+
+ for (p = fmt; *p && (p = strchr (p, '%')); )
+ {
+ switch (p[1])
+ {
+ case '%':
+ len--;
+ break;
+
+ case 'd':
+ if (st)
+ {
+ if (!dirp)
+ dirp = dir_name (st->orig_file_name);
+ dir = safer_name_suffix (dirp, false, absolute_names_option);
+ len += strlen (dir) - 2;
+ }
+ break;
+
+ case 'f':
+ if (st)
+ {
+ base = last_component (st->orig_file_name);
+ len += strlen (base) - 2;
+ }
+ break;
+
+ case 'p':
+ pptr = umaxtostr (getpid (), pidbuf);
+ len += pidbuf + sizeof pidbuf - 1 - pptr - 2;
+ break;
+
+ case 'n':
+ nptr = umaxtostr (n, nbuf);
+ len += nbuf + sizeof nbuf - 1 - nptr - 2;
+ break;
+ }
+ p++;
+ }
+
+ buf = xmalloc (len + 1);
+ for (q = buf, p = fmt; *p; )
+ {
+ if (*p == '%')
+ {
+ switch (p[1])
+ {
+ case '%':
+ *q++ = *p++;
+ p++;
+ break;
+
+ case 'd':
+ if (dir)
+ q = stpcpy (q, dir);
+ p += 2;
+ break;
+
+ case 'f':
+ if (base)
+ q = stpcpy (q, base);
+ p += 2;
+ break;
+
+ case 'p':
+ q = stpcpy (q, pptr);
+ p += 2;
+ break;
+
+ case 'n':
+ if (nptr)
+ {
+ q = stpcpy (q, nptr);
+ p += 2;
+ break;
+ }
+ /* else fall through */
+
+ default:
+ *q++ = *p++;
+ if (*p)
+ *q++ = *p++;
+ }
+ }
+ else
+ *q++ = *p++;
+ }
+
+ free (dirp);
+
+ /* Do not allow it to end in a slash */
+ while (q > buf && ISSLASH (q[-1]))
+ q--;
+ *q = 0;
+ return buf;
+}
+
+char *
+xheader_xhdr_name (struct tar_stat_info *st)
+{
+ if (!exthdr_name)
+ assign_string (&exthdr_name, "%d/PaxHeaders.%p/%f");
+ return xheader_format_name (st, exthdr_name, 0);
+}
+
+#define GLOBAL_HEADER_TEMPLATE "/GlobalHead.%p.%n"
+
+char *
+xheader_ghdr_name (void)
+{
+ if (!globexthdr_name)
+ {
+ size_t len;
+ const char *tmp = getenv ("TMPDIR");
+ if (!tmp)
+ tmp = "/tmp";
+ len = strlen (tmp) + sizeof (GLOBAL_HEADER_TEMPLATE); /* Includes nul */
+ globexthdr_name = xmalloc (len);
+ strcpy(globexthdr_name, tmp);
+ strcat(globexthdr_name, GLOBAL_HEADER_TEMPLATE);
+ }
+
+ return xheader_format_name (NULL, globexthdr_name, global_header_count + 1);
+}
+
+void
+xheader_write (char type, char *name, struct xheader *xhdr)
+{
+ union block *header;
+ size_t size;
+ char *p;
+
+ size = xhdr->size;
+ header = start_private_header (name, size);
+ header->header.typeflag = type;
+
+ simple_finish_header (header);
+
+ p = xhdr->buffer;
+
+ do
+ {
+ size_t len;
+
+ header = find_next_block ();
+ len = BLOCKSIZE;
+ if (len > size)
+ len = size;
+ memcpy (header->buffer, p, len);
+ if (len < BLOCKSIZE)
+ memset (header->buffer + len, 0, BLOCKSIZE - len);
+ p += len;
+ size -= len;
+ set_next_block_after (header);
+ }
+ while (size > 0);
+ xheader_destroy (xhdr);
+
+ if (type == XGLTYPE)
+ global_header_count++;
+}
+
+void
+xheader_write_global (struct xheader *xhdr)
+{
+ char *name;
+ struct keyword_list *kp;
+
+ if (!keyword_global_override_list)
+ return;
+
+ xheader_init (xhdr);
+ for (kp = keyword_global_override_list; kp; kp = kp->next)
+ code_string (kp->value, kp->pattern, xhdr);
+ xheader_finish (xhdr);
+ xheader_write (XGLTYPE, name = xheader_ghdr_name (), xhdr);
+ free (name);
+}
+
+
+/* General Interface */
+
+struct xhdr_tab
+{
+ char const *keyword;
+ void (*coder) (struct tar_stat_info const *, char const *,
+ struct xheader *, void const *data);
+ void (*decoder) (struct tar_stat_info *, char const *, char const *, size_t);
+ bool protect;
+};
+
+/* This declaration must be extern, because ISO C99 section 6.9.2
+ prohibits a tentative definition that has both internal linkage and
+ incomplete type. If we made it static, we'd have to declare its
+ size which would be a maintenance pain; if we put its initializer
+ here, we'd need a boatload of forward declarations, which would be
+ even more of a pain. */
+extern struct xhdr_tab const xhdr_tab[];
+
+static struct xhdr_tab const *
+locate_handler (char const *keyword)
+{
+ struct xhdr_tab const *p;
+
+ for (p = xhdr_tab; p->keyword; p++)
+ if (strcmp (p->keyword, keyword) == 0)
+ return p;
+ return NULL;
+}
+
+static bool
+xheader_protected_pattern_p (const char *pattern)
+{
+ struct xhdr_tab const *p;
+
+ for (p = xhdr_tab; p->keyword; p++)
+ if (p->protect && fnmatch (pattern, p->keyword, 0) == 0)
+ return true;
+ return false;
+}
+
+static bool
+xheader_protected_keyword_p (const char *keyword)
+{
+ struct xhdr_tab const *p;
+
+ for (p = xhdr_tab; p->keyword; p++)
+ if (p->protect && strcmp (p->keyword, keyword) == 0)
+ return true;
+ return false;
+}
+
+/* Decode a single extended header record, advancing *PTR to the next record.
+ Return true on success, false otherwise. */
+static bool
+decode_record (struct xheader *xhdr,
+ char **ptr,
+ void (*handler) (void *, char const *, char const *, size_t),
+ void *data)
+{
+ char *start = *ptr;
+ char *p = start;
+ uintmax_t u;
+ size_t len;
+ char *len_lim;
+ char const *keyword;
+ char *nextp;
+ size_t len_max = xhdr->buffer + xhdr->size - start;
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (! ISDIGIT (*p))
+ {
+ if (*p)
+ ERROR ((0, 0, _("Malformed extended header: missing length")));
+ return false;
+ }
+
+ errno = 0;
+ len = u = strtoumax (p, &len_lim, 10);
+ if (len != u || errno == ERANGE)
+ {
+ ERROR ((0, 0, _("Extended header length is out of allowed range")));
+ return false;
+ }
+
+ if (len_max < len)
+ {
+ int len_len = len_lim - p;
+ ERROR ((0, 0, _("Extended header length %*s is out of range"),
+ len_len, p));
+ return false;
+ }
+
+ nextp = start + len;
+
+ for (p = len_lim; *p == ' ' || *p == '\t'; p++)
+ continue;
+ if (p == len_lim)
+ {
+ ERROR ((0, 0,
+ _("Malformed extended header: missing blank after length")));
+ return false;
+ }
+
+ keyword = p;
+ p = strchr (p, '=');
+ if (! (p && p < nextp))
+ {
+ ERROR ((0, 0, _("Malformed extended header: missing equal sign")));
+ return false;
+ }
+
+ if (nextp[-1] != '\n')
+ {
+ ERROR ((0, 0, _("Malformed extended header: missing newline")));
+ return false;
+ }
+
+ *p = nextp[-1] = '\0';
+ handler (data, keyword, p + 1, nextp - p - 2); /* '=' + trailing '\n' */
+ *p = '=';
+ nextp[-1] = '\n';
+ *ptr = nextp;
+ return true;
+}
+
+static void
+run_override_list (struct keyword_list *kp, struct tar_stat_info *st)
+{
+ for (; kp; kp = kp->next)
+ {
+ struct xhdr_tab const *t = locate_handler (kp->pattern);
+ if (t)
+ t->decoder (st, t->keyword, kp->value, strlen (kp->value));
+ }
+}
+
+static void
+decx (void *data, char const *keyword, char const *value, size_t size)
+{
+ struct xhdr_tab const *t;
+ struct tar_stat_info *st = data;
+
+ if (xheader_keyword_deleted_p (keyword)
+ || xheader_keyword_override_p (keyword))
+ return;
+
+ t = locate_handler (keyword);
+ if (t)
+ t->decoder (st, keyword, value, size);
+ else
+ WARN((0, 0, _("Ignoring unknown extended header keyword `%s'"),
+ keyword));
+}
+
+void
+xheader_decode (struct tar_stat_info *st)
+{
+ run_override_list (keyword_global_override_list, st);
+ run_override_list (global_header_override_list, st);
+
+ if (st->xhdr.size)
+ {
+ char *p = st->xhdr.buffer + BLOCKSIZE;
+ while (decode_record (&st->xhdr, &p, decx, st))
+ continue;
+ }
+ run_override_list (keyword_override_list, st);
+}
+
+static void
+decg (void *data, char const *keyword, char const *value,
+ size_t size __attribute__((unused)))
+{
+ struct keyword_list **kwl = data;
+ xheader_list_append (kwl, keyword, value);
+}
+
+void
+xheader_decode_global (struct xheader *xhdr)
+{
+ if (xhdr->size)
+ {
+ char *p = xhdr->buffer + BLOCKSIZE;
+
+ xheader_list_destroy (&global_header_override_list);
+ while (decode_record (xhdr, &p, decg, &global_header_override_list))
+ continue;
+ }
+}
+
+void
+xheader_init (struct xheader *xhdr)
+{
+ if (!xhdr->stk)
+ {
+ xhdr->stk = xmalloc (sizeof *xhdr->stk);
+ obstack_init (xhdr->stk);
+ }
+}
+
+void
+xheader_store (char const *keyword, struct tar_stat_info *st,
+ void const *data)
+{
+ struct xhdr_tab const *t;
+
+ if (st->xhdr.buffer)
+ return;
+ t = locate_handler (keyword);
+ if (!t || !t->coder)
+ return;
+ if (xheader_keyword_deleted_p (keyword)
+ || xheader_keyword_override_p (keyword))
+ return;
+ xheader_init (&st->xhdr);
+ t->coder (st, keyword, &st->xhdr, data);
+}
+
+void
+xheader_read (struct xheader *xhdr, union block *p, size_t size)
+{
+ size_t j = 0;
+
+ xheader_init (xhdr);
+ size += BLOCKSIZE;
+ xhdr->size = size;
+ xhdr->buffer = xmalloc (size + 1);
+ xhdr->buffer[size] = '\0';
+
+ do
+ {
+ size_t len = size;
+
+ if (len > BLOCKSIZE)
+ len = BLOCKSIZE;
+
+ memcpy (&xhdr->buffer[j], p->buffer, len);
+ set_next_block_after (p);
+
+ p = find_next_block ();
+
+ j += len;
+ size -= len;
+ }
+ while (size > 0);
+}
+
+static void
+xheader_print_n (struct xheader *xhdr, char const *keyword,
+ char const *value, size_t vsize)
+{
+ size_t len = strlen (keyword) + vsize + 3; /* ' ' + '=' + '\n' */
+ size_t p;
+ size_t n = 0;
+ char nbuf[UINTMAX_STRSIZE_BOUND];
+ char const *np;
+
+ do
+ {
+ p = n;
+ np = umaxtostr (len + p, nbuf);
+ n = nbuf + sizeof nbuf - 1 - np;
+ }
+ while (n != p);
+
+ x_obstack_grow (xhdr, np, n);
+ x_obstack_1grow (xhdr, ' ');
+ x_obstack_grow (xhdr, keyword, strlen (keyword));
+ x_obstack_1grow (xhdr, '=');
+ x_obstack_grow (xhdr, value, vsize);
+ x_obstack_1grow (xhdr, '\n');
+}
+
+static void
+xheader_print (struct xheader *xhdr, char const *keyword, char const *value)
+{
+ xheader_print_n (xhdr, keyword, value, strlen (value));
+}
+
+void
+xheader_finish (struct xheader *xhdr)
+{
+ struct keyword_list *kp;
+
+ for (kp = keyword_override_list; kp; kp = kp->next)
+ code_string (kp->value, kp->pattern, xhdr);
+
+ xhdr->buffer = obstack_finish (xhdr->stk);
+}
+
+void
+xheader_destroy (struct xheader *xhdr)
+{
+ if (xhdr->stk)
+ {
+ obstack_free (xhdr->stk, NULL);
+ free (xhdr->stk);
+ xhdr->stk = NULL;
+ }
+ else
+ free (xhdr->buffer);
+ xhdr->buffer = 0;
+ xhdr->size = 0;
+}
+
+
+/* Buildable strings */
+
+void
+xheader_string_begin (struct xheader *xhdr)
+{
+ xhdr->string_length = 0;
+}
+
+void
+xheader_string_add (struct xheader *xhdr, char const *s)
+{
+ if (xhdr->buffer)
+ return;
+ xheader_init (xhdr);
+ xhdr->string_length += strlen (s);
+ x_obstack_grow (xhdr, s, strlen (s));
+}
+
+bool
+xheader_string_end (struct xheader *xhdr, char const *keyword)
+{
+ uintmax_t len;
+ uintmax_t p;
+ uintmax_t n = 0;
+ size_t size;
+ char nbuf[UINTMAX_STRSIZE_BOUND];
+ char const *np;
+ char *cp;
+
+ if (xhdr->buffer)
+ return false;
+ xheader_init (xhdr);
+
+ len = strlen (keyword) + xhdr->string_length + 3; /* ' ' + '=' + '\n' */
+
+ do
+ {
+ p = n;
+ np = umaxtostr (len + p, nbuf);
+ n = nbuf + sizeof nbuf - 1 - np;
+ }
+ while (n != p);
+
+ p = strlen (keyword) + n + 2;
+ size = p;
+ if (size != p)
+ {
+ ERROR ((0, 0,
+ _("Generated keyword/value pair is too long (keyword=%s, length=%s)"),
+ keyword, nbuf));
+ obstack_free (xhdr->stk, obstack_finish (xhdr->stk));
+ return false;
+ }
+ x_obstack_blank (xhdr, p);
+ x_obstack_1grow (xhdr, '\n');
+ cp = obstack_next_free (xhdr->stk) - xhdr->string_length - p - 1;
+ memmove (cp + p, cp, xhdr->string_length);
+ cp = stpcpy (cp, np);
+ *cp++ = ' ';
+ cp = stpcpy (cp, keyword);
+ *cp++ = '=';
+ return true;
+}
+
+
+/* Implementations */
+
+static void
+out_of_range_header (char const *keyword, char const *value,
+ uintmax_t minus_minval, uintmax_t maxval)
+{
+ char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
+ char maxval_buf[UINTMAX_STRSIZE_BOUND];
+ char *minval_string = umaxtostr (minus_minval, minval_buf + 1);
+ char *maxval_string = umaxtostr (maxval, maxval_buf);
+ if (minus_minval)
+ *--minval_string = '-';
+
+ /* TRANSLATORS: The first %s is the pax extended header keyword
+ (atime, gid, etc.). */
+ ERROR ((0, 0, _("Extended header %s=%s is out of range %s..%s"),
+ keyword, value, minval_string, maxval_string));
+}
+
+static void
+code_string (char const *string, char const *keyword, struct xheader *xhdr)
+{
+ char *outstr;
+ if (!utf8_convert (true, string, &outstr))
+ {
+ /* FIXME: report error */
+ outstr = xstrdup (string);
+ }
+ xheader_print (xhdr, keyword, outstr);
+ free (outstr);
+}
+
+static void
+decode_string (char **string, char const *arg)
+{
+ if (*string)
+ {
+ free (*string);
+ *string = NULL;
+ }
+ if (!utf8_convert (false, arg, string))
+ {
+ /* FIXME: report error and act accordingly to --pax invalid=UTF-8 */
+ assign_string (string, arg);
+ }
+}
+
+static void
+code_time (struct timespec t, char const *keyword, struct xheader *xhdr)
+{
+ char buf[TIMESPEC_STRSIZE_BOUND];
+ xheader_print (xhdr, keyword, code_timespec (t, buf));
+}
+
+enum decode_time_status
+ {
+ decode_time_success,
+ decode_time_range,
+ decode_time_bad_header
+ };
+
+static enum decode_time_status
+_decode_time (struct timespec *ts, char const *arg, char const *keyword)
+{
+ time_t s;
+ unsigned long int ns = 0;
+ char *p;
+ char *arg_lim;
+ bool negative = *arg == '-';
+
+ errno = 0;
+
+ if (ISDIGIT (arg[negative]))
+ {
+ if (negative)
+ {
+ intmax_t i = strtoimax (arg, &arg_lim, 10);
+ if (TYPE_SIGNED (time_t) ? i < TYPE_MINIMUM (time_t) : i < 0)
+ return decode_time_range;
+ s = i;
+ }
+ else
+ {
+ uintmax_t i = strtoumax (arg, &arg_lim, 10);
+ if (TYPE_MAXIMUM (time_t) < i)
+ return decode_time_range;
+ s = i;
+ }
+
+ p = arg_lim;
+
+ if (errno == ERANGE)
+ return decode_time_range;
+
+ if (*p == '.')
+ {
+ int digits = 0;
+ bool trailing_nonzero = false;
+
+ while (ISDIGIT (*++p))
+ if (digits < LOG10_BILLION)
+ {
+ ns = 10 * ns + (*p - '0');
+ digits++;
+ }
+ else
+ trailing_nonzero |= *p != '0';
+
+ while (digits++ < LOG10_BILLION)
+ ns *= 10;
+
+ if (negative)
+ {
+ /* Convert "-1.10000000000001" to s == -2, ns == 89999999.
+ I.e., truncate time stamps towards minus infinity while
+ converting them to internal form. */
+ ns += trailing_nonzero;
+ if (ns != 0)
+ {
+ if (s == TYPE_MINIMUM (time_t))
+ return decode_time_range;
+ s--;
+ ns = BILLION - ns;
+ }
+ }
+ }
+
+ if (! *p)
+ {
+ ts->tv_sec = s;
+ ts->tv_nsec = ns;
+ return decode_time_success;
+ }
+ }
+
+ return decode_time_bad_header;
+}
+
+static bool
+decode_time (struct timespec *ts, char const *arg, char const *keyword)
+{
+ switch (_decode_time (ts, arg, keyword))
+ {
+ case decode_time_success:
+ return true;
+ case decode_time_bad_header:
+ ERROR ((0, 0, _("Malformed extended header: invalid %s=%s"),
+ keyword, arg));
+ return false;
+ case decode_time_range:
+ out_of_range_header (keyword, arg, - (uintmax_t) TYPE_MINIMUM (time_t),
+ TYPE_MAXIMUM (time_t));
+ return false;
+ }
+ return true;
+}
+
+
+
+static void
+code_num (uintmax_t value, char const *keyword, struct xheader *xhdr)
+{
+ char sbuf[UINTMAX_STRSIZE_BOUND];
+ xheader_print (xhdr, keyword, umaxtostr (value, sbuf));
+}
+
+static bool
+decode_num (uintmax_t *num, char const *arg, uintmax_t maxval,
+ char const *keyword)
+{
+ uintmax_t u;
+ char *arg_lim;
+
+ if (! (ISDIGIT (*arg)
+ && (errno = 0, u = strtoumax (arg, &arg_lim, 10), !*arg_lim)))
+ {
+ ERROR ((0, 0, _("Malformed extended header: invalid %s=%s"),
+ keyword, arg));
+ return false;
+ }
+
+ if (! (u <= maxval && errno != ERANGE))
+ {
+ out_of_range_header (keyword, arg, 0, maxval);
+ return false;
+ }
+
+ *num = u;
+ return true;
+}
+
+static void
+dummy_coder (struct tar_stat_info const *st __attribute__ ((unused)),
+ char const *keyword __attribute__ ((unused)),
+ struct xheader *xhdr __attribute__ ((unused)),
+ void const *data __attribute__ ((unused)))
+{
+}
+
+static void
+dummy_decoder (struct tar_stat_info *st __attribute__ ((unused)),
+ char const *keyword __attribute__ ((unused)),
+ char const *arg __attribute__ ((unused)),
+ size_t size __attribute__((unused)))
+{
+}
+
+static void
+atime_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data __attribute__ ((unused)))
+{
+ code_time (st->atime, keyword, xhdr);
+}
+
+static void
+atime_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ struct timespec ts;
+ if (decode_time (&ts, arg, keyword))
+ st->atime = ts;
+}
+
+static void
+gid_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data __attribute__ ((unused)))
+{
+ code_num (st->stat.st_gid, keyword, xhdr);
+}
+
+static void
+gid_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, TYPE_MAXIMUM (gid_t), keyword))
+ st->stat.st_gid = u;
+}
+
+static void
+gname_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data __attribute__ ((unused)))
+{
+ code_string (st->gname, keyword, xhdr);
+}
+
+static void
+gname_decoder (struct tar_stat_info *st,
+ char const *keyword __attribute__((unused)),
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ decode_string (&st->gname, arg);
+}
+
+static void
+linkpath_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data __attribute__ ((unused)))
+{
+ code_string (st->link_name, keyword, xhdr);
+}
+
+static void
+linkpath_decoder (struct tar_stat_info *st,
+ char const *keyword __attribute__((unused)),
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ decode_string (&st->link_name, arg);
+}
+
+static void
+ctime_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data __attribute__ ((unused)))
+{
+ code_time (st->ctime, keyword, xhdr);
+}
+
+static void
+ctime_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ struct timespec ts;
+ if (decode_time (&ts, arg, keyword))
+ st->ctime = ts;
+}
+
+static void
+mtime_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ struct timespec const *mtime = data;
+ code_time (mtime ? *mtime : st->mtime, keyword, xhdr);
+}
+
+static void
+mtime_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ struct timespec ts;
+ if (decode_time (&ts, arg, keyword))
+ st->mtime = ts;
+}
+
+static void
+path_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data __attribute__ ((unused)))
+{
+ code_string (st->file_name, keyword, xhdr);
+}
+
+static void
+path_decoder (struct tar_stat_info *st,
+ char const *keyword __attribute__((unused)),
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ decode_string (&st->orig_file_name, arg);
+ decode_string (&st->file_name, arg);
+ st->had_trailing_slash = strip_trailing_slashes (st->file_name);
+}
+
+static void
+size_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data __attribute__ ((unused)))
+{
+ code_num (st->stat.st_size, keyword, xhdr);
+}
+
+static void
+size_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword))
+ st->stat.st_size = u;
+}
+
+static void
+uid_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data __attribute__ ((unused)))
+{
+ code_num (st->stat.st_uid, keyword, xhdr);
+}
+
+static void
+uid_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, TYPE_MAXIMUM (uid_t), keyword))
+ st->stat.st_uid = u;
+}
+
+static void
+uname_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data __attribute__ ((unused)))
+{
+ code_string (st->uname, keyword, xhdr);
+}
+
+static void
+uname_decoder (struct tar_stat_info *st,
+ char const *keyword __attribute__((unused)),
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ decode_string (&st->uname, arg);
+}
+
+static void
+sparse_size_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ size_coder (st, keyword, xhdr, data);
+}
+
+static void
+sparse_size_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword))
+ st->stat.st_size = u;
+}
+
+static void
+sparse_numblocks_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr,
+ void const *data __attribute__ ((unused)))
+{
+ code_num (st->sparse_map_avail, keyword, xhdr);
+}
+
+static void
+sparse_numblocks_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, SIZE_MAX, keyword))
+ {
+ st->sparse_map_size = u;
+ st->sparse_map = xcalloc (u, sizeof st->sparse_map[0]);
+ st->sparse_map_avail = 0;
+ }
+}
+
+static void
+sparse_offset_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ size_t const *pi = data;
+ code_num (st->sparse_map[*pi].offset, keyword, xhdr);
+}
+
+static void
+sparse_offset_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword))
+ {
+ if (st->sparse_map_avail < st->sparse_map_size)
+ st->sparse_map[st->sparse_map_avail].offset = u;
+ else
+ ERROR ((0, 0, _("Malformed extended header: excess %s=%s"),
+ "GNU.sparse.offset", arg));
+ }
+}
+
+static void
+sparse_numbytes_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ size_t const *pi = data;
+ code_num (st->sparse_map[*pi].numbytes, keyword, xhdr);
+}
+
+static void
+sparse_numbytes_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, SIZE_MAX, keyword))
+ {
+ if (st->sparse_map_avail < st->sparse_map_size)
+ st->sparse_map[st->sparse_map_avail++].numbytes = u;
+ else
+ ERROR ((0, 0, _("Malformed extended header: excess %s=%s"),
+ keyword, arg));
+ }
+}
+
+static void
+sparse_map_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ int offset = 1;
+
+ st->sparse_map_avail = 0;
+ while (1)
+ {
+ uintmax_t u;
+ char *delim;
+ struct sp_array e;
+
+ if (!ISDIGIT (*arg))
+ {
+ ERROR ((0, 0, _("Malformed extended header: invalid %s=%s"),
+ keyword, arg));
+ return;
+ }
+
+ errno = 0;
+ u = strtoumax (arg, &delim, 10);
+ if (offset)
+ {
+ e.offset = u;
+ if (!(u == e.offset && errno != ERANGE))
+ {
+ out_of_range_header (keyword, arg, 0, TYPE_MAXIMUM (off_t));
+ return;
+ }
+ }
+ else
+ {
+ e.numbytes = u;
+ if (!(u == e.numbytes && errno != ERANGE))
+ {
+ out_of_range_header (keyword, arg, 0, TYPE_MAXIMUM (size_t));
+ return;
+ }
+ if (st->sparse_map_avail < st->sparse_map_size)
+ st->sparse_map[st->sparse_map_avail++] = e;
+ else
+ {
+ ERROR ((0, 0, _("Malformed extended header: excess %s=%s"),
+ keyword, arg));
+ return;
+ }
+ }
+
+ offset = !offset;
+
+ if (*delim == 0)
+ break;
+ else if (*delim != ',')
+ {
+ ERROR ((0, 0,
+ _("Malformed extended header: invalid %s: unexpected delimiter %c"),
+ keyword, *delim));
+ return;
+ }
+
+ arg = delim + 1;
+ }
+
+ if (!offset)
+ ERROR ((0, 0,
+ _("Malformed extended header: invalid %s: odd number of values"),
+ keyword));
+}
+
+static void
+dumpdir_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ xheader_print_n (xhdr, keyword, data, dumpdir_size (data));
+}
+
+static void
+dumpdir_decoder (struct tar_stat_info *st,
+ char const *keyword __attribute__((unused)),
+ char const *arg,
+ size_t size)
+{
+ st->dumpdir = xmalloc (size);
+ memcpy (st->dumpdir, arg, size);
+}
+
+static void
+volume_label_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ code_string (data, keyword, xhdr);
+}
+
+static void
+volume_label_decoder (struct tar_stat_info *st,
+ char const *keyword __attribute__((unused)),
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ decode_string (&volume_label, arg);
+}
+
+static void
+volume_size_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ off_t const *v = data;
+ code_num (*v, keyword, xhdr);
+}
+
+static void
+volume_size_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg, size_t size)
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, TYPE_MAXIMUM (uintmax_t), keyword))
+ continued_file_size = u;
+}
+
+/* FIXME: Merge with volume_size_coder */
+static void
+volume_offset_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ off_t const *v = data;
+ code_num (*v, keyword, xhdr);
+}
+
+static void
+volume_offset_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg, size_t size)
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, TYPE_MAXIMUM (uintmax_t), keyword))
+ continued_file_offset = u;
+}
+
+static void
+volume_filename_decoder (struct tar_stat_info *st,
+ char const *keyword __attribute__((unused)),
+ char const *arg,
+ size_t size __attribute__((unused)))
+{
+ decode_string (&continued_file_name, arg);
+}
+
+static void
+sparse_major_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ code_num (st->sparse_major, keyword, xhdr);
+}
+
+static void
+sparse_major_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size)
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, TYPE_MAXIMUM (unsigned), keyword))
+ st->sparse_major = u;
+}
+
+static void
+sparse_minor_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+{
+ code_num (st->sparse_minor, keyword, xhdr);
+}
+
+static void
+sparse_minor_decoder (struct tar_stat_info *st,
+ char const *keyword,
+ char const *arg,
+ size_t size)
+{
+ uintmax_t u;
+ if (decode_num (&u, arg, TYPE_MAXIMUM (unsigned), keyword))
+ st->sparse_minor = u;
+}
+
+struct xhdr_tab const xhdr_tab[] = {
+ { "atime", atime_coder, atime_decoder, false },
+ { "comment", dummy_coder, dummy_decoder, false },
+ { "charset", dummy_coder, dummy_decoder, false },
+ { "ctime", ctime_coder, ctime_decoder, false },
+ { "gid", gid_coder, gid_decoder, false },
+ { "gname", gname_coder, gname_decoder, false },
+ { "linkpath", linkpath_coder, linkpath_decoder, false },
+ { "mtime", mtime_coder, mtime_decoder, false },
+ { "path", path_coder, path_decoder, false },
+ { "size", size_coder, size_decoder, false },
+ { "uid", uid_coder, uid_decoder, false },
+ { "uname", uname_coder, uname_decoder, false },
+
+ /* Sparse file handling */
+ { "GNU.sparse.name", path_coder, path_decoder,
+ true },
+ { "GNU.sparse.major", sparse_major_coder, sparse_major_decoder,
+ true },
+ { "GNU.sparse.minor", sparse_minor_coder, sparse_minor_decoder,
+ true },
+ { "GNU.sparse.realsize", sparse_size_coder, sparse_size_decoder,
+ true },
+ { "GNU.sparse.numblocks", sparse_numblocks_coder, sparse_numblocks_decoder,
+ true },
+
+ /* tar 1.14 - 1.15.90 keywords. */
+ { "GNU.sparse.size", sparse_size_coder, sparse_size_decoder, true },
+ /* tar 1.14 - 1.15.1 keywords. Multiple instances of these appeared in 'x'
+ headers, and each of them was meaningful. It confilcted with POSIX specs,
+ which requires that "when extended header records conflict, the last one
+ given in the header shall take precedence." */
+ { "GNU.sparse.offset", sparse_offset_coder, sparse_offset_decoder,
+ true },
+ { "GNU.sparse.numbytes", sparse_numbytes_coder, sparse_numbytes_decoder,
+ true },
+ /* tar 1.15.90 keyword, introduced to remove the above-mentioned conflict. */
+ { "GNU.sparse.map", NULL /* Unused, see pax_dump_header() */,
+ sparse_map_decoder, false },
+
+ { "GNU.dumpdir", dumpdir_coder, dumpdir_decoder,
+ true },
+
+ /* Keeps the tape/volume label. May be present only in the global headers.
+ Equivalent to GNUTYPE_VOLHDR. */
+ { "GNU.volume.label", volume_label_coder, volume_label_decoder, true },
+
+ /* These may be present in a first global header of the archive.
+ They provide the same functionality as GNUTYPE_MULTIVOL header.
+ The GNU.volume.size keeps the real_s_sizeleft value, which is
+ otherwise kept in the size field of a multivolume header. The
+ GNU.volume.offset keeps the offset of the start of this volume,
+ otherwise kept in oldgnu_header.offset. */
+ { "GNU.volume.filename", volume_label_coder, volume_filename_decoder,
+ true },
+ { "GNU.volume.size", volume_size_coder, volume_size_decoder, true },
+ { "GNU.volume.offset", volume_offset_coder, volume_offset_decoder, true },
+
+ { NULL, NULL, NULL, false }
+};
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..d339bc2
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,161 @@
+# Makefile for GNU tar regression tests.
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2003, 2004, 2005,
+# 2006, 2007 Free Software Foundation, Inc.
+
+# François Pinard <pinard@iro.umontreal.ca>, 1988.
+# Sergey Poznyakoff <gray@mirddin.farlep.net>, 2004.
+
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+## 02110-1301, USA.
+
+EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4 star/README star/quicktest.sh
+DISTCLEANFILES = atconfig $(check_SCRIPTS)
+MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
+
+## ------------ ##
+## package.m4. ##
+## ------------ ##
+
+$(srcdir)/package.m4: $(top_srcdir)/configure.ac
+ { \
+ echo '# Signature of the current package.'; \
+ echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \
+ echo 'm4_define([AT_PACKAGE_TARNAME], [@PACKAGE_TARNAME@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \
+ echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \
+ echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \
+ } >$(srcdir)/package.m4
+
+#
+
+## ------------ ##
+## Test suite. ##
+## ------------ ##
+
+TESTSUITE_AT = \
+ T-empty.at\
+ T-null.at\
+ testsuite.at\
+ append.at\
+ append01.at\
+ append02.at\
+ chtype.at\
+ comprec.at\
+ delete01.at\
+ delete02.at\
+ delete03.at\
+ delete04.at\
+ delete05.at\
+ exclude.at\
+ extrac01.at\
+ extrac02.at\
+ extrac03.at\
+ extrac04.at\
+ extrac05.at\
+ extrac06.at\
+ extrac07.at\
+ gzip.at\
+ grow.at\
+ incremental.at\
+ incr01.at\
+ incr02.at\
+ incr03.at\
+ incr04.at\
+ indexfile.at\
+ ignfail.at\
+ link01.at\
+ listed01.at\
+ listed02.at\
+ long01.at\
+ longv7.at\
+ lustar01.at\
+ lustar02.at\
+ lustar03.at\
+ multiv01.at\
+ multiv02.at\
+ multiv03.at\
+ multiv04.at\
+ multiv05.at\
+ old.at\
+ options.at\
+ options02.at\
+ pipe.at\
+ recurse.at\
+ rename01.at\
+ rename02.at\
+ rename03.at\
+ same-order01.at\
+ same-order02.at\
+ shortrec.at\
+ sparse01.at\
+ sparse02.at\
+ sparse03.at\
+ sparsemv.at\
+ sparsemvp.at\
+ spmvp00.at\
+ spmvp01.at\
+ spmvp10.at\
+ truncate.at\
+ update.at\
+ volsize.at\
+ volume.at\
+ verbose.at\
+ version.at\
+ star/gtarfail.at\
+ star/gtarfail2.at\
+ star/multi-fail.at\
+ star/ustar-big-2g.at\
+ star/ustar-big-8g.at\
+ star/pax-big-10g.at
+
+TESTSUITE = $(srcdir)/testsuite
+
+AUTOTEST = $(AUTOM4TE) --language=autotest
+$(TESTSUITE): package.m4 $(TESTSUITE_AT)
+ $(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp
+ mv $@.tmp $@
+
+atconfig: $(top_builddir)/config.status
+ cd $(top_builddir) && ./config.status tests/$@
+
+clean-local:
+ test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean
+
+check-local: atconfig atlocal $(TESTSUITE)
+ $(SHELL) $(TESTSUITE)
+
+check-full:
+ FULL_TEST=1 $(MAKE) check
+
+#check_SCRIPTS = tar
+
+# Run the test suite on the *installed* tree.
+installcheck-local:
+ $(SHELL) $(TESTSUITE) AUTOTEST_PATH=$(exec_prefix)/bin
+
+
+## ------------ ##
+## genfile ##
+## ------------ ##
+
+check_PROGRAMS = genfile
+
+genfile_SOURCES = genfile.c argcv.c argcv.h
+
+localedir = $(datadir)/locale
+INCLUDES = -I$(top_srcdir)/lib -I../lib -I$(top_srcdir)/src
+AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\"
+LDADD = ../lib/libtar.a $(LIBINTL) $(LIB_CLOCK_GETTIME)
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..e2615cf
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,817 @@
+# Makefile.in generated by automake 1.10a from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007 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 GNU tar regression tests.
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2003, 2004, 2005,
+# 2006, 2007 Free Software Foundation, Inc.
+
+# François Pinard <pinard@iro.umontreal.ca>, 1988.
+# Sergey Poznyakoff <gray@mirddin.farlep.net>, 2004.
+VPATH = @srcdir@
+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 = genfile$(EXEEXT)
+subdir = tests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/atlocal.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/absolute-header.m4 \
+ $(top_srcdir)/m4/alloca.m4 $(top_srcdir)/m4/allocsa.m4 \
+ $(top_srcdir)/m4/argmatch.m4 $(top_srcdir)/m4/argp.m4 \
+ $(top_srcdir)/m4/backupfile.m4 $(top_srcdir)/m4/bison.m4 \
+ $(top_srcdir)/m4/canonicalize-lgpl.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/chown.m4 \
+ $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close-stream.m4 $(top_srcdir)/m4/closeout.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/d-ino.m4 \
+ $(top_srcdir)/m4/dirfd.m4 $(top_srcdir)/m4/dirname.m4 \
+ $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/double-slash-root.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eealloc.m4 \
+ $(top_srcdir)/m4/eoverflow.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exclude.m4 $(top_srcdir)/m4/exitfail.m4 \
+ $(top_srcdir)/m4/extensions.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-safer.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+ $(top_srcdir)/m4/fileblocks.m4 $(top_srcdir)/m4/float_h.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fpending.m4 \
+ $(top_srcdir)/m4/ftruncate.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdate.m4 $(top_srcdir)/m4/getdelim.m4 \
+ $(top_srcdir)/m4/getline.m4 $(top_srcdir)/m4/getopt.m4 \
+ $(top_srcdir)/m4/getpagesize.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/hash.m4 \
+ $(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intmax_t.m4 \
+ $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lchown.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/lstat.m4 $(top_srcdir)/m4/mbchar.m4 \
+ $(top_srcdir)/m4/mbiter.m4 $(top_srcdir)/m4/mbrtowc.m4 \
+ $(top_srcdir)/m4/mbscasecmp.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mempcpy.m4 \
+ $(top_srcdir)/m4/memrchr.m4 $(top_srcdir)/m4/memset.m4 \
+ $(top_srcdir)/m4/mkdtemp.m4 $(top_srcdir)/m4/mktime.m4 \
+ $(top_srcdir)/m4/modechange.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/pathmax.m4 \
+ $(top_srcdir)/m4/paxutils.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quote.m4 \
+ $(top_srcdir)/m4/quotearg.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/rmdir.m4 \
+ $(top_srcdir)/m4/rmt.m4 $(top_srcdir)/m4/rpmatch.m4 \
+ $(top_srcdir)/m4/rtapelib.m4 $(top_srcdir)/m4/safe-read.m4 \
+ $(top_srcdir)/m4/safe-write.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/savedir.m4 $(top_srcdir)/m4/setenv.m4 \
+ $(top_srcdir)/m4/sleep.m4 $(top_srcdir)/m4/ssize_t.m4 \
+ $(top_srcdir)/m4/stat-time.m4 $(top_srcdir)/m4/stdarg.m4 \
+ $(top_srcdir)/m4/stdbool.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/string_h.m4 $(top_srcdir)/m4/strndup.m4 \
+ $(top_srcdir)/m4/strnlen.m4 $(top_srcdir)/m4/strtoimax.m4 \
+ $(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoll.m4 \
+ $(top_srcdir)/m4/strtoul.m4 $(top_srcdir)/m4/strtoull.m4 \
+ $(top_srcdir)/m4/strtoumax.m4 $(top_srcdir)/m4/sys_stat_h.m4 \
+ $(top_srcdir)/m4/sys_time_h.m4 $(top_srcdir)/m4/sysexits.m4 \
+ $(top_srcdir)/m4/system.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/time_r.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
+ $(top_srcdir)/m4/unlinkdir.m4 $(top_srcdir)/m4/unlocked-io.m4 \
+ $(top_srcdir)/m4/utimbuf.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wchar.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wctype.m4 \
+ $(top_srcdir)/m4/wcwidth.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xgetcwd.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/xstrtol.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = atlocal
+am_genfile_OBJECTS = genfile.$(OBJEXT) argcv.$(OBJEXT)
+genfile_OBJECTS = $(am_genfile_OBJECTS)
+genfile_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+genfile_DEPENDENCIES = ../lib/libtar.a $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(genfile_SOURCES)
+DIST_SOURCES = $(genfile_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ABSOLUTE_DIRENT_H = @ABSOLUTE_DIRENT_H@
+ABSOLUTE_FCNTL_H = @ABSOLUTE_FCNTL_H@
+ABSOLUTE_FLOAT_H = @ABSOLUTE_FLOAT_H@
+ABSOLUTE_INTTYPES_H = @ABSOLUTE_INTTYPES_H@
+ABSOLUTE_STDINT_H = @ABSOLUTE_STDINT_H@
+ABSOLUTE_STDIO_H = @ABSOLUTE_STDIO_H@
+ABSOLUTE_STDLIB_H = @ABSOLUTE_STDLIB_H@
+ABSOLUTE_STRING_H = @ABSOLUTE_STRING_H@
+ABSOLUTE_SYSEXITS_H = @ABSOLUTE_SYSEXITS_H@
+ABSOLUTE_SYS_STAT_H = @ABSOLUTE_SYS_STAT_H@
+ABSOLUTE_SYS_TIME_H = @ABSOLUTE_SYS_TIME_H@
+ABSOLUTE_TIME_H = @ABSOLUTE_TIME_H@
+ABSOLUTE_UNISTD_H = @ABSOLUTE_UNISTD_H@
+ABSOLUTE_WCHAR_H = @ABSOLUTE_WCHAR_H@
+ABSOLUTE_WCTYPE_H = @ABSOLUTE_WCTYPE_H@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOM4TE = @AUTOM4TE@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BACKUP_LIBEXEC_SCRIPTS = @BACKUP_LIBEXEC_SCRIPTS@
+BACKUP_SBIN_SCRIPTS = @BACKUP_SBIN_SCRIPTS@
+BACKUP_SED_COND = @BACKUP_SED_COND@
+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@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFAULT_ARCHIVE = @DEFAULT_ARCHIVE@
+DEFAULT_ARCHIVE_FORMAT = @DEFAULT_ARCHIVE_FORMAT@
+DEFAULT_BLOCKING = @DEFAULT_BLOCKING@
+DEFAULT_QUOTING_STYLE = @DEFAULT_QUOTING_STYLE@
+DEFAULT_RMT_COMMAND = @DEFAULT_RMT_COMMAND@
+DEFAULT_RMT_DIR = @DEFAULT_RMT_DIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRENT_H = @DIRENT_H@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EOVERFLOW = @EOVERFLOW@
+EXEEXT = @EXEEXT@
+FCNTL_H = @FCNTL_H@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+GETOPT_H = @GETOPT_H@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GREP = @GREP@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_MKDIR = @HAVE_DECL_MKDIR@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_IO_H = @HAVE_IO_H@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_READLINK = @HAVE_READLINK@
+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_SLEEP = @HAVE_SLEEP@
+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_STRNDUP = @HAVE_STRNDUP@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_SYSEXITS_H = @HAVE_SYSEXITS_H@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE__BOOL = @HAVE__BOOL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTTYPES_H = @INTTYPES_H@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTAR_LIBDEPS = @LIBTAR_LIBDEPS@
+LIBTAR_LTLIBDEPS = @LIBTAR_LTLIBDEPS@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_SETSOCKOPT = @LIB_SETSOCKOPT@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PU_RMT_PROG = @PU_RMT_PROG@
+RANLIB = @RANLIB@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_FCHDIR = @REPLACE_FCHDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STRPTIME = @REPLACE_STRPTIME@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYSEXITS_H = @SYSEXITS_H@
+SYS_STAT_H = @SYS_STAT_H@
+SYS_TIME_H = @SYS_TIME_H@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WCHAR_H = @WCHAR_H@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WCTYPE_H = @WCTYPE_H@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+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@
+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 = $(datadir)/locale
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4 star/README star/quicktest.sh
+DISTCLEANFILES = atconfig $(check_SCRIPTS)
+MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
+
+#
+TESTSUITE_AT = \
+ T-empty.at\
+ T-null.at\
+ testsuite.at\
+ append.at\
+ append01.at\
+ append02.at\
+ chtype.at\
+ comprec.at\
+ delete01.at\
+ delete02.at\
+ delete03.at\
+ delete04.at\
+ delete05.at\
+ exclude.at\
+ extrac01.at\
+ extrac02.at\
+ extrac03.at\
+ extrac04.at\
+ extrac05.at\
+ extrac06.at\
+ extrac07.at\
+ gzip.at\
+ grow.at\
+ incremental.at\
+ incr01.at\
+ incr02.at\
+ incr03.at\
+ incr04.at\
+ indexfile.at\
+ ignfail.at\
+ link01.at\
+ listed01.at\
+ listed02.at\
+ long01.at\
+ longv7.at\
+ lustar01.at\
+ lustar02.at\
+ lustar03.at\
+ multiv01.at\
+ multiv02.at\
+ multiv03.at\
+ multiv04.at\
+ multiv05.at\
+ old.at\
+ options.at\
+ options02.at\
+ pipe.at\
+ recurse.at\
+ rename01.at\
+ rename02.at\
+ rename03.at\
+ same-order01.at\
+ same-order02.at\
+ shortrec.at\
+ sparse01.at\
+ sparse02.at\
+ sparse03.at\
+ sparsemv.at\
+ sparsemvp.at\
+ spmvp00.at\
+ spmvp01.at\
+ spmvp10.at\
+ truncate.at\
+ update.at\
+ volsize.at\
+ volume.at\
+ verbose.at\
+ version.at\
+ star/gtarfail.at\
+ star/gtarfail2.at\
+ star/multi-fail.at\
+ star/ustar-big-2g.at\
+ star/ustar-big-8g.at\
+ star/pax-big-10g.at
+
+TESTSUITE = $(srcdir)/testsuite
+AUTOTEST = $(AUTOM4TE) --language=autotest
+genfile_SOURCES = genfile.c argcv.c argcv.h
+INCLUDES = -I$(top_srcdir)/lib -I../lib -I$(top_srcdir)/src
+AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\"
+LDADD = ../lib/libtar.a $(LIBINTL) $(LIB_CLOCK_GETTIME)
+all: 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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits tests/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnits tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(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
+atlocal: $(top_builddir)/config.status $(srcdir)/atlocal.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+clean-checkPROGRAMS:
+ -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
+genfile$(EXEEXT): $(genfile_OBJECTS) $(genfile_DEPENDENCIES)
+ @rm -f genfile$(EXEEXT)
+ $(LINK) $(genfile_OBJECTS) $(genfile_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argcv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genfile.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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-local
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+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
+
+installcheck-am: installcheck-local
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+ clean-checkPROGRAMS clean-generic clean-local ctags 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 installcheck-local installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am
+
+
+$(srcdir)/package.m4: $(top_srcdir)/configure.ac
+ { \
+ echo '# Signature of the current package.'; \
+ echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \
+ echo 'm4_define([AT_PACKAGE_TARNAME], [@PACKAGE_TARNAME@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \
+ echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \
+ echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \
+ } >$(srcdir)/package.m4
+$(TESTSUITE): package.m4 $(TESTSUITE_AT)
+ $(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp
+ mv $@.tmp $@
+
+atconfig: $(top_builddir)/config.status
+ cd $(top_builddir) && ./config.status tests/$@
+
+clean-local:
+ test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean
+
+check-local: atconfig atlocal $(TESTSUITE)
+ $(SHELL) $(TESTSUITE)
+
+check-full:
+ FULL_TEST=1 $(MAKE) check
+
+#check_SCRIPTS = tar
+
+# Run the test suite on the *installed* tree.
+installcheck-local:
+ $(SHELL) $(TESTSUITE) AUTOTEST_PATH=$(exec_prefix)/bin
+# 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/T-empty.at b/tests/T-empty.at
new file mode 100644
index 0000000..be902fb
--- /dev/null
+++ b/tests/T-empty.at
@@ -0,0 +1,52 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Tar 1.16 coredumped if a filelist file contained empty (zero-length)
+# entries
+# Reported by: Karl Berry <karl@freefriends.org>
+# References: <200610301353.k9UDr1O30680@f7.net>
+
+AT_SETUP([files-from: empty entries])
+AT_KEYWORDS([files-from empty])
+
+AT_DATA([file-list],
+[jeden
+dwa
+
+trzy
+])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+genfile --file jeden
+genfile --file dwa
+genfile --file trzy
+
+tar cfvT archive ../file-list | sort
+],
+[0],
+[dwa
+jeden
+trzy
+],
+[],[],[],[ustar]) # Testing one format is enough
+
+AT_CLEANUP \ No newline at end of file
diff --git a/tests/T-null.at b/tests/T-null.at
new file mode 100644
index 0000000..206f5e8
--- /dev/null
+++ b/tests/T-null.at
@@ -0,0 +1,46 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([files-from: 0-separated file without -0])
+AT_KEYWORDS([files-from null])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+echo dwa > temp
+echo trzy >> temp
+cat temp | tr '\n' '\0' > temp1
+echo jeden > file-list
+cat temp1 >> file-list
+
+genfile -f "jeden
+dwa" || AT_SKIP_TEST
+genfile -f trzy
+
+tar cfTv archive file-list | sort
+],
+[0],
+[jeden\ndwa
+trzy
+],
+[tar: file-list: file name read contains nul character
+],[],[],[ustar]) # Testing one format is enough
+
+AT_CLEANUP
diff --git a/tests/append.at b/tests/append.at
new file mode 100644
index 0000000..0ef4d9d
--- /dev/null
+++ b/tests/append.at
@@ -0,0 +1,34 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([append])
+AT_KEYWORDS([append append00])
+
+AT_TAR_CHECK([touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive],
+ [0],
+[file1
+file2
+])
+
+AT_CLEANUP
diff --git a/tests/append01.at b/tests/append01.at
new file mode 100644
index 0000000..f8efb1c
--- /dev/null
+++ b/tests/append01.at
@@ -0,0 +1,48 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# When decoding a header tar was assigning 0 to oldgnu_header.isextended,
+# which destroyed name prefix. When updating archive, modified prefix
+# could have been written to disk thus producing invalid archive member.
+# Reported by Adye, TJ (Tim), <T.J.Adye@rl.ac.uk>
+# References:
+# <7231C15EAC2F164CA6DC326D97493C8B36C25D@exchange35.fed.cclrc.ac.uk>
+# http://lists.gnu.org/archive/html/bug-tar/2005-02/msg00032.html
+
+AT_SETUP([appending files with long names])
+AT_KEYWORDS([append append01])
+
+m4_define([PREFIX],[This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX])
+
+AT_TAR_CHECK([
+mkdir PREFIX
+touch PREFIX/file1 PREFIX/file2
+tar cf archive PREFIX/file1
+tar rf archive PREFIX/file2
+tar tf archive
+],
+[0],
+[PREFIX/file1
+PREFIX/file2
+],
+[],[],[],[oldgnu, ustar, posix, gnu])
+
+AT_CLEANUP
+
diff --git a/tests/append02.at b/tests/append02.at
new file mode 100644
index 0000000..3c31a34
--- /dev/null
+++ b/tests/append02.at
@@ -0,0 +1,75 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Using tar 1.15.x the following equivalent command sets:
+#
+# 1. tar cf archive file1 file2
+# and
+# 2. tar cfT archive /dev/null
+# tar rf archive file1
+# tar rt archive file2
+#
+# produced different archives (GNU format is assumed). Namely, in the
+# second case the mode field of all members, except the first, was truncated
+# to lower 3 octets (& 0777).
+#
+# References:
+# <200607210526.AA03440@tamuki.linet.gr.jp>
+# http://lists.gnu.org/archive/html/bug-tar/2006-07/msg00029.html
+
+# The test case below verifies that the equivalent create and append commands
+# produce binary equivalent archives for all formats.
+
+AT_SETUP([append vs. create])
+AT_KEYWORDS([append append02 append-gnu])
+
+AT_TAR_CHECK([
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $[]TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+],
+[0],
+[Creating archive.1
+Creating archive.2
+Comparing archives
+])
+
+AT_CLEANUP
+
+# End of append02.at
diff --git a/tests/argcv.c b/tests/argcv.c
new file mode 100644
index 0000000..a9d4061
--- /dev/null
+++ b/tests/argcv.c
@@ -0,0 +1,396 @@
+/* argcv.c - simple functions for parsing input based on whitespace
+ Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include <ctype.h>
+
+#include <argcv.h>
+
+/*
+ * takes a string and splits it into several strings, breaking at ' '
+ * command is the string to split
+ * the number of strings is placed into argc
+ * the split strings are put into argv
+ * returns 0 on success, nonzero on failure
+ */
+
+#define isws(c) ((c)==' '||(c)=='\t'||(c)=='\n')
+#define isdelim(c,delim) ((c)=='"'||strchr(delim,(c))!=NULL)
+
+static int
+argcv_scan (int len, const char *command, const char *delim, const char* cmnt,
+ int *start, int *end, int *save)
+{
+ int i = 0;
+
+ for (;;)
+ {
+ i = *save;
+
+ if (i >= len)
+ return i + 1;
+
+ /* Skip initial whitespace */
+ while (i < len && isws (command[i]))
+ i++;
+ *start = i;
+
+ switch (command[i])
+ {
+ case '"':
+ case '\'':
+ while (++i < len
+ && (command[i] != command[*start]
+ || command[i-1] == '\\'))
+ ;
+ if (i < len) /* found matching quote */
+ break;
+ /*FALLTHRU*/ default:
+ if (isdelim (command[i], delim))
+ break;
+ /* Skip until next whitespace character or end of line. Honor
+ escaped whitespace. */
+ while (++i < len &&
+ !((isws (command[i]) && command[i-1] != '\\')
+ || isdelim (command[i], delim)));
+ i--;
+ break;
+ }
+
+ *end = i;
+ *save = i + 1;
+
+ /* If we have a token, and it starts with a comment character, skip
+ to the newline and restart the token search. */
+ if (*save <= len)
+ {
+ if (cmnt && strchr (cmnt, command[*start]) != NULL)
+ {
+ i = *save;
+ while (i < len && command[i] != '\n')
+ i++;
+
+ *save = i;
+ continue;
+ }
+ }
+ break;
+ }
+ return *save;
+}
+
+static char escape_transtab[] = "\\\\a\ab\bf\fn\nr\rt\t";
+
+int
+argcv_unescape_char (int c)
+{
+ char *p;
+
+ for (p = escape_transtab; *p; p += 2)
+ {
+ if (*p == c)
+ return p[1];
+ }
+ return c;
+}
+
+int
+argcv_escape_char (int c)
+{
+ char *p;
+
+ for (p = escape_transtab + sizeof(escape_transtab) - 2;
+ p > escape_transtab; p -= 2)
+ {
+ if (*p == c)
+ return p[-1];
+ }
+ return -1;
+}
+
+
+static int
+xtonum (const char *src, int base, size_t cnt)
+{
+ int val;
+ char *p;
+ char tmp[4]; /* At most three characters + zero */
+
+ /* Notice: No use to check `cnt'. It should be either 2 or 3 */
+ memcpy (tmp, src, cnt);
+ tmp[cnt] = 0;
+ val = strtoul (tmp, &p, base);
+ return (*p == 0) ? val : -1;
+}
+
+static size_t
+escaped_length (const char *str, int *quote)
+{
+ size_t len = 0;
+
+ for (; *str; str++)
+ {
+ if (*str == ' ')
+ {
+ len++;
+ *quote = 1;
+ }
+ else if (*str == '"')
+ {
+ len += 2;
+ *quote = 1;
+ }
+ else if (isprint (*str))
+ len++;
+ else if (argcv_escape_char (*str) != -1)
+ len += 2;
+ else
+ len += 4;
+ }
+ return len;
+}
+
+static void
+unescape_copy (char *dst, const char *src, size_t n)
+{
+ int c;
+
+ while (n > 0)
+ {
+ n--;
+ if (*src == '\\')
+ {
+ switch (*++src)
+ {
+ case 'x':
+ case 'X':
+ ++src;
+ --n;
+ if (n == 0)
+ {
+ *dst++ = '\\';
+ *dst++ = src[-1];
+ }
+ else
+ {
+ c = xtonum(src, 16, 2);
+ if (c == -1)
+ {
+ *dst++ = '\\';
+ *dst++ = src[-1];
+ }
+ else
+ {
+ *dst++ = c;
+ src += 2;
+ n -= 2;
+ }
+ }
+ break;
+
+ case '0':
+ ++src;
+ --n;
+ if (n == 0)
+ {
+ *dst++ = '\\';
+ *dst++ = src[-1];
+ }
+ else
+ {
+ c = xtonum(src, 8, 3);
+ if (c == -1)
+ {
+ *dst++ = '\\';
+ *dst++ = src[-1];
+ }
+ else
+ {
+ *dst++ = c;
+ src += 3;
+ n -= 3;
+ }
+ }
+ break;
+
+ default:
+ *dst++ = argcv_unescape_char (*src++);
+ n--;
+ }
+ }
+ else
+ {
+ *dst++ = *src++;
+ }
+ }
+ *dst = 0;
+}
+
+static void
+escape_copy (char *dst, const char *src)
+{
+ for (; *src; src++)
+ {
+ if (*src == '"')
+ {
+ *dst++ = '\\';
+ *dst++ = '"';
+ }
+ else if (*src != '\t' && isprint(*src))
+ *dst++ = *src;
+ else
+ {
+ int c = argcv_escape_char (*src);
+ *dst++ = '\\';
+ if (c != -1)
+ *dst++ = c;
+ else
+ {
+ char tmp[4];
+ snprintf (tmp, sizeof tmp, "%03o", *(unsigned char*)src);
+ memcpy (dst, tmp, 3);
+ dst += 3;
+ }
+ }
+ }
+}
+
+int
+argcv_get (const char *command, const char *delim, const char* cmnt,
+ int *argc, char ***argv)
+{
+ int len = strlen (command);
+ int i = 0;
+ int start, end, save;
+
+ *argv = NULL;
+
+ /* Count number of arguments */
+ *argc = 0;
+ save = 0;
+
+ while (argcv_scan (len, command, delim, cmnt, &start, &end, &save) <= len)
+ (*argc)++;
+
+ *argv = calloc ((*argc + 1), sizeof (char *));
+
+ i = 0;
+ save = 0;
+ for (i = 0; i < *argc; i++)
+ {
+ int n;
+ argcv_scan (len, command, delim, cmnt, &start, &end, &save);
+
+ if ((command[start] == '"' || command[end] == '\'')
+ && command[end] == command[start])
+ {
+ start++;
+ end--;
+ }
+ n = end - start + 1;
+ (*argv)[i] = calloc (n+1, sizeof (char));
+ if ((*argv)[i] == NULL)
+ return 1;
+ unescape_copy ((*argv)[i], &command[start], n);
+ (*argv)[i][n] = 0;
+ }
+ (*argv)[i] = NULL;
+ return 0;
+}
+
+/*
+ * frees all elements of an argv array
+ * argc is the number of elements
+ * argv is the array
+ */
+int
+argcv_free (int argc, char **argv)
+{
+ while (--argc >= 0)
+ if (argv[argc])
+ free (argv[argc]);
+ free (argv);
+ return 1;
+}
+
+/* Take a argv an make string separated by ' '. */
+
+int
+argcv_string (int argc, char **argv, char **pstring)
+{
+ size_t i, j, len;
+ char *buffer;
+
+ /* No need. */
+ if (pstring == NULL)
+ return 1;
+
+ buffer = malloc (1);
+ if (buffer == NULL)
+ return 1;
+ *buffer = '\0';
+
+ for (len = i = j = 0; i < argc; i++)
+ {
+ int quote = 0;
+ int toklen;
+
+ toklen = escaped_length (argv[i], &quote);
+
+ len += toklen + 2;
+ if (quote)
+ len += 2;
+
+ buffer = realloc (buffer, len);
+ if (buffer == NULL)
+ return 1;
+
+ if (i != 0)
+ buffer[j++] = ' ';
+ if (quote)
+ buffer[j++] = '"';
+ escape_copy (buffer + j, argv[i]);
+ j += toklen;
+ if (quote)
+ buffer[j++] = '"';
+ }
+
+ for (; j > 0 && isspace (buffer[j-1]); j--)
+ ;
+ buffer[j] = 0;
+ if (pstring)
+ *pstring = buffer;
+ return 0;
+}
+
+#if 0
+char *command = "set prompt=\"& \a\\\"\" \\x25\\0145\\098\\ta";
+
+main(int xargc, char **xargv)
+{
+ int i, argc;
+ char **argv;
+ char *s;
+
+ argcv_get (xargv[1] ? xargv[1]:command, "=", "#", &argc, &argv);
+ printf ("%d args:\n", argc);
+ for (i = 0; i < argc; i++)
+ printf ("%s\n", argv[i]);
+ printf ("===\n");
+ argcv_string (argc, argv, &s);
+ printf ("%s\n", s);
+}
+#endif
diff --git a/tests/argcv.h b/tests/argcv.h
new file mode 100644
index 0000000..029b1f8
--- /dev/null
+++ b/tests/argcv.h
@@ -0,0 +1,50 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#ifndef _ARGCV_H
+#define _ARGCV_H 1
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __P
+# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
+# define __P(args) args
+# else
+# define __P(args) ()
+# endif
+#endif /*__P */
+
+extern int argcv_get __P ((const char *command, const char *delim,
+ const char* cmnt,
+ int *argc, char ***argv));
+extern int argcv_string __P ((int argc, char **argv, char **string));
+extern int argcv_free __P ((int argc, char **argv));
+extern int argcv_unescape_char __P((int c));
+extern int argcv_escape_char __P((int c));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ARGCV_H */
diff --git a/tests/atlocal.in b/tests/atlocal.in
new file mode 100644
index 0000000..f095080
--- /dev/null
+++ b/tests/atlocal.in
@@ -0,0 +1,33 @@
+# @configure_input@ -*- shell-script -*-
+# Configurable variable values for tar test suite.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+PATH=@abs_builddir@:@abs_top_builddir@/src:@abs_top_srcdir@/build-aux:$top_srcdir:$srcdir:$PATH
+
+XFAILFILE=$abs_builddir/.badversion
+
+trap "test -r $XFAILFILE && cat $XFAILFILE; exit $?" 1 2 13 15
+
+TEST_DATA_URL=ftp://download.gnu.org.ua/pub/tests/tar
+if test -z "$TEST_DATA_DIR"; then
+ TEST_DATA_DIR=$abs_builddir
+fi
+
+STAR_DATA_URL=http://download.berlios.de/pub/star/testscripts
+if test -z "$STAR_TESTSCRIPTS"; then
+ STAR_TESTSCRIPTS=$TEST_DATA_DIR
+fi
+
+# tarball_prereq file sum dir url
+tarball_prereq() {
+ if test -d "$3"; then
+ if test -r $3/$1; then
+ :
+ elif test -n "$FULL_TEST"; then
+ wget -q --directory-prefix=$3 $4/$1
+ fi
+ fi
+ echo "$2 $3/$1" | md5sum --status --check - >/dev/null 2>&1
+}
+
+
diff --git a/tests/chtype.at b/tests/chtype.at
new file mode 100644
index 0000000..a2c3b63
--- /dev/null
+++ b/tests/chtype.at
@@ -0,0 +1,73 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Description: Incremental restore malfunctions if an archive member
+# changes type before restoration, e.g. from directory to file or vice
+# versa.
+# Reported by: Wolfram Kleff <bugreport@wkleff.intergenia.de>
+# References: <200605101232.25031.bugreport@wkleff.intergenia.de>
+
+AT_SETUP([changed file types in incrementals])
+AT_KEYWORDS([incremental chtype])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+AT_TAR_MKHIER([directory/b/c],[x])
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+],
+[0],
+[First backup
+Second backup
+Restore archive.1
+Restore archive.2
+directory
+directory/a
+directory/a/a
+directory/a/b
+directory/b
+],[],[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
+
+# End of chtype.at
diff --git a/tests/comprec.at b/tests/comprec.at
new file mode 100644
index 0000000..197e9b8
--- /dev/null
+++ b/tests/comprec.at
@@ -0,0 +1,41 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([compressed format recognition])
+
+AT_KEYWORDS([comprec])
+
+AT_TAR_CHECK([
+AT_GZIP_PREREQ
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+],
+[0],
+[separator
+separator
+file1
+])
+
+AT_CLEANUP
diff --git a/tests/delete01.at b/tests/delete01.at
new file mode 100644
index 0000000..a401c94
--- /dev/null
+++ b/tests/delete01.at
@@ -0,0 +1,36 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Deleting a member after a big one was destroying the archive.
+
+AT_SETUP([deleting a member after a big one])
+AT_KEYWORDS([delete delete01])
+
+AT_TAR_CHECK([
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive],
+[0],
+[file1
+])
+
+AT_CLEANUP
diff --git a/tests/delete02.at b/tests/delete02.at
new file mode 100644
index 0000000..4e45b4f
--- /dev/null
+++ b/tests/delete02.at
@@ -0,0 +1,44 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Deleting a member with the archive from stdin was not working correctly.
+
+AT_SETUP([deleting a member from stdin archive])
+AT_KEYWORDS([delete delete02])
+
+AT_TAR_CHECK([
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2],
+[0],
+[1
+2
+3
+separator
+1
+3
+])
+
+AT_CLEANUP
diff --git a/tests/delete03.at b/tests/delete03.at
new file mode 100644
index 0000000..29dc644
--- /dev/null
+++ b/tests/delete03.at
@@ -0,0 +1,48 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([deleting members with long names])
+AT_KEYWORDS([delete delete03])
+
+m4_define([PREFIX],[This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX])
+
+AT_TAR_CHECK([
+
+prefix=PREFIX
+rm -f $prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch $prefix$i
+done
+tar -cf archive ./$prefix* &&
+ tar --delete -f archive ./${prefix}5 &&
+ tar -tf archive
+],
+[0],
+[./PREFIX[]1
+./PREFIX[]2
+./PREFIX[]3
+./PREFIX[]4
+./PREFIX[]6
+./PREFIX[]7
+./PREFIX[]8
+./PREFIX[]9
+],[],[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
diff --git a/tests/delete04.at b/tests/delete04.at
new file mode 100644
index 0000000..9f4f2a4
--- /dev/null
+++ b/tests/delete04.at
@@ -0,0 +1,53 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Deleting a large last member was destroying earlier members.
+
+AT_SETUP([deleting a large last member])
+AT_KEYWORDS([delete delete04])
+
+AT_TAR_CHECK([
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+],
+[0],
+[file1
+file2
+file3
+file4
+file5
+file6
+file7
+file8
+file9
+])
+
+AT_CLEANUP
diff --git a/tests/delete05.at b/tests/delete05.at
new file mode 100644
index 0000000..3faaa20
--- /dev/null
+++ b/tests/delete05.at
@@ -0,0 +1,48 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# When attempted to delete a non-existing member, tar used to destroy
+# last blocking_factor blocks.
+# References:
+# <Pine.LNX.4.10.10412160956460.30933-100000@electra.znyx.com>
+# http://lists.gnu.org/archive/html/bug-tar/2004-12/msg00016.html
+
+AT_SETUP([deleting non-existing member])
+AT_KEYWORDS([delete delete05])
+
+AT_TAR_CHECK([
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+],
+[0],
+[en
+to
+],
+[tar: tre: Not found in archive
+tar: Error exit delayed from previous errors
+])
+
+AT_CLEANUP
diff --git a/tests/exclude.at b/tests/exclude.at
new file mode 100644
index 0000000..817ef76
--- /dev/null
+++ b/tests/exclude.at
@@ -0,0 +1,161 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Test the functioning of --exclude-caches and --exclude-tag option families
+
+AT_SETUP([exclude])
+AT_KEYWORDS([exclude])
+
+AT_TAR_CHECK([
+mkdir dir
+echo blues > dir/blues
+echo jazz > dir/jazz
+mkdir dir/folk
+echo tagfile > dir/folk/tagfile
+echo sanjuan > dir/folk/sanjuan
+mkdir dir/rock
+echo "Signature: 8a477f597d28d172789f06886806bc55" > dir/rock/CACHEDIR.TAG
+echo "test" > dir/rock/file
+
+for option in exclude-caches exclude-caches-under exclude-caches-all
+do
+ echo OPTION $option
+ tar -cf archive.tar --$option -v dir 2>err
+ cat err
+ echo ARCHIVE
+ tar tf archive.tar
+done
+
+for option in exclude-tag exclude-tag-under exclude-tag-all
+do
+ echo OPTION $option
+ tar -cf archive.tar --${option}=tagfile -v dir 2>err
+ cat err
+ echo ARCHIVE
+ tar tf archive.tar
+done
+],
+[0],
+[OPTION exclude-caches
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+dir/rock/
+dir/rock/CACHEDIR.TAG
+tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; contents not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+dir/rock/
+dir/rock/CACHEDIR.TAG
+OPTION exclude-caches-under
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+dir/rock/
+tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; contents not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+dir/rock/
+OPTION exclude-caches-all
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; directory not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+OPTION exclude-tag
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+tar: dir/folk/: contains a cache directory tag tagfile; contents not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+OPTION exclude-tag-under
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+tar: dir/folk/: contains a cache directory tag tagfile; contents not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+OPTION exclude-tag-all
+dir/
+dir/blues
+dir/jazz
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+tar: dir/folk/: contains a cache directory tag tagfile; directory not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+],
+[],[],[],[ustar])
+
+AT_CLEANUP
diff --git a/tests/extrac01.at b/tests/extrac01.at
new file mode 100644
index 0000000..f458ba7
--- /dev/null
+++ b/tests/extrac01.at
@@ -0,0 +1,33 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# There was a diagnostic when directory already exists.
+
+AT_SETUP([extract over an existing directory])
+AT_KEYWORDS([extract extract01])
+
+AT_TAR_CHECK([
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+])
+
+AT_CLEANUP
diff --git a/tests/extrac02.at b/tests/extrac02.at
new file mode 100644
index 0000000..ee2517a
--- /dev/null
+++ b/tests/extrac02.at
@@ -0,0 +1,37 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Could not extract symlinks over an existing file.
+
+AT_SETUP([extracting symlinks over an existing file])
+AT_KEYWORDS([extract extract02 symlink])
+
+# FIXME: Skip if symlinks are not supported on the system
+
+AT_TAR_CHECK([
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+])
+
+AT_CLEANUP
diff --git a/tests/extrac03.at b/tests/extrac03.at
new file mode 100644
index 0000000..1a2f6d4
--- /dev/null
+++ b/tests/extrac03.at
@@ -0,0 +1,37 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Paths going up and down were inducing extraction loops.
+
+AT_SETUP([extraction loops])
+AT_KEYWORDS([extract extract03])
+
+AT_TAR_CHECK([
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive],
+[0],
+[directory/../directory/
+separator
+directory/../directory/
+])
+
+AT_CLEANUP
diff --git a/tests/extrac04.at b/tests/extrac04.at
new file mode 100644
index 0000000..ddc5651
--- /dev/null
+++ b/tests/extrac04.at
@@ -0,0 +1,47 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Check for fnmatch problems in glibc 2.1.95.
+
+AT_SETUP([extract + fnmatch])
+AT_KEYWORDS([extract extract04 fnmatch])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+],
+[0],
+[directory/
+directory/file2
+directory/subdirectory/
+])
+
+AT_CLEANUP
diff --git a/tests/extrac05.at b/tests/extrac05.at
new file mode 100644
index 0000000..f20830b
--- /dev/null
+++ b/tests/extrac05.at
@@ -0,0 +1,61 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Problem: when extracting selected members from a PAX archive,
+# tar 1.14 incorrectly deemed all members to be sparse and
+# therefore was not able to properly skip them.
+#
+# Reported by: Luca Fibbi <fibbi@lamma.rete.toscana.it>
+#
+# References: <3.0.6.32.20040809113727.00a30e50@localhost>
+# http://lists.gnu.org/archive/html/bug-tar/2004-08/msg00008.html
+
+AT_SETUP([extracting selected members from pax])
+AT_KEYWORDS([extract extract05])
+
+AT_DATA([list],
+[jeden
+cztery
+])
+
+AT_TAR_CHECK([
+genfile --length 118 --file jeden
+genfile --length 223 --file dwa
+genfile --length 517 --file trzy
+genfile --sparse --file sparsefile 0 ABCD 1M EFGH 2000K IJKL
+genfile --length 110 --file cztery
+
+tar cf archive jeden dwa trzy cztery || exit 1
+
+mkdir dir
+cd dir
+
+tar xvfT ../archive ../../list || exit 1
+
+cd ..
+],
+[0],
+[jeden
+cztery
+],
+[],[],[],
+[posix])
+
+AT_CLEANUP
diff --git a/tests/extrac06.at b/tests/extrac06.at
new file mode 100644
index 0000000..983e5fe
--- /dev/null
+++ b/tests/extrac06.at
@@ -0,0 +1,72 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# The bug occurs when extracting from a tarfile a directory when the directory
+# already exists and the version in the tarfile has more permissive
+# permissions than your umask. In this case, the permissions of the
+# existing directory will toggle between the version which complies with
+# your umask (which would be correct, without -p) and the version from the
+# tarfile.
+#
+# Reported by: Ian Jackson <iwj@ubuntu.com>
+#
+# References: <17461.519.640947.664400@davenant.relativity.greenend.org.uk>
+#
+
+AT_SETUP([mode of extracted directories])
+AT_KEYWORDS([extract extract06 directory mode])
+
+AT_TAR_CHECK([
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+],
+[0],
+[777
+755
+755
+755
+])
+
+AT_CLEANUP
diff --git a/tests/extrac07.at b/tests/extrac07.at
new file mode 100644
index 0000000..1919a2a
--- /dev/null
+++ b/tests/extrac07.at
@@ -0,0 +1,57 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Tar 1.16 failed to extract archives that have symlinks
+# in read-only directories.
+#
+# Reported-by: Eelco Dolstra <eelco@cs.uu.nl>
+# References: <45475D78.8050708@cs.uu.nl>
+
+AT_SETUP([extracting symlinks to a read-only dir])
+AT_KEYWORDS([extract extract07 read-only symlink])
+
+AT_TAR_CHECK([
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+],
+[0],
+[Prepare the directory
+Create the archive
+Extract
+dir/
+dir/foo
+],
+[],[],[ustar]) # Testing one format is enough
+
+AT_CLEANUP
+
+
diff --git a/tests/genfile.c b/tests/genfile.c
new file mode 100644
index 0000000..8032dd3
--- /dev/null
+++ b/tests/genfile.c
@@ -0,0 +1,884 @@
+/* Generate a file containing some preset patterns.
+ Print statistics for existing files.
+
+ Copyright (C) 1995, 1996, 1997, 2001, 2003, 2004, 2005, 2006
+ Free Software Foundation, Inc.
+
+ François Pinard <pinard@iro.umontreal.ca>, 1995.
+ Sergey Poznyakoff <gray@mirddin.farlep.net>, 2004, 2005, 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 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <system.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <argmatch.h>
+#include <argp.h>
+#include <argcv.h>
+#include <getdate.h>
+#include <setenv.h>
+#include <utimens.h>
+#include <inttostr.h>
+#define obstack_chunk_alloc malloc
+#define obstack_chunk_free free
+#include <obstack.h>
+
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+#if ! defined SIGCHLD && defined SIGCLD
+# define SIGCHLD SIGCLD
+#endif
+
+enum pattern
+{
+ DEFAULT_PATTERN,
+ ZEROS_PATTERN
+};
+
+/* The name this program was run with. */
+const char *program_name;
+
+/* Name of file to generate */
+static char *file_name;
+
+/* Name of the file-list file: */
+static char *files_from;
+static char filename_terminator = '\n';
+
+/* Length of file to generate. */
+static off_t file_length = 0;
+static off_t seek_offset = 0;
+
+/* Pattern to generate. */
+static enum pattern pattern = DEFAULT_PATTERN;
+
+/* Next checkpoint number */
+size_t checkpoint;
+
+enum genfile_mode
+ {
+ mode_generate,
+ mode_sparse,
+ mode_stat,
+ mode_exec
+ };
+
+enum genfile_mode mode = mode_generate;
+
+#define DEFAULT_STAT_FORMAT \
+ "name,dev,ino,mode,nlink,uid,gid,size,blksize,blocks,atime,mtime,ctime"
+
+/* Format for --stat option */
+static char *stat_format = DEFAULT_STAT_FORMAT;
+
+/* Size of a block for sparse file */
+size_t block_size = 512;
+
+/* Block buffer for sparse file */
+char *buffer;
+
+/* Number of arguments and argument vector for mode == mode_exec */
+int exec_argc;
+char **exec_argv;
+
+/* Time for --touch option */
+struct timespec touch_time;
+
+/* Verbose mode */
+int verbose;
+
+const char *argp_program_version = "genfile (" PACKAGE ") " VERSION;
+const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
+static char doc[] = N_("genfile manipulates data files for GNU paxutils test suite.\n"
+"OPTIONS are:\n");
+
+#define OPT_CHECKPOINT 256
+#define OPT_TOUCH 257
+#define OPT_APPEND 258
+#define OPT_TRUNCATE 259
+#define OPT_EXEC 260
+#define OPT_DATE 261
+#define OPT_VERBOSE 262
+#define OPT_SEEK 263
+
+static struct argp_option options[] = {
+#define GRP 0
+ {NULL, 0, NULL, 0,
+ N_("File creation options:"), GRP},
+ {"length", 'l', N_("SIZE"), 0,
+ N_("Create file of the given SIZE"), GRP+1 },
+ {"file", 'f', N_("NAME"), 0,
+ N_("Write to file NAME, instead of standard output"), GRP+1},
+ {"files-from", 'T', N_("FILE"), 0,
+ N_("Read file names from FILE"), GRP+1},
+ {"null", '0', NULL, 0,
+ N_("-T reads null-terminated names"), GRP+1},
+ {"pattern", 'p', N_("PATTERN"), 0,
+ N_("Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'"),
+ GRP+1 },
+ {"block-size", 'b', N_("SIZE"), 0,
+ N_("Size of a block for sparse file"), GRP+1},
+ {"sparse", 's', NULL, 0,
+ N_("Generate sparse file. Rest of the command line gives the file map."),
+ GRP+1 },
+ {"seek", OPT_SEEK, N_("OFFSET"), 0,
+ N_("Seek to the given offset before writing data"),
+ GRP+1 },
+
+#undef GRP
+#define GRP 10
+ {NULL, 0, NULL, 0,
+ N_("File statistics options:"), GRP},
+
+ {"stat", 'S', N_("FORMAT"), OPTION_ARG_OPTIONAL,
+ N_("Print contents of struct stat for each given file. Default FORMAT is: ")
+ DEFAULT_STAT_FORMAT,
+ GRP+1 },
+
+#undef GRP
+#define GRP 20
+ {NULL, 0, NULL, 0,
+ N_("Synchronous execution options:"), GRP},
+
+ {"run", 'r', N_("COMMAND"), 0,
+ N_("Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, --touch"),
+ GRP+1 },
+ {"checkpoint", OPT_CHECKPOINT, N_("NUMBER"), 0,
+ N_("Perform given action (see below) upon reaching checkpoint NUMBER"),
+ GRP+1 },
+ {"date", OPT_DATE, N_("STRING"), 0,
+ N_("Set date for next --touch option"),
+ GRP+1 },
+ {"verbose", OPT_VERBOSE, NULL, 0,
+ N_("Display executed checkpoints and exit status of COMMAND"),
+ GRP+1 },
+#undef GRP
+#define GRP 30
+ {NULL, 0, NULL, 0,
+ N_("Synchronous execution actions. These are executed when checkpoint number given by --checkpoint option is reached."), GRP},
+
+ {"cut", OPT_TRUNCATE, N_("FILE"), 0,
+ N_("Truncate FILE to the size specified by previous --length option (or 0, if it is not given)"),
+ GRP+1 },
+ {"truncate", 0, NULL, OPTION_ALIAS, NULL, GRP+1 },
+ {"append", OPT_APPEND, N_("FILE"), 0,
+ N_("Append SIZE bytes to FILE. SIZE is given by previous --length option."),
+ GRP+1 },
+ {"touch", OPT_TOUCH, N_("FILE"), 0,
+ N_("Update the access and modification times of FILE"),
+ GRP+1 },
+ {"exec", OPT_EXEC, N_("COMMAND"), 0,
+ N_("Execute COMMAND"),
+ GRP+1 },
+#undef GRP
+ { NULL, }
+};
+
+static char const * const pattern_args[] = { "default", "zeros", 0 };
+static enum pattern const pattern_types[] = {DEFAULT_PATTERN, ZEROS_PATTERN};
+
+static int
+xlat_suffix (off_t *vp, const char *p)
+{
+ off_t val = *vp;
+
+ if (p[1])
+ return 1;
+ switch (p[0])
+ {
+ case 'g':
+ case 'G':
+ *vp *= 1024;
+
+ case 'm':
+ case 'M':
+ *vp *= 1024;
+
+ case 'k':
+ case 'K':
+ *vp *= 1024;
+ break;
+
+ default:
+ return 1;
+ }
+ return *vp <= val;
+}
+
+static off_t
+get_size (const char *str, int allow_zero)
+{
+ const char *p;
+ off_t v = 0;
+
+ for (p = str; *p; p++)
+ {
+ int digit = *p - '0';
+ off_t x = v * 10;
+ if (9 < (unsigned) digit)
+ {
+ if (xlat_suffix (&v, p))
+ error (EXIT_FAILURE, 0, _("Invalid size: %s"), str);
+ else
+ break;
+ }
+ else if (x / 10 != v)
+ error (EXIT_FAILURE, 0, _("Number out of allowed range: %s"), str);
+ v = x + digit;
+ if (v < 0)
+ error (EXIT_FAILURE, 0, _("Negative size: %s"), str);
+ }
+ return v;
+}
+
+void
+verify_file (char *file_name)
+{
+ if (file_name)
+ {
+ struct stat st;
+
+ if (stat (file_name, &st))
+ error (0, errno, _("stat(%s) failed"), file_name);
+
+ if (st.st_size != file_length + seek_offset)
+ {
+ printf ("%lu %lu\n", (unsigned long)st.st_size , (unsigned long)file_length);
+ exit (1);
+ }
+
+ if (mode == mode_sparse && !ST_IS_SPARSE (st))
+ exit (1);
+ }
+}
+
+struct action
+{
+ struct action *next;
+ size_t checkpoint;
+ int action;
+ char *name;
+ off_t size;
+ enum pattern pattern;
+ struct timespec ts;
+};
+
+static struct action *action_list;
+
+void
+reg_action (int action, char *arg)
+{
+ struct action *act = xmalloc (sizeof (*act));
+ act->checkpoint = checkpoint;
+ act->action = action;
+ act->pattern = pattern;
+ act->ts = touch_time;
+ act->size = file_length;
+ act->name = arg;
+ act->next = action_list;
+ action_list = act;
+}
+
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+ switch (key)
+ {
+ case '0':
+ filename_terminator = 0;
+ break;
+
+ case 'f':
+ file_name = arg;
+ break;
+
+ case 'l':
+ file_length = get_size (arg, 1);
+ break;
+
+ case 'p':
+ pattern = XARGMATCH ("--pattern", arg, pattern_args, pattern_types);
+ break;
+
+ case 'b':
+ block_size = get_size (arg, 0);
+ break;
+
+ case 's':
+ mode = mode_sparse;
+ break;
+
+ case 'S':
+ mode = mode_stat;
+ if (arg)
+ stat_format = arg;
+ break;
+
+ case 'r':
+ mode = mode_exec;
+ argcv_get (arg, "", NULL, &exec_argc, &exec_argv);
+ break;
+
+ case 'T':
+ files_from = arg;
+ break;
+
+ case OPT_SEEK:
+ seek_offset = get_size (arg, 0);
+ break;
+
+ case OPT_CHECKPOINT:
+ {
+ char *p;
+
+ checkpoint = strtoul (arg, &p, 0);
+ if (*p)
+ argp_error (state, _("Error parsing number near `%s'"), p);
+ }
+ break;
+
+ case OPT_DATE:
+ if (!get_date (&touch_time, arg, NULL))
+ argp_error (state, _("Unknown date format"));
+ break;
+
+ case OPT_APPEND:
+ case OPT_TRUNCATE:
+ case OPT_TOUCH:
+ case OPT_EXEC:
+ reg_action (key, arg);
+ break;
+
+ case OPT_VERBOSE:
+ verbose++;
+ break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+static struct argp argp = {
+ options,
+ parse_opt,
+ N_("[ARGS...]"),
+ doc,
+ NULL,
+ NULL,
+ NULL
+};
+
+
+void
+fill (FILE *fp, off_t length, enum pattern pattern)
+{
+ off_t i;
+
+ switch (pattern)
+ {
+ case DEFAULT_PATTERN:
+ for (i = 0; i < length; i++)
+ fputc (i & 255, fp);
+ break;
+
+ case ZEROS_PATTERN:
+ for (i = 0; i < length; i++)
+ fputc (0, fp);
+ break;
+ }
+}
+
+/* Generate Mode: usual files */
+static void
+generate_simple_file (char *filename)
+{
+ FILE *fp;
+
+ if (filename)
+ {
+ fp = fopen (filename, seek_offset ? "r+" : "w");
+ if (!fp)
+ error (EXIT_FAILURE, 0, _("cannot open `%s'"), filename);
+ }
+ else
+ fp = stdout;
+
+ if (fseeko (fp, seek_offset, 0))
+ error (EXIT_FAILURE, 0, _("cannot seek: %s"), strerror (errno));
+
+ fill (fp, file_length, pattern);
+
+ fclose (fp);
+}
+
+/* A simplified version of the same function from tar */
+int
+read_name_from_file (FILE *fp, struct obstack *stk)
+{
+ int c;
+ size_t counter = 0;
+
+ for (c = getc (fp); c != EOF && c != filename_terminator; c = getc (fp))
+ {
+ if (c == 0)
+ error (EXIT_FAILURE, 0, _("file name contains null character"));
+ obstack_1grow (stk, c);
+ counter++;
+ }
+
+ obstack_1grow (stk, 0);
+
+ return (counter == 0 && c == EOF);
+}
+
+void
+generate_files_from_list ()
+{
+ FILE *fp = strcmp (files_from, "-") ? fopen (files_from, "r") : stdin;
+ struct obstack stk;
+
+ if (!fp)
+ error (EXIT_FAILURE, errno, _("cannot open `%s'"), files_from);
+
+ obstack_init (&stk);
+ while (!read_name_from_file (fp, &stk))
+ {
+ char *name = obstack_finish (&stk);
+ generate_simple_file (name);
+ verify_file (name);
+ obstack_free (&stk, name);
+ }
+ fclose (fp);
+ obstack_free (&stk, NULL);
+}
+
+
+/* Generate Mode: sparse files */
+
+static void
+mkhole (int fd, off_t displ)
+{
+ if (lseek (fd, displ, SEEK_CUR) == -1)
+ error (EXIT_FAILURE, errno, "lseek");
+ ftruncate (fd, lseek (fd, 0, SEEK_CUR));
+}
+
+static void
+mksparse (int fd, off_t displ, char *marks)
+{
+ if (lseek (fd, displ, SEEK_CUR) == -1)
+ error (EXIT_FAILURE, errno, "lseek");
+
+ for (; *marks; marks++)
+ {
+ memset (buffer, *marks, block_size);
+ if (write (fd, buffer, block_size) != block_size)
+ error (EXIT_FAILURE, errno, "write");
+ }
+}
+
+static void
+generate_sparse_file (int argc, char **argv)
+{
+ int i;
+ int fd;
+ int flags = O_CREAT|O_RDWR;
+
+ if (!file_name)
+ error (EXIT_FAILURE, 0,
+ _("cannot generate sparse files on standard output, use --file option"));
+ if (!seek_offset)
+ flags |= O_TRUNC;
+ fd = open (file_name, flags, 0644);
+ if (fd < 0)
+ error (EXIT_FAILURE, 0, _("cannot open `%s'"), file_name);
+
+ buffer = xmalloc (block_size);
+
+ file_length = 0;
+
+ for (i = 0; i < argc; i += 2)
+ {
+ off_t displ = get_size (argv[i], 1);
+ file_length += displ;
+
+ if (i == argc-1)
+ {
+ mkhole (fd, displ);
+ break;
+ }
+ else
+ {
+ file_length += block_size * strlen (argv[i+1]);
+ mksparse (fd, displ, argv[i+1]);
+ }
+ }
+
+ close (fd);
+}
+
+
+/* Status Mode */
+
+void
+print_time (time_t t)
+{
+ char buf[20]; /* ccyy-mm-dd HH:MM:SS\0 */
+ strftime (buf, sizeof buf, "%Y-%m-%d %H:%M:%S", gmtime (&t));
+ printf ("%s ", buf);
+}
+
+void
+print_stat (const char *name)
+{
+ char *fmt, *p;
+ struct stat st;
+ char buf[UINTMAX_STRSIZE_BOUND];
+
+ if (stat (name, &st))
+ {
+ error (0, errno, _("stat(%s) failed"), name);
+ return;
+ }
+
+ fmt = strdup (stat_format);
+ for (p = strtok (fmt, ","); p; )
+ {
+ if (memcmp (p, "st_", 3) == 0)
+ p += 3;
+ if (strcmp (p, "name") == 0)
+ printf ("%s", name);
+ else if (strcmp (p, "dev") == 0)
+ printf ("%lu", (unsigned long) st.st_dev);
+ else if (strcmp (p, "ino") == 0)
+ printf ("%lu", (unsigned long) st.st_ino);
+ else if (strncmp (p, "mode", 4) == 0)
+ {
+ mode_t mask = ~0;
+
+ if (ispunct (p[4]))
+ {
+ char *q;
+
+ mask = strtoul (p + 5, &q, 8);
+ if (*q)
+ {
+ printf ("\n");
+ error (EXIT_FAILURE, 0, _("incorrect mask (near `%s')"), q);
+ }
+ }
+ else if (p[4])
+ {
+ printf ("\n");
+ error (EXIT_FAILURE, 0, _("Unknown field `%s'"), p);
+ }
+ printf ("%0o", st.st_mode & mask);
+ }
+ else if (strcmp (p, "nlink") == 0)
+ printf ("%lu", (unsigned long) st.st_nlink);
+ else if (strcmp (p, "uid") == 0)
+ printf ("%ld", (long unsigned) st.st_uid);
+ else if (strcmp (p, "gid") == 0)
+ printf ("%lu", (unsigned long) st.st_gid);
+ else if (strcmp (p, "size") == 0)
+ printf ("%s", umaxtostr (st.st_size, buf));
+ else if (strcmp (p, "blksize") == 0)
+ printf ("%s", umaxtostr (st.st_blksize, buf));
+ else if (strcmp (p, "blocks") == 0)
+ printf ("%s", umaxtostr (st.st_blocks, buf));
+ else if (strcmp (p, "atime") == 0)
+ printf ("%lu", (unsigned long) st.st_atime);
+ else if (strcmp (p, "atimeH") == 0)
+ print_time (st.st_atime);
+ else if (strcmp (p, "mtime") == 0)
+ printf ("%lu", (unsigned long) st.st_mtime);
+ else if (strcmp (p, "mtimeH") == 0)
+ print_time (st.st_mtime);
+ else if (strcmp (p, "ctime") == 0)
+ printf ("%lu", (unsigned long) st.st_ctime);
+ else if (strcmp (p, "ctimeH") == 0)
+ print_time (st.st_ctime);
+ else if (strcmp (p, "sparse") == 0)
+ printf ("%d", ST_IS_SPARSE (st));
+ else
+ {
+ printf ("\n");
+ error (EXIT_FAILURE, 0, _("Unknown field `%s'"), p);
+ }
+ p = strtok (NULL, ",");
+ if (p)
+ printf (" ");
+ }
+ printf ("\n");
+ free (fmt);
+}
+
+
+/* Exec Mode */
+
+void
+exec_checkpoint (struct action *p)
+{
+ if (verbose)
+ printf ("processing checkpoint %lu\n", (unsigned long) p->checkpoint);
+ switch (p->action)
+ {
+ case OPT_TOUCH:
+ {
+ struct timespec ts[2];
+
+ ts[0] = ts[1] = p->ts;
+ if (utimens (p->name, ts) != 0)
+ {
+ error (0, errno, _("cannot set time on `%s'"), p->name);
+ break;
+ }
+ }
+ break;
+
+ case OPT_APPEND:
+ {
+ FILE *fp = fopen (p->name, "a");
+ if (!fp)
+ {
+ error (0, errno, _("cannot open `%s'"), p->name);
+ break;
+ }
+
+ fill (fp, p->size, p->pattern);
+ fclose (fp);
+ }
+ break;
+
+ case OPT_TRUNCATE:
+ {
+ int fd = open (p->name, O_RDWR);
+ if (fd == -1)
+ {
+ error (0, errno, _("cannot open `%s'"), p->name);
+ break;
+ }
+ ftruncate (fd, p->size);
+ close (fd);
+ }
+ break;
+
+ case OPT_EXEC:
+ system (p->name);
+ break;
+
+ default:
+ abort ();
+ }
+}
+
+void
+process_checkpoint (size_t n)
+{
+ struct action *p, *prev = NULL;
+
+ for (p = action_list; p; )
+ {
+ struct action *next = p->next;
+
+ if (p->checkpoint <= n)
+ {
+ exec_checkpoint (p);
+ /* Remove the item from the list */
+ if (prev)
+ prev->next = next;
+ else
+ action_list = next;
+ free (p);
+ }
+ else
+ prev = p;
+
+ p = next;
+ }
+}
+
+#define CHECKPOINT_TEXT "Write checkpoint"
+
+void
+exec_command (void)
+{
+ int status;
+ pid_t pid;
+ int fd[2];
+ char *p;
+ FILE *fp;
+ char buf[128];
+
+ /* Insert --checkpoint option.
+ FIXME: This assumes that exec_argv does not use traditional tar options
+ (without dash) */
+ exec_argc++;
+ exec_argv = xrealloc (exec_argv, (exec_argc + 1) * sizeof (*exec_argv));
+ memmove (exec_argv+2, exec_argv+1, (exec_argc - 1) * sizeof (*exec_argv));
+ exec_argv[1] = "--checkpoint";
+
+#ifdef SIGCHLD
+ /* System V fork+wait does not work if SIGCHLD is ignored. */
+ signal (SIGCHLD, SIG_DFL);
+#endif
+
+ pipe (fd);
+
+ pid = fork ();
+ if (pid == -1)
+ error (EXIT_FAILURE, errno, "fork");
+
+ if (pid == 0)
+ {
+ /* Child */
+
+ /* Pipe stderr */
+ if (fd[1] != 2)
+ dup2 (fd[1], 2);
+ close (fd[0]);
+
+ /* Make sure POSIX locale is used */
+ setenv ("LC_ALL", "POSIX", 1);
+
+ execvp (exec_argv[0], exec_argv);
+ error (EXIT_FAILURE, errno, "execvp");
+ }
+
+ /* Master */
+ close (fd[1]);
+ fp = fdopen (fd[0], "r");
+ if (fp == NULL)
+ error (EXIT_FAILURE, errno, "fdopen");
+
+ while ((p = fgets (buf, sizeof buf, fp)))
+ {
+ while (*p && !isspace (*p) && *p != ':')
+ p++;
+
+ if (*p == ':')
+ {
+ for (p++; *p && isspace (*p); p++)
+ ;
+
+ if (*p
+ && memcmp (p, CHECKPOINT_TEXT, sizeof CHECKPOINT_TEXT - 1) == 0)
+ {
+ char *end;
+ size_t n = strtoul (p + sizeof CHECKPOINT_TEXT - 1, &end, 10);
+ if (!(*end && !isspace (*end)))
+ {
+ process_checkpoint (n);
+ continue;
+ }
+ }
+ }
+ fprintf (stderr, "%s", buf);
+ }
+
+ /* Collect exit status */
+ waitpid (pid, &status, 0);
+
+ if (verbose)
+ {
+ if (WIFEXITED (status))
+ {
+ if (WEXITSTATUS (status) == 0)
+ printf (_("Command exited successfully\n"));
+ else
+ printf (_("Command failed with status %d\n"),
+ WEXITSTATUS (status));
+ }
+ else if (WIFSIGNALED (status))
+ printf (_("Command terminated on signal %d\n"), WTERMSIG (status));
+ else if (WIFSTOPPED (status))
+ printf (_("Command stopped on signal %d\n"), WSTOPSIG (status));
+#ifdef WCOREDUMP
+ else if (WCOREDUMP (status))
+ printf (_("Command dumped core\n"));
+#endif
+ else
+ printf(_("Command terminated\n"));
+ }
+
+ if (WIFEXITED (status))
+ exit (WEXITSTATUS (status));
+ exit (EXIT_FAILURE);
+}
+
+int
+main (int argc, char **argv)
+{
+ int index;
+
+ program_name = argv[0];
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ get_date (&touch_time, "now", NULL);
+
+ /* Decode command options. */
+
+ if (argp_parse (&argp, argc, argv, 0, &index, NULL))
+ exit (EXIT_FAILURE);
+
+ argc -= index;
+ argv += index;
+
+ switch (mode)
+ {
+ case mode_stat:
+ if (argc == 0)
+ error (EXIT_FAILURE, 0, _("--stat requires file names"));
+
+ while (argc--)
+ print_stat (*argv++);
+ break;
+
+ case mode_sparse:
+ generate_sparse_file (argc, argv);
+ verify_file (file_name);
+ break;
+
+ case mode_generate:
+ if (argc)
+ error (EXIT_FAILURE, 0, _("too many arguments"));
+ if (files_from)
+ generate_files_from_list ();
+ else
+ {
+ generate_simple_file (file_name);
+ verify_file (file_name);
+ }
+ break;
+
+ case mode_exec:
+ exec_command ();
+ break;
+
+ default:
+ /* Just in case */
+ abort ();
+ }
+ exit (EXIT_SUCCESS);
+}
diff --git a/tests/grow.at b/tests/grow.at
new file mode 100644
index 0000000..3074d61
--- /dev/null
+++ b/tests/grow.at
@@ -0,0 +1,40 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Tar should exit with error code 1 (file differs) if any files have
+# changed during archiving.
+
+AT_SETUP([grow])
+AT_KEYWORDS([grow filechange])
+
+AT_TAR_CHECK([
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+],
+[1],
+[foo
+baz
+],
+[tar: foo: file changed as we read it
+])
+
+AT_CLEANUP
diff --git a/tests/gzip.at b/tests/gzip.at
new file mode 100644
index 0000000..a68520e
--- /dev/null
+++ b/tests/gzip.at
@@ -0,0 +1,42 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# tar should detect that its gzip child failed.
+
+AT_SETUP([gzip])
+AT_KEYWORDS([gzip])
+
+unset TAR_OPTIONS
+
+AT_CHECK([
+AT_GZIP_PREREQ
+tar xfvz /dev/null
+test $? = 2 || exit 1
+],
+[0],
+[],
+[
+gzip: stdin: unexpected end of file
+tar: Child returned status 1
+tar: Error exit delayed from previous errors
+],
+[],[])
+
+AT_CLEANUP
diff --git a/tests/ignfail.at b/tests/ignfail.at
new file mode 100644
index 0000000..feab9d7
--- /dev/null
+++ b/tests/ignfail.at
@@ -0,0 +1,77 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Unreadable directories yielded error despite --ignore-failed-read.
+
+AT_SETUP([ignfail])
+AT_KEYWORDS([ignfail])
+
+AT_TAR_CHECK([
+# The test is meaningless for super-user.
+AT_UNPRIVILEGED_PREREQ
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+],
+[0],
+[],
+[
+-----
+tar: file: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: file: Warning: Cannot open: Permission denied
+-----
+tar: directory: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: directory: Warning: Cannot open: Permission denied
+])
+
+AT_CLEANUP
diff --git a/tests/incr01.at b/tests/incr01.at
new file mode 100644
index 0000000..91ff39a
--- /dev/null
+++ b/tests/incr01.at
@@ -0,0 +1,55 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Description:
+# Check if restore from incremental backups does not choke on dangling
+# symlinks.
+# References: <20050821163500.2772914828A@blake.inputplus.co.uk>
+# http://lists.gnu.org/archive/html/bug-tar/2005-08/msg00023.html
+
+AT_SETUP([restore broken symlinks from incremental])
+AT_KEYWORDS([incremental incr01])
+
+AT_TAR_CHECK([
+mkdir directory
+$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+],
+[0],
+[directory/
+directory/bar
+separator
+directory/
+tar: Deleting `directory/bar'
+],
+[],[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
+
+
diff --git a/tests/incr02.at b/tests/incr02.at
new file mode 100644
index 0000000..b456341
--- /dev/null
+++ b/tests/incr02.at
@@ -0,0 +1,77 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Description:
+# Restoring of directory modes and timestamps works correctly only
+# if the archive has normal member ordering, i.e. each directory
+# member is immediately followed by members located under that directory.
+# This is not true for incremental archives, where directory members
+# precede the non-directory ones. Due to this, GNU tar up to version 1.15.2
+# failed to correctly restore directory timestamps from an incremental
+# archive if this directory contained some files in it.
+#
+# References: <200511291228.47081.karaman@dssgmbh.de>
+
+AT_SETUP([restoring timestamps from incremental])
+AT_KEYWORDS([incremental timestamp restore incr02])
+
+AT_TAR_CHECK([
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, `dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# `subdir1' prior to restoring `dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+],
+[0],
+[],[],[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
+
+# End of incr02.at
diff --git a/tests/incr03.at b/tests/incr03.at
new file mode 100644
index 0000000..474ae7f
--- /dev/null
+++ b/tests/incr03.at
@@ -0,0 +1,78 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Description:
+# Previous versions checked only mtime/ctime of directories during
+# incremental backups. As a result, it sufficed to rename a single file
+# to get full dump of the directory where it resided. Since v.1.15.91
+# tar checks directory contents as well, so in this case only the renamed
+# file is dumped.
+
+AT_SETUP([renamed files in incrementals])
+AT_KEYWORDS([incremental incr03 rename])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+],
+[0],
+[Listing of archive.1
+directory/
+directory/x
+directory/y
+Listing of archive.2
+directory/
+directory/z
+Directory after first restore
+directory
+directory/x
+directory/y
+Directory after second restore
+directory
+directory/y
+directory/z
+],[],[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
+
+# End of incr03.at
+
diff --git a/tests/incr04.at b/tests/incr04.at
new file mode 100644
index 0000000..42bb781
--- /dev/null
+++ b/tests/incr04.at
@@ -0,0 +1,63 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Description: Rewritten incremental backup support (2006-05-08)
+# missed initialization of all struct directory members in make_directory,
+# which lead to random core dumps.
+# Reported by Sergey Myasnikov <tigra@sw.ru>. This testcase uses original
+# script provided by him.
+# References: <1148669592.5127.81.camel@tigra.sw.ru>
+# http://lists.gnu.org/archive/html/bug-tar/2006-05/msg00038.html
+
+AT_SETUP([proper icontents initialization])
+AT_KEYWORDS([incremental incr04 icontents])
+
+m4_define([NAME_PREFIX],[a/b/one_31_chars_long_file_name_])
+
+AT_TAR_CHECK([
+AT_TAR_MKHIER(a/b)
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf("NAME_PREFIX[%03d]\n", i);
+ }' < /dev/null | genfile --files-from -
+
+echo "Initial dump"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo "Incremental dump"
+tar cvf a1.tar -g a.sna a
+],
+[0],
+[Initial dump
+a/
+a/b/
+m4_for(I,1,142,1,[NAME_PREFIX[]m4_if(m4_len(I),1,00,m4_len(I),2,0)I
+])dnl
+Incremental dump
+a/
+a/c/
+],
+[tar: a/b: Directory is new
+tar: a/c: Directory has been renamed from `a/b'
+],[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
+
+# End of incr04.at
diff --git a/tests/incremental.at b/tests/incremental.at
new file mode 100644
index 0000000..801b0b7
--- /dev/null
+++ b/tests/incremental.at
@@ -0,0 +1,60 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# A directory older than the listed entry was skipped completely.
+
+AT_SETUP([incremental])
+AT_KEYWORDS([incremental incr00])
+
+AT_TAR_CHECK([
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created `on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+],
+[0],
+[
+structure/
+separator
+structure/
+structure/file
+],
+[],[],[],[gnu,oldgnu,posix])
+
+AT_CLEANUP
diff --git a/tests/indexfile.at b/tests/indexfile.at
new file mode 100644
index 0000000..0c899c9
--- /dev/null
+++ b/tests/indexfile.at
@@ -0,0 +1,47 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# tar --index-file=FILE --file=- sent the archive to FILE, and
+# the listing to stderr.
+# Reported by Marcin Gryszkalis <mg@fork.pl>
+# References: <200607061943.06645.mg@fork.pl>
+
+AT_SETUP([tar --index-file=FILE --file=-])
+AT_KEYWORDS([stdout indexfile])
+
+AT_TAR_CHECK([
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+],
+[0],
+[Creating the archive
+Testing the archive
+directory/
+directory/a
+])
+
+AT_CLEANUP
diff --git a/tests/link01.at b/tests/link01.at
new file mode 100644
index 0000000..fd0fc94
--- /dev/null
+++ b/tests/link01.at
@@ -0,0 +1,55 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Problem: If a member with link count > 2 was stored in the archive twice,
+# previous versions of tar were not able to extract it, since they
+# were trying to link the file to itself, which always failed and
+# lead to removing the already extracted copy. This script tests
+# the workaround by Paul Eggert that leaves the extracted copy
+# untouched.
+#
+# Reported by: Toby Peterson <toby@apple.com>
+#
+# References: <2330D503-D20A-11D8-A0CF-00039391EECE@apple.com>
+# http://lists.gnu.org/archive/html/bug-tar/2004-07/msg00009.html
+
+AT_SETUP([link count gt 2])
+AT_KEYWORDS([link01])
+
+AT_TAR_CHECK([
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || AT_SKIP_TEST
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+],
+[0],
+[test.txt
+])
+
+AT_CLEANUP
diff --git a/tests/listed01.at b/tests/listed01.at
new file mode 100644
index 0000000..e8eb480
--- /dev/null
+++ b/tests/listed01.at
@@ -0,0 +1,63 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Check if listed-incremental backups work for individual files.
+# Script proposed by Andreas Schuldei <andreas@schuldei.org>
+# References: <20040215014223.GA9699@lukas.schuldei.com>
+# http://lists.gnu.org/archive/html/bug-tar/2004-02/msg00011.html
+
+AT_SETUP([--listed for individual files])
+AT_KEYWORDS([listed incremental listed01])
+
+AT_TAR_CHECK([
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+# Let the things settle
+sleep 1
+
+tar --create \
+ --file=archive.1 \
+ --listed-incremental=listing \
+ directory/file*
+
+tar tf archive.1 || exit 1
+
+sleep 1
+
+genfile --length 10240 --pattern zeros --file directory/file2
+
+echo "separator"
+
+tar --create \
+ --file=archive.2 \
+ --listed-incremental=listing \
+ directory/file* || exit 1
+
+tar tf archive.2 || exit 1
+],
+[0],
+[directory/file1
+separator
+directory/file2
+],
+[],[],[],[gnu, oldgnu])
+
+AT_CLEANUP
+
diff --git a/tests/listed02.at b/tests/listed02.at
new file mode 100644
index 0000000..5040c08
--- /dev/null
+++ b/tests/listed02.at
@@ -0,0 +1,150 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Check if listed-incremental backups work for files moved from one directory
+# to another.
+# Based on a script by Martin Simmons <ZYHYLCRMZPRP@spammotel.com>
+# References:
+# <20040626230315.163AA1D148@cpc5-cmbg1-6-0-cust208.cmbg.cable.ntl.com>
+# http://lists.gnu.org/archive/html/bug-tar/2004-06/msg00028.html
+
+AT_SETUP([working --listed])
+AT_KEYWORDS([listed incremental listed02])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+echo Create directories
+
+mkdir tart
+sleep 1
+mkdir tart/c0
+sleep 1
+mkdir tart/c1
+sleep 1
+
+for file in tart/a1 tart/b1 tart/c0/cq1 tart/c0/cq2 tart/c1/ca1 tart/c1/ca2
+do
+ echo File $file > $file
+ sleep 1
+done
+
+sleep 1
+echo Creating main archive
+tar -c -v --listed-incremental=tart.incr1 -f archive.1 tart 2> err || exit 1
+
+# The above prints two lines to stderr announcing the new directories c0 and c1.
+# Ensure that they appear in this script's stderr in sorted order.
+sort err 1>&2; rm -f err
+
+sleep 1
+echo Modifying filesystem
+rm tart/a1
+
+mv tart/b1 tart/b2
+mv tart/c1 tart/c2
+touch tart/c2/ca3
+
+echo Directory contents
+find tart -print | sort 2>/dev/null
+
+sleep 1
+echo Creating incremental archive
+cp -p tart.incr1 tart.incr2
+tar -c -v --listed-incremental=tart.incr2 -f archive.2 tart || exit 1
+
+sleep 1
+
+rm -rf tart/*
+echo Extracting main archive
+tar -x -v --listed-incremental=tart.incr1 -f archive.1 || exit 1
+echo Extracting incremental archive
+# This command should produce three messages about deletion
+# of the existing files, that may appear in any order. Piping
+# to sort makes sure we don't depend on any particular ordering.
+tar -x -v --listed-incremental=tart.incr2 -f archive.2 | sort 2>/dev/null
+
+echo Final files:
+find tart -print | sort 2>/dev/null
+],
+[0],
+[Create directories
+Creating main archive
+tart/
+tart/c0/
+tart/c1/
+tart/a1
+tart/b1
+tart/c0/cq1
+tart/c0/cq2
+tart/c1/ca1
+tart/c1/ca2
+Modifying filesystem
+Directory contents
+tart
+tart/b2
+tart/c0
+tart/c0/cq1
+tart/c0/cq2
+tart/c2
+tart/c2/ca1
+tart/c2/ca2
+tart/c2/ca3
+Creating incremental archive
+tart/
+tart/c0/
+tart/c2/
+tart/b2
+tart/c2/ca3
+Extracting main archive
+tart/
+tart/c0/
+tart/c1/
+tart/a1
+tart/b1
+tart/c0/cq1
+tart/c0/cq2
+tart/c1/ca1
+tart/c1/ca2
+Extracting incremental archive
+tar: Deleting `tart/a1'
+tar: Deleting `tart/b1'
+tart/
+tart/b2
+tart/c0/
+tart/c2/
+tart/c2/ca3
+Final files:
+tart
+tart/b2
+tart/c0
+tart/c0/cq1
+tart/c0/cq2
+tart/c2
+tart/c2/ca1
+tart/c2/ca2
+tart/c2/ca3
+],
+[tar: tart/c0: Directory is new
+tar: tart/c1: Directory is new
+tar: tart/c2: Directory has been renamed from `tart/c1'
+],
+[],[],[gnu, oldgnu])
+
+AT_CLEANUP
diff --git a/tests/long01.at b/tests/long01.at
new file mode 100644
index 0000000..022c2ce
--- /dev/null
+++ b/tests/long01.at
@@ -0,0 +1,49 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# In GNU format, when extracting or listing a file member with a name
+# whose length is divisible by block size (512) tar used to read an
+# extra block of data. In consequence the following file was not extracted.
+# Reported by Josef Bauer
+# References: <200501122145.j0CLjGhl006070@uhu.mchp.siemens.de>
+# http://lists.gnu.org/archive/html/bug-tar/2005-01/msg00038.html
+
+AT_SETUP([long file names divisible by block size])
+AT_KEYWORDS([longname long512])
+
+dnl Create a directory structure with maximum directory name length 512-16
+m4_define([NAME],[0123456789abcde])
+m4_define([FULLNAME],NAME)
+m4_for([N],0,29,,[m4_define([FULLNAME],FULLNAME/NAME)])
+
+AT_TAR_CHECK([
+AT_TAR_MKHIER(FULLNAME,NAME)
+echo test > endfile
+
+tar cf archive FULLNAME/NAME endfile
+tar tf archive],
+[0],
+[FULLNAME/NAME
+endfile
+],
+[],[],[],[gnu,oldgnu])
+
+AT_CLEANUP
+
diff --git a/tests/longv7.at b/tests/longv7.at
new file mode 100644
index 0000000..8a20fa6
--- /dev/null
+++ b/tests/longv7.at
@@ -0,0 +1,48 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Old format (V7) archives should not accept file names longer than
+# 99 characters
+
+AT_SETUP([long names in V7 archives])
+AT_KEYWORDS([longname longv7])
+
+m4_define([DIR],[this_is_a_very_long_name_for_a_directory_which_causes_problems])
+m4_define([FILE],[this_is_a_very_long_file_name_which_raises_issues.c])
+
+AT_TAR_CHECK([
+mkdir DIR
+touch DIR/FILE
+
+tar cf archive DIR
+echo separator
+tar tf archive
+],
+[0],
+[separator
+DIR/
+],
+[tar: DIR/FILE: file name is too long (max 99); not dumped
+tar: Error exit delayed from previous errors
+],
+[],[],[v7])
+
+AT_CLEANUP
+
diff --git a/tests/lustar01.at b/tests/lustar01.at
new file mode 100644
index 0000000..436536c
--- /dev/null
+++ b/tests/lustar01.at
@@ -0,0 +1,37 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([ustar: unsplittable file name])
+AT_KEYWORDS([longname ustar lustar01])
+
+m4_define([LONGNAME],
+ [this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_between_name_and_prefix])
+
+AT_TAR_CHECK([
+genfile --file=LONGNAME
+tar cf archive LONGNAME
+],
+[2],
+[],
+[tar: LONGNAME: file name is too long (cannot be split); not dumped
+tar: Error exit delayed from previous errors
+],[],[],[ustar])
+
+AT_CLEANUP
diff --git a/tests/lustar02.at b/tests/lustar02.at
new file mode 100644
index 0000000..fb7d4c6
--- /dev/null
+++ b/tests/lustar02.at
@@ -0,0 +1,42 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([ustar: unsplittable path name])
+AT_KEYWORDS([longname ustar lustar02])
+
+m4_define([PREFIX_155],
+ [this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be])
+
+m4_define([DIR_155],
+ [this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be])
+
+m4_define([NAME], [tween_name_and_prefix])
+
+AT_TAR_CHECK([
+AT_TAR_MKHIER(PREFIX_155,NAME)
+tar cf archive PREFIX_155
+],
+[2],
+[],
+[tar: PREFIX_155/: file name is too long (cannot be split); not dumped
+tar: Error exit delayed from previous errors
+],[],[],[ustar])
+
+AT_CLEANUP
diff --git a/tests/lustar03.at b/tests/lustar03.at
new file mode 100644
index 0000000..255c55c
--- /dev/null
+++ b/tests/lustar03.at
@@ -0,0 +1,43 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([ustar: splitting long names])
+AT_KEYWORDS([longname ustar lustar03])
+
+m4_define([DIR_155],
+ [this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be])
+
+m4_define([NAME], [file])
+
+AT_TAR_CHECK([
+AT_TAR_MKHIER(DIR_155,NAME)
+echo "Create archive"
+tar cf archive DIR_155
+echo "List archive"
+tar tf archive],
+[0],
+[Create archive
+List archive
+DIR_155/
+DIR_155/NAME
+],
+[],[],[],[ustar])
+
+AT_CLEANUP
diff --git a/tests/multiv01.at b/tests/multiv01.at
new file mode 100644
index 0000000..4247156
--- /dev/null
+++ b/tests/multiv01.at
@@ -0,0 +1,66 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Test multivolume dumps from pipes.
+
+AT_SETUP([multivolume dumps from pipes])
+AT_KEYWORDS([multivolume multiv multiv01])
+
+# Fixme: should be configurable
+# TRUSS=truss -o /tmp/tr
+# TRUSS=strace
+
+AT_TAR_CHECK([
+exec <&-
+genfile --length 7168 --file file1
+
+for block in " 1" " 2" " 3" " 4" " 5" " 6" " 7" " 8" \
+ " 9" "10" "11" "12" "13" "14" "15" "16" ; do \
+ echo "file2 block ${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo "bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ done
+done >file2
+
+if test $TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=$TAPE_LENGTH \
+ --listed-incremental=t.snar \
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=$PATH ${TRUSS} tar -f t1-pipe.tar -f - \
+ -C extract-dir-pipe -x --multi-volume \
+ --tape-length=$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+],
+[0],
+[],[],[],[],[gnu, oldgnu, pax])
+
+AT_CLEANUP
+
+
diff --git a/tests/multiv02.at b/tests/multiv02.at
new file mode 100644
index 0000000..84184ea
--- /dev/null
+++ b/tests/multiv02.at
@@ -0,0 +1,49 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Previous versions of tar were not able to skip a member straddling
+# the multivolume archive boundary. Reported by Mads Martin Joergensen
+# <mmj@suse.de>
+#
+# References: <20040402144254.GC4409@suse.de>
+# http://lists.gnu.org/archive/html/bug-tar/2004-04/msg00002.html
+
+AT_SETUP([skipping a straddling member])
+AT_KEYWORDS([multivolume multiv multiv02])
+
+AT_TAR_CHECK([
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+],
+[0],
+[separator
+en
+],
+[],[],[],[gnu, oldgnu, pax])
+
+AT_CLEANUP
diff --git a/tests/multiv03.at b/tests/multiv03.at
new file mode 100644
index 0000000..02458bc
--- /dev/null
+++ b/tests/multiv03.at
@@ -0,0 +1,71 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Problem: GNU multivolume archives are not able to continue on members
+# with filenames longer than 100 characters. Versions of tar <= 1.14
+# were not checking filename lengths and produced malformed multivolume
+# headers.
+# References: <20040809214854.GB32706@suse.de>
+# http://lists.gnu.org/archive/html/bug-tar/2004-08/msg00012.html
+# <200604270859.47241.Juergen.Vollmer@informatik-vollmer.de>
+#
+
+AT_SETUP([MV archive & long filenames])
+AT_KEYWORDS([multivolume multiv multiv03])
+
+AT_TAR_CHECK([
+AFILE=`awk 'BEGIN { for (i = 0; i < 100; i++) printf "a"; exit; }'`
+BFILE=`awk 'BEGIN { for (i = 0; i < 101; i++) printf "b"; exit; }'`
+
+cat > ../experr <<EOF
+tar: $BFILE: file name too long to be stored in a GNU multivolume header, truncated
+tar: \`$BFILE' is possibly continued on this volume: header contains truncated name
+EOF
+
+cat > ../expout <<EOF
+$AFILE
+separator-1
+separator-2
+EOF
+
+genfile --length 15360 --file $AFILE
+
+exec <&-
+
+tar -M -L 10 -c -f arch.1 -f arch.2 $AFILE || exit 1
+tar -tM -f arch.1 -f arch.2 || exit 1
+
+echo separator-1
+
+genfile --length 15360 --file $BFILE
+tar -M -L 10 -c -f arch.1 -f arch.2 $BFILE || exit 1
+
+echo separator-2
+mv $BFILE bfile
+tar -M -x -f arch.1 -f arch.2 || exit 1
+cmp $BFILE bfile
+],
+[0],
+[expout],
+[experr],
+[],[],[gnu, oldgnu])
+
+AT_CLEANUP
+
diff --git a/tests/multiv04.at b/tests/multiv04.at
new file mode 100644
index 0000000..516ccbe
--- /dev/null
+++ b/tests/multiv04.at
@@ -0,0 +1,66 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Problem: Tar was not able to match directory name if the directory
+# member was split between two volumes
+# References: Jörg Schilling pretends to have reported this two
+# years ago (<42551FF2.nail98011FRAT@burner>).
+
+# Test idea:
+# 1. Create a listed-incremental archive of a directory containing
+# a cetrain number of zero-length files.
+# 2. Using the same snapshot file, create a *multivolume* listed-incremental
+# archive. Number of files created in the directory and volume size should
+# be selected so that the first volume ends in the midst of the directory
+# member. The files are zero-length so that their member records are
+# sufficiently small, in order for the entire archive to fit in two volumes.
+# 3. Test the created multi-volume archive.
+
+AT_SETUP([split directory members in a MV archive])
+AT_KEYWORDS([multivolume multiv incremental multiv04])
+
+AT_TAR_CHECK([
+
+mkdir directory
+awk 'BEGIN { for (i = 0; i < 1024; i++) printf("directory/%014x\n", i); }' </dev/null | genfile --files-from -
+
+exec <&-
+
+sleep 2
+
+tar --listed-incremental=list -c -f archive.a directory
+
+sleep 2
+
+tar --listed-incremental=list -c --record-size 1024 -L 16 -f arc.1 -f arc.2 -v directory
+
+echo separator
+
+tar -MRt -f arc.1 -f arc.2],
+[0],
+[directory/
+separator
+block 0: directory/
+block 35: ** Block of NULs **
+],
+[],
+[],[],[gnu, oldgnu])
+
+AT_CLEANUP
diff --git a/tests/multiv05.at b/tests/multiv05.at
new file mode 100644
index 0000000..59a2902
--- /dev/null
+++ b/tests/multiv05.at
@@ -0,0 +1,67 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Up to version 1.15.91 tar was unable to recognize all volumes
+# given after an aout-of-sync volume.
+# Reported by: Joerg Weilbier <gnu@weilbier.net>
+# References: <200610011952.29880.gnu@weilbier.net>
+
+AT_SETUP([Restoring after an out of sync folume])
+AT_KEYWORDS([multivolume multiv multiv05 sync])
+m4_define([FILELIST],[jeden,dwa,trzy,cztery,piec,szesc])
+
+AT_TAR_CHECK([
+exec <&-
+
+m4_foreach([f],
+ [FILELIST],
+ [genfile --length 250k --file f
+])
+
+echo Creating archive
+tar -c -M -L 502 -f a.tar -f b.tar -f c.tar m4_foreach([f],[FILELIST],f )
+echo separator
+mkdir bak
+mv m4_foreach([f],[FILELIST],f )bak
+tar -vxM -f a.tar -f c.tar -f b.tar -f c.tar
+m4_foreach([f],
+ [FILELIST],
+ [echo Diffing f
+ cmp bak/f f || exit 1
+])],
+[0],
+[Creating archive
+separator]
+m4_foreach([file],
+ [FILELIST],
+ [file
+])dnl
+m4_foreach([file],
+ [FILELIST],
+ [Diffing file
+])dnl
+,
+[tar: `trzy' is not continued on this volume
+],[],[], [gnu])
+
+AT_CLEANUP
+
+
+
diff --git a/tests/old.at b/tests/old.at
new file mode 100644
index 0000000..ba0ae13
--- /dev/null
+++ b/tests/old.at
@@ -0,0 +1,37 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# An old archive was not receiving directories.
+
+AT_SETUP([old archives])
+AT_KEYWORDS([old])
+
+unset TAR_OPTIONS
+AT_CHECK([
+mkdir directory
+tar cfvo archive directory || exit 1
+tar tf archive
+],
+[0],
+[directory/
+directory/
+])
+
+AT_CLEANUP
diff --git a/tests/options.at b/tests/options.at
new file mode 100644
index 0000000..a0b39a5
--- /dev/null
+++ b/tests/options.at
@@ -0,0 +1,37 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Ensure that TAR_OPTIONS works in conjunction with old-style options.
+
+unset TAR_OPTIONS
+AT_SETUP([mixing options])
+AT_KEYWORDS([options options00])
+
+AT_CHECK([
+echo > file1
+TAR_OPTIONS=--numeric-owner tar chof archive file1
+tar tf archive
+],
+[0],
+[file1
+])
+
+AT_CLEANUP
+
diff --git a/tests/options02.at b/tests/options02.at
new file mode 100644
index 0000000..05c24ca
--- /dev/null
+++ b/tests/options02.at
@@ -0,0 +1,39 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Ensure that tar correctly handles non-option arguments interspersed with
+# options.
+# References: <200501051042.46223.vapier@gentoo.org>
+# http://lists.gnu.org/archive/html/bug-tar/2005-01/msg00011.html
+
+AT_SETUP([interspersed options])
+AT_KEYWORDS([options options02])
+
+AT_CHECK([
+echo > file1
+tar c file1 -f archive
+tar tf archive
+],
+[0],
+[file1
+])
+
+AT_CLEANUP
+
diff --git a/tests/package.m4 b/tests/package.m4
new file mode 100644
index 0000000..4e8fce7
--- /dev/null
+++ b/tests/package.m4
@@ -0,0 +1,6 @@
+# Signature of the current package.
+m4_define([AT_PACKAGE_NAME], [GNU tar])
+m4_define([AT_PACKAGE_TARNAME], [tar])
+m4_define([AT_PACKAGE_VERSION], [1.17])
+m4_define([AT_PACKAGE_STRING], [GNU tar 1.17])
+m4_define([AT_PACKAGE_BUGREPORT], [bug-tar@gnu.org])
diff --git a/tests/pipe.at b/tests/pipe.at
new file mode 100644
index 0000000..c557b29
--- /dev/null
+++ b/tests/pipe.at
@@ -0,0 +1,54 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Recognition of compressed formats, introduced with tar 1.15, broke
+# untarring of archives from standard input.
+# References:
+# 1) <20041221040834.GA9635@tigers-lfs.nsw.bigpond.net.au>
+# http://lists.gnu.org/archive/html/bug-tar/2004-12/msg00031.html
+# 2) <20041221093801.GA55537@engelschall.com>
+# http://lists.gnu.org/archive/html/bug-tar/2004-12/msg00026.html
+
+AT_SETUP([decompressing from stdin])
+
+AT_KEYWORDS([pipe])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2],
+[0],
+[directory/
+directory/file1
+directory/file2
+separator
+separator
+])
+
+AT_CLEANUP
diff --git a/tests/recurse.at b/tests/recurse.at
new file mode 100644
index 0000000..ce34660
--- /dev/null
+++ b/tests/recurse.at
@@ -0,0 +1,34 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([recurse])
+AT_KEYWORDS([recurse])
+
+AT_TAR_CHECK([
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+],
+[0],
+[directory/
+])
+
+AT_CLEANUP
diff --git a/tests/rename01.at b/tests/rename01.at
new file mode 100644
index 0000000..52e139b
--- /dev/null
+++ b/tests/rename01.at
@@ -0,0 +1,89 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Description: Test basic handling of renamed directory in the incremental
+# archives.
+
+AT_SETUP([renamed dirs in incrementals])
+AT_KEYWORDS([incremental rename rename01])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+],
+[0],
+[Creating base archive
+foo/
+foo/bar/
+foo/file1
+foo/file2
+foo/bar/file
+Creating incremental archive
+foo/
+foo/baz/
+Begin directory listing 1
+foo
+foo/bar
+foo/bar/file
+foo/file1
+foo/file2
+End directory listing 1
+Begin directory listing 2
+foo
+foo/baz
+foo/baz/file
+foo/file1
+foo/file2
+End directory listing 2
+],
+[tar: foo/bar: Directory is new
+tar: foo/baz: Directory has been renamed from `foo/bar'
+],
+[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
+
+# End of rename01.at
diff --git a/tests/rename02.at b/tests/rename02.at
new file mode 100644
index 0000000..c623851
--- /dev/null
+++ b/tests/rename02.at
@@ -0,0 +1,102 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Description: Incremental archives should be able to handle directories
+# moved between directory hierarchies.
+
+AT_SETUP([move between hierarchies])
+AT_KEYWORDS([incremental rename rename02])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+],
+[0],
+[Creating base archive
+foo/
+foo/bar/
+foo/bar/baz/
+foo/file1
+foo/file2
+foo/bar/file.r
+foo/bar/baz/file.z
+Creating incremental archive
+foo/
+foo/bar/
+foo/baz/
+Begin directory listing 1
+foo
+foo/bar
+foo/bar/baz
+foo/bar/baz/file.z
+foo/bar/file.r
+foo/file1
+foo/file2
+End directory listing 1
+foo/
+foo/bar/
+foo/baz/
+Begin directory listing 2
+foo
+foo/bar
+foo/bar/file.r
+foo/baz
+foo/baz/file.z
+foo/file1
+foo/file2
+End directory listing 2
+],
+[tar: foo/bar: Directory is new
+tar: foo/bar/baz: Directory is new
+tar: foo/baz: Directory has been renamed from `foo/bar/baz'
+],
+[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
+
+# End of rename02.at
diff --git a/tests/rename03.at b/tests/rename03.at
new file mode 100644
index 0000000..138ef00
--- /dev/null
+++ b/tests/rename03.at
@@ -0,0 +1,126 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Description: Handling of cyclic renames in incremental archives.
+
+AT_SETUP([cyclic renames])
+AT_KEYWORDS([incremental rename rename03 cyclic-rename])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo "First dump"
+echo "First dump">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a $$
+mv c a
+mv b c
+mv $$ b)
+
+echo "Second dump"
+echo "Second dump" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+],
+[0],
+[First dump
+foo/
+foo/a/
+foo/b/
+foo/c/
+foo/file1
+foo/file2
+foo/a/filea
+foo/b/fileb
+foo/c/filec
+Second dump
+foo/
+foo/a/
+foo/b/
+foo/c/
+Begin directory listing 1
+foo
+foo/a
+foo/a/filea
+foo/b
+foo/b/fileb
+foo/c
+foo/c/filec
+foo/file1
+foo/file2
+End directory listing 1
+foo/
+foo/a/
+foo/b/
+foo/c/
+Begin directory listing 2
+foo
+foo/a
+foo/a/filec
+foo/b
+foo/b/filea
+foo/c
+foo/c/fileb
+foo/file1
+foo/file2
+End directory listing 2
+],
+[First dump
+tar: foo/a: Directory is new
+tar: foo/b: Directory is new
+tar: foo/c: Directory is new
+Second dump
+tar: foo/a: Directory has been renamed from `foo/c'
+tar: foo/b: Directory has been renamed from `foo/a'
+tar: foo/c: Directory has been renamed from `foo/b'
+],
+[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
+
+# End of rename03.at
diff --git a/tests/same-order01.at b/tests/same-order01.at
new file mode 100644
index 0000000..ea159ed
--- /dev/null
+++ b/tests/same-order01.at
@@ -0,0 +1,47 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Problem: -C dir did not work with --same-order
+# Reported by: Karl-Michael Schneider <schneide@phil.uni-passau.de>
+# References: <20040507122613.GB12457@pike.phil.uni-passau.de>
+# http://lists.gnu.org/archive/html/bug-tar/2004-05/msg00008.html
+
+AT_SETUP([working -C with --same-order])
+AT_KEYWORDS([same-order same-order01])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+],
+[0],
+[file1
+file2
+])
+
+AT_CLEANUP
+
diff --git a/tests/same-order02.at b/tests/same-order02.at
new file mode 100644
index 0000000..f01b142
--- /dev/null
+++ b/tests/same-order02.at
@@ -0,0 +1,49 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# In previous versions a single -C option did not work with --same-order
+# (see same-order01.sh). However, multiple -C options worked OK.
+# Test if we did not break the correct behavior.
+
+AT_SETUP([multiple -C options])
+AT_KEYWORDS([same-order same-order02])
+
+AT_TAR_CHECK([
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+],
+[0],
+[file1
+separator
+file2
+])
+
+AT_CLEANUP
diff --git a/tests/shortrec.at b/tests/shortrec.at
new file mode 100644
index 0000000..9871143
--- /dev/null
+++ b/tests/shortrec.at
@@ -0,0 +1,39 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Check that tar doesn't complain when reading short records.
+# This can happen when the input blocksize differs from the blocksize
+# used to create the archive.
+
+AT_SETUP([short records])
+AT_KEYWORDS([shortrec.at])
+
+AT_TAR_CHECK([
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+])
+
+AT_CLEANUP
diff --git a/tests/sparse01.at b/tests/sparse01.at
new file mode 100644
index 0000000..651660d
--- /dev/null
+++ b/tests/sparse01.at
@@ -0,0 +1,52 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([sparse files])
+AT_KEYWORDS([sparse sparse01])
+
+AT_TAR_CHECK([
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || AT_SKIP_TEST
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+],
+[0],
+[stdout],
+[],[],[],[posix, gnu, oldgnu])
+
+RE_CHECK([stdout],
+[separator
+-rw-r--r-- [^ ][^ ]* *1000 [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] begin
+-rw-r--r-- [^ ][^ ]* *10344448 [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] sparsefile
+-rw-r--r-- [^ ][^ ]* *1000 [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] end
+separator
+sparsefile 10344448
+])
+
+AT_CLEANUP
+
diff --git a/tests/sparse02.at b/tests/sparse02.at
new file mode 100644
index 0000000..979e479
--- /dev/null
+++ b/tests/sparse02.at
@@ -0,0 +1,41 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([extracting sparse file over a pipe])
+AT_KEYWORDS([sparse sparse02])
+
+# Tar 1.14 - 1.15.1 was unable to extract sparse files to a pipe.
+# References: <16896.21739.460782.124775@jik.kamens.brookline.ma.us>
+# http://lists.gnu.org/archive/html/bug-tar/2005-02/msg00003.html
+
+AT_TAR_CHECK([
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || AT_SKIP_TEST
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+],
+[0],
+[separator
+],
+[],[],[],[posix, gnu, oldgnu])
+
+AT_CLEANUP
diff --git a/tests/sparse03.at b/tests/sparse03.at
new file mode 100644
index 0000000..1ebac2e
--- /dev/null
+++ b/tests/sparse03.at
@@ -0,0 +1,56 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([storing sparse files > 8G])
+AT_KEYWORDS([sparse sparse03])
+
+# Tar 1.15.1 incorrectly computed sparse member size if the extended
+# PAX header contained size keyword.
+# References: <87vf46nb36.fsf@penguin.cs.ucla.edu>
+# http://lists.gnu.org/archive/html/bug-tar/2005-06/msg00040.html
+
+AT_TAR_CHECK([
+genfile --length 1000 --file begin
+genfile --length 1000 --file end
+genfile --sparse --file sparsefile --block-size 512 8G A || AT_SKIP_TEST
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+],
+[0],
+[stdout],
+[],[],[],[posix])
+
+RE_CHECK([stdout],
+[separator
+-rw-r--r-- [^ ][^ ]* *1000 [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] begin
+-rw-r--r-- [^ ][^ ]* *8589935104 [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] sparsefile
+-rw-r--r-- [^ ][^ ]* *1000 [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] end
+separator
+sparsefile 8589935104
+])
+
+AT_CLEANUP
diff --git a/tests/sparsemv.at b/tests/sparsemv.at
new file mode 100644
index 0000000..973480e
--- /dev/null
+++ b/tests/sparsemv.at
@@ -0,0 +1,65 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([sparse files in MV archives])
+AT_KEYWORDS([sparse multiv sparsemv])
+
+# Check if sparse files are correctly split between GNU multi-volume
+# archives.
+# There are two cases: the file can be split within an empty (null) block,
+# or within a data block. Since null blocks are not archived, the first
+# case means the file is split between two consecutive data blocks.
+#
+
+AT_TAR_CHECK([
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || AT_SKIP_TEST
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || AT_SKIP_TEST
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+],
+[0],
+[Pass 1: Split between data blocks
+Create archive
+Test archive
+sparsefile
+Compare archive
+Pass 2: Split within a data block
+Create archive
+Test archive
+sparsefile
+Compare archive
+],
+[],[],[],[gnu, oldgnu])
+
+AT_CLEANUP
diff --git a/tests/sparsemvp.at b/tests/sparsemvp.at
new file mode 100644
index 0000000..0c6ff62
--- /dev/null
+++ b/tests/sparsemvp.at
@@ -0,0 +1,60 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Check if sparse files are correctly split between PAX multi-volume
+# archives.
+# See comment in sparsemv.at for the description.
+
+dnl TAR_MVP_TEST version map1 map2
+m4_define([TAR_MVP_TEST],[
+AT_TAR_CHECK([
+exec <&-
+genfile --sparse --file sparsefile $2 || AT_SKIP_TEST
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse --sparse-version=$1 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile $3 || AT_SKIP_TEST
+echo "Create archive"
+tar --sparse --sparse-version=$1 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+],
+[0],
+[Pass 1: Split between data blocks
+Create archive
+Test archive
+sparsefile
+Compare archive
+Pass 2: Split within a data block
+Create archive
+Test archive
+sparsefile
+Compare archive
+],
+[],[],[],[pax])])
+
diff --git a/tests/spmvp00.at b/tests/spmvp00.at
new file mode 100644
index 0000000..526289d
--- /dev/null
+++ b/tests/spmvp00.at
@@ -0,0 +1,26 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([sparse files in PAX MV archives, v.0.0])
+AT_KEYWORDS([sparse multiv sparsemvp sparsemvp00])
+
+TAR_MVP_TEST(0.0, [0 ABCDEFGHI 1M ABCDEFGHI], [0 ABCDEFGH 1M ABCDEFGHI])
+
+AT_CLEANUP
diff --git a/tests/spmvp01.at b/tests/spmvp01.at
new file mode 100644
index 0000000..a2123cc
--- /dev/null
+++ b/tests/spmvp01.at
@@ -0,0 +1,26 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([sparse files in PAX MV archives, v.0.1])
+AT_KEYWORDS([sparse multiv sparsemvp sparsemvp01])
+
+TAR_MVP_TEST(0.1, [0 ABCDEFGHIJK 1M ABCDEFGHI], [0 ABCDEFGHIJ 1M ABCDEFGHI])
+
+AT_CLEANUP
diff --git a/tests/spmvp10.at b/tests/spmvp10.at
new file mode 100644
index 0000000..e35908d
--- /dev/null
+++ b/tests/spmvp10.at
@@ -0,0 +1,26 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([sparse files in PAX MV archives, v.1.0])
+AT_KEYWORDS([sparse multiv sparsemvp sparsemvp10])
+
+TAR_MVP_TEST(1.0, [0 ABCDEFGH 1M ABCDEFGHI], [0 ABCDEFG 1M ABCDEFGHI])
+
+AT_CLEANUP
diff --git a/tests/star/README b/tests/star/README
new file mode 100644
index 0000000..8e1b231
--- /dev/null
+++ b/tests/star/README
@@ -0,0 +1,68 @@
+This directory contains scripts for testing GNU tar using
+star "test archives". The archives themselves can be obtained
+from http://download.berlios.de/pub/star/testscripts.
+
+The tests are ignored unless environment variable STAR_TESTSCRIPTS
+is set and points to the directory where the test archives reside.
+Sample usage:
+
+ make STAR_TESTSCRIPTS=testdir check
+or
+ make TESTS_ENVIRONMENT='STAR_TESTSCRIPTS=testdir' check
+
+The file `quicktest.sh' is a separate test. It is never executed
+within `make check' command, you will need to run it manually.
+Please, carefully read section `quicktest.sh' below before running
+it.
+
+Following is a short description of the tests:
+
+* gtarfail.at and gtarfail2.at
+
+These tests require gtarfile.tar and gtarfile2.tar, respectively.
+These files are POSIX compliant tar archives that were not accepted
+by previous versions of GNU tar.
+
+* multi-fail.at
+
+Requires gnu-multi-fail-volume1.gtar and gnu-multi-fail-volume2.gtar.
+These are two parts of a multi-volume archive that previous versions
+of tar refused to read (at least, without -B option).
+
+* ustar-big-2g.at
+
+Requires ustar-big-2g.tar.bz2. It is a tar archive containing a file with
+the largest size that a historic tar implementation is able to understand.
+
+* ustar-big-8g.at
+
+Requires ustar-big-8g.tar.bz2. This is a test for reading an archive containing
+files with the largest size that may be used with ustar (POSIX.1-1990)
+format.
+
+* pax-big-10g.at
+
+Requires pax-big-10g.tar.bz2. It tests handling pax (POSIX.1-2001) archves
+containing very large files (in this case -- 10 GB).
+
+* quicktest.sh
+
+This is a test for compliance to POSIX.1-1990 tar specification. It
+requires two files: ustar-all-quicktest.tar and quicktest.filelist,
+(they usually reside in star/tartest directory), and `tartest' program
+(also part of star distribution). The test must be run only with root
+privileges, so it is a good idea to test contents of
+ustar-all-quicktest.tar before running it.
+
+If `tartest' is not in your PATH, use TARTEST variable to specify its
+full file name. You may pass both STAR_TESTSCRIPTS and TARTEST
+variables as command line arguments to quicktest.sh, as shown in
+the example below:
+
+ ./quicktest.sh STAR_TESTSCRIPTS=testdir TARTEST=/path/to/tartest
+
+
+Local variables:
+mode: outline
+paragraph-separate: "[ ]*$"
+end:
diff --git a/tests/star/gtarfail.at b/tests/star/gtarfail.at
new file mode 100644
index 0000000..fa7abda
--- /dev/null
+++ b/tests/star/gtarfail.at
@@ -0,0 +1,40 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([gtarfail])
+AT_KEYWORDS([star gtarfail])
+
+unset TAR_OPTIONS
+
+AT_CHECK([
+AT_STAR_PREREQ([gtarfail.tar],[bf7612e401aaa679edbb07ae1183811b])
+
+tar --utc -tvf $STAR_TESTSCRIPTS/gtarfail.tar
+],
+[0],
+[-rw-r--r-- jes/glone 518 2001-05-25 14:41 vedpowered.gif
+-rw-r--r-- jes/glone 6825 1997-04-29 00:19 cd.gif
+-rw-r--r-- jes/glone 33354 1999-06-22 12:17 DSCN0049c.JPG
+-rw-r--r-- jes/glone 86159 2001-06-05 18:16 Window1.jpg
+-rw-r--r-- jes/glone 1310 2001-05-25 13:05 vipower.gif
+-rw-rw-rw- jes/glone 148753 1998-09-15 13:08 billyboy.jpg
+])
+
+AT_CLEANUP
diff --git a/tests/star/gtarfail2.at b/tests/star/gtarfail2.at
new file mode 100644
index 0000000..61c4dc3
--- /dev/null
+++ b/tests/star/gtarfail2.at
@@ -0,0 +1,45 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([gtarfail2])
+AT_KEYWORDS([star gtarfail2])
+
+unset TAR_OPTIONS
+
+AT_CHECK([
+AT_STAR_PREREQ([gtarfail2.tar],[6b607d1faec14b82f69525d9c5b66e53])
+tar --utc -tvf $STAR_TESTSCRIPTS/gtarfail2.tar
+],
+[0],
+[-rwxr-xr-x jes/glone 214 2001-09-21 14:08 .clean
+lrwxrwxrwx jes/cats 0 1998-05-07 12:39 RULES -> makefiles/RULES
+drwxr-sr-x jes/glone 0 2001-12-10 00:00 build/
+-rw-r--r-- jes/glone 312019 2001-12-10 00:00 build/smake-1.2.tar.gz
+drwxr-sr-x jes/glone 0 2001-11-09 18:20 build/psmake/
+-rwxr-xr-x jes/glone 259 2000-01-09 16:36 build/psmake/MAKE
+-rwxr-xr-x jes/glone 4820 2001-02-25 22:45 build/psmake/MAKE.sh
+-rw-r--r-- jes/glone 647 2001-02-25 23:50 build/psmake/Makefile
+lrwxrwxrwx jes/glone 0 2001-08-29 10:53 build/psmake/archconf.c -> ../archconf.c
+lrwxrwxrwx jes/glone 0 2001-08-29 10:54 build/psmake/astoi.c -> ../../lib/astoi.c
+])
+
+AT_CLEANUP
+
+
diff --git a/tests/star/multi-fail.at b/tests/star/multi-fail.at
new file mode 100644
index 0000000..9627ced
--- /dev/null
+++ b/tests/star/multi-fail.at
@@ -0,0 +1,89 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([multi-fail])
+AT_KEYWORDS([star multivolume multiv multi-fail])
+
+unset TAR_OPTIONS
+
+AT_CHECK([
+AT_STAR_PREREQ([gnu-multi-fail-volume1.gtar],[7c28663dd98b0bd91ceb4be7af55254e])
+AT_STAR_PREREQ([gnu-multi-fail-volume2.gtar],[b5d41c4c3ec440687d4a44957b5079a8])
+
+tar --utc -tvM -f $STAR_TESTSCRIPTS/gnu-multi-fail-volume1.gtar \
+ -f $STAR_TESTSCRIPTS/gnu-multi-fail-volume2.gtar <&-
+],
+[0],
+[drwxrwsr-x joerg/bs 0 2003-10-11 14:32 OBJ/i386-sunos5-gcc/
+-rw-r--r-- joerg/bs 1 2003-10-11 14:32 OBJ/i386-sunos5-gcc/Dnull
+-rw-r--r-- joerg/bs 1743 2003-10-10 18:06 OBJ/i386-sunos5-gcc/star.d
+-rw-r--r-- joerg/bs 1460 2003-10-11 11:53 OBJ/i386-sunos5-gcc/header.d
+-rw-r--r-- joerg/bs 1540 2003-10-10 18:06 OBJ/i386-sunos5-gcc/cpiohdr.d
+-rw-r--r-- joerg/bs 2245 2003-10-10 18:06 OBJ/i386-sunos5-gcc/xheader.d
+-rw-r--r-- joerg/bs 1254 2003-10-10 18:06 OBJ/i386-sunos5-gcc/xattr.d
+-rw-r--r-- joerg/bs 1330 2003-10-10 18:06 OBJ/i386-sunos5-gcc/list.d
+-rw-r--r-- joerg/bs 1745 2003-10-10 18:06 OBJ/i386-sunos5-gcc/extract.d
+-rw-r--r-- joerg/bs 1518 2003-10-10 18:06 OBJ/i386-sunos5-gcc/create.d
+-rw-r--r-- joerg/bs 1235 2003-10-10 18:06 OBJ/i386-sunos5-gcc/append.d
+-rw-r--r-- joerg/bs 1368 2003-10-10 18:06 OBJ/i386-sunos5-gcc/diff.d
+-rw-r--r-- joerg/bs 1423 2003-10-10 18:06 OBJ/i386-sunos5-gcc/remove.d
+-rw-r--r-- joerg/bs 1493 2003-10-10 18:07 OBJ/i386-sunos5-gcc/star_unix.d
+-rw-r--r-- joerg/bs 1572 2003-10-10 18:07 OBJ/i386-sunos5-gcc/acl_unix.d
+-rw-r--r-- joerg/bs 1453 2003-10-10 18:07 OBJ/i386-sunos5-gcc/fflags.d
+-rw-r--r-- joerg/bs 2257 2003-10-11 14:32 OBJ/i386-sunos5-gcc/buffer.d
+-rw-r--r-- joerg/bs 969 2003-10-07 17:53 OBJ/i386-sunos5-gcc/dirtime.d
+-rw-r--r-- joerg/bs 1308 2003-10-10 18:07 OBJ/i386-sunos5-gcc/lhash.d
+-rw-r--r-- joerg/bs 1287 2003-10-10 18:07 OBJ/i386-sunos5-gcc/hole.d
+-rw-r--r-- joerg/bs 1105 2003-10-10 18:07 OBJ/i386-sunos5-gcc/longnames.d
+-rw-r--r-- joerg/bs 1230 2003-10-10 18:07 OBJ/i386-sunos5-gcc/names.d
+-rw-r--r-- joerg/bs 1091 2003-10-10 18:07 OBJ/i386-sunos5-gcc/movearch.d
+-rw-r--r-- joerg/bs 961 2003-10-07 17:53 OBJ/i386-sunos5-gcc/table.d
+-rw-r--r-- joerg/bs 1113 2003-10-10 18:07 OBJ/i386-sunos5-gcc/props.d
+-rw-r--r-- joerg/bs 2146 2003-10-10 18:07 OBJ/i386-sunos5-gcc/fetchdir.d
+-rw-r--r-- joerg/bs 1093 2003-10-10 18:07 OBJ/i386-sunos5-gcc/unicode.d
+-rw-r--r-- joerg/bs 1211 2003-10-10 18:07 OBJ/i386-sunos5-gcc/subst.d
+-rw-r--r-- joerg/bs 2076 2003-10-11 11:53 OBJ/i386-sunos5-gcc/volhdr.d
+-rw-r--r-- joerg/bs 1480 2003-10-10 18:07 OBJ/i386-sunos5-gcc/chdir.d
+-rw-r--r-- joerg/bs 42460 2003-10-10 18:07 OBJ/i386-sunos5-gcc/star.o
+-rw-r--r-- joerg/bs 22564 2003-10-11 11:53 OBJ/i386-sunos5-gcc/header.o
+-rw-r--r-- joerg/bs 7880 2003-10-10 18:07 OBJ/i386-sunos5-gcc/cpiohdr.o
+-rw-r--r-- joerg/bs 14624 2003-10-10 18:07 OBJ/i386-sunos5-gcc/xheader.o
+-rw-r--r-- joerg/bs 924 2003-10-10 18:07 OBJ/i386-sunos5-gcc/xattr.o
+-rw-r--r-- joerg/bs 6120 2003-10-10 18:07 OBJ/i386-sunos5-gcc/list.o
+-rw-r--r-- joerg/bs 12764 2003-10-10 18:07 OBJ/i386-sunos5-gcc/extract.o
+-rw-r--r-- joerg/bs 14668 2003-10-10 18:07 OBJ/i386-sunos5-gcc/create.o
+-rw-r--r-- joerg/bs 2576 2003-10-10 18:07 OBJ/i386-sunos5-gcc/append.o
+-rw-r--r-- joerg/bs 7636 2003-10-10 18:07 OBJ/i386-sunos5-gcc/diff.o
+-rw-r--r-- joerg/bs 3072 2003-10-10 18:07 OBJ/i386-sunos5-gcc/remove.o
+-rw-r--r-- joerg/bs 5612 2003-10-10 18:07 OBJ/i386-sunos5-gcc/star_unix.o
+-rw-r--r-- joerg/bs 6220 2003-10-10 18:07 OBJ/i386-sunos5-gcc/acl_unix.o
+-rw-r--r-- joerg/bs 1092 2003-10-10 18:07 OBJ/i386-sunos5-gcc/fflags.o
+-rw-r--r-- joerg/bs 20996 2003-10-11 14:32 OBJ/i386-sunos5-gcc/buffer.o
+-rw-r--r-- joerg/bs 2060 2003-10-07 17:53 OBJ/i386-sunos5-gcc/dirtime.o
+-rw-r--r-- joerg/bs 1664 2003-10-10 18:07 OBJ/i386-sunos5-gcc/lhash.o
+-rw-r--r-- joerg/bs 10564 2003-10-10 18:07 OBJ/i386-sunos5-gcc/hole.o
+-rw-r--r-- joerg/bs 3864 2003-10-10 18:07 OBJ/i386-sunos5-gcc/longnames.o
+-rw-r--r-- joerg/bs 2576 2003-10-10 18:07 OBJ/i386-sunos5-gcc/names.o
+-rw-r--r-- joerg/bs 952 2003-10-10 18:07 OBJ/i386-sunos5-gcc/movearch.o
+-rw-r--r-- joerg/bs 2756 2003-10-07 17:53 OBJ/i386-sunos5-gcc/table.o
+])
+
+AT_CLEANUP
+
diff --git a/tests/star/pax-big-10g.at b/tests/star/pax-big-10g.at
new file mode 100644
index 0000000..5e28db2
--- /dev/null
+++ b/tests/star/pax-big-10g.at
@@ -0,0 +1,43 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([pax-big-10g])
+AT_KEYWORDS([star pax-big-10g])
+
+unset TAR_OPTIONS
+
+AT_CHECK([
+AT_GZIP_PREREQ([bzip2])
+AT_STAR_PREREQ([pax-big-10g.tar.bz2],[ca15c23acc8d8bb1f27e60113a5f8bff])
+
+tar --utc -tvjf $STAR_TESTSCRIPTS/pax-big-10g.tar.bz2
+],
+[0],
+[-rw------- jes/glone 10737418240 2002-06-15 21:18 10g
+-rw-r--r-- jes/glone 0 2002-06-15 14:53 file
+],
+[stderr])
+
+RE_CHECK([stderr],[tar: Record size = .*
+])
+
+AT_CLEANUP
+
+
diff --git a/tests/star/quicktest.sh b/tests/star/quicktest.sh
new file mode 100755
index 0000000..8eb2fc8
--- /dev/null
+++ b/tests/star/quicktest.sh
@@ -0,0 +1,108 @@
+#! /bin/sh
+# This file is part of GNU tar testsuite.
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+PWD=`pwd`
+P=`expr $0 : '\(.*\)/.*'`
+DIR=`cd $P; pwd`/../../src
+if [ -d $DIR ]; then
+ PATH=`cd $DIR;pwd`:$PATH
+fi
+
+# Usage: quicktest FILELIST ARCHIVE-NAME
+quicktest() {
+ DIR=quicktest.$$
+ mkdir $DIR
+ cd $DIR
+
+ TAR_OPTIONS=""
+ export TAR_OPTIONS
+
+ tar xf $2
+ tar -cf ../archive -H ustar -T $1
+ cd ..
+
+ ${TARTEST:-tartest} -v < $2 > $DIR/old.out
+ ${TARTEST:-tartest} -v < archive > $DIR/new.out
+
+ if cmp $DIR/old.out $DIR/new.out; then
+ echo "PASS"
+ rm -r $DIR
+ exit 0
+ else
+ echo "FAIL. Examine $DIR for details"
+ exit 1
+ fi
+}
+
+test_access() {
+ if [ -r $1 ]; then
+ :
+ else
+ echo "$1 does not exist or is unreadable"
+ echo 77
+ fi
+}
+
+check_environ() {
+ if [ "$STAR_TESTSCRIPTS" = "" ]; then
+ echo "STAR_TESTSCRIPTS not set"
+ exit 77
+ fi
+
+ if [ -d $STAR_TESTSCRIPTS ]; then
+ :
+ else
+ echo "STAR_TESTSCRIPTS is not a directory"
+ exit 77
+ fi
+
+ ARCHIVE=$STAR_TESTSCRIPTS/ustar-all-quicktest.tar
+ test_access $ARCHIVE
+ FILELIST=$STAR_TESTSCRIPTS/quicktest.filelist
+ test_access $FILELIST
+
+ ${TARTEST:-tartest} < /dev/null > /dev/null 2>&1
+ if [ $? -eq 127 ]; then
+ echo "tartest not in your path"
+ exit 77
+ fi
+ tar --version
+}
+
+getargs() {
+ for option
+ do
+ case $option in
+ *=*) eval $option;;
+ *) echo "Unknown option: $option" >&2
+ exit 77;;
+ esac
+ done
+}
+
+if [ -w / ]; then
+ getargs $*
+ check_environ
+ quicktest $FILELIST $ARCHIVE
+else
+ echo "You need to be root to run this test"
+ exit 77
+fi
+
+# End of quicktest.sh
diff --git a/tests/star/ustar-big-2g.at b/tests/star/ustar-big-2g.at
new file mode 100644
index 0000000..c132d06
--- /dev/null
+++ b/tests/star/ustar-big-2g.at
@@ -0,0 +1,42 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([ustar-big-2g])
+AT_KEYWORDS([star ustar-big-2g])
+
+unset TAR_OPTIONS
+
+AT_CHECK([
+AT_GZIP_PREREQ([bzip2])
+AT_STAR_PREREQ([ustar-big-2g.tar.bz2],[b63979733629c8fcdf40b60065422767])
+
+tar --utc -tvjf $STAR_TESTSCRIPTS/ustar-big-2g.tar.bz2
+],
+[0],
+[-rw------- jes/glone 2147483647 2002-06-15 14:53 big
+-rw-r--r-- jes/glone 0 2002-06-15 14:53 file
+],
+[stderr])
+
+RE_CHECK([stderr],[tar: Record size = .*
+])
+
+AT_CLEANUP
+
diff --git a/tests/star/ustar-big-8g.at b/tests/star/ustar-big-8g.at
new file mode 100644
index 0000000..b642bf7
--- /dev/null
+++ b/tests/star/ustar-big-8g.at
@@ -0,0 +1,42 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([ustar-big-8g])
+AT_KEYWORDS([star ustar-big-8g])
+
+unset TAR_OPTIONS
+
+AT_CHECK([
+AT_GZIP_PREREQ([bzip2])
+AT_STAR_PREREQ([ustar-big-8g.tar.bz2],[60ff503fa4b8288bef7ada89e9c91b0f])
+
+tar --utc -tvjf $STAR_TESTSCRIPTS/ustar-big-8g.tar.bz2
+],
+[0],
+[-rw------- jes/glone 8589934591 2002-06-15 15:08 8gb-1
+-rw-r--r-- jes/glone 0 2002-06-15 14:53 file
+],
+[stderr])
+
+RE_CHECK([stderr],[tar: Record size = .*
+])
+
+AT_CLEANUP
+
diff --git a/tests/testsuite b/tests/testsuite
new file mode 100755
index 0000000..af849c2
--- /dev/null
+++ b/tests/testsuite
@@ -0,0 +1,27410 @@
+#! /bin/sh
+#
+# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+# Foundation, Inc.
+# This test suite is free software; the Free Software Foundation gives
+# unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+
+# PATH needs CR
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+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
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+ if (eval ":") 2>/dev/null; then
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+
+ if test $as_have_required = yes && (eval ":
+(as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=\$LINENO
+ as_lineno_2=\$LINENO
+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+ :
+else
+ as_candidate_shells=
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /usr/bin/posix$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ case $as_dir in
+ /*)
+ for as_base in sh bash ksh sh5; do
+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+ done;;
+ esac
+done
+IFS=$as_save_IFS
+
+
+ for as_shell in $as_candidate_shells $SHELL; do
+ # Try only shells that exist, to save several forks.
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { ("$as_shell") 2> /dev/null <<\_ASEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+:
+_ASEOF
+}; then
+ CONFIG_SHELL=$as_shell
+ as_have_required=yes
+ if { "$as_shell" 2> /dev/null <<\_ASEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+:
+(as_func_return () {
+ (exit $1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+ break
+fi
+
+fi
+
+ done
+
+ if test "x$CONFIG_SHELL" != x; then
+ for as_var in BASH_ENV ENV
+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ done
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+ if test $as_have_required = no; then
+ echo This script requires a shell more modern than all the
+ echo shells that I found on your system. Please install a
+ echo modern shell, or manually run the script under such a
+ echo shell if you do have one.
+ { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+ echo No shell found that supports shell functions.
+ echo Please tell autoconf@gnu.org about your system,
+ echo including any error possibly output before this
+ echo message
+}
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. 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" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # 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
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+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
+fi
+echo >conf$$.file
+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 -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+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=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+# Find out whether ``test -x'' works. Don't use a zero-byte file, as
+# systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ as_executable_p="test -x"
+else
+ as_executable_p=:
+fi
+rm -f conf$$.file
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# How were we run?
+at_cli_args="$@"
+
+# Load the config file.
+for at_file in atconfig atlocal
+do
+ test -r $at_file || continue
+ . ./$at_file || { echo "$as_me: error: invalid content: $at_file" >&2
+ { (exit 1); exit 1; }; }
+done
+
+# Autoconf <=2.59b set at_top_builddir instead of at_top_build_prefix:
+: ${at_top_build_prefix=$at_top_builddir}
+
+# atconfig delivers names relative to the directory the test suite is
+# in, but the groups themselves are run in testsuite-dir/group-dir.
+if test -n "$at_top_srcdir"; then
+ builddir=../..
+ for at_dir in srcdir top_srcdir top_build_prefix
+ do
+ at_val=`eval echo '${'at_$at_dir'}'`
+ eval "$at_dir=\$at_val/../.."
+ done
+fi
+
+# Not all shells have the 'times' builtin; the subshell is needed to make
+# sure we discard the 'times: not found' message from the shell.
+at_times_p=false
+(times) >/dev/null 2>&1 && at_times_p=:
+
+# CLI Arguments to pass to the debugging scripts.
+at_debug_args=
+# -e sets to true
+at_errexit_p=false
+# Shall we be verbose?
+at_verbose=:
+at_quiet=echo
+
+# Shall we keep the debug scripts? Must be `:' when the suite is
+# run by a debug script, so that the script doesn't remove itself.
+at_debug_p=false
+# Display help message?
+at_help_p=false
+# Display the version message?
+at_version_p=false
+# List test groups?
+at_list_p=false
+# Test groups to run
+at_groups=
+
+# The directory we are in.
+at_dir=`pwd`
+# The directory the whole suite works in.
+# Should be absolutely to let the user `cd' at will.
+at_suite_dir=$at_dir/$as_me.dir
+# The file containing the suite.
+at_suite_log=$at_dir/$as_me.log
+# The file containing the location of the last AT_CHECK.
+at_check_line_file=$at_suite_dir/at-check-line
+# The file containing the exit status of the last command.
+at_status_file=$at_suite_dir/at-status
+# The files containing the output of the tested commands.
+at_stdout=$at_suite_dir/at-stdout
+at_stder1=$at_suite_dir/at-stder1
+at_stderr=$at_suite_dir/at-stderr
+# The file containing dates.
+at_times_file=$at_suite_dir/at-times
+
+# List of the tested programs.
+at_tested='tar'
+# List of the all the test groups.
+at_groups_all=' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72'
+# As many question marks as there are digits in the last test group number.
+# Used to normalize the test group numbers so that `ls' lists them in
+# numerical order.
+at_format='??'
+# Description of all the test groups.
+at_help_all='1;version.at:19;tar version;;
+2;pipe.at:29;decompressing from stdin;pipe;
+3;options.at:24;mixing options;options options00;
+4;options02.at:26;interspersed options;options options02;
+5;T-empty.at:26;files-from: empty entries;files-from empty;
+6;T-null.at:21;files-from: 0-separated file without -0;files-from null;
+7;indexfile.at:26;tar --index-file=this_is_a_very_long_file_name_which_raises_issues.c --file=-;stdout indexfile;
+8;verbose.at:26;tar cvf -;stdout verbose;
+9;append.at:21;append;append append00;
+10;append01.at:29;appending files with long names;append append01;
+11;append02.at:40;append vs. create;append append02 append-gnu;
+12;exclude.at:23;exclude;exclude;
+13;delete01.at:23;deleting a member after a big one;delete delete01;
+14;delete02.at:23;deleting a member from stdin archive;delete delete02;
+15;delete03.at:21;deleting members with long names;delete delete03;
+16;delete04.at:23;deleting a large last member;delete delete04;
+17;delete05.at:27;deleting non-existing member;delete delete05;
+18;extrac01.at:23;extract over an existing directory;extract extract01;
+19;extrac02.at:23;extracting symlinks over an existing file;extract extract02 symlink;
+20;extrac03.at:23;extraction loops;extract extract03;
+21;extrac04.at:23;extract + fnmatch;extract extract04 fnmatch;
+22;extrac05.at:30;extracting selected members from pax;extract extract05;
+23;extrac06.at:33;mode of extracted directories;extract extract06 directory mode;
+24;extrac07.at:27;extracting symlinks to a read-only dir;extract extract07 read-only symlink;
+25;gzip.at:23;gzip;gzip;
+26;incremental.at:23;incremental;incremental incr00;
+27;incr01.at:27;restore broken symlinks from incremental;incremental incr01;
+28;incr02.at:32;restoring timestamps from incremental;incremental timestamp restore incr02;
+29;listed01.at:26;--listed for individual files;listed incremental listed01;
+30;listed02.at:28;working --listed;listed incremental listed02;
+31;incr03.at:28;renamed files in incrementals;incremental incr03 rename;
+32;incr04.at:29;proper icontents initialization;incremental incr04 icontents;
+33;rename01.at:24;renamed dirs in incrementals;incremental rename rename01;
+34;rename02.at:24;move between hierarchies;incremental rename rename02;
+35;rename03.at:23;cyclic renames;incremental rename rename03 cyclic-rename;
+36;chtype.at:27;changed file types in incrementals;incremental chtype;
+37;ignfail.at:23;ignfail;ignfail;
+38;link01.at:33;link count gt 2;link01;
+39;longv7.at:24;long names in V7 archives;longname longv7;
+40;long01.at:28;long file names divisible by block size;longname long512;
+41;lustar01.at:21;ustar: unsplittable file name;longname ustar lustar01;
+42;lustar02.at:21;ustar: unsplittable path name;longname ustar lustar02;
+43;lustar03.at:21;ustar: splitting long names;longname ustar lustar03;
+44;multiv01.at:23;multivolume dumps from pipes;multivolume multiv multiv01;
+45;multiv02.at:28;skipping a straddling member;multivolume multiv multiv02;
+46;multiv03.at:30;MV archive & long filenames;multivolume multiv multiv03;
+47;multiv04.at:36;split directory members in a MV archive;multivolume multiv incremental multiv04;
+48;multiv05.at:26;Restoring after an out of sync folume;multivolume multiv multiv05 sync;
+49;old.at:23;old archives;old;
+50;recurse.at:21;recurse;recurse;
+51;same-order01.at:26;working -C with --same-order;same-order same-order01;
+52;same-order02.at:25;multiple -C options;same-order same-order02;
+53;shortrec.at:25;short records;shortrec.at;
+54;sparse01.at:21;sparse files;sparse sparse01;
+55;sparse02.at:21;extracting sparse file over a pipe;sparse sparse02;
+56;sparse03.at:21;storing sparse files > 8G;sparse sparse03;
+57;sparsemv.at:21;sparse files in MV archives;sparse multiv sparsemv;
+58;spmvp00.at:21;sparse files in PAX MV archives, v.0.0;sparse multiv sparsemvp sparsemvp00;
+59;spmvp01.at:21;sparse files in PAX MV archives, v.0.1;sparse multiv sparsemvp sparsemvp01;
+60;spmvp10.at:21;sparse files in PAX MV archives, v.1.0;sparse multiv sparsemvp sparsemvp10;
+61;update.at:27;update unchanged directories;update;
+62;volume.at:23;volume;volume volcheck;
+63;volsize.at:29;volume header size;volume volsize;
+64;comprec.at:21;compressed format recognition;comprec;
+65;truncate.at:29;truncate;truncate filechange;
+66;grow.at:24;grow;grow filechange;
+67;gtarfail.at:21;gtarfail;star gtarfail;
+68;gtarfail2.at:21;gtarfail2;star gtarfail2;
+69;multi-fail.at:21;multi-fail;star multivolume multiv multi-fail;
+70;ustar-big-2g.at:21;ustar-big-2g;star ustar-big-2g;
+71;ustar-big-8g.at:21;ustar-big-8g;star ustar-big-8g;
+72;pax-big-10g.at:21;pax-big-10g;star pax-big-10g;
+'
+
+at_prev=
+for at_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$at_prev"; then
+ at_option=$at_prev=$at_option
+ at_prev=
+ fi
+
+ case $at_option in
+ *=*) at_optarg=`expr "x$at_option" : 'x[^=]*=\(.*\)'` ;;
+ *) at_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $at_option in
+ --help | -h )
+ at_help_p=:
+ ;;
+
+ --list | -l )
+ at_list_p=:
+ ;;
+
+ --version | -V )
+ at_version_p=:
+ ;;
+
+ --clean | -c )
+ test -d "$at_suite_dir" &&
+ find "$at_suite_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
+ rm -f -r "$at_suite_dir" "$at_suite_log"
+ exit 0
+ ;;
+
+ --debug | -d )
+ at_debug_p=:
+ ;;
+
+ --errexit | -e )
+ at_debug_p=:
+ at_errexit_p=:
+ ;;
+
+ --verbose | -v )
+ at_verbose=echo; at_quiet=:
+ ;;
+
+ --trace | -x )
+ at_traceon='set -x'; at_traceoff='set +x'
+ ;;
+
+ [0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9])
+ at_groups="$at_groups$at_option "
+ ;;
+
+ # Ranges
+ [0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-)
+ at_range_start=`echo $at_option |tr -d X-`
+ at_range=`echo " $at_groups_all " | \
+ sed -e 's/^.* \('$at_range_start' \)/\1/'`
+ at_groups="$at_groups$at_range "
+ ;;
+
+ -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9])
+ at_range_end=`echo $at_option |tr -d X-`
+ at_range=`echo " $at_groups_all " | \
+ sed -e 's/\( '$at_range_end'\) .*$/\1/'`
+ at_groups="$at_groups$at_range "
+ ;;
+
+ [0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9] | \
+ [0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9] | \
+ [0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9] | \
+ [0-9][0-9][0-9]-[0-9][0-9][0-9] | \
+ [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] | \
+ [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] )
+ at_range_start=`expr $at_option : '\(.*\)-'`
+ at_range_end=`expr $at_option : '.*-\(.*\)'`
+ if test $at_range_start -gt $at_range_end; then
+ at_tmp=$at_range_end
+ at_range_end=$at_range_start
+ at_range_start=$at_tmp
+ fi
+ at_range=`echo " $at_groups_all " | \
+ sed -e 's/^.*\( '$at_range_start' \)/\1/' \
+ -e 's/\( '$at_range_end'\) .*$/\1/'`
+ at_groups="$at_groups$at_range "
+ ;;
+
+ # Keywords.
+ --keywords | -k )
+ at_prev=--keywords
+ ;;
+ --keywords=* )
+ at_groups_selected=$at_help_all
+ at_save_IFS=$IFS
+ IFS=,
+ set X $at_optarg
+ shift
+ IFS=$at_save_IFS
+ for at_keyword
+ do
+ at_invert=
+ case $at_keyword in
+ '!'*)
+ at_invert="-v"
+ at_keyword=`expr "X$at_keyword" : 'X!\(.*\)'`
+ ;;
+ esac
+ # It is on purpose that we match the test group titles too.
+ at_groups_selected=`echo "$at_groups_selected" |
+ grep -i $at_invert "^[1-9][^;]*;.*[; ]$at_keyword[ ;]"`
+ done
+ at_groups_selected=`echo "$at_groups_selected" | sed 's/;.*//'`
+ # Smash the newlines.
+ at_groups="$at_groups`echo $at_groups_selected` "
+ ;;
+
+ *=*)
+ at_envvar=`expr "x$at_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$at_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $at_envvar" >&2
+ { (exit 1); exit 1; }; }
+ at_value=`echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$at_envvar='$at_value'"
+ export $at_envvar
+ # Propagate to debug scripts.
+ at_debug_args="$at_debug_args $at_envvar='$at_value'"
+ ;;
+
+ *) echo "$as_me: invalid option: $at_option" >&2
+ echo "Try \`$0 --help' for more information." >&2
+ exit 1
+ ;;
+ esac
+done
+
+# Selected test groups.
+if test -z "$at_groups"; then
+ at_groups=$at_groups_all
+else
+ # Sort the tests, removing duplicates:
+ at_groups=`echo $at_groups | tr ' ' "$as_nl" | sort -nu`
+ # and add banners. (Passing at_groups_all is tricky--see the comment
+ # starting with "Passing at_groups is tricky.")
+ at_groups=`echo "$at_groups$as_nl $at_groups_all" |
+ awk 'BEGIN { FS = "@" } # Effectively switch off field splitting.
+ /^$/ { next } # Ignore the empty line.
+ !/ / { groups++; selected[$ 0] = 1; next }
+ # The last line, containing at_groups_all.
+ {
+ n = split($ 0, a, " ")
+ # If there are several tests, select their banners:
+ if (groups > 1) {
+ for (i = 1; i <= n; i++) {
+ if (a[i] ~ /^banner-/)
+ banner = a[i]
+ else if (banner != "" && selected[a[i]] == 1)
+ selected[banner] = 1
+ }
+ }
+ for (i = 1; i <= n; i++)
+ if (selected[a[i]] == 1)
+ list = list " " a[i]
+ print list
+ }'`
+fi
+
+# Help message.
+if $at_help_p; then
+ cat <<_ATEOF
+Usage: $0 [OPTION]... [VARIABLE=VALUE]... [TESTS]
+
+Run all the tests, or the selected TESTS, given by numeric ranges, and
+save a detailed log file. Upon failure, create debugging scripts.
+
+You should not change environment variables unless explicitly passed
+as command line arguments. Set \`AUTOTEST_PATH' to select the executables
+to exercise. Each relative directory is expanded as build and source
+directories relatively to the top level of this distribution. E.g.,
+
+ $ $0 AUTOTEST_PATH=bin
+
+possibly amounts into
+
+ PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH
+_ATEOF
+cat <<_ATEOF
+
+Operation modes:
+ -h, --help print the help message, then exit
+ -V, --version print version number, then exit
+ -c, --clean remove all the files this test suite might create and exit
+ -l, --list describes all the tests, or the selected TESTS
+_ATEOF
+cat <<_ATEOF
+
+Execution tuning:
+ -k, --keywords=KEYWORDS
+ select the tests matching all the comma-separated KEYWORDS
+ multiple \`-k' accumulate; prefixed \`!' negates a KEYWORD
+ -e, --errexit abort as soon as a test fails; implies --debug
+ -v, --verbose force more detailed output
+ default for debugging scripts
+ -d, --debug inhibit clean up and top-level logging
+ default for debugging scripts
+ -x, --trace enable tests shell tracing
+_ATEOF
+cat <<_ATEOF
+
+Report bugs to <bug-tar@gnu.org>.
+_ATEOF
+ exit 0
+fi
+
+# List of tests.
+if $at_list_p; then
+ cat <<_ATEOF
+GNU tar 1.17 test suite test groups:
+
+ NUM: FILE-NAME:LINE TEST-GROUP-NAME
+ KEYWORDS
+
+_ATEOF
+ # Passing at_groups is tricky. We cannot use it to form a literal string
+ # or regexp because of the limitation of AIX awk. And Solaris' awk
+ # doesn't grok more than 99 fields in a record, so we have to use `split'.
+ echo "$at_groups$as_nl$at_help_all" |
+ awk 'BEGIN { FS = ";" }
+ NR == 1 {
+ for (n = split($ 0, a, " "); n; n--) selected[a[n]] = 1
+ next
+ }
+ {
+ if (selected[$ 1]) {
+ printf " %3d: %-18s %s\n", $ 1, $ 2, $ 3
+ if ($ 4) printf " %s\n", $ 4
+ }
+ }'
+ exit 0
+fi
+if $at_version_p; then
+ echo "$as_me (GNU tar 1.17)"
+ cat <<\_ACEOF
+
+Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+Foundation, Inc.
+This test suite is free software; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+
+# Don't take risks: use only absolute directories in PATH.
+#
+# For stand-alone test suites, AUTOTEST_PATH is relative to `.'.
+#
+# For embedded test suites, AUTOTEST_PATH is relative to the top level
+# of the package. Then expand it into build/src parts, since users
+# may create executables in both places.
+AUTOTEST_PATH=`echo $AUTOTEST_PATH | sed "s&:&$PATH_SEPARATOR&g"`
+at_path=
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $AUTOTEST_PATH $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -n "$at_path" && at_path=$at_path$PATH_SEPARATOR
+case $as_dir in
+ [\\/]* | ?:[\\/]* )
+ at_path=$at_path$as_dir
+ ;;
+ * )
+ if test -z "$at_top_build_prefix"; then
+ # Stand-alone test suite.
+ at_path=$at_path$as_dir
+ else
+ # Embedded test suite.
+ at_path=$at_path$at_top_build_prefix$as_dir$PATH_SEPARATOR
+ at_path=$at_path$at_top_srcdir/$as_dir
+ fi
+ ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+# Now build and simplify PATH.
+#
+# There might be directories that don't exist, but don't redirect
+# builtins' (eg., cd) stderr directly: Ultrix's sh hates that.
+PATH=
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $at_path
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_dir=`(cd "$as_dir" && pwd) 2>/dev/null`
+test -d "$as_dir" || continue
+case $PATH in
+ $as_dir | \
+ $as_dir$PATH_SEPARATOR* | \
+ *$PATH_SEPARATOR$as_dir | \
+ *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR* ) ;;
+
+ '') PATH=$as_dir ;;
+ *) PATH=$PATH$PATH_SEPARATOR$as_dir ;;
+esac
+done
+IFS=$as_save_IFS
+
+export PATH
+
+# Setting up the FDs.
+# 5 is the log file. Not to be overwritten if `-d'.
+
+if $at_debug_p; then
+ at_suite_log=/dev/null
+else
+ : >"$at_suite_log"
+fi
+exec 5>>"$at_suite_log"
+
+# Banners and logs.
+cat <<\_ASBOX
+## ------------------------ ##
+## GNU tar 1.17 test suite. ##
+## ------------------------ ##
+_ASBOX
+{
+ cat <<\_ASBOX
+## ------------------------ ##
+## GNU tar 1.17 test suite. ##
+## ------------------------ ##
+_ASBOX
+ echo
+
+ echo "$as_me: command line was:"
+ echo " $ $0 $at_cli_args"
+ echo
+
+ # Try to find a few ChangeLogs in case it might help determining the
+ # exact version. Use the relative dir: if the top dir is a symlink,
+ # find will not follow it (and options to follow the links are not
+ # portable), which would result in no output here.
+ if test -n "$at_top_srcdir"; then
+ cat <<\_ASBOX
+## ----------- ##
+## ChangeLogs. ##
+## ----------- ##
+_ASBOX
+ echo
+ for at_file in `find "$at_top_srcdir" -name ChangeLog -print`
+ do
+ echo "$as_me: $at_file:"
+ sed 's/^/| /;10q' $at_file
+ echo
+ done
+
+ {
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+}
+ echo
+ fi
+
+ # Contents of the config files.
+ for at_file in atconfig atlocal
+ do
+ test -r $at_file || continue
+ echo "$as_me: $at_file:"
+ sed 's/^/| /' $at_file
+ echo
+ done
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Tested programs. ##
+## ---------------- ##
+_ASBOX
+ echo
+} >&5
+
+# Report what programs are being tested.
+for at_program in : $at_tested
+do
+ test "$at_program" = : && continue
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -f "$as_dir/$at_program" && break
+done
+IFS=$as_save_IFS
+
+ if test -f "$as_dir/$at_program"; then
+ {
+ echo "$at_srcdir/testsuite.at:92: $as_dir/$at_program --version"
+ "$as_dir/$at_program" --version
+ echo
+ } >&5 2>&1
+ else
+ { { echo "$as_me:$LINENO: error: cannot find $at_program" >&5
+echo "$as_me: error: cannot find $at_program" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+{
+ cat <<\_ASBOX
+## ------------------ ##
+## Running the tests. ##
+## ------------------ ##
+_ASBOX
+} >&5
+
+at_start_date=`date`
+at_start_time=`date +%s 2>/dev/null`
+echo "$as_me: starting at: $at_start_date" >&5
+at_xpass_list=
+at_xfail_list=
+at_pass_list=
+at_fail_list=
+at_skip_list=
+at_group_count=0
+
+# Create the master directory if it doesn't already exist.
+test -d "$at_suite_dir" ||
+ mkdir "$at_suite_dir" ||
+ { { echo "$as_me:$LINENO: error: cannot create '$at_suite_dir'" >&5
+echo "$as_me: error: cannot create '$at_suite_dir'" >&2;}
+ { (exit 1); exit 1; }; }
+
+# Can we diff with `/dev/null'? DU 5.0 refuses.
+if diff /dev/null /dev/null >/dev/null 2>&1; then
+ at_devnull=/dev/null
+else
+ at_devnull=$at_suite_dir/devnull
+ >"$at_devnull"
+fi
+
+# Use `diff -u' when possible.
+if at_diff=`diff -u "$at_devnull" "$at_devnull" 2>&1` && test -z "$at_diff"
+then
+ at_diff='diff -u'
+else
+ at_diff=diff
+fi
+
+
+for at_group in $at_groups
+do
+ # Be sure to come back to the top test directory.
+ cd "$at_suite_dir"
+
+ case $at_group in
+ banner-*)
+ at_group_log=$at_suite_log
+ ;;
+
+ *)
+ at_group_normalized=$at_group
+
+ while :; do
+ case $at_group_normalized in #(
+ $at_format*) break;;
+ esac
+ at_group_normalized=0$at_group_normalized
+ done
+
+
+ # Create a fresh directory for the next test group, and enter.
+ at_group_dir=$at_suite_dir/$at_group_normalized
+ at_group_log=$at_group_dir/$as_me.log
+ if test -d "$at_group_dir"; then
+ find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
+ rm -fr "$at_group_dir"
+ fi
+ # Be tolerant if the above `rm' was not able to remove the directory.
+ { as_dir=$at_group_dir
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ cd $at_group_dir
+ ;;
+ esac
+
+ echo 0 > "$at_status_file"
+
+ # Clearly separate the test groups when verbose.
+ test $at_group_count != 0 && $at_verbose
+
+ # In verbose mode, append to the log file *and* show on
+ # the standard output; in quiet mode only write to the log
+ if test $at_verbose = echo; then
+ at_tee_pipe='tee -a "$at_group_log"'
+ else
+ at_tee_pipe='cat >> "$at_group_log"'
+ fi
+
+ case $at_group in
+ 1 ) # 1. version.at:19: tar version
+ at_setup_line='version.at:19'
+ at_desc='tar version'
+ $at_quiet $ECHO_N " 1: tar version $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "1. version.at:19: testing ..."
+ $at_traceon
+
+
+$at_traceoff
+echo "$at_srcdir/version.at:21: tar --version | sed 1q"
+echo version.at:21 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ at_trace_this=yes
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon; tar --version | sed 1q ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :; tar --version | sed 1q ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "tar (GNU tar) 1.17
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/version.at:21: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+ cat >$XFAILFILE <<'_EOT'
+
+==============================================================
+WARNING: Not using the proper version, *all* checks dubious...
+==============================================================
+_EOT
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+else
+ rm -f $XFAILFILE
+fi
+
+$at_traceon
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 2 ) # 2. pipe.at:29: decompressing from stdin
+ at_setup_line='pipe.at:29'
+ at_desc='decompressing from stdin'
+ $at_quiet $ECHO_N " 2: decompressing from stdin $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "2. pipe.at:29: testing ..."
+ $at_traceon
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/pipe.at:33:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo \"separator\"
+cmp orig/file1 directory/file1
+echo \"separator\"
+cmp orig/file2 directory/file2)"
+echo pipe.at:33 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file1
+directory/file2
+separator
+separator
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/pipe.at:33: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/pipe.at:33:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo \"separator\"
+cmp orig/file1 directory/file1
+echo \"separator\"
+cmp orig/file2 directory/file2)"
+echo pipe.at:33 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file1
+directory/file2
+separator
+separator
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/pipe.at:33: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/pipe.at:33:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo \"separator\"
+cmp orig/file1 directory/file1
+echo \"separator\"
+cmp orig/file2 directory/file2)"
+echo pipe.at:33 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file1
+directory/file2
+separator
+separator
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/pipe.at:33: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/pipe.at:33:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo \"separator\"
+cmp orig/file1 directory/file1
+echo \"separator\"
+cmp orig/file2 directory/file2)"
+echo pipe.at:33 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file1
+directory/file2
+separator
+separator
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/pipe.at:33: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/pipe.at:33:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo \"separator\"
+cmp orig/file1 directory/file1
+echo \"separator\"
+cmp orig/file2 directory/file2)"
+echo pipe.at:33 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 13 --file directory/file2
+tar cf archive directory|sort
+mv directory orig
+cat archive | tar xfv - | sort
+echo "separator"
+cmp orig/file1 directory/file1
+echo "separator"
+cmp orig/file2 directory/file2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file1
+directory/file2
+separator
+separator
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/pipe.at:33: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 3 ) # 3. options.at:24: mixing options
+ at_setup_line='options.at:24'
+ at_desc='mixing options'
+ $at_quiet $ECHO_N " 3: mixing options $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "3. options.at:24: testing ..."
+ $at_traceon
+
+
+
+$at_traceoff
+echo "$at_srcdir/options.at:27:
+echo > file1
+TAR_OPTIONS=--numeric-owner tar chof archive file1
+tar tf archive
+"
+echo options.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+echo > file1
+TAR_OPTIONS=--numeric-owner tar chof archive file1
+tar tf archive
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+echo > file1
+TAR_OPTIONS=--numeric-owner tar chof archive file1
+tar tf archive
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/options.at:27: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 4 ) # 4. options02.at:26: interspersed options
+ at_setup_line='options02.at:26'
+ at_desc='interspersed options'
+ $at_quiet $ECHO_N " 4: interspersed options $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "4. options02.at:26: testing ..."
+ $at_traceon
+
+
+
+$at_traceoff
+echo "$at_srcdir/options02.at:29:
+echo > file1
+tar c file1 -f archive
+tar tf archive
+"
+echo options02.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+echo > file1
+tar c file1 -f archive
+tar tf archive
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+echo > file1
+tar c file1 -f archive
+tar tf archive
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/options02.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 5 ) # 5. T-empty.at:26: files-from: empty entries
+ at_setup_line='T-empty.at:26'
+ at_desc='files-from: empty entries'
+ $at_quiet $ECHO_N " 5: files-from: empty entries $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "5. T-empty.at:26: testing ..."
+ $at_traceon
+
+
+
+cat >file-list <<'_ATEOF'
+jeden
+dwa
+
+trzy
+_ATEOF
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/T-empty.at:36:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile --file jeden
+genfile --file dwa
+genfile --file trzy
+
+tar cfvT archive ../file-list | sort
+)"
+echo T-empty.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile --file jeden
+genfile --file dwa
+genfile --file trzy
+
+tar cfvT archive ../file-list | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile --file jeden
+genfile --file dwa
+genfile --file trzy
+
+tar cfvT archive ../file-list | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "dwa
+jeden
+trzy
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/T-empty.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+ # Testing one format is enough
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 6 ) # 6. T-null.at:21: files-from: 0-separated file without -0
+ at_setup_line='T-null.at:21'
+ at_desc='files-from: 0-separated file without -0'
+ $at_quiet $ECHO_N " 6: files-from: 0-separated file without -0 $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "6. T-null.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/T-null.at:24:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+echo dwa > temp
+echo trzy >> temp
+cat temp | tr '\\n' '\\0' > temp1
+echo jeden > file-list
+cat temp1 >> file-list
+
+genfile -f \"jeden
+dwa\" || exit 77
+genfile -f trzy
+
+tar cfTv archive file-list | sort
+)"
+echo T-null.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+echo dwa > temp
+echo trzy >> temp
+cat temp | tr '\n' '\0' > temp1
+echo jeden > file-list
+cat temp1 >> file-list
+
+genfile -f "jeden
+dwa" || exit 77
+genfile -f trzy
+
+tar cfTv archive file-list | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+echo dwa > temp
+echo trzy >> temp
+cat temp | tr '\n' '\0' > temp1
+echo jeden > file-list
+cat temp1 >> file-list
+
+genfile -f "jeden
+dwa" || exit 77
+genfile -f trzy
+
+tar cfTv archive file-list | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: file-list: file name read contains nul character
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "jeden\\ndwa
+trzy
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/T-null.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+ # Testing one format is enough
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 7 ) # 7. indexfile.at:26: tar --index-file=FILE --file=-
+ at_setup_line='indexfile.at:26'
+ at_desc='tar --index-file=FILE --file=-'
+ $at_quiet $ECHO_N " 7: tar --index-file=FILE --file=- $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "7. indexfile.at:26: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/indexfile.at:29:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo \"Creating the archive\"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo \"Testing the archive\"
+tar -tf archive
+)"
+echo indexfile.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+directory/
+directory/a
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/indexfile.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/indexfile.at:29:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo \"Creating the archive\"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo \"Testing the archive\"
+tar -tf archive
+)"
+echo indexfile.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+directory/
+directory/a
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/indexfile.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/indexfile.at:29:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo \"Creating the archive\"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo \"Testing the archive\"
+tar -tf archive
+)"
+echo indexfile.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+directory/
+directory/a
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/indexfile.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/indexfile.at:29:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo \"Creating the archive\"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo \"Testing the archive\"
+tar -tf archive
+)"
+echo indexfile.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+directory/
+directory/a
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/indexfile.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/indexfile.at:29:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo \"Creating the archive\"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo \"Testing the archive\"
+tar -tf archive
+)"
+echo indexfile.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+genfile --file=directory/a --length=1035
+
+echo "Creating the archive"
+tar -c -v -f - --index-file=idx directory > archive
+
+echo "Testing the archive"
+tar -tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+directory/
+directory/a
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/indexfile.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 8 ) # 8. verbose.at:26: tar cvf -
+ at_setup_line='verbose.at:26'
+ at_desc='tar cvf -'
+ $at_quiet $ECHO_N " 8: tar cvf - $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "8. verbose.at:26: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/verbose.at:29:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+)"
+echo verbose.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "file
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/verbose.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/verbose.at:29:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+)"
+echo verbose.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "file
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/verbose.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/verbose.at:29:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+)"
+echo verbose.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "file
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/verbose.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/verbose.at:29:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+)"
+echo verbose.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "file
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/verbose.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/verbose.at:29:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+)"
+echo verbose.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "file
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating the archive
+Testing the archive
+file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/verbose.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 9 ) # 9. append.at:21: append
+ at_setup_line='append.at:21'
+ at_desc='append'
+ $at_quiet $ECHO_N " 9: append $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "9. append.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/append.at:24:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive)"
+echo append.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append.at:24:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive)"
+echo append.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append.at:24:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive)"
+echo append.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append.at:24:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive)"
+echo append.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append.at:24:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive)"
+echo append.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+touch file1
+ touch file2
+ tar cf archive file1
+ tar rf archive file2
+ tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 10 ) # 10. append01.at:29: appending files with long names
+ at_setup_line='append01.at:29'
+ at_desc='appending files with long names'
+ $at_quiet $ECHO_N " 10: appending files with long names $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "10. append01.at:29: testing ..."
+ $at_traceon
+
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/append01.at:34:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+)"
+echo append01.at:34 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append01.at:34: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append01.at:34:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+)"
+echo append01.at:34 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append01.at:34: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append01.at:34:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+)"
+echo append01.at:34 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append01.at:34: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append01.at:34:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+)"
+echo append01.at:34 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX
+touch This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1 This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar cf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+tar rf archive This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file1
+This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_appending_long_file_names_that_run_into_a_limit_of_the_ustar_tarX/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append01.at:34: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 11 ) # 11. append02.at:40: append vs. create
+ at_setup_line='append02.at:40'
+ at_desc='append vs. create'
+ $at_quiet $ECHO_N " 11: append vs. create $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "11. append02.at:40: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/append02.at:43:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME=\"--mtime=@0\"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test \$TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS=\"\$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime\"
+fi
+
+echo Creating archive.1
+tar \$MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar \$MTIME -cf archive.2 -T /dev/null
+tar \$MTIME -rf archive.2 file1
+tar \$MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+)"
+echo append02.at:43 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating archive.1
+Creating archive.2
+Comparing archives
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append02.at:43: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append02.at:43:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME=\"--mtime=@0\"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test \$TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS=\"\$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime\"
+fi
+
+echo Creating archive.1
+tar \$MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar \$MTIME -cf archive.2 -T /dev/null
+tar \$MTIME -rf archive.2 file1
+tar \$MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+)"
+echo append02.at:43 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating archive.1
+Creating archive.2
+Comparing archives
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append02.at:43: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append02.at:43:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME=\"--mtime=@0\"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test \$TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS=\"\$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime\"
+fi
+
+echo Creating archive.1
+tar \$MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar \$MTIME -cf archive.2 -T /dev/null
+tar \$MTIME -rf archive.2 file1
+tar \$MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+)"
+echo append02.at:43 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating archive.1
+Creating archive.2
+Comparing archives
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append02.at:43: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append02.at:43:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME=\"--mtime=@0\"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test \$TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS=\"\$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime\"
+fi
+
+echo Creating archive.1
+tar \$MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar \$MTIME -cf archive.2 -T /dev/null
+tar \$MTIME -rf archive.2 file1
+tar \$MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+)"
+echo append02.at:43 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating archive.1
+Creating archive.2
+Comparing archives
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append02.at:43: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/append02.at:43:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME=\"--mtime=@0\"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test \$TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS=\"\$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime\"
+fi
+
+echo Creating archive.1
+tar \$MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar \$MTIME -cf archive.2 -T /dev/null
+tar \$MTIME -rf archive.2 file1
+tar \$MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+)"
+echo append02.at:43 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file file1
+genfile --file file2
+
+# Make sure file timestamps in the archive will not differ
+MTIME="--mtime=@0"
+
+# For PAX archives, we need to make sure extended header names are
+# reproducible and that their contents won't change with time
+if test $TEST_TAR_FORMAT = posix; then
+ TAR_OPTIONS="$TAR_OPTIONS --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=mtime,delete=atime,delete=ctime"
+fi
+
+echo Creating archive.1
+tar $MTIME -cf archive.1 file1 file2
+
+echo Creating archive.2
+tar $MTIME -cf archive.2 -T /dev/null
+tar $MTIME -rf archive.2 file1
+tar $MTIME -rf archive.2 file2
+
+echo Comparing archives
+cmp archive.1 archive.2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating archive.1
+Creating archive.2
+Comparing archives
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/append02.at:43: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 12 ) # 12. exclude.at:23: exclude
+ at_setup_line='exclude.at:23'
+ at_desc='exclude'
+ $at_quiet $ECHO_N " 12: exclude $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "12. exclude.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/exclude.at:26:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir dir
+echo blues > dir/blues
+echo jazz > dir/jazz
+mkdir dir/folk
+echo tagfile > dir/folk/tagfile
+echo sanjuan > dir/folk/sanjuan
+mkdir dir/rock
+echo \"Signature: 8a477f597d28d172789f06886806bc55\" > dir/rock/CACHEDIR.TAG
+echo \"test\" > dir/rock/file
+
+for option in exclude-caches exclude-caches-under exclude-caches-all
+do
+ echo OPTION \$option
+ tar -cf archive.tar --\$option -v dir 2>err
+ cat err
+ echo ARCHIVE
+ tar tf archive.tar
+done
+
+for option in exclude-tag exclude-tag-under exclude-tag-all
+do
+ echo OPTION \$option
+ tar -cf archive.tar --\${option}=tagfile -v dir 2>err
+ cat err
+ echo ARCHIVE
+ tar tf archive.tar
+done
+)"
+echo exclude.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a ${...} parameter expansion)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir dir
+echo blues > dir/blues
+echo jazz > dir/jazz
+mkdir dir/folk
+echo tagfile > dir/folk/tagfile
+echo sanjuan > dir/folk/sanjuan
+mkdir dir/rock
+echo "Signature: 8a477f597d28d172789f06886806bc55" > dir/rock/CACHEDIR.TAG
+echo "test" > dir/rock/file
+
+for option in exclude-caches exclude-caches-under exclude-caches-all
+do
+ echo OPTION $option
+ tar -cf archive.tar --$option -v dir 2>err
+ cat err
+ echo ARCHIVE
+ tar tf archive.tar
+done
+
+for option in exclude-tag exclude-tag-under exclude-tag-all
+do
+ echo OPTION $option
+ tar -cf archive.tar --${option}=tagfile -v dir 2>err
+ cat err
+ echo ARCHIVE
+ tar tf archive.tar
+done
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir dir
+echo blues > dir/blues
+echo jazz > dir/jazz
+mkdir dir/folk
+echo tagfile > dir/folk/tagfile
+echo sanjuan > dir/folk/sanjuan
+mkdir dir/rock
+echo "Signature: 8a477f597d28d172789f06886806bc55" > dir/rock/CACHEDIR.TAG
+echo "test" > dir/rock/file
+
+for option in exclude-caches exclude-caches-under exclude-caches-all
+do
+ echo OPTION $option
+ tar -cf archive.tar --$option -v dir 2>err
+ cat err
+ echo ARCHIVE
+ tar tf archive.tar
+done
+
+for option in exclude-tag exclude-tag-under exclude-tag-all
+do
+ echo OPTION $option
+ tar -cf archive.tar --${option}=tagfile -v dir 2>err
+ cat err
+ echo ARCHIVE
+ tar tf archive.tar
+done
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "OPTION exclude-caches
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+dir/rock/
+dir/rock/CACHEDIR.TAG
+tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; contents not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+dir/rock/
+dir/rock/CACHEDIR.TAG
+OPTION exclude-caches-under
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+dir/rock/
+tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; contents not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+dir/rock/
+OPTION exclude-caches-all
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; directory not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/folk/sanjuan
+OPTION exclude-tag
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+tar: dir/folk/: contains a cache directory tag tagfile; contents not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/folk/tagfile
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+OPTION exclude-tag-under
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+tar: dir/folk/: contains a cache directory tag tagfile; contents not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/folk/
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+OPTION exclude-tag-all
+dir/
+dir/blues
+dir/jazz
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+tar: dir/folk/: contains a cache directory tag tagfile; directory not dumped
+ARCHIVE
+dir/
+dir/blues
+dir/jazz
+dir/rock/
+dir/rock/CACHEDIR.TAG
+dir/rock/file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/exclude.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 13 ) # 13. delete01.at:23: deleting a member after a big one
+ at_setup_line='delete01.at:23'
+ at_desc='deleting a member after a big one'
+ $at_quiet $ECHO_N " 13: deleting a member after a big one $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "13. delete01.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/delete01.at:26:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive)"
+echo delete01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete01.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive)"
+echo delete01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete01.at:26:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive)"
+echo delete01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete01.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive)"
+echo delete01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete01.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive)"
+echo delete01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 50000 --file file1
+genfile -l 1024 --file file2
+tar cf archive file1 file2
+tar f archive --delete file2
+tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 14 ) # 14. delete02.at:23: deleting a member from stdin archive
+ at_setup_line='delete02.at:23'
+ at_desc='deleting a member from stdin archive'
+ $at_quiet $ECHO_N " 14: deleting a member from stdin archive $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "14. delete02.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/delete02.at:26:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2)"
+echo delete02.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "1
+2
+3
+separator
+1
+3
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete02.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete02.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2)"
+echo delete02.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "1
+2
+3
+separator
+1
+3
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete02.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete02.at:26:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2)"
+echo delete02.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "1
+2
+3
+separator
+1
+3
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete02.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete02.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2)"
+echo delete02.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "1
+2
+3
+separator
+1
+3
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete02.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete02.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2)"
+echo delete02.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3073 -p zeros --file 1
+cp 1 2
+cp 2 3
+tar cf archive 1 2 3
+tar tf archive
+cat archive | tar f - --delete 2 > archive2
+echo separator
+tar tf archive2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "1
+2
+3
+separator
+1
+3
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete02.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 15 ) # 15. delete03.at:21: deleting members with long names
+ at_setup_line='delete03.at:21'
+ at_desc='deleting members with long names'
+ $at_quiet $ECHO_N " 15: deleting members with long names $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "15. delete03.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/delete03.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+prefix=This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX
+rm -f \$prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch \$prefix\$i
+done
+tar -cf archive ./\$prefix* &&
+ tar --delete -f archive ./\${prefix}5 &&
+ tar -tf archive
+)"
+echo delete03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a ${...} parameter expansion)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+prefix=This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX
+rm -f $prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch $prefix$i
+done
+tar -cf archive ./$prefix* &&
+ tar --delete -f archive ./${prefix}5 &&
+ tar -tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+prefix=This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX
+rm -f $prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch $prefix$i
+done
+tar -cf archive ./$prefix* &&
+ tar --delete -f archive ./${prefix}5 &&
+ tar -tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX1
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX2
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX3
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX4
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX6
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX7
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX8
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX9
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete03.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+prefix=This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX
+rm -f \$prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch \$prefix\$i
+done
+tar -cf archive ./\$prefix* &&
+ tar --delete -f archive ./\${prefix}5 &&
+ tar -tf archive
+)"
+echo delete03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a ${...} parameter expansion)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+prefix=This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX
+rm -f $prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch $prefix$i
+done
+tar -cf archive ./$prefix* &&
+ tar --delete -f archive ./${prefix}5 &&
+ tar -tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+prefix=This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX
+rm -f $prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch $prefix$i
+done
+tar -cf archive ./$prefix* &&
+ tar --delete -f archive ./${prefix}5 &&
+ tar -tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX1
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX2
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX3
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX4
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX6
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX7
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX8
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX9
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete03.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+prefix=This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX
+rm -f \$prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch \$prefix\$i
+done
+tar -cf archive ./\$prefix* &&
+ tar --delete -f archive ./\${prefix}5 &&
+ tar -tf archive
+)"
+echo delete03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a ${...} parameter expansion)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+prefix=This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX
+rm -f $prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch $prefix$i
+done
+tar -cf archive ./$prefix* &&
+ tar --delete -f archive ./${prefix}5 &&
+ tar -tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+prefix=This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX
+rm -f $prefix*
+for i in 1 2 3 4 5 6 7 8 9
+do touch $prefix$i
+done
+tar -cf archive ./$prefix* &&
+ tar --delete -f archive ./${prefix}5 &&
+ tar -tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX1
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX2
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX3
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX4
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX6
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX7
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX8
+./This_is_a_very_long_file_name_prefix_that_is_designed_to_cause_problems_with_file_names_that_run_into_a_limit_of_the_posix_tar_formatXX9
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 16 ) # 16. delete04.at:23: deleting a large last member
+ at_setup_line='delete04.at:23'
+ at_desc='deleting a large last member'
+ $at_quiet $ECHO_N " 16: deleting a large last member $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "16. delete04.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/delete04.at:26:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+)"
+echo delete04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+file3
+file4
+file5
+file6
+file7
+file8
+file9
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete04.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+)"
+echo delete04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+file3
+file4
+file5
+file6
+file7
+file8
+file9
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete04.at:26:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+)"
+echo delete04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+file3
+file4
+file5
+file6
+file7
+file8
+file9
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete04.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+)"
+echo delete04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+file3
+file4
+file5
+file6
+file7
+file8
+file9
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete04.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+)"
+echo delete04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 3 -f file1
+genfile -l 5 -f file2
+genfile -l 3 -f file3
+genfile -l 6 -f file4
+genfile -l 24 -f file5
+genfile -l 13 -f file6
+genfile -l 1385 -f file7
+genfile -l 30 -f file8
+genfile -l 10 -f file9
+genfile -l 256000 -f file10
+tar cf archive file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
+tar f archive --delete file10
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+file3
+file4
+file5
+file6
+file7
+file8
+file9
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 17 ) # 17. delete05.at:27: deleting non-existing member
+ at_setup_line='delete05.at:27'
+ at_desc='deleting non-existing member'
+ $at_quiet $ECHO_N " 17: deleting non-existing member $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "17. delete05.at:27: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/delete05.at:30:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+)"
+echo delete05.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: tre: Not found in archive
+tar: Error exit delayed from previous errors
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "en
+to
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete05.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete05.at:30:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+)"
+echo delete05.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: tre: Not found in archive
+tar: Error exit delayed from previous errors
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "en
+to
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete05.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete05.at:30:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+)"
+echo delete05.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: tre: Not found in archive
+tar: Error exit delayed from previous errors
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "en
+to
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete05.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete05.at:30:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+)"
+echo delete05.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: tre: Not found in archive
+tar: Error exit delayed from previous errors
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "en
+to
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete05.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/delete05.at:30:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+)"
+echo delete05.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f en
+genfile -l 1024 -f to
+
+tar cf archive en to
+# Make sure we don't use bogus blocking factor.
+# GNU tar up to and including 1.14.91 produced an empty archive this way:
+tar --file archive --blocking-factor=20 --delete tre
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: tre: Not found in archive
+tar: Error exit delayed from previous errors
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "en
+to
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/delete05.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 18 ) # 18. extrac01.at:23: extract over an existing directory
+ at_setup_line='extrac01.at:23'
+ at_desc='extract over an existing directory'
+ $at_quiet $ECHO_N " 18: extract over an existing directory $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "18. extrac01.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/extrac01.at:26:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+)"
+echo extrac01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac01.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+)"
+echo extrac01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac01.at:26:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+)"
+echo extrac01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac01.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+)"
+echo extrac01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac01.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+)"
+echo extrac01.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar cf archive directory || exit 1
+tar xf archive || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac01.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 19 ) # 19. extrac02.at:23: extracting symlinks over an existing file
+ at_setup_line='extrac02.at:23'
+ at_desc='extracting symlinks over an existing file'
+ $at_quiet $ECHO_N " 19: extracting symlinks over an existing file $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "19. extrac02.at:23: testing ..."
+ $at_traceon
+
+
+
+# FIXME: Skip if symlinks are not supported on the system
+
+
+
+ $at_traceoff
+echo "$at_srcdir/extrac02.at:28:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+)"
+echo extrac02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac02.at:28:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+)"
+echo extrac02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac02.at:28:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+)"
+echo extrac02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac02.at:28:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+)"
+echo extrac02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac02.at:28:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+)"
+echo extrac02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+touch file
+ln -s file link 2> /dev/null || ln file link
+tar cf archive link
+rm link
+touch link
+tar xf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 20 ) # 20. extrac03.at:23: extraction loops
+ at_setup_line='extrac03.at:23'
+ at_desc='extraction loops'
+ $at_quiet $ECHO_N " 20: extraction loops $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "20. extrac03.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/extrac03.at:26:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive)"
+echo extrac03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/../directory/
+separator
+directory/../directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac03.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive)"
+echo extrac03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/../directory/
+separator
+directory/../directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac03.at:26:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive)"
+echo extrac03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/../directory/
+separator
+directory/../directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac03.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive)"
+echo extrac03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/../directory/
+separator
+directory/../directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac03.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive)"
+echo extrac03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+tar -cPvf archive directory/../directory
+echo separator
+tar -xPvf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/../directory/
+separator
+directory/../directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 21 ) # 21. extrac04.at:23: extract + fnmatch
+ at_setup_line='extrac04.at:23'
+ at_desc='extract + fnmatch'
+ $at_quiet $ECHO_N " 21: extract + fnmatch $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "21. extrac04.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/extrac04.at:26:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \\
+ --exclude='./*1' \\
+ --exclude='d*/*1' \\
+ --exclude='d*/s*/*2' | sort
+)"
+echo extrac04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file2
+directory/subdirectory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac04.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \\
+ --exclude='./*1' \\
+ --exclude='d*/*1' \\
+ --exclude='d*/s*/*2' | sort
+)"
+echo extrac04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file2
+directory/subdirectory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac04.at:26:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \\
+ --exclude='./*1' \\
+ --exclude='d*/*1' \\
+ --exclude='d*/s*/*2' | sort
+)"
+echo extrac04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file2
+directory/subdirectory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac04.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \\
+ --exclude='./*1' \\
+ --exclude='d*/*1' \\
+ --exclude='d*/s*/*2' | sort
+)"
+echo extrac04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file2
+directory/subdirectory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac04.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \\
+ --exclude='./*1' \\
+ --exclude='d*/*1' \\
+ --exclude='d*/s*/*2' | sort
+)"
+echo extrac04.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+touch file1
+mkdir directory
+mkdir directory/subdirectory
+touch directory/file1
+touch directory/file2
+touch directory/subdirectory/file1
+touch directory/subdirectory/file2
+tar -cf archive ./file1 directory
+tar -tf archive \
+ --exclude='./*1' \
+ --exclude='d*/*1' \
+ --exclude='d*/s*/*2' | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/file2
+directory/subdirectory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac04.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 22 ) # 22. extrac05.at:30: extracting selected members from pax
+ at_setup_line='extrac05.at:30'
+ at_desc='extracting selected members from pax'
+ $at_quiet $ECHO_N " 22: extracting selected members from pax $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "22. extrac05.at:30: testing ..."
+ $at_traceon
+
+
+
+cat >list <<'_ATEOF'
+jeden
+cztery
+_ATEOF
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/extrac05.at:38:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 118 --file jeden
+genfile --length 223 --file dwa
+genfile --length 517 --file trzy
+genfile --sparse --file sparsefile 0 ABCD 1M EFGH 2000K IJKL
+genfile --length 110 --file cztery
+
+tar cf archive jeden dwa trzy cztery || exit 1
+
+mkdir dir
+cd dir
+
+tar xvfT ../archive ../../list || exit 1
+
+cd ..
+)"
+echo extrac05.at:38 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 118 --file jeden
+genfile --length 223 --file dwa
+genfile --length 517 --file trzy
+genfile --sparse --file sparsefile 0 ABCD 1M EFGH 2000K IJKL
+genfile --length 110 --file cztery
+
+tar cf archive jeden dwa trzy cztery || exit 1
+
+mkdir dir
+cd dir
+
+tar xvfT ../archive ../../list || exit 1
+
+cd ..
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 118 --file jeden
+genfile --length 223 --file dwa
+genfile --length 517 --file trzy
+genfile --sparse --file sparsefile 0 ABCD 1M EFGH 2000K IJKL
+genfile --length 110 --file cztery
+
+tar cf archive jeden dwa trzy cztery || exit 1
+
+mkdir dir
+cd dir
+
+tar xvfT ../archive ../../list || exit 1
+
+cd ..
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "jeden
+cztery
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac05.at:38: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 23 ) # 23. extrac06.at:33: mode of extracted directories
+ at_setup_line='extrac06.at:33'
+ at_desc='mode of extracted directories'
+ $at_quiet $ECHO_N " 23: mode of extracted directories $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "23. extrac06.at:33: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/extrac06.at:36:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS=\"\$TAR_OPTIONS --no-same-permissions\"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+)"
+echo extrac06.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "777
+755
+755
+755
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac06.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac06.at:36:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS=\"\$TAR_OPTIONS --no-same-permissions\"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+)"
+echo extrac06.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "777
+755
+755
+755
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac06.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac06.at:36:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS=\"\$TAR_OPTIONS --no-same-permissions\"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+)"
+echo extrac06.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "777
+755
+755
+755
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac06.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac06.at:36:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS=\"\$TAR_OPTIONS --no-same-permissions\"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+)"
+echo extrac06.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "777
+755
+755
+755
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac06.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac06.at:36:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS=\"\$TAR_OPTIONS --no-same-permissions\"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+)"
+echo extrac06.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+# Force umask
+umask 022
+
+# Make sure user's umask is honored, even if we are superuser
+TAR_OPTIONS="$TAR_OPTIONS --no-same-permissions"
+
+# Create a directory
+mkdir directory
+chmod 777 directory
+genfile --stat=mode:777 directory
+
+# Archive it
+tar cf arc directory
+
+# Change its permissions ...
+chmod 755 directory
+genfile --stat=mode:777 directory
+
+# ... and attempt to restore it twice
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+tar xf arc directory
+genfile --stat=mode:777 directory
+
+# After both restores, the directory mode should be 755
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "777
+755
+755
+755
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac06.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 24 ) # 24. extrac07.at:27: extracting symlinks to a read-only dir
+ at_setup_line='extrac07.at:27'
+ at_desc='extracting symlinks to a read-only dir'
+ $at_quiet $ECHO_N " 24: extracting symlinks to a read-only dir $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "24. extrac07.at:27: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/extrac07.at:30:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+)"
+echo extrac07.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Prepare the directory
+Create the archive
+Extract
+dir/
+dir/foo
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac07.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+else
+ ustar
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac07.at:30:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+)"
+echo extrac07.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Prepare the directory
+Create the archive
+Extract
+dir/
+dir/foo
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac07.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+else
+ ustar
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac07.at:30:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+)"
+echo extrac07.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Prepare the directory
+Create the archive
+Extract
+dir/
+dir/foo
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac07.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+else
+ ustar
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac07.at:30:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+)"
+echo extrac07.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Prepare the directory
+Create the archive
+Extract
+dir/
+dir/foo
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac07.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+else
+ ustar
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/extrac07.at:30:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+)"
+echo extrac07.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+echo Prepare the directory
+mkdir dir
+genfile -f foo
+cd dir
+ln -s ../foo .
+cd ..
+chmod -w dir
+
+echo Create the archive
+tar cf archive dir || exit 1
+
+echo Extract
+mkdir out
+tar -C out -xvf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Prepare the directory
+Create the archive
+Extract
+dir/
+dir/foo
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/extrac07.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+else
+ ustar
+fi
+
+$at_traceon
+
+ # Testing one format is enough
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 25 ) # 25. gzip.at:23: gzip
+ at_setup_line='gzip.at:23'
+ at_desc='gzip'
+ $at_quiet $ECHO_N " 25: gzip $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "25. gzip.at:23: testing ..."
+ $at_traceon
+
+
+
+unset TAR_OPTIONS
+
+$at_traceoff
+echo "$at_srcdir/gzip.at:28:
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+tar xfvz /dev/null
+test \$? = 2 || exit 1
+"
+echo gzip.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+tar xfvz /dev/null
+test $? = 2 || exit 1
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+tar xfvz /dev/null
+test $? = 2 || exit 1
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "
+gzip: stdin: unexpected end of file
+tar: Child returned status 1
+tar: Error exit delayed from previous errors
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/gzip.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 26 ) # 26. incremental.at:23: incremental
+ at_setup_line='incremental.at:23'
+ at_desc='incremental'
+ $at_quiet $ECHO_N " 26: incremental $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "26. incremental.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/incremental.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created \`on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+)"
+echo incremental.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created `on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created `on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "structure/
+separator
+structure/
+structure/file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incremental.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incremental.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created \`on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+)"
+echo incremental.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created `on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created `on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "structure/
+separator
+structure/
+structure/file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incremental.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incremental.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created \`on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+)"
+echo incremental.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created `on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir structure
+echo x >structure/file
+
+# On Nextstep (and perhaps other 4.3BSD systems),
+# a newly created file's ctime isn't updated
+# until the next sync or stat operation on the file.
+ls -l structure/file >/dev/null
+
+# If the time of an initial backup and the creation time of a file contained
+# in that backup are the same, the file will be backed up again when an
+# incremental backup is done, because the incremental backup backs up
+# files created `on or after' the initial backup time. Without the sleep
+# command, behaviour of tar becomes variable, depending whether the system
+# clock ticked over to the next second between creating the file and
+# backing it up.
+sleep 1
+
+tar cf archive --listed=list structure
+tar cfv archive --listed=list structure
+echo separator
+sleep 1
+echo y >structure/file
+tar cfv archive --listed=list structure
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "structure/
+separator
+structure/
+structure/file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incremental.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 27 ) # 27. incr01.at:27: restore broken symlinks from incremental
+ at_setup_line='incr01.at:27'
+ at_desc='restore broken symlinks from incremental'
+ $at_quiet $ECHO_N " 27: restore broken symlinks from incremental $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "27. incr01.at:27: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/incr01.at:30:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+\$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+)"
+echo incr01.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/bar
+separator
+directory/
+tar: Deleting \`directory/bar'
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr01.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incr01.at:30:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+\$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+)"
+echo incr01.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/bar
+separator
+directory/
+tar: Deleting \`directory/bar'
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr01.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incr01.at:30:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+\$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+)"
+echo incr01.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+$as_ln_s foo directory/bar
+
+tar -cf archive.0 -g db directory
+rm directory/bar
+tar -cf archive.1 -g db directory
+
+mv directory orig
+
+tar xvfg archive.0 /dev/null
+echo separator
+tar xvfg archive.1 /dev/null
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/bar
+separator
+directory/
+tar: Deleting \`directory/bar'
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr01.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 28 ) # 28. incr02.at:32: restoring timestamps from incremental
+ at_setup_line='incr02.at:32'
+ at_desc='restoring timestamps from incremental'
+ $at_quiet $ECHO_N " 28: restoring timestamps from incremental $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "28. incr02.at:32: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/incr02.at:35:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, \`dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# \`subdir1' prior to restoring \`dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+)"
+echo incr02.at:35 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, `dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# `subdir1' prior to restoring `dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, `dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# `subdir1' prior to restoring `dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr02.at:35: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incr02.at:35:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, \`dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# \`subdir1' prior to restoring \`dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+)"
+echo incr02.at:35 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, `dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# `subdir1' prior to restoring `dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, `dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# `subdir1' prior to restoring `dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr02.at:35: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incr02.at:35:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, \`dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# \`subdir1' prior to restoring \`dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+)"
+echo incr02.at:35 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, `dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# `subdir1' prior to restoring `dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+# Create directory structure
+mkdir dir
+mkdir dir/subdir1
+mkdir dir/subdir2
+genfile --length 10 --file dir/subdir1/file
+
+# Save mtime for later comparison
+genfile --stat=mtime dir/subdir1 > ts
+
+# Create an archive. Using incremental mode makes sure the
+# archive will have a directory-first member ordering,
+# i.e.:
+# dir/
+# dir/subdir1/
+# dir/subdir2/
+# dir/subdir1/foofile
+#
+# When restoring from this directory structure, `dir/subdir2/' used to
+# trigger apply_nonancestor_delayed_set_stat() which restored stats for
+# `subdir1' prior to restoring `dir/subdir1/foofile'. Then, restoring the
+# latter clobbered the directory timestamp.
+
+tar -cf archive -g db dir
+
+# Move away the directory
+mv dir orig
+
+# Wait enough time for timestamps to differ in case of failure.
+sleep 5
+
+# Restore the directory
+tar -xf archive dir
+
+# Check the timestamp
+genfile --stat=mtime dir/subdir1 | diff ts -
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr02.at:35: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 29 ) # 29. listed01.at:26: --listed for individual files
+ at_setup_line='listed01.at:26'
+ at_desc='--listed for individual files'
+ $at_quiet $ECHO_N " 29: --listed for individual files $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "29. listed01.at:26: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/listed01.at:29:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+# Let the things settle
+sleep 1
+
+tar --create \\
+ --file=archive.1 \\
+ --listed-incremental=listing \\
+ directory/file*
+
+tar tf archive.1 || exit 1
+
+sleep 1
+
+genfile --length 10240 --pattern zeros --file directory/file2
+
+echo \"separator\"
+
+tar --create \\
+ --file=archive.2 \\
+ --listed-incremental=listing \\
+ directory/file* || exit 1
+
+tar tf archive.2 || exit 1
+)"
+echo listed01.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+# Let the things settle
+sleep 1
+
+tar --create \
+ --file=archive.1 \
+ --listed-incremental=listing \
+ directory/file*
+
+tar tf archive.1 || exit 1
+
+sleep 1
+
+genfile --length 10240 --pattern zeros --file directory/file2
+
+echo "separator"
+
+tar --create \
+ --file=archive.2 \
+ --listed-incremental=listing \
+ directory/file* || exit 1
+
+tar tf archive.2 || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+# Let the things settle
+sleep 1
+
+tar --create \
+ --file=archive.1 \
+ --listed-incremental=listing \
+ directory/file*
+
+tar tf archive.1 || exit 1
+
+sleep 1
+
+genfile --length 10240 --pattern zeros --file directory/file2
+
+echo "separator"
+
+tar --create \
+ --file=archive.2 \
+ --listed-incremental=listing \
+ directory/file* || exit 1
+
+tar tf archive.2 || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/file1
+separator
+directory/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/listed01.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/listed01.at:29:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+# Let the things settle
+sleep 1
+
+tar --create \\
+ --file=archive.1 \\
+ --listed-incremental=listing \\
+ directory/file*
+
+tar tf archive.1 || exit 1
+
+sleep 1
+
+genfile --length 10240 --pattern zeros --file directory/file2
+
+echo \"separator\"
+
+tar --create \\
+ --file=archive.2 \\
+ --listed-incremental=listing \\
+ directory/file* || exit 1
+
+tar tf archive.2 || exit 1
+)"
+echo listed01.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+# Let the things settle
+sleep 1
+
+tar --create \
+ --file=archive.1 \
+ --listed-incremental=listing \
+ directory/file*
+
+tar tf archive.1 || exit 1
+
+sleep 1
+
+genfile --length 10240 --pattern zeros --file directory/file2
+
+echo "separator"
+
+tar --create \
+ --file=archive.2 \
+ --listed-incremental=listing \
+ directory/file* || exit 1
+
+tar tf archive.2 || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+# Let the things settle
+sleep 1
+
+tar --create \
+ --file=archive.1 \
+ --listed-incremental=listing \
+ directory/file*
+
+tar tf archive.1 || exit 1
+
+sleep 1
+
+genfile --length 10240 --pattern zeros --file directory/file2
+
+echo "separator"
+
+tar --create \
+ --file=archive.2 \
+ --listed-incremental=listing \
+ directory/file* || exit 1
+
+tar tf archive.2 || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/file1
+separator
+directory/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/listed01.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 30 ) # 30. listed02.at:28: working --listed
+ at_setup_line='listed02.at:28'
+ at_desc='working --listed'
+ $at_quiet $ECHO_N " 30: working --listed $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "30. listed02.at:28: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/listed02.at:31:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+echo Create directories
+
+mkdir tart
+sleep 1
+mkdir tart/c0
+sleep 1
+mkdir tart/c1
+sleep 1
+
+for file in tart/a1 tart/b1 tart/c0/cq1 tart/c0/cq2 tart/c1/ca1 tart/c1/ca2
+do
+ echo File \$file > \$file
+ sleep 1
+done
+
+sleep 1
+echo Creating main archive
+tar -c -v --listed-incremental=tart.incr1 -f archive.1 tart 2> err || exit 1
+
+# The above prints two lines to stderr announcing the new directories c0 and c1.
+# Ensure that they appear in this script's stderr in sorted order.
+sort err 1>&2; rm -f err
+
+sleep 1
+echo Modifying filesystem
+rm tart/a1
+
+mv tart/b1 tart/b2
+mv tart/c1 tart/c2
+touch tart/c2/ca3
+
+echo Directory contents
+find tart -print | sort 2>/dev/null
+
+sleep 1
+echo Creating incremental archive
+cp -p tart.incr1 tart.incr2
+tar -c -v --listed-incremental=tart.incr2 -f archive.2 tart || exit 1
+
+sleep 1
+
+rm -rf tart/*
+echo Extracting main archive
+tar -x -v --listed-incremental=tart.incr1 -f archive.1 || exit 1
+echo Extracting incremental archive
+# This command should produce three messages about deletion
+# of the existing files, that may appear in any order. Piping
+# to sort makes sure we don't depend on any particular ordering.
+tar -x -v --listed-incremental=tart.incr2 -f archive.2 | sort 2>/dev/null
+
+echo Final files:
+find tart -print | sort 2>/dev/null
+)"
+echo listed02.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+echo Create directories
+
+mkdir tart
+sleep 1
+mkdir tart/c0
+sleep 1
+mkdir tart/c1
+sleep 1
+
+for file in tart/a1 tart/b1 tart/c0/cq1 tart/c0/cq2 tart/c1/ca1 tart/c1/ca2
+do
+ echo File $file > $file
+ sleep 1
+done
+
+sleep 1
+echo Creating main archive
+tar -c -v --listed-incremental=tart.incr1 -f archive.1 tart 2> err || exit 1
+
+# The above prints two lines to stderr announcing the new directories c0 and c1.
+# Ensure that they appear in this script's stderr in sorted order.
+sort err 1>&2; rm -f err
+
+sleep 1
+echo Modifying filesystem
+rm tart/a1
+
+mv tart/b1 tart/b2
+mv tart/c1 tart/c2
+touch tart/c2/ca3
+
+echo Directory contents
+find tart -print | sort 2>/dev/null
+
+sleep 1
+echo Creating incremental archive
+cp -p tart.incr1 tart.incr2
+tar -c -v --listed-incremental=tart.incr2 -f archive.2 tart || exit 1
+
+sleep 1
+
+rm -rf tart/*
+echo Extracting main archive
+tar -x -v --listed-incremental=tart.incr1 -f archive.1 || exit 1
+echo Extracting incremental archive
+# This command should produce three messages about deletion
+# of the existing files, that may appear in any order. Piping
+# to sort makes sure we don't depend on any particular ordering.
+tar -x -v --listed-incremental=tart.incr2 -f archive.2 | sort 2>/dev/null
+
+echo Final files:
+find tart -print | sort 2>/dev/null
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+echo Create directories
+
+mkdir tart
+sleep 1
+mkdir tart/c0
+sleep 1
+mkdir tart/c1
+sleep 1
+
+for file in tart/a1 tart/b1 tart/c0/cq1 tart/c0/cq2 tart/c1/ca1 tart/c1/ca2
+do
+ echo File $file > $file
+ sleep 1
+done
+
+sleep 1
+echo Creating main archive
+tar -c -v --listed-incremental=tart.incr1 -f archive.1 tart 2> err || exit 1
+
+# The above prints two lines to stderr announcing the new directories c0 and c1.
+# Ensure that they appear in this script's stderr in sorted order.
+sort err 1>&2; rm -f err
+
+sleep 1
+echo Modifying filesystem
+rm tart/a1
+
+mv tart/b1 tart/b2
+mv tart/c1 tart/c2
+touch tart/c2/ca3
+
+echo Directory contents
+find tart -print | sort 2>/dev/null
+
+sleep 1
+echo Creating incremental archive
+cp -p tart.incr1 tart.incr2
+tar -c -v --listed-incremental=tart.incr2 -f archive.2 tart || exit 1
+
+sleep 1
+
+rm -rf tart/*
+echo Extracting main archive
+tar -x -v --listed-incremental=tart.incr1 -f archive.1 || exit 1
+echo Extracting incremental archive
+# This command should produce three messages about deletion
+# of the existing files, that may appear in any order. Piping
+# to sort makes sure we don't depend on any particular ordering.
+tar -x -v --listed-incremental=tart.incr2 -f archive.2 | sort 2>/dev/null
+
+echo Final files:
+find tart -print | sort 2>/dev/null
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: tart/c0: Directory is new
+tar: tart/c1: Directory is new
+tar: tart/c2: Directory has been renamed from \`tart/c1'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Create directories
+Creating main archive
+tart/
+tart/c0/
+tart/c1/
+tart/a1
+tart/b1
+tart/c0/cq1
+tart/c0/cq2
+tart/c1/ca1
+tart/c1/ca2
+Modifying filesystem
+Directory contents
+tart
+tart/b2
+tart/c0
+tart/c0/cq1
+tart/c0/cq2
+tart/c2
+tart/c2/ca1
+tart/c2/ca2
+tart/c2/ca3
+Creating incremental archive
+tart/
+tart/c0/
+tart/c2/
+tart/b2
+tart/c2/ca3
+Extracting main archive
+tart/
+tart/c0/
+tart/c1/
+tart/a1
+tart/b1
+tart/c0/cq1
+tart/c0/cq2
+tart/c1/ca1
+tart/c1/ca2
+Extracting incremental archive
+tar: Deleting \`tart/a1'
+tar: Deleting \`tart/b1'
+tart/
+tart/b2
+tart/c0/
+tart/c2/
+tart/c2/ca3
+Final files:
+tart
+tart/b2
+tart/c0
+tart/c0/cq1
+tart/c0/cq2
+tart/c2
+tart/c2/ca1
+tart/c2/ca2
+tart/c2/ca3
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/listed02.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/listed02.at:31:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+echo Create directories
+
+mkdir tart
+sleep 1
+mkdir tart/c0
+sleep 1
+mkdir tart/c1
+sleep 1
+
+for file in tart/a1 tart/b1 tart/c0/cq1 tart/c0/cq2 tart/c1/ca1 tart/c1/ca2
+do
+ echo File \$file > \$file
+ sleep 1
+done
+
+sleep 1
+echo Creating main archive
+tar -c -v --listed-incremental=tart.incr1 -f archive.1 tart 2> err || exit 1
+
+# The above prints two lines to stderr announcing the new directories c0 and c1.
+# Ensure that they appear in this script's stderr in sorted order.
+sort err 1>&2; rm -f err
+
+sleep 1
+echo Modifying filesystem
+rm tart/a1
+
+mv tart/b1 tart/b2
+mv tart/c1 tart/c2
+touch tart/c2/ca3
+
+echo Directory contents
+find tart -print | sort 2>/dev/null
+
+sleep 1
+echo Creating incremental archive
+cp -p tart.incr1 tart.incr2
+tar -c -v --listed-incremental=tart.incr2 -f archive.2 tart || exit 1
+
+sleep 1
+
+rm -rf tart/*
+echo Extracting main archive
+tar -x -v --listed-incremental=tart.incr1 -f archive.1 || exit 1
+echo Extracting incremental archive
+# This command should produce three messages about deletion
+# of the existing files, that may appear in any order. Piping
+# to sort makes sure we don't depend on any particular ordering.
+tar -x -v --listed-incremental=tart.incr2 -f archive.2 | sort 2>/dev/null
+
+echo Final files:
+find tart -print | sort 2>/dev/null
+)"
+echo listed02.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+echo Create directories
+
+mkdir tart
+sleep 1
+mkdir tart/c0
+sleep 1
+mkdir tart/c1
+sleep 1
+
+for file in tart/a1 tart/b1 tart/c0/cq1 tart/c0/cq2 tart/c1/ca1 tart/c1/ca2
+do
+ echo File $file > $file
+ sleep 1
+done
+
+sleep 1
+echo Creating main archive
+tar -c -v --listed-incremental=tart.incr1 -f archive.1 tart 2> err || exit 1
+
+# The above prints two lines to stderr announcing the new directories c0 and c1.
+# Ensure that they appear in this script's stderr in sorted order.
+sort err 1>&2; rm -f err
+
+sleep 1
+echo Modifying filesystem
+rm tart/a1
+
+mv tart/b1 tart/b2
+mv tart/c1 tart/c2
+touch tart/c2/ca3
+
+echo Directory contents
+find tart -print | sort 2>/dev/null
+
+sleep 1
+echo Creating incremental archive
+cp -p tart.incr1 tart.incr2
+tar -c -v --listed-incremental=tart.incr2 -f archive.2 tart || exit 1
+
+sleep 1
+
+rm -rf tart/*
+echo Extracting main archive
+tar -x -v --listed-incremental=tart.incr1 -f archive.1 || exit 1
+echo Extracting incremental archive
+# This command should produce three messages about deletion
+# of the existing files, that may appear in any order. Piping
+# to sort makes sure we don't depend on any particular ordering.
+tar -x -v --listed-incremental=tart.incr2 -f archive.2 | sort 2>/dev/null
+
+echo Final files:
+find tart -print | sort 2>/dev/null
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+echo Create directories
+
+mkdir tart
+sleep 1
+mkdir tart/c0
+sleep 1
+mkdir tart/c1
+sleep 1
+
+for file in tart/a1 tart/b1 tart/c0/cq1 tart/c0/cq2 tart/c1/ca1 tart/c1/ca2
+do
+ echo File $file > $file
+ sleep 1
+done
+
+sleep 1
+echo Creating main archive
+tar -c -v --listed-incremental=tart.incr1 -f archive.1 tart 2> err || exit 1
+
+# The above prints two lines to stderr announcing the new directories c0 and c1.
+# Ensure that they appear in this script's stderr in sorted order.
+sort err 1>&2; rm -f err
+
+sleep 1
+echo Modifying filesystem
+rm tart/a1
+
+mv tart/b1 tart/b2
+mv tart/c1 tart/c2
+touch tart/c2/ca3
+
+echo Directory contents
+find tart -print | sort 2>/dev/null
+
+sleep 1
+echo Creating incremental archive
+cp -p tart.incr1 tart.incr2
+tar -c -v --listed-incremental=tart.incr2 -f archive.2 tart || exit 1
+
+sleep 1
+
+rm -rf tart/*
+echo Extracting main archive
+tar -x -v --listed-incremental=tart.incr1 -f archive.1 || exit 1
+echo Extracting incremental archive
+# This command should produce three messages about deletion
+# of the existing files, that may appear in any order. Piping
+# to sort makes sure we don't depend on any particular ordering.
+tar -x -v --listed-incremental=tart.incr2 -f archive.2 | sort 2>/dev/null
+
+echo Final files:
+find tart -print | sort 2>/dev/null
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: tart/c0: Directory is new
+tar: tart/c1: Directory is new
+tar: tart/c2: Directory has been renamed from \`tart/c1'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Create directories
+Creating main archive
+tart/
+tart/c0/
+tart/c1/
+tart/a1
+tart/b1
+tart/c0/cq1
+tart/c0/cq2
+tart/c1/ca1
+tart/c1/ca2
+Modifying filesystem
+Directory contents
+tart
+tart/b2
+tart/c0
+tart/c0/cq1
+tart/c0/cq2
+tart/c2
+tart/c2/ca1
+tart/c2/ca2
+tart/c2/ca3
+Creating incremental archive
+tart/
+tart/c0/
+tart/c2/
+tart/b2
+tart/c2/ca3
+Extracting main archive
+tart/
+tart/c0/
+tart/c1/
+tart/a1
+tart/b1
+tart/c0/cq1
+tart/c0/cq2
+tart/c1/ca1
+tart/c1/ca2
+Extracting incremental archive
+tar: Deleting \`tart/a1'
+tar: Deleting \`tart/b1'
+tart/
+tart/b2
+tart/c0/
+tart/c2/
+tart/c2/ca3
+Final files:
+tart
+tart/b2
+tart/c0
+tart/c0/cq1
+tart/c0/cq2
+tart/c2
+tart/c2/ca1
+tart/c2/ca2
+tart/c2/ca3
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/listed02.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 31 ) # 31. incr03.at:28: renamed files in incrementals
+ at_setup_line='incr03.at:28'
+ at_desc='renamed files in incrementals'
+ $at_quiet $ECHO_N " 31: renamed files in incrementals $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "31. incr03.at:28: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/incr03.at:31:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+)"
+echo incr03.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Listing of archive.1
+directory/
+directory/x
+directory/y
+Listing of archive.2
+directory/
+directory/z
+Directory after first restore
+directory
+directory/x
+directory/y
+Directory after second restore
+directory
+directory/y
+directory/z
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr03.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incr03.at:31:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+)"
+echo incr03.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Listing of archive.1
+directory/
+directory/x
+directory/y
+Listing of archive.2
+directory/
+directory/z
+Directory after first restore
+directory
+directory/x
+directory/y
+Directory after second restore
+directory
+directory/y
+directory/z
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr03.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incr03.at:31:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+)"
+echo incr03.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --file=directory/x
+genfile --file=directory/y
+
+tar -cf archive.1 -g db directory
+
+mv directory/x directory/z
+tar -cf archive.2 -g db directory
+
+mv directory orig
+
+echo Listing of archive.1
+tar -tf archive.1 | sort
+echo Listing of archive.2
+tar -tf archive.2 | sort
+
+echo Directory after first restore
+tar -xf archive.1 -g db
+find directory | sort
+
+echo Directory after second restore
+tar -xf archive.2 -g db
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Listing of archive.1
+directory/
+directory/x
+directory/y
+Listing of archive.2
+directory/
+directory/z
+Directory after first restore
+directory
+directory/x
+directory/y
+Directory after second restore
+directory
+directory/y
+directory/z
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr03.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 32 ) # 32. incr04.at:29: proper icontents initialization
+ at_setup_line='incr04.at:29'
+ at_desc='proper icontents initialization'
+ $at_quiet $ECHO_N " 32: proper icontents initialization $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "32. incr04.at:29: testing ..."
+ $at_traceon
+
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/incr04.at:34:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d a/b >/dev/null
+
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf(\"a/b/one_31_chars_long_file_name_%03d\\n\", i);
+ }' < /dev/null | genfile --files-from -
+
+echo \"Initial dump\"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo \"Incremental dump\"
+tar cvf a1.tar -g a.sna a
+)"
+echo incr04.at:34 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d a/b >/dev/null
+
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf("a/b/one_31_chars_long_file_name_%03d\n", i);
+ }' < /dev/null | genfile --files-from -
+
+echo "Initial dump"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo "Incremental dump"
+tar cvf a1.tar -g a.sna a
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d a/b >/dev/null
+
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf("a/b/one_31_chars_long_file_name_%03d\n", i);
+ }' < /dev/null | genfile --files-from -
+
+echo "Initial dump"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo "Incremental dump"
+tar cvf a1.tar -g a.sna a
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: a/b: Directory is new
+tar: a/c: Directory has been renamed from \`a/b'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Initial dump
+a/
+a/b/
+a/b/one_31_chars_long_file_name_001
+a/b/one_31_chars_long_file_name_002
+a/b/one_31_chars_long_file_name_003
+a/b/one_31_chars_long_file_name_004
+a/b/one_31_chars_long_file_name_005
+a/b/one_31_chars_long_file_name_006
+a/b/one_31_chars_long_file_name_007
+a/b/one_31_chars_long_file_name_008
+a/b/one_31_chars_long_file_name_009
+a/b/one_31_chars_long_file_name_010
+a/b/one_31_chars_long_file_name_011
+a/b/one_31_chars_long_file_name_012
+a/b/one_31_chars_long_file_name_013
+a/b/one_31_chars_long_file_name_014
+a/b/one_31_chars_long_file_name_015
+a/b/one_31_chars_long_file_name_016
+a/b/one_31_chars_long_file_name_017
+a/b/one_31_chars_long_file_name_018
+a/b/one_31_chars_long_file_name_019
+a/b/one_31_chars_long_file_name_020
+a/b/one_31_chars_long_file_name_021
+a/b/one_31_chars_long_file_name_022
+a/b/one_31_chars_long_file_name_023
+a/b/one_31_chars_long_file_name_024
+a/b/one_31_chars_long_file_name_025
+a/b/one_31_chars_long_file_name_026
+a/b/one_31_chars_long_file_name_027
+a/b/one_31_chars_long_file_name_028
+a/b/one_31_chars_long_file_name_029
+a/b/one_31_chars_long_file_name_030
+a/b/one_31_chars_long_file_name_031
+a/b/one_31_chars_long_file_name_032
+a/b/one_31_chars_long_file_name_033
+a/b/one_31_chars_long_file_name_034
+a/b/one_31_chars_long_file_name_035
+a/b/one_31_chars_long_file_name_036
+a/b/one_31_chars_long_file_name_037
+a/b/one_31_chars_long_file_name_038
+a/b/one_31_chars_long_file_name_039
+a/b/one_31_chars_long_file_name_040
+a/b/one_31_chars_long_file_name_041
+a/b/one_31_chars_long_file_name_042
+a/b/one_31_chars_long_file_name_043
+a/b/one_31_chars_long_file_name_044
+a/b/one_31_chars_long_file_name_045
+a/b/one_31_chars_long_file_name_046
+a/b/one_31_chars_long_file_name_047
+a/b/one_31_chars_long_file_name_048
+a/b/one_31_chars_long_file_name_049
+a/b/one_31_chars_long_file_name_050
+a/b/one_31_chars_long_file_name_051
+a/b/one_31_chars_long_file_name_052
+a/b/one_31_chars_long_file_name_053
+a/b/one_31_chars_long_file_name_054
+a/b/one_31_chars_long_file_name_055
+a/b/one_31_chars_long_file_name_056
+a/b/one_31_chars_long_file_name_057
+a/b/one_31_chars_long_file_name_058
+a/b/one_31_chars_long_file_name_059
+a/b/one_31_chars_long_file_name_060
+a/b/one_31_chars_long_file_name_061
+a/b/one_31_chars_long_file_name_062
+a/b/one_31_chars_long_file_name_063
+a/b/one_31_chars_long_file_name_064
+a/b/one_31_chars_long_file_name_065
+a/b/one_31_chars_long_file_name_066
+a/b/one_31_chars_long_file_name_067
+a/b/one_31_chars_long_file_name_068
+a/b/one_31_chars_long_file_name_069
+a/b/one_31_chars_long_file_name_070
+a/b/one_31_chars_long_file_name_071
+a/b/one_31_chars_long_file_name_072
+a/b/one_31_chars_long_file_name_073
+a/b/one_31_chars_long_file_name_074
+a/b/one_31_chars_long_file_name_075
+a/b/one_31_chars_long_file_name_076
+a/b/one_31_chars_long_file_name_077
+a/b/one_31_chars_long_file_name_078
+a/b/one_31_chars_long_file_name_079
+a/b/one_31_chars_long_file_name_080
+a/b/one_31_chars_long_file_name_081
+a/b/one_31_chars_long_file_name_082
+a/b/one_31_chars_long_file_name_083
+a/b/one_31_chars_long_file_name_084
+a/b/one_31_chars_long_file_name_085
+a/b/one_31_chars_long_file_name_086
+a/b/one_31_chars_long_file_name_087
+a/b/one_31_chars_long_file_name_088
+a/b/one_31_chars_long_file_name_089
+a/b/one_31_chars_long_file_name_090
+a/b/one_31_chars_long_file_name_091
+a/b/one_31_chars_long_file_name_092
+a/b/one_31_chars_long_file_name_093
+a/b/one_31_chars_long_file_name_094
+a/b/one_31_chars_long_file_name_095
+a/b/one_31_chars_long_file_name_096
+a/b/one_31_chars_long_file_name_097
+a/b/one_31_chars_long_file_name_098
+a/b/one_31_chars_long_file_name_099
+a/b/one_31_chars_long_file_name_100
+a/b/one_31_chars_long_file_name_101
+a/b/one_31_chars_long_file_name_102
+a/b/one_31_chars_long_file_name_103
+a/b/one_31_chars_long_file_name_104
+a/b/one_31_chars_long_file_name_105
+a/b/one_31_chars_long_file_name_106
+a/b/one_31_chars_long_file_name_107
+a/b/one_31_chars_long_file_name_108
+a/b/one_31_chars_long_file_name_109
+a/b/one_31_chars_long_file_name_110
+a/b/one_31_chars_long_file_name_111
+a/b/one_31_chars_long_file_name_112
+a/b/one_31_chars_long_file_name_113
+a/b/one_31_chars_long_file_name_114
+a/b/one_31_chars_long_file_name_115
+a/b/one_31_chars_long_file_name_116
+a/b/one_31_chars_long_file_name_117
+a/b/one_31_chars_long_file_name_118
+a/b/one_31_chars_long_file_name_119
+a/b/one_31_chars_long_file_name_120
+a/b/one_31_chars_long_file_name_121
+a/b/one_31_chars_long_file_name_122
+a/b/one_31_chars_long_file_name_123
+a/b/one_31_chars_long_file_name_124
+a/b/one_31_chars_long_file_name_125
+a/b/one_31_chars_long_file_name_126
+a/b/one_31_chars_long_file_name_127
+a/b/one_31_chars_long_file_name_128
+a/b/one_31_chars_long_file_name_129
+a/b/one_31_chars_long_file_name_130
+a/b/one_31_chars_long_file_name_131
+a/b/one_31_chars_long_file_name_132
+a/b/one_31_chars_long_file_name_133
+a/b/one_31_chars_long_file_name_134
+a/b/one_31_chars_long_file_name_135
+a/b/one_31_chars_long_file_name_136
+a/b/one_31_chars_long_file_name_137
+a/b/one_31_chars_long_file_name_138
+a/b/one_31_chars_long_file_name_139
+a/b/one_31_chars_long_file_name_140
+a/b/one_31_chars_long_file_name_141
+a/b/one_31_chars_long_file_name_142
+Incremental dump
+a/
+a/c/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr04.at:34: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incr04.at:34:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d a/b >/dev/null
+
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf(\"a/b/one_31_chars_long_file_name_%03d\\n\", i);
+ }' < /dev/null | genfile --files-from -
+
+echo \"Initial dump\"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo \"Incremental dump\"
+tar cvf a1.tar -g a.sna a
+)"
+echo incr04.at:34 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d a/b >/dev/null
+
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf("a/b/one_31_chars_long_file_name_%03d\n", i);
+ }' < /dev/null | genfile --files-from -
+
+echo "Initial dump"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo "Incremental dump"
+tar cvf a1.tar -g a.sna a
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d a/b >/dev/null
+
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf("a/b/one_31_chars_long_file_name_%03d\n", i);
+ }' < /dev/null | genfile --files-from -
+
+echo "Initial dump"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo "Incremental dump"
+tar cvf a1.tar -g a.sna a
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: a/b: Directory is new
+tar: a/c: Directory has been renamed from \`a/b'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Initial dump
+a/
+a/b/
+a/b/one_31_chars_long_file_name_001
+a/b/one_31_chars_long_file_name_002
+a/b/one_31_chars_long_file_name_003
+a/b/one_31_chars_long_file_name_004
+a/b/one_31_chars_long_file_name_005
+a/b/one_31_chars_long_file_name_006
+a/b/one_31_chars_long_file_name_007
+a/b/one_31_chars_long_file_name_008
+a/b/one_31_chars_long_file_name_009
+a/b/one_31_chars_long_file_name_010
+a/b/one_31_chars_long_file_name_011
+a/b/one_31_chars_long_file_name_012
+a/b/one_31_chars_long_file_name_013
+a/b/one_31_chars_long_file_name_014
+a/b/one_31_chars_long_file_name_015
+a/b/one_31_chars_long_file_name_016
+a/b/one_31_chars_long_file_name_017
+a/b/one_31_chars_long_file_name_018
+a/b/one_31_chars_long_file_name_019
+a/b/one_31_chars_long_file_name_020
+a/b/one_31_chars_long_file_name_021
+a/b/one_31_chars_long_file_name_022
+a/b/one_31_chars_long_file_name_023
+a/b/one_31_chars_long_file_name_024
+a/b/one_31_chars_long_file_name_025
+a/b/one_31_chars_long_file_name_026
+a/b/one_31_chars_long_file_name_027
+a/b/one_31_chars_long_file_name_028
+a/b/one_31_chars_long_file_name_029
+a/b/one_31_chars_long_file_name_030
+a/b/one_31_chars_long_file_name_031
+a/b/one_31_chars_long_file_name_032
+a/b/one_31_chars_long_file_name_033
+a/b/one_31_chars_long_file_name_034
+a/b/one_31_chars_long_file_name_035
+a/b/one_31_chars_long_file_name_036
+a/b/one_31_chars_long_file_name_037
+a/b/one_31_chars_long_file_name_038
+a/b/one_31_chars_long_file_name_039
+a/b/one_31_chars_long_file_name_040
+a/b/one_31_chars_long_file_name_041
+a/b/one_31_chars_long_file_name_042
+a/b/one_31_chars_long_file_name_043
+a/b/one_31_chars_long_file_name_044
+a/b/one_31_chars_long_file_name_045
+a/b/one_31_chars_long_file_name_046
+a/b/one_31_chars_long_file_name_047
+a/b/one_31_chars_long_file_name_048
+a/b/one_31_chars_long_file_name_049
+a/b/one_31_chars_long_file_name_050
+a/b/one_31_chars_long_file_name_051
+a/b/one_31_chars_long_file_name_052
+a/b/one_31_chars_long_file_name_053
+a/b/one_31_chars_long_file_name_054
+a/b/one_31_chars_long_file_name_055
+a/b/one_31_chars_long_file_name_056
+a/b/one_31_chars_long_file_name_057
+a/b/one_31_chars_long_file_name_058
+a/b/one_31_chars_long_file_name_059
+a/b/one_31_chars_long_file_name_060
+a/b/one_31_chars_long_file_name_061
+a/b/one_31_chars_long_file_name_062
+a/b/one_31_chars_long_file_name_063
+a/b/one_31_chars_long_file_name_064
+a/b/one_31_chars_long_file_name_065
+a/b/one_31_chars_long_file_name_066
+a/b/one_31_chars_long_file_name_067
+a/b/one_31_chars_long_file_name_068
+a/b/one_31_chars_long_file_name_069
+a/b/one_31_chars_long_file_name_070
+a/b/one_31_chars_long_file_name_071
+a/b/one_31_chars_long_file_name_072
+a/b/one_31_chars_long_file_name_073
+a/b/one_31_chars_long_file_name_074
+a/b/one_31_chars_long_file_name_075
+a/b/one_31_chars_long_file_name_076
+a/b/one_31_chars_long_file_name_077
+a/b/one_31_chars_long_file_name_078
+a/b/one_31_chars_long_file_name_079
+a/b/one_31_chars_long_file_name_080
+a/b/one_31_chars_long_file_name_081
+a/b/one_31_chars_long_file_name_082
+a/b/one_31_chars_long_file_name_083
+a/b/one_31_chars_long_file_name_084
+a/b/one_31_chars_long_file_name_085
+a/b/one_31_chars_long_file_name_086
+a/b/one_31_chars_long_file_name_087
+a/b/one_31_chars_long_file_name_088
+a/b/one_31_chars_long_file_name_089
+a/b/one_31_chars_long_file_name_090
+a/b/one_31_chars_long_file_name_091
+a/b/one_31_chars_long_file_name_092
+a/b/one_31_chars_long_file_name_093
+a/b/one_31_chars_long_file_name_094
+a/b/one_31_chars_long_file_name_095
+a/b/one_31_chars_long_file_name_096
+a/b/one_31_chars_long_file_name_097
+a/b/one_31_chars_long_file_name_098
+a/b/one_31_chars_long_file_name_099
+a/b/one_31_chars_long_file_name_100
+a/b/one_31_chars_long_file_name_101
+a/b/one_31_chars_long_file_name_102
+a/b/one_31_chars_long_file_name_103
+a/b/one_31_chars_long_file_name_104
+a/b/one_31_chars_long_file_name_105
+a/b/one_31_chars_long_file_name_106
+a/b/one_31_chars_long_file_name_107
+a/b/one_31_chars_long_file_name_108
+a/b/one_31_chars_long_file_name_109
+a/b/one_31_chars_long_file_name_110
+a/b/one_31_chars_long_file_name_111
+a/b/one_31_chars_long_file_name_112
+a/b/one_31_chars_long_file_name_113
+a/b/one_31_chars_long_file_name_114
+a/b/one_31_chars_long_file_name_115
+a/b/one_31_chars_long_file_name_116
+a/b/one_31_chars_long_file_name_117
+a/b/one_31_chars_long_file_name_118
+a/b/one_31_chars_long_file_name_119
+a/b/one_31_chars_long_file_name_120
+a/b/one_31_chars_long_file_name_121
+a/b/one_31_chars_long_file_name_122
+a/b/one_31_chars_long_file_name_123
+a/b/one_31_chars_long_file_name_124
+a/b/one_31_chars_long_file_name_125
+a/b/one_31_chars_long_file_name_126
+a/b/one_31_chars_long_file_name_127
+a/b/one_31_chars_long_file_name_128
+a/b/one_31_chars_long_file_name_129
+a/b/one_31_chars_long_file_name_130
+a/b/one_31_chars_long_file_name_131
+a/b/one_31_chars_long_file_name_132
+a/b/one_31_chars_long_file_name_133
+a/b/one_31_chars_long_file_name_134
+a/b/one_31_chars_long_file_name_135
+a/b/one_31_chars_long_file_name_136
+a/b/one_31_chars_long_file_name_137
+a/b/one_31_chars_long_file_name_138
+a/b/one_31_chars_long_file_name_139
+a/b/one_31_chars_long_file_name_140
+a/b/one_31_chars_long_file_name_141
+a/b/one_31_chars_long_file_name_142
+Incremental dump
+a/
+a/c/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr04.at:34: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/incr04.at:34:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d a/b >/dev/null
+
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf(\"a/b/one_31_chars_long_file_name_%03d\\n\", i);
+ }' < /dev/null | genfile --files-from -
+
+echo \"Initial dump\"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo \"Incremental dump\"
+tar cvf a1.tar -g a.sna a
+)"
+echo incr04.at:34 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d a/b >/dev/null
+
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf("a/b/one_31_chars_long_file_name_%03d\n", i);
+ }' < /dev/null | genfile --files-from -
+
+echo "Initial dump"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo "Incremental dump"
+tar cvf a1.tar -g a.sna a
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d a/b >/dev/null
+
+awk 'BEGIN {
+ for (i=1;i<=142;i++)
+ printf("a/b/one_31_chars_long_file_name_%03d\n", i);
+ }' < /dev/null | genfile --files-from -
+
+echo "Initial dump"
+tar cvf a0.tar -g a.sna a
+mv a/b a/c
+echo "Incremental dump"
+tar cvf a1.tar -g a.sna a
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: a/b: Directory is new
+tar: a/c: Directory has been renamed from \`a/b'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Initial dump
+a/
+a/b/
+a/b/one_31_chars_long_file_name_001
+a/b/one_31_chars_long_file_name_002
+a/b/one_31_chars_long_file_name_003
+a/b/one_31_chars_long_file_name_004
+a/b/one_31_chars_long_file_name_005
+a/b/one_31_chars_long_file_name_006
+a/b/one_31_chars_long_file_name_007
+a/b/one_31_chars_long_file_name_008
+a/b/one_31_chars_long_file_name_009
+a/b/one_31_chars_long_file_name_010
+a/b/one_31_chars_long_file_name_011
+a/b/one_31_chars_long_file_name_012
+a/b/one_31_chars_long_file_name_013
+a/b/one_31_chars_long_file_name_014
+a/b/one_31_chars_long_file_name_015
+a/b/one_31_chars_long_file_name_016
+a/b/one_31_chars_long_file_name_017
+a/b/one_31_chars_long_file_name_018
+a/b/one_31_chars_long_file_name_019
+a/b/one_31_chars_long_file_name_020
+a/b/one_31_chars_long_file_name_021
+a/b/one_31_chars_long_file_name_022
+a/b/one_31_chars_long_file_name_023
+a/b/one_31_chars_long_file_name_024
+a/b/one_31_chars_long_file_name_025
+a/b/one_31_chars_long_file_name_026
+a/b/one_31_chars_long_file_name_027
+a/b/one_31_chars_long_file_name_028
+a/b/one_31_chars_long_file_name_029
+a/b/one_31_chars_long_file_name_030
+a/b/one_31_chars_long_file_name_031
+a/b/one_31_chars_long_file_name_032
+a/b/one_31_chars_long_file_name_033
+a/b/one_31_chars_long_file_name_034
+a/b/one_31_chars_long_file_name_035
+a/b/one_31_chars_long_file_name_036
+a/b/one_31_chars_long_file_name_037
+a/b/one_31_chars_long_file_name_038
+a/b/one_31_chars_long_file_name_039
+a/b/one_31_chars_long_file_name_040
+a/b/one_31_chars_long_file_name_041
+a/b/one_31_chars_long_file_name_042
+a/b/one_31_chars_long_file_name_043
+a/b/one_31_chars_long_file_name_044
+a/b/one_31_chars_long_file_name_045
+a/b/one_31_chars_long_file_name_046
+a/b/one_31_chars_long_file_name_047
+a/b/one_31_chars_long_file_name_048
+a/b/one_31_chars_long_file_name_049
+a/b/one_31_chars_long_file_name_050
+a/b/one_31_chars_long_file_name_051
+a/b/one_31_chars_long_file_name_052
+a/b/one_31_chars_long_file_name_053
+a/b/one_31_chars_long_file_name_054
+a/b/one_31_chars_long_file_name_055
+a/b/one_31_chars_long_file_name_056
+a/b/one_31_chars_long_file_name_057
+a/b/one_31_chars_long_file_name_058
+a/b/one_31_chars_long_file_name_059
+a/b/one_31_chars_long_file_name_060
+a/b/one_31_chars_long_file_name_061
+a/b/one_31_chars_long_file_name_062
+a/b/one_31_chars_long_file_name_063
+a/b/one_31_chars_long_file_name_064
+a/b/one_31_chars_long_file_name_065
+a/b/one_31_chars_long_file_name_066
+a/b/one_31_chars_long_file_name_067
+a/b/one_31_chars_long_file_name_068
+a/b/one_31_chars_long_file_name_069
+a/b/one_31_chars_long_file_name_070
+a/b/one_31_chars_long_file_name_071
+a/b/one_31_chars_long_file_name_072
+a/b/one_31_chars_long_file_name_073
+a/b/one_31_chars_long_file_name_074
+a/b/one_31_chars_long_file_name_075
+a/b/one_31_chars_long_file_name_076
+a/b/one_31_chars_long_file_name_077
+a/b/one_31_chars_long_file_name_078
+a/b/one_31_chars_long_file_name_079
+a/b/one_31_chars_long_file_name_080
+a/b/one_31_chars_long_file_name_081
+a/b/one_31_chars_long_file_name_082
+a/b/one_31_chars_long_file_name_083
+a/b/one_31_chars_long_file_name_084
+a/b/one_31_chars_long_file_name_085
+a/b/one_31_chars_long_file_name_086
+a/b/one_31_chars_long_file_name_087
+a/b/one_31_chars_long_file_name_088
+a/b/one_31_chars_long_file_name_089
+a/b/one_31_chars_long_file_name_090
+a/b/one_31_chars_long_file_name_091
+a/b/one_31_chars_long_file_name_092
+a/b/one_31_chars_long_file_name_093
+a/b/one_31_chars_long_file_name_094
+a/b/one_31_chars_long_file_name_095
+a/b/one_31_chars_long_file_name_096
+a/b/one_31_chars_long_file_name_097
+a/b/one_31_chars_long_file_name_098
+a/b/one_31_chars_long_file_name_099
+a/b/one_31_chars_long_file_name_100
+a/b/one_31_chars_long_file_name_101
+a/b/one_31_chars_long_file_name_102
+a/b/one_31_chars_long_file_name_103
+a/b/one_31_chars_long_file_name_104
+a/b/one_31_chars_long_file_name_105
+a/b/one_31_chars_long_file_name_106
+a/b/one_31_chars_long_file_name_107
+a/b/one_31_chars_long_file_name_108
+a/b/one_31_chars_long_file_name_109
+a/b/one_31_chars_long_file_name_110
+a/b/one_31_chars_long_file_name_111
+a/b/one_31_chars_long_file_name_112
+a/b/one_31_chars_long_file_name_113
+a/b/one_31_chars_long_file_name_114
+a/b/one_31_chars_long_file_name_115
+a/b/one_31_chars_long_file_name_116
+a/b/one_31_chars_long_file_name_117
+a/b/one_31_chars_long_file_name_118
+a/b/one_31_chars_long_file_name_119
+a/b/one_31_chars_long_file_name_120
+a/b/one_31_chars_long_file_name_121
+a/b/one_31_chars_long_file_name_122
+a/b/one_31_chars_long_file_name_123
+a/b/one_31_chars_long_file_name_124
+a/b/one_31_chars_long_file_name_125
+a/b/one_31_chars_long_file_name_126
+a/b/one_31_chars_long_file_name_127
+a/b/one_31_chars_long_file_name_128
+a/b/one_31_chars_long_file_name_129
+a/b/one_31_chars_long_file_name_130
+a/b/one_31_chars_long_file_name_131
+a/b/one_31_chars_long_file_name_132
+a/b/one_31_chars_long_file_name_133
+a/b/one_31_chars_long_file_name_134
+a/b/one_31_chars_long_file_name_135
+a/b/one_31_chars_long_file_name_136
+a/b/one_31_chars_long_file_name_137
+a/b/one_31_chars_long_file_name_138
+a/b/one_31_chars_long_file_name_139
+a/b/one_31_chars_long_file_name_140
+a/b/one_31_chars_long_file_name_141
+a/b/one_31_chars_long_file_name_142
+Incremental dump
+a/
+a/c/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/incr04.at:34: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 33 ) # 33. rename01.at:24: renamed dirs in incrementals
+ at_setup_line='rename01.at:24'
+ at_desc='renamed dirs in incrementals'
+ $at_quiet $ECHO_N " 33: renamed dirs in incrementals $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "33. rename01.at:24: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/rename01.at:27:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo \"Creating base archive\"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo \"Creating incremental archive\"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo \"Begin directory listing 1\"
+find foo | sort
+echo \"End directory listing 1\"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+)"
+echo rename01.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo/bar: Directory is new
+tar: foo/baz: Directory has been renamed from \`foo/bar'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating base archive
+foo/
+foo/bar/
+foo/file1
+foo/file2
+foo/bar/file
+Creating incremental archive
+foo/
+foo/baz/
+Begin directory listing 1
+foo
+foo/bar
+foo/bar/file
+foo/file1
+foo/file2
+End directory listing 1
+Begin directory listing 2
+foo
+foo/baz
+foo/baz/file
+foo/file1
+foo/file2
+End directory listing 2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/rename01.at:27: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/rename01.at:27:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo \"Creating base archive\"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo \"Creating incremental archive\"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo \"Begin directory listing 1\"
+find foo | sort
+echo \"End directory listing 1\"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+)"
+echo rename01.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo/bar: Directory is new
+tar: foo/baz: Directory has been renamed from \`foo/bar'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating base archive
+foo/
+foo/bar/
+foo/file1
+foo/file2
+foo/bar/file
+Creating incremental archive
+foo/
+foo/baz/
+Begin directory listing 1
+foo
+foo/bar
+foo/bar/file
+foo/file1
+foo/file2
+End directory listing 1
+Begin directory listing 2
+foo
+foo/baz
+foo/baz/file
+foo/file1
+foo/file2
+End directory listing 2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/rename01.at:27: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/rename01.at:27:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo \"Creating base archive\"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo \"Creating incremental archive\"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo \"Begin directory listing 1\"
+find foo | sort
+echo \"End directory listing 1\"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+)"
+echo rename01.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar foo/baz
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfg arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo/bar: Directory is new
+tar: foo/baz: Directory has been renamed from \`foo/bar'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating base archive
+foo/
+foo/bar/
+foo/file1
+foo/file2
+foo/bar/file
+Creating incremental archive
+foo/
+foo/baz/
+Begin directory listing 1
+foo
+foo/bar
+foo/bar/file
+foo/file1
+foo/file2
+End directory listing 1
+Begin directory listing 2
+foo
+foo/baz
+foo/baz/file
+foo/file1
+foo/file2
+End directory listing 2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/rename01.at:27: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 34 ) # 34. rename02.at:24: move between hierarchies
+ at_setup_line='rename02.at:24'
+ at_desc='move between hierarchies'
+ $at_quiet $ECHO_N " 34: move between hierarchies $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "34. rename02.at:24: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/rename02.at:27:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo \"Creating base archive\"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo \"Creating incremental archive\"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo \"Begin directory listing 1\"
+find foo | sort
+echo \"End directory listing 1\"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+)"
+echo rename02.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo/bar: Directory is new
+tar: foo/bar/baz: Directory is new
+tar: foo/baz: Directory has been renamed from \`foo/bar/baz'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating base archive
+foo/
+foo/bar/
+foo/bar/baz/
+foo/file1
+foo/file2
+foo/bar/file.r
+foo/bar/baz/file.z
+Creating incremental archive
+foo/
+foo/bar/
+foo/baz/
+Begin directory listing 1
+foo
+foo/bar
+foo/bar/baz
+foo/bar/baz/file.z
+foo/bar/file.r
+foo/file1
+foo/file2
+End directory listing 1
+foo/
+foo/bar/
+foo/baz/
+Begin directory listing 2
+foo
+foo/bar
+foo/bar/file.r
+foo/baz
+foo/baz/file.z
+foo/file1
+foo/file2
+End directory listing 2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/rename02.at:27: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/rename02.at:27:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo \"Creating base archive\"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo \"Creating incremental archive\"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo \"Begin directory listing 1\"
+find foo | sort
+echo \"End directory listing 1\"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+)"
+echo rename02.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo/bar: Directory is new
+tar: foo/bar/baz: Directory is new
+tar: foo/baz: Directory has been renamed from \`foo/bar/baz'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating base archive
+foo/
+foo/bar/
+foo/bar/baz/
+foo/file1
+foo/file2
+foo/bar/file.r
+foo/bar/baz/file.z
+Creating incremental archive
+foo/
+foo/bar/
+foo/baz/
+Begin directory listing 1
+foo
+foo/bar
+foo/bar/baz
+foo/bar/baz/file.z
+foo/bar/file.r
+foo/file1
+foo/file2
+End directory listing 1
+foo/
+foo/bar/
+foo/baz/
+Begin directory listing 2
+foo
+foo/bar
+foo/bar/file.r
+foo/baz
+foo/baz/file.z
+foo/file1
+foo/file2
+End directory listing 2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/rename02.at:27: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/rename02.at:27:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo \"Creating base archive\"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo \"Creating incremental archive\"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo \"Begin directory listing 1\"
+find foo | sort
+echo \"End directory listing 1\"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+)"
+echo rename02.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+mkdir foo/bar
+genfile --file foo/bar/file.r
+mkdir foo/bar/baz
+genfile --file foo/bar/baz/file.z
+
+echo "Creating base archive"
+tar -g incr -cf arch.1 -v foo
+
+mv foo/bar/baz foo
+
+echo "Creating incremental archive"
+tar -g incr -cf arch.2 -v foo
+
+mv foo old
+
+tar xfg arch.1 /dev/null 2>tmperr
+sort tmperr >&2
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo/bar: Directory is new
+tar: foo/bar/baz: Directory is new
+tar: foo/baz: Directory has been renamed from \`foo/bar/baz'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating base archive
+foo/
+foo/bar/
+foo/bar/baz/
+foo/file1
+foo/file2
+foo/bar/file.r
+foo/bar/baz/file.z
+Creating incremental archive
+foo/
+foo/bar/
+foo/baz/
+Begin directory listing 1
+foo
+foo/bar
+foo/bar/baz
+foo/bar/baz/file.z
+foo/bar/file.r
+foo/file1
+foo/file2
+End directory listing 1
+foo/
+foo/bar/
+foo/baz/
+Begin directory listing 2
+foo
+foo/bar
+foo/bar/file.r
+foo/baz
+foo/baz/file.z
+foo/file1
+foo/file2
+End directory listing 2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/rename02.at:27: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 35 ) # 35. rename03.at:23: cyclic renames
+ at_setup_line='rename03.at:23'
+ at_desc='cyclic renames'
+ $at_quiet $ECHO_N " 35: cyclic renames $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "35. rename03.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/rename03.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo \"First dump\"
+echo \"First dump\">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a \$\$
+mv c a
+mv b c
+mv \$\$ b)
+
+echo \"Second dump\"
+echo \"Second dump\" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo \"Begin directory listing 1\"
+find foo | sort
+echo \"End directory listing 1\"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+)"
+echo rename03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo "First dump"
+echo "First dump">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a $$
+mv c a
+mv b c
+mv $$ b)
+
+echo "Second dump"
+echo "Second dump" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo "First dump"
+echo "First dump">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a $$
+mv c a
+mv b c
+mv $$ b)
+
+echo "Second dump"
+echo "Second dump" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "First dump
+tar: foo/a: Directory is new
+tar: foo/b: Directory is new
+tar: foo/c: Directory is new
+Second dump
+tar: foo/a: Directory has been renamed from \`foo/c'
+tar: foo/b: Directory has been renamed from \`foo/a'
+tar: foo/c: Directory has been renamed from \`foo/b'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "First dump
+foo/
+foo/a/
+foo/b/
+foo/c/
+foo/file1
+foo/file2
+foo/a/filea
+foo/b/fileb
+foo/c/filec
+Second dump
+foo/
+foo/a/
+foo/b/
+foo/c/
+Begin directory listing 1
+foo
+foo/a
+foo/a/filea
+foo/b
+foo/b/fileb
+foo/c
+foo/c/filec
+foo/file1
+foo/file2
+End directory listing 1
+foo/
+foo/a/
+foo/b/
+foo/c/
+Begin directory listing 2
+foo
+foo/a
+foo/a/filec
+foo/b
+foo/b/filea
+foo/c
+foo/c/fileb
+foo/file1
+foo/file2
+End directory listing 2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/rename03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/rename03.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo \"First dump\"
+echo \"First dump\">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a \$\$
+mv c a
+mv b c
+mv \$\$ b)
+
+echo \"Second dump\"
+echo \"Second dump\" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo \"Begin directory listing 1\"
+find foo | sort
+echo \"End directory listing 1\"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+)"
+echo rename03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo "First dump"
+echo "First dump">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a $$
+mv c a
+mv b c
+mv $$ b)
+
+echo "Second dump"
+echo "Second dump" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo "First dump"
+echo "First dump">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a $$
+mv c a
+mv b c
+mv $$ b)
+
+echo "Second dump"
+echo "Second dump" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "First dump
+tar: foo/a: Directory is new
+tar: foo/b: Directory is new
+tar: foo/c: Directory is new
+Second dump
+tar: foo/a: Directory has been renamed from \`foo/c'
+tar: foo/b: Directory has been renamed from \`foo/a'
+tar: foo/c: Directory has been renamed from \`foo/b'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "First dump
+foo/
+foo/a/
+foo/b/
+foo/c/
+foo/file1
+foo/file2
+foo/a/filea
+foo/b/fileb
+foo/c/filec
+Second dump
+foo/
+foo/a/
+foo/b/
+foo/c/
+Begin directory listing 1
+foo
+foo/a
+foo/a/filea
+foo/b
+foo/b/fileb
+foo/c
+foo/c/filec
+foo/file1
+foo/file2
+End directory listing 1
+foo/
+foo/a/
+foo/b/
+foo/c/
+Begin directory listing 2
+foo
+foo/a
+foo/a/filec
+foo/b
+foo/b/filea
+foo/c
+foo/c/fileb
+foo/file1
+foo/file2
+End directory listing 2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/rename03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/rename03.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo \"First dump\"
+echo \"First dump\">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a \$\$
+mv c a
+mv b c
+mv \$\$ b)
+
+echo \"Second dump\"
+echo \"Second dump\" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo \"Begin directory listing 1\"
+find foo | sort
+echo \"End directory listing 1\"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+)"
+echo rename03.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo "First dump"
+echo "First dump">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a $$
+mv c a
+mv b c
+mv $$ b)
+
+echo "Second dump"
+echo "Second dump" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+mkdir foo
+genfile --file foo/file1
+genfile --file foo/file2
+
+mkdir foo/a
+genfile --file foo/a/filea
+
+mkdir foo/b
+genfile --file foo/b/fileb
+
+mkdir foo/c
+genfile --file foo/c/filec
+
+echo "First dump"
+echo "First dump">&2
+tar -g incr -cf arch.1 -v foo 2>tmperr
+sort tmperr >&2
+
+# Shuffle directories:
+(cd foo
+mv a $$
+mv c a
+mv b c
+mv $$ b)
+
+echo "Second dump"
+echo "Second dump" >&2
+tar -g incr -cf arch.2 -v foo 2>tmperr
+sort tmperr >&2
+
+tar xfg arch.1 /dev/null
+
+echo "Begin directory listing 1"
+find foo | sort
+echo "End directory listing 1"
+
+tar xfgv arch.2 /dev/null
+echo Begin directory listing 2
+find foo | sort
+echo End directory listing 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "First dump
+tar: foo/a: Directory is new
+tar: foo/b: Directory is new
+tar: foo/c: Directory is new
+Second dump
+tar: foo/a: Directory has been renamed from \`foo/c'
+tar: foo/b: Directory has been renamed from \`foo/a'
+tar: foo/c: Directory has been renamed from \`foo/b'
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "First dump
+foo/
+foo/a/
+foo/b/
+foo/c/
+foo/file1
+foo/file2
+foo/a/filea
+foo/b/fileb
+foo/c/filec
+Second dump
+foo/
+foo/a/
+foo/b/
+foo/c/
+Begin directory listing 1
+foo
+foo/a
+foo/a/filea
+foo/b
+foo/b/fileb
+foo/c
+foo/c/filec
+foo/file1
+foo/file2
+End directory listing 1
+foo/
+foo/a/
+foo/b/
+foo/c/
+Begin directory listing 2
+foo
+foo/a
+foo/a/filec
+foo/b
+foo/b/filea
+foo/c
+foo/c/fileb
+foo/file1
+foo/file2
+End directory listing 2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/rename03.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 36 ) # 36. chtype.at:27: changed file types in incrementals
+ at_setup_line='chtype.at:27'
+ at_desc='changed file types in incrementals'
+ $at_quiet $ECHO_N " 36: changed file types in incrementals $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "36. chtype.at:27: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/chtype.at:30:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+install-sh -d directory/b/c >/dev/null
+genfile --file directory/b/c/x
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+)"
+echo chtype.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+install-sh -d directory/b/c >/dev/null
+genfile --file directory/b/c/x
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+install-sh -d directory/b/c >/dev/null
+genfile --file directory/b/c/x
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "First backup
+Second backup
+Restore archive.1
+Restore archive.2
+directory
+directory/a
+directory/a/a
+directory/a/b
+directory/b
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/chtype.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/chtype.at:30:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+install-sh -d directory/b/c >/dev/null
+genfile --file directory/b/c/x
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+)"
+echo chtype.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+install-sh -d directory/b/c >/dev/null
+genfile --file directory/b/c/x
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+install-sh -d directory/b/c >/dev/null
+genfile --file directory/b/c/x
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "First backup
+Second backup
+Restore archive.1
+Restore archive.2
+directory
+directory/a
+directory/a/a
+directory/a/b
+directory/b
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/chtype.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/chtype.at:30:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+install-sh -d directory/b/c >/dev/null
+genfile --file directory/b/c/x
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+)"
+echo chtype.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+install-sh -d directory/b/c >/dev/null
+genfile --file directory/b/c/x
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+install-sh -d directory/b/c >/dev/null
+genfile --file directory/b/c/x
+mkdir directory/a
+genfile --file directory/a/a
+
+echo First backup
+tar --create --file=archive.1 --listed-incremental=db.1 directory
+
+sleep 2
+
+# Remove directory b and create a file with this name.
+# Previous versions were not able to restore over this file.
+rm -r directory/b
+genfile --file directory/b
+genfile --file directory/a/b
+
+echo Second backup
+tar --create --file=archive.2 --listed-incremental=db.2 directory
+
+# Delete a
+rm -r directory
+
+echo Restore archive.1
+tar -xf archive.1 --listed-incremental=/dev/null
+echo Restore archive.2
+tar -xf archive.2 --listed-incremental=/dev/null
+find directory | sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "First backup
+Second backup
+Restore archive.1
+Restore archive.2
+directory
+directory/a
+directory/a/a
+directory/a/b
+directory/b
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/chtype.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 37 ) # 37. ignfail.at:23: ignfail
+ at_setup_line='ignfail.at:23'
+ at_desc='ignfail'
+ $at_quiet $ECHO_N " 37: ignfail $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "37. ignfail.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/ignfail.at:26:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=\$?
+chmod 600 file
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=\$?
+chmod 600 file
+test \$status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=\$?
+chmod 700 directory
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=\$?
+chmod 700 directory
+test \$status = 0
+)"
+echo ignfail.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "-----
+tar: file: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: file: Warning: Cannot open: Permission denied
+-----
+tar: directory: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: directory: Warning: Cannot open: Permission denied
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/ignfail.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/ignfail.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=\$?
+chmod 600 file
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=\$?
+chmod 600 file
+test \$status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=\$?
+chmod 700 directory
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=\$?
+chmod 700 directory
+test \$status = 0
+)"
+echo ignfail.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "-----
+tar: file: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: file: Warning: Cannot open: Permission denied
+-----
+tar: directory: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: directory: Warning: Cannot open: Permission denied
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/ignfail.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/ignfail.at:26:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=\$?
+chmod 600 file
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=\$?
+chmod 600 file
+test \$status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=\$?
+chmod 700 directory
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=\$?
+chmod 700 directory
+test \$status = 0
+)"
+echo ignfail.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "-----
+tar: file: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: file: Warning: Cannot open: Permission denied
+-----
+tar: directory: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: directory: Warning: Cannot open: Permission denied
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/ignfail.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/ignfail.at:26:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=\$?
+chmod 600 file
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=\$?
+chmod 600 file
+test \$status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=\$?
+chmod 700 directory
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=\$?
+chmod 700 directory
+test \$status = 0
+)"
+echo ignfail.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "-----
+tar: file: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: file: Warning: Cannot open: Permission denied
+-----
+tar: directory: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: directory: Warning: Cannot open: Permission denied
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/ignfail.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/ignfail.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=\$?
+chmod 600 file
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=\$?
+chmod 600 file
+test \$status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=\$?
+chmod 700 directory
+test \$status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=\$?
+chmod 700 directory
+test \$status = 0
+)"
+echo ignfail.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+# The test is meaningless for super-user.
+
+echo "test" > $$
+chmod 0 $$
+cat $$ > /dev/null 2>&1
+result=$?
+rm -f $$
+test $result -eq 0 && exit 77
+
+
+touch file
+mkdir directory
+touch directory/file
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive file
+status=$?
+chmod 600 file
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 file
+tar cf archive --ignore-failed-read file || exit 1
+status=$?
+chmod 600 file
+test $status = 0 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive directory
+status=$?
+chmod 700 directory
+test $status = 2 || exit 1
+
+echo 1>&2 -----
+chmod 000 directory
+tar cf archive --ignore-failed-read directory || exit 1
+status=$?
+chmod 700 directory
+test $status = 0
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "-----
+tar: file: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: file: Warning: Cannot open: Permission denied
+-----
+tar: directory: Cannot open: Permission denied
+tar: Error exit delayed from previous errors
+-----
+tar: directory: Warning: Cannot open: Permission denied
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/ignfail.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 38 ) # 38. link01.at:33: link count gt 2
+ at_setup_line='link01.at:33'
+ at_desc='link count gt 2'
+ $at_quiet $ECHO_N " 38: link count gt 2 $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "38. link01.at:33: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/link01.at:36:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+)"
+echo link01.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "test.txt
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/link01.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/link01.at:36:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+)"
+echo link01.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "test.txt
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/link01.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/link01.at:36:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+)"
+echo link01.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "test.txt
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/link01.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/link01.at:36:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+)"
+echo link01.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "test.txt
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/link01.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/link01.at:36:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+)"
+echo link01.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+mkdir directory/test1
+mkdir directory/test2
+
+echo TEST > directory/test1/test.txt
+ln directory/test1/test.txt directory/test2/test.txt || exit 77
+
+tar cf archive directory/test1/test.txt directory/test1/test.txt
+
+rm -r directory
+tar xf archive
+
+ls directory/test1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "test.txt
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/link01.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 39 ) # 39. longv7.at:24: long names in V7 archives
+ at_setup_line='longv7.at:24'
+ at_desc='long names in V7 archives'
+ $at_quiet $ECHO_N " 39: long names in V7 archives $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "39. longv7.at:24: testing ..."
+ $at_traceon
+
+
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/longv7.at:30:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir this_is_a_very_long_name_for_a_directory_which_causes_problems
+touch this_is_a_very_long_name_for_a_directory_which_causes_problems/this_is_a_very_long_file_name_which_raises_issues.c
+
+tar cf archive this_is_a_very_long_name_for_a_directory_which_causes_problems
+echo separator
+tar tf archive
+)"
+echo longv7.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir this_is_a_very_long_name_for_a_directory_which_causes_problems
+touch this_is_a_very_long_name_for_a_directory_which_causes_problems/this_is_a_very_long_file_name_which_raises_issues.c
+
+tar cf archive this_is_a_very_long_name_for_a_directory_which_causes_problems
+echo separator
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir this_is_a_very_long_name_for_a_directory_which_causes_problems
+touch this_is_a_very_long_name_for_a_directory_which_causes_problems/this_is_a_very_long_file_name_which_raises_issues.c
+
+tar cf archive this_is_a_very_long_name_for_a_directory_which_causes_problems
+echo separator
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: this_is_a_very_long_name_for_a_directory_which_causes_problems/this_is_a_very_long_file_name_which_raises_issues.c: file name is too long (max 99); not dumped
+tar: Error exit delayed from previous errors
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+this_is_a_very_long_name_for_a_directory_which_causes_problems/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/longv7.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 40 ) # 40. long01.at:28: long file names divisible by block size
+ at_setup_line='long01.at:28'
+ at_desc='long file names divisible by block size'
+ $at_quiet $ECHO_N " 40: long file names divisible by block size $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "40. long01.at:28: testing ..."
+ $at_traceon
+
+
+
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/long01.at:36:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde >/dev/null
+genfile --file 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde
+echo test > endfile
+
+tar cf archive 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde endfile
+tar tf archive)"
+echo long01.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde >/dev/null
+genfile --file 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde
+echo test > endfile
+
+tar cf archive 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde endfile
+tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde >/dev/null
+genfile --file 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde
+echo test > endfile
+
+tar cf archive 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde endfile
+tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde
+endfile
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/long01.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/long01.at:36:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde >/dev/null
+genfile --file 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde
+echo test > endfile
+
+tar cf archive 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde endfile
+tar tf archive)"
+echo long01.at:36 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde >/dev/null
+genfile --file 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde
+echo test > endfile
+
+tar cf archive 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde endfile
+tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde >/dev/null
+genfile --file 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde
+echo test > endfile
+
+tar cf archive 0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde endfile
+tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde/0123456789abcde
+endfile
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/long01.at:36: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 41 ) # 41. lustar01.at:21: ustar: unsplittable file name
+ at_setup_line='lustar01.at:21'
+ at_desc='ustar: unsplittable file name'
+ $at_quiet $ECHO_N " 41: ustar: unsplittable file name $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "41. lustar01.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/lustar01.at:27:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file=this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_between_name_and_prefix
+tar cf archive this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_between_name_and_prefix
+)"
+echo lustar01.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file=this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_between_name_and_prefix
+tar cf archive this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_between_name_and_prefix
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file=this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_between_name_and_prefix
+tar cf archive this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_between_name_and_prefix
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_between_name_and_prefix: file name is too long (cannot be split); not dumped
+tar: Error exit delayed from previous errors
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 2) ;;
+ *) echo "$at_srcdir/lustar01.at:27: exit code was $at_status, expected 2"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 42 ) # 42. lustar02.at:21: ustar: unsplittable path name
+ at_setup_line='lustar02.at:21'
+ at_desc='ustar: unsplittable path name'
+ $at_quiet $ECHO_N " 42: ustar: unsplittable path name $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "42. lustar02.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/lustar02.at:32:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be >/dev/null
+genfile --file this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be/tween_name_and_prefix
+tar cf archive this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be
+)"
+echo lustar02.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be >/dev/null
+genfile --file this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be/tween_name_and_prefix
+tar cf archive this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be >/dev/null
+genfile --file this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be/tween_name_and_prefix
+tar cf archive this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: this_is_a_very_long_name_for_a_file_designed_to_test_generation_of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be/: file name is too long (cannot be split); not dumped
+tar: Error exit delayed from previous errors
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 2) ;;
+ *) echo "$at_srcdir/lustar02.at:32: exit code was $at_status, expected 2"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 43 ) # 43. lustar03.at:21: ustar: splitting long names
+ at_setup_line='lustar03.at:21'
+ at_desc='ustar: splitting long names'
+ $at_quiet $ECHO_N " 43: ustar: splitting long names $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "43. lustar03.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/lustar03.at:29:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be >/dev/null
+genfile --file this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be/file
+echo \"Create archive\"
+tar cf archive this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be
+echo \"List archive\"
+tar tf archive)"
+echo lustar03.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be >/dev/null
+genfile --file this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be/file
+echo "Create archive"
+tar cf archive this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be
+echo "List archive"
+tar tf archive) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+install-sh -d this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be >/dev/null
+genfile --file this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be/file
+echo "Create archive"
+tar cf archive this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be
+echo "List archive"
+tar tf archive) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Create archive
+List archive
+this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be/
+this_is_a_very_long_name_for_a_file_designed_to_test_generation/of_ustar_archives_by_gnu_tar_semicolon_it_will_not_fit_the_name_field_and_cannot_be_split_be/file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/lustar03.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 44 ) # 44. multiv01.at:23: multivolume dumps from pipes
+ at_setup_line='multiv01.at:23'
+ at_desc='multivolume dumps from pipes'
+ $at_quiet $ECHO_N " 44: multivolume dumps from pipes $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "44. multiv01.at:23: testing ..."
+ $at_traceon
+
+
+
+# Fixme: should be configurable
+# TRUSS=truss -o /tmp/tr
+# TRUSS=strace
+
+
+
+ $at_traceoff
+echo "$at_srcdir/multiv01.at:30:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --length 7168 --file file1
+
+for block in \" 1\" \" 2\" \" 3\" \" 4\" \" 5\" \" 6\" \" 7\" \" 8\" \\
+ \" 9\" \"10\" \"11\" \"12\" \"13\" \"14\" \"15\" \"16\" ; do \\
+ echo \"file2 block \${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla\"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo \"bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla\"
+ done
+done >file2
+
+if test \$TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=\$TAPE_LENGTH \\
+ --listed-incremental=t.snar \\
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=\$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=\$PATH \${TRUSS} tar -f t1-pipe.tar -f - \\
+ -C extract-dir-pipe -x --multi-volume \\
+ --tape-length=\$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+)"
+echo multiv01.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a ${...} parameter expansion)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --length 7168 --file file1
+
+for block in " 1" " 2" " 3" " 4" " 5" " 6" " 7" " 8" \
+ " 9" "10" "11" "12" "13" "14" "15" "16" ; do \
+ echo "file2 block ${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo "bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ done
+done >file2
+
+if test $TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=$TAPE_LENGTH \
+ --listed-incremental=t.snar \
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=$PATH ${TRUSS} tar -f t1-pipe.tar -f - \
+ -C extract-dir-pipe -x --multi-volume \
+ --tape-length=$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --length 7168 --file file1
+
+for block in " 1" " 2" " 3" " 4" " 5" " 6" " 7" " 8" \
+ " 9" "10" "11" "12" "13" "14" "15" "16" ; do \
+ echo "file2 block ${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo "bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ done
+done >file2
+
+if test $TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=$TAPE_LENGTH \
+ --listed-incremental=t.snar \
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=$PATH ${TRUSS} tar -f t1-pipe.tar -f - \
+ -C extract-dir-pipe -x --multi-volume \
+ --tape-length=$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv01.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/multiv01.at:30:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --length 7168 --file file1
+
+for block in \" 1\" \" 2\" \" 3\" \" 4\" \" 5\" \" 6\" \" 7\" \" 8\" \\
+ \" 9\" \"10\" \"11\" \"12\" \"13\" \"14\" \"15\" \"16\" ; do \\
+ echo \"file2 block \${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla\"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo \"bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla\"
+ done
+done >file2
+
+if test \$TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=\$TAPE_LENGTH \\
+ --listed-incremental=t.snar \\
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=\$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=\$PATH \${TRUSS} tar -f t1-pipe.tar -f - \\
+ -C extract-dir-pipe -x --multi-volume \\
+ --tape-length=\$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+)"
+echo multiv01.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a ${...} parameter expansion)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --length 7168 --file file1
+
+for block in " 1" " 2" " 3" " 4" " 5" " 6" " 7" " 8" \
+ " 9" "10" "11" "12" "13" "14" "15" "16" ; do \
+ echo "file2 block ${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo "bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ done
+done >file2
+
+if test $TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=$TAPE_LENGTH \
+ --listed-incremental=t.snar \
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=$PATH ${TRUSS} tar -f t1-pipe.tar -f - \
+ -C extract-dir-pipe -x --multi-volume \
+ --tape-length=$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --length 7168 --file file1
+
+for block in " 1" " 2" " 3" " 4" " 5" " 6" " 7" " 8" \
+ " 9" "10" "11" "12" "13" "14" "15" "16" ; do \
+ echo "file2 block ${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo "bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ done
+done >file2
+
+if test $TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=$TAPE_LENGTH \
+ --listed-incremental=t.snar \
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=$PATH ${TRUSS} tar -f t1-pipe.tar -f - \
+ -C extract-dir-pipe -x --multi-volume \
+ --tape-length=$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv01.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/multiv01.at:30:
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H pax\"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --length 7168 --file file1
+
+for block in \" 1\" \" 2\" \" 3\" \" 4\" \" 5\" \" 6\" \" 7\" \" 8\" \\
+ \" 9\" \"10\" \"11\" \"12\" \"13\" \"14\" \"15\" \"16\" ; do \\
+ echo \"file2 block \${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla\"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo \"bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla\"
+ done
+done >file2
+
+if test \$TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=\$TAPE_LENGTH \\
+ --listed-incremental=t.snar \\
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=\$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=\$PATH \${TRUSS} tar -f t1-pipe.tar -f - \\
+ -C extract-dir-pipe -x --multi-volume \\
+ --tape-length=\$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+)"
+echo multiv01.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a ${...} parameter expansion)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --length 7168 --file file1
+
+for block in " 1" " 2" " 3" " 4" " 5" " 6" " 7" " 8" \
+ " 9" "10" "11" "12" "13" "14" "15" "16" ; do \
+ echo "file2 block ${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo "bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ done
+done >file2
+
+if test $TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=$TAPE_LENGTH \
+ --listed-incremental=t.snar \
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=$PATH ${TRUSS} tar -f t1-pipe.tar -f - \
+ -C extract-dir-pipe -x --multi-volume \
+ --tape-length=$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --length 7168 --file file1
+
+for block in " 1" " 2" " 3" " 4" " 5" " 6" " 7" " 8" \
+ " 9" "10" "11" "12" "13" "14" "15" "16" ; do \
+ echo "file2 block ${block} bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ for count in 2 3 4 5 6 7 8 ; do
+ echo "bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla!bla"
+ done
+done >file2
+
+if test $TEST_TAR_FORMAT = pax; then
+ TAPE_LENGTH=11
+else
+ TAPE_LENGTH=10
+fi
+
+tar -c --multi-volume --tape-length=$TAPE_LENGTH \
+ --listed-incremental=t.snar \
+ -f t1-pipe.tar -f t2-pipe.tar ./file1 ./file2 || exit 1
+
+mkdir extract-dir-pipe
+dd bs=4096 count=$TAPE_LENGTH if=t2-pipe.tar 2>/dev/null |
+PATH=$PATH ${TRUSS} tar -f t1-pipe.tar -f - \
+ -C extract-dir-pipe -x --multi-volume \
+ --tape-length=$TAPE_LENGTH --read-full-records || exit 1
+
+cmp file1 extract-dir-pipe/file1
+cmp file2 extract-dir-pipe/file2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv01.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 45 ) # 45. multiv02.at:28: skipping a straddling member
+ at_setup_line='multiv02.at:28'
+ at_desc='skipping a straddling member'
+ $at_quiet $ECHO_N " 45: skipping a straddling member $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "45. multiv02.at:28: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/multiv02.at:31:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+)"
+echo multiv02.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+en
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv02.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/multiv02.at:31:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+)"
+echo multiv02.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+en
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv02.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/multiv02.at:31:
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H pax\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+)"
+echo multiv02.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 10240 --file en
+genfile --length 20000 --file to
+genfile --length 20000 --file tre
+genfile --length 10240 --file fire
+
+exec <&-
+
+tar -c -f A.tar -f B.tar -f C.tar -M -L 30 en to tre fire || exit 1
+echo separator
+tar -v -x -f A.tar -f B.tar -f C.tar -M en || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+en
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv02.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 46 ) # 46. multiv03.at:30: MV archive & long filenames
+ at_setup_line='multiv03.at:30'
+ at_desc='MV archive & long filenames'
+ $at_quiet $ECHO_N " 46: MV archive & long filenames $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "46. multiv03.at:30: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/multiv03.at:33:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+AFILE=\`awk 'BEGIN { for (i = 0; i < 100; i++) printf \"a\"; exit; }'\`
+BFILE=\`awk 'BEGIN { for (i = 0; i < 101; i++) printf \"b\"; exit; }'\`
+
+cat > ../experr <<EOF
+tar: \$BFILE: file name too long to be stored in a GNU multivolume header, truncated
+tar: \\\`\$BFILE' is possibly continued on this volume: header contains truncated name
+EOF
+
+cat > ../expout <<EOF
+\$AFILE
+separator-1
+separator-2
+EOF
+
+genfile --length 15360 --file \$AFILE
+
+exec <&-
+
+tar -M -L 10 -c -f arch.1 -f arch.2 \$AFILE || exit 1
+tar -tM -f arch.1 -f arch.2 || exit 1
+
+echo separator-1
+
+genfile --length 15360 --file \$BFILE
+tar -M -L 10 -c -f arch.1 -f arch.2 \$BFILE || exit 1
+
+echo separator-2
+mv \$BFILE bfile
+tar -M -x -f arch.1 -f arch.2 || exit 1
+cmp \$BFILE bfile
+)"
+echo multiv03.at:33 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+AFILE=`awk 'BEGIN { for (i = 0; i < 100; i++) printf "a"; exit; }'`
+BFILE=`awk 'BEGIN { for (i = 0; i < 101; i++) printf "b"; exit; }'`
+
+cat > ../experr <<EOF
+tar: $BFILE: file name too long to be stored in a GNU multivolume header, truncated
+tar: \`$BFILE' is possibly continued on this volume: header contains truncated name
+EOF
+
+cat > ../expout <<EOF
+$AFILE
+separator-1
+separator-2
+EOF
+
+genfile --length 15360 --file $AFILE
+
+exec <&-
+
+tar -M -L 10 -c -f arch.1 -f arch.2 $AFILE || exit 1
+tar -tM -f arch.1 -f arch.2 || exit 1
+
+echo separator-1
+
+genfile --length 15360 --file $BFILE
+tar -M -L 10 -c -f arch.1 -f arch.2 $BFILE || exit 1
+
+echo separator-2
+mv $BFILE bfile
+tar -M -x -f arch.1 -f arch.2 || exit 1
+cmp $BFILE bfile
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+AFILE=`awk 'BEGIN { for (i = 0; i < 100; i++) printf "a"; exit; }'`
+BFILE=`awk 'BEGIN { for (i = 0; i < 101; i++) printf "b"; exit; }'`
+
+cat > ../experr <<EOF
+tar: $BFILE: file name too long to be stored in a GNU multivolume header, truncated
+tar: \`$BFILE' is possibly continued on this volume: header contains truncated name
+EOF
+
+cat > ../expout <<EOF
+$AFILE
+separator-1
+separator-2
+EOF
+
+genfile --length 15360 --file $AFILE
+
+exec <&-
+
+tar -M -L 10 -c -f arch.1 -f arch.2 $AFILE || exit 1
+tar -tM -f arch.1 -f arch.2 || exit 1
+
+echo separator-1
+
+genfile --length 15360 --file $BFILE
+tar -M -L 10 -c -f arch.1 -f arch.2 $BFILE || exit 1
+
+echo separator-2
+mv $BFILE bfile
+tar -M -x -f arch.1 -f arch.2 || exit 1
+cmp $BFILE bfile
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff experr "$at_stderr" || at_failed=:
+$at_diff expout "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv03.at:33: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/multiv03.at:33:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+AFILE=\`awk 'BEGIN { for (i = 0; i < 100; i++) printf \"a\"; exit; }'\`
+BFILE=\`awk 'BEGIN { for (i = 0; i < 101; i++) printf \"b\"; exit; }'\`
+
+cat > ../experr <<EOF
+tar: \$BFILE: file name too long to be stored in a GNU multivolume header, truncated
+tar: \\\`\$BFILE' is possibly continued on this volume: header contains truncated name
+EOF
+
+cat > ../expout <<EOF
+\$AFILE
+separator-1
+separator-2
+EOF
+
+genfile --length 15360 --file \$AFILE
+
+exec <&-
+
+tar -M -L 10 -c -f arch.1 -f arch.2 \$AFILE || exit 1
+tar -tM -f arch.1 -f arch.2 || exit 1
+
+echo separator-1
+
+genfile --length 15360 --file \$BFILE
+tar -M -L 10 -c -f arch.1 -f arch.2 \$BFILE || exit 1
+
+echo separator-2
+mv \$BFILE bfile
+tar -M -x -f arch.1 -f arch.2 || exit 1
+cmp \$BFILE bfile
+)"
+echo multiv03.at:33 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+AFILE=`awk 'BEGIN { for (i = 0; i < 100; i++) printf "a"; exit; }'`
+BFILE=`awk 'BEGIN { for (i = 0; i < 101; i++) printf "b"; exit; }'`
+
+cat > ../experr <<EOF
+tar: $BFILE: file name too long to be stored in a GNU multivolume header, truncated
+tar: \`$BFILE' is possibly continued on this volume: header contains truncated name
+EOF
+
+cat > ../expout <<EOF
+$AFILE
+separator-1
+separator-2
+EOF
+
+genfile --length 15360 --file $AFILE
+
+exec <&-
+
+tar -M -L 10 -c -f arch.1 -f arch.2 $AFILE || exit 1
+tar -tM -f arch.1 -f arch.2 || exit 1
+
+echo separator-1
+
+genfile --length 15360 --file $BFILE
+tar -M -L 10 -c -f arch.1 -f arch.2 $BFILE || exit 1
+
+echo separator-2
+mv $BFILE bfile
+tar -M -x -f arch.1 -f arch.2 || exit 1
+cmp $BFILE bfile
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+AFILE=`awk 'BEGIN { for (i = 0; i < 100; i++) printf "a"; exit; }'`
+BFILE=`awk 'BEGIN { for (i = 0; i < 101; i++) printf "b"; exit; }'`
+
+cat > ../experr <<EOF
+tar: $BFILE: file name too long to be stored in a GNU multivolume header, truncated
+tar: \`$BFILE' is possibly continued on this volume: header contains truncated name
+EOF
+
+cat > ../expout <<EOF
+$AFILE
+separator-1
+separator-2
+EOF
+
+genfile --length 15360 --file $AFILE
+
+exec <&-
+
+tar -M -L 10 -c -f arch.1 -f arch.2 $AFILE || exit 1
+tar -tM -f arch.1 -f arch.2 || exit 1
+
+echo separator-1
+
+genfile --length 15360 --file $BFILE
+tar -M -L 10 -c -f arch.1 -f arch.2 $BFILE || exit 1
+
+echo separator-2
+mv $BFILE bfile
+tar -M -x -f arch.1 -f arch.2 || exit 1
+cmp $BFILE bfile
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff experr "$at_stderr" || at_failed=:
+$at_diff expout "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv03.at:33: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 47 ) # 47. multiv04.at:36: split directory members in a MV archive
+ at_setup_line='multiv04.at:36'
+ at_desc='split directory members in a MV archive'
+ $at_quiet $ECHO_N " 47: split directory members in a MV archive $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "47. multiv04.at:36: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/multiv04.at:39:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+awk 'BEGIN { for (i = 0; i < 1024; i++) printf(\"directory/%014x\\n\", i); }' </dev/null | genfile --files-from -
+
+exec <&-
+
+sleep 2
+
+tar --listed-incremental=list -c -f archive.a directory
+
+sleep 2
+
+tar --listed-incremental=list -c --record-size 1024 -L 16 -f arc.1 -f arc.2 -v directory
+
+echo separator
+
+tar -MRt -f arc.1 -f arc.2)"
+echo multiv04.at:39 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+awk 'BEGIN { for (i = 0; i < 1024; i++) printf("directory/%014x\n", i); }' </dev/null | genfile --files-from -
+
+exec <&-
+
+sleep 2
+
+tar --listed-incremental=list -c -f archive.a directory
+
+sleep 2
+
+tar --listed-incremental=list -c --record-size 1024 -L 16 -f arc.1 -f arc.2 -v directory
+
+echo separator
+
+tar -MRt -f arc.1 -f arc.2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+awk 'BEGIN { for (i = 0; i < 1024; i++) printf("directory/%014x\n", i); }' </dev/null | genfile --files-from -
+
+exec <&-
+
+sleep 2
+
+tar --listed-incremental=list -c -f archive.a directory
+
+sleep 2
+
+tar --listed-incremental=list -c --record-size 1024 -L 16 -f arc.1 -f arc.2 -v directory
+
+echo separator
+
+tar -MRt -f arc.1 -f arc.2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+separator
+block 0: directory/
+block 35: ** Block of NULs **
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv04.at:39: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/multiv04.at:39:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+awk 'BEGIN { for (i = 0; i < 1024; i++) printf(\"directory/%014x\\n\", i); }' </dev/null | genfile --files-from -
+
+exec <&-
+
+sleep 2
+
+tar --listed-incremental=list -c -f archive.a directory
+
+sleep 2
+
+tar --listed-incremental=list -c --record-size 1024 -L 16 -f arc.1 -f arc.2 -v directory
+
+echo separator
+
+tar -MRt -f arc.1 -f arc.2)"
+echo multiv04.at:39 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+awk 'BEGIN { for (i = 0; i < 1024; i++) printf("directory/%014x\n", i); }' </dev/null | genfile --files-from -
+
+exec <&-
+
+sleep 2
+
+tar --listed-incremental=list -c -f archive.a directory
+
+sleep 2
+
+tar --listed-incremental=list -c --record-size 1024 -L 16 -f arc.1 -f arc.2 -v directory
+
+echo separator
+
+tar -MRt -f arc.1 -f arc.2) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+mkdir directory
+awk 'BEGIN { for (i = 0; i < 1024; i++) printf("directory/%014x\n", i); }' </dev/null | genfile --files-from -
+
+exec <&-
+
+sleep 2
+
+tar --listed-incremental=list -c -f archive.a directory
+
+sleep 2
+
+tar --listed-incremental=list -c --record-size 1024 -L 16 -f arc.1 -f arc.2 -v directory
+
+echo separator
+
+tar -MRt -f arc.1 -f arc.2) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+separator
+block 0: directory/
+block 35: ** Block of NULs **
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv04.at:39: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 48 ) # 48. multiv05.at:26: Restoring after an out of sync folume
+ at_setup_line='multiv05.at:26'
+ at_desc='Restoring after an out of sync folume'
+ $at_quiet $ECHO_N " 48: Restoring after an out of sync folume $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "48. multiv05.at:26: testing ..."
+ $at_traceon
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/multiv05.at:30:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+
+genfile --length 250k --file jeden
+genfile --length 250k --file dwa
+genfile --length 250k --file trzy
+genfile --length 250k --file cztery
+genfile --length 250k --file piec
+genfile --length 250k --file szesc
+
+
+echo Creating archive
+tar -c -M -L 502 -f a.tar -f b.tar -f c.tar jeden dwa trzy cztery piec szesc
+echo separator
+mkdir bak
+mv jeden dwa trzy cztery piec szesc bak
+tar -vxM -f a.tar -f c.tar -f b.tar -f c.tar
+echo Diffing jeden
+ cmp bak/jeden jeden || exit 1
+echo Diffing dwa
+ cmp bak/dwa dwa || exit 1
+echo Diffing trzy
+ cmp bak/trzy trzy || exit 1
+echo Diffing cztery
+ cmp bak/cztery cztery || exit 1
+echo Diffing piec
+ cmp bak/piec piec || exit 1
+echo Diffing szesc
+ cmp bak/szesc szesc || exit 1
+)"
+echo multiv05.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+
+genfile --length 250k --file jeden
+genfile --length 250k --file dwa
+genfile --length 250k --file trzy
+genfile --length 250k --file cztery
+genfile --length 250k --file piec
+genfile --length 250k --file szesc
+
+
+echo Creating archive
+tar -c -M -L 502 -f a.tar -f b.tar -f c.tar jeden dwa trzy cztery piec szesc
+echo separator
+mkdir bak
+mv jeden dwa trzy cztery piec szesc bak
+tar -vxM -f a.tar -f c.tar -f b.tar -f c.tar
+echo Diffing jeden
+ cmp bak/jeden jeden || exit 1
+echo Diffing dwa
+ cmp bak/dwa dwa || exit 1
+echo Diffing trzy
+ cmp bak/trzy trzy || exit 1
+echo Diffing cztery
+ cmp bak/cztery cztery || exit 1
+echo Diffing piec
+ cmp bak/piec piec || exit 1
+echo Diffing szesc
+ cmp bak/szesc szesc || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+
+genfile --length 250k --file jeden
+genfile --length 250k --file dwa
+genfile --length 250k --file trzy
+genfile --length 250k --file cztery
+genfile --length 250k --file piec
+genfile --length 250k --file szesc
+
+
+echo Creating archive
+tar -c -M -L 502 -f a.tar -f b.tar -f c.tar jeden dwa trzy cztery piec szesc
+echo separator
+mkdir bak
+mv jeden dwa trzy cztery piec szesc bak
+tar -vxM -f a.tar -f c.tar -f b.tar -f c.tar
+echo Diffing jeden
+ cmp bak/jeden jeden || exit 1
+echo Diffing dwa
+ cmp bak/dwa dwa || exit 1
+echo Diffing trzy
+ cmp bak/trzy trzy || exit 1
+echo Diffing cztery
+ cmp bak/cztery cztery || exit 1
+echo Diffing piec
+ cmp bak/piec piec || exit 1
+echo Diffing szesc
+ cmp bak/szesc szesc || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: \`trzy' is not continued on this volume
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Creating archive
+separator
+jeden
+dwa
+trzy
+cztery
+piec
+szesc
+Diffing jeden
+Diffing dwa
+Diffing trzy
+Diffing cztery
+Diffing piec
+Diffing szesc
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multiv05.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 49 ) # 49. old.at:23: old archives
+ at_setup_line='old.at:23'
+ at_desc='old archives'
+ $at_quiet $ECHO_N " 49: old archives $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "49. old.at:23: testing ..."
+ $at_traceon
+
+
+
+unset TAR_OPTIONS
+$at_traceoff
+echo "$at_srcdir/old.at:27:
+mkdir directory
+tar cfvo archive directory || exit 1
+tar tf archive
+"
+echo old.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir directory
+tar cfvo archive directory || exit 1
+tar tf archive
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir directory
+tar cfvo archive directory || exit 1
+tar tf archive
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/old.at:27: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 50 ) # 50. recurse.at:21: recurse
+ at_setup_line='recurse.at:21'
+ at_desc='recurse'
+ $at_quiet $ECHO_N " 50: recurse $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "50. recurse.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/recurse.at:24:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+)"
+echo recurse.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/recurse.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/recurse.at:24:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+)"
+echo recurse.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/recurse.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/recurse.at:24:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+)"
+echo recurse.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/recurse.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/recurse.at:24:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+)"
+echo recurse.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/recurse.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/recurse.at:24:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+)"
+echo recurse.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+touch directory/file
+tar --create --file archive --no-recursion directory || exit 1
+tar tf archive
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "directory/
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/recurse.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 51 ) # 51. same-order01.at:26: working -C with --same-order
+ at_setup_line='same-order01.at:26'
+ at_desc='working -C with --same-order'
+ $at_quiet $ECHO_N " 51: working -C with --same-order $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "51. same-order01.at:26: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/same-order01.at:29:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+)"
+echo same-order01.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order01.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/same-order01.at:29:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+)"
+echo same-order01.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order01.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/same-order01.at:29:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+)"
+echo same-order01.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order01.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/same-order01.at:29:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+)"
+echo same-order01.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order01.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/same-order01.at:29:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+)"
+echo same-order01.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir directory
+tar -xf archive --same-order -C directory || exit 1
+
+ls directory|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order01.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 52 ) # 52. same-order02.at:25: multiple -C options
+ at_setup_line='same-order02.at:25'
+ at_desc='multiple -C options'
+ $at_quiet $ECHO_N " 52: multiple -C options $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "52. same-order02.at:25: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/same-order02.at:28:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=\`pwd\`
+tar -xf archive --same-order -C \$HERE/en file1 -C \$HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+)"
+echo same-order02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+separator
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/same-order02.at:28:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=\`pwd\`
+tar -xf archive --same-order -C \$HERE/en file1 -C \$HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+)"
+echo same-order02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+separator
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/same-order02.at:28:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=\`pwd\`
+tar -xf archive --same-order -C \$HERE/en file1 -C \$HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+)"
+echo same-order02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+separator
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/same-order02.at:28:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=\`pwd\`
+tar -xf archive --same-order -C \$HERE/en file1 -C \$HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+)"
+echo same-order02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+separator
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/same-order02.at:28:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=\`pwd\`
+tar -xf archive --same-order -C \$HERE/en file1 -C \$HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+)"
+echo same-order02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains a `...` command substitution)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile -l 1024 -f file1
+genfile -l 1024 -f file2
+tar cf archive file1 file2
+
+mkdir en
+mkdir to
+
+HERE=`pwd`
+tar -xf archive --same-order -C $HERE/en file1 -C $HERE/to file2 || exit 1
+
+ls en
+echo separator
+ls to
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "file1
+separator
+file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/same-order02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 53 ) # 53. shortrec.at:25: short records
+ at_setup_line='shortrec.at:25'
+ at_desc='short records'
+ $at_quiet $ECHO_N " 53: short records $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "53. shortrec.at:25: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/shortrec.at:28:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+)"
+echo shortrec.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/shortrec.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/shortrec.at:28:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+)"
+echo shortrec.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/shortrec.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/shortrec.at:28:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+)"
+echo shortrec.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/shortrec.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/shortrec.at:28:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+)"
+echo shortrec.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/shortrec.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/shortrec.at:28:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+)"
+echo shortrec.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+mkdir directory
+(cd directory && touch a b c d e f g h i j k l m n o p q r)
+tar -c -b 1 -f - directory | tar -t -f - >/dev/null
+tar -c -b 1 -f archive directory
+tar -t -f archive >/dev/null
+tar -t -f - < archive >/dev/null
+
+rm -r directory
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/shortrec.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 54 ) # 54. sparse01.at:21: sparse files
+ at_setup_line='sparse01.at:21'
+ at_desc='sparse files'
+ $at_quiet $ECHO_N " 54: sparse files $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "54. sparse01.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/sparse01.at:24:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+)"
+echo sparse01.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo stdout:; tee stdout <"$at_stdout"
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/sparse01.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/sparse01.at:24:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+)"
+echo sparse01.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo stdout:; tee stdout <"$at_stdout"
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/sparse01.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/sparse01.at:24:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+)"
+echo sparse01.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 -f begin
+genfile --length 1000 -f end
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo stdout:; tee stdout <"$at_stdout"
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/sparse01.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+
+cat >stdout.re <<'_ATEOF'
+separator
+-rw-r--r-- ^ ^ * *1000 0-90-90-90-9-0-90-9-0-90-9 0-90-9:0-90-9 begin
+-rw-r--r-- ^ ^ * *10344448 0-90-90-90-9-0-90-9-0-90-9 0-90-9:0-90-9 sparsefile
+-rw-r--r-- ^ ^ * *1000 0-90-90-90-9-0-90-9-0-90-9 0-90-9:0-90-9 end
+separator
+sparsefile 10344448
+_ATEOF
+
+awk '{print NR " " $0}' stdout > $$.1
+awk '{print NR " " $0}' stdout.re | join - $$.1 |
+while read NUM RE LINE
+do
+ echo "$LINE" | grep -- "$RE" >/dev/null || exit 1
+done
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 55 ) # 55. sparse02.at:21: extracting sparse file over a pipe
+ at_setup_line='sparse02.at:21'
+ at_desc='extracting sparse file over a pipe'
+ $at_quiet $ECHO_N " 55: extracting sparse file over a pipe $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "55. sparse02.at:21: testing ..."
+ $at_traceon
+
+
+
+# Tar 1.14 - 1.15.1 was unable to extract sparse files to a pipe.
+# References: <16896.21739.460782.124775@jik.kamens.brookline.ma.us>
+# http://lists.gnu.org/archive/html/bug-tar/2005-02/msg00003.html
+
+
+
+ $at_traceoff
+echo "$at_srcdir/sparse02.at:28:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+)"
+echo sparse02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/sparse02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/sparse02.at:28:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+)"
+echo sparse02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/sparse02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/sparse02.at:28:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+)"
+echo sparse02.at:28 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --sparse --file sparsefile --block-size 512 0 ABCD 1M EFGH 2000K IJKL || exit 77
+tar -c -f archive --sparse sparsefile || exit 1
+echo separator
+
+tar xfO archive | cat - > sparsecopy || exit 1
+cmp sparsefile sparsecopy
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/sparse02.at:28: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 56 ) # 56. sparse03.at:21: storing sparse files > 8G
+ at_setup_line='sparse03.at:21'
+ at_desc='storing sparse files > 8G'
+ $at_quiet $ECHO_N " 56: storing sparse files > 8G $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "56. sparse03.at:21: testing ..."
+ $at_traceon
+
+
+
+# Tar 1.15.1 incorrectly computed sparse member size if the extended
+# PAX header contained size keyword.
+# References: <87vf46nb36.fsf@penguin.cs.ucla.edu>
+# http://lists.gnu.org/archive/html/bug-tar/2005-06/msg00040.html
+
+
+
+ $at_traceoff
+echo "$at_srcdir/sparse03.at:29:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 --file begin
+genfile --length 1000 --file end
+genfile --sparse --file sparsefile --block-size 512 8G A || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+)"
+echo sparse03.at:29 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 --file begin
+genfile --length 1000 --file end
+genfile --sparse --file sparsefile --block-size 512 8G A || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --length 1000 --file begin
+genfile --length 1000 --file end
+genfile --sparse --file sparsefile --block-size 512 8G A || exit 77
+tar -c -f archive --sparse begin sparsefile end || exit 1
+echo separator
+
+tar tfv archive
+echo separator
+mkdir directory
+tar Cxf directory archive
+genfile --stat=name,size sparsefile
+cmp sparsefile directory/sparsefile
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo stdout:; tee stdout <"$at_stdout"
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/sparse03.at:29: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+
+cat >stdout.re <<'_ATEOF'
+separator
+-rw-r--r-- ^ ^ * *1000 0-90-90-90-9-0-90-9-0-90-9 0-90-9:0-90-9 begin
+-rw-r--r-- ^ ^ * *8589935104 0-90-90-90-9-0-90-9-0-90-9 0-90-9:0-90-9 sparsefile
+-rw-r--r-- ^ ^ * *1000 0-90-90-90-9-0-90-9-0-90-9 0-90-9:0-90-9 end
+separator
+sparsefile 8589935104
+_ATEOF
+
+awk '{print NR " " $0}' stdout > $$.1
+awk '{print NR " " $0}' stdout.re | join - $$.1 |
+while read NUM RE LINE
+do
+ echo "$LINE" | grep -- "$RE" >/dev/null || exit 1
+done
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 57 ) # 57. sparsemv.at:21: sparse files in MV archives
+ at_setup_line='sparsemv.at:21'
+ at_desc='sparse files in MV archives'
+ $at_quiet $ECHO_N " 57: sparse files in MV archives $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "57. sparsemv.at:21: testing ..."
+ $at_traceon
+
+
+
+# Check if sparse files are correctly split between GNU multi-volume
+# archives.
+# There are two cases: the file can be split within an empty (null) block,
+# or within a data block. Since null blocks are not archived, the first
+# case means the file is split between two consecutive data blocks.
+#
+
+
+
+ $at_traceoff
+echo "$at_srcdir/sparsemv.at:31:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || exit 77
+echo \"Pass 1: Split between data blocks\"
+echo \"Create archive\"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2
+
+echo \"Pass 2: Split within a data block\"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || exit 77
+echo \"Create archive\"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2
+)"
+echo sparsemv.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Pass 1: Split between data blocks
+Create archive
+Test archive
+sparsefile
+Compare archive
+Pass 2: Split within a data block
+Create archive
+Test archive
+sparsefile
+Compare archive
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/sparsemv.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/sparsemv.at:31:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || exit 77
+echo \"Pass 1: Split between data blocks\"
+echo \"Create archive\"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2
+
+echo \"Pass 2: Split within a data block\"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || exit 77
+echo \"Create archive\"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2
+)"
+echo sparsemv.at:31 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse -c --record-size=512 -M -L6 -f arc.1 -f arc.2 sparsefile || exit 1
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Pass 1: Split between data blocks
+Create archive
+Test archive
+sparsefile
+Compare archive
+Pass 2: Split within a data block
+Create archive
+Test archive
+sparsefile
+Compare archive
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/sparsemv.at:31: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 58 ) # 58. spmvp00.at:21: sparse files in PAX MV archives, v.0.0
+ at_setup_line='spmvp00.at:21'
+ at_desc='sparse files in PAX MV archives, v.0.0'
+ $at_quiet $ECHO_N " 58: sparse files in PAX MV archives, v.0.0 $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "58. spmvp00.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/spmvp00.at:24:
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H pax\"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHI 1M ABCDEFGHI || exit 77
+echo \"Pass 1: Split between data blocks\"
+echo \"Create archive\"
+tar --sparse --sparse-version=0.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo \"Pass 2: Split within a data block\"
+genfile --sparse --file sparsefile 0 ABCDEFGH 1M ABCDEFGHI || exit 77
+echo \"Create archive\"
+tar --sparse --sparse-version=0.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+)"
+echo spmvp00.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHI 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse --sparse-version=0.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFGH 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse --sparse-version=0.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHI 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse --sparse-version=0.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFGH 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse --sparse-version=0.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Pass 1: Split between data blocks
+Create archive
+Test archive
+sparsefile
+Compare archive
+Pass 2: Split within a data block
+Create archive
+Test archive
+sparsefile
+Compare archive
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/spmvp00.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 59 ) # 59. spmvp01.at:21: sparse files in PAX MV archives, v.0.1
+ at_setup_line='spmvp01.at:21'
+ at_desc='sparse files in PAX MV archives, v.0.1'
+ $at_quiet $ECHO_N " 59: sparse files in PAX MV archives, v.0.1 $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "59. spmvp01.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/spmvp01.at:24:
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H pax\"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || exit 77
+echo \"Pass 1: Split between data blocks\"
+echo \"Create archive\"
+tar --sparse --sparse-version=0.1 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo \"Pass 2: Split within a data block\"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || exit 77
+echo \"Create archive\"
+tar --sparse --sparse-version=0.1 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+)"
+echo spmvp01.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse --sparse-version=0.1 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse --sparse-version=0.1 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGHIJK 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse --sparse-version=0.1 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFGHIJ 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse --sparse-version=0.1 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Pass 1: Split between data blocks
+Create archive
+Test archive
+sparsefile
+Compare archive
+Pass 2: Split within a data block
+Create archive
+Test archive
+sparsefile
+Compare archive
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/spmvp01.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 60 ) # 60. spmvp10.at:21: sparse files in PAX MV archives, v.1.0
+ at_setup_line='spmvp10.at:21'
+ at_desc='sparse files in PAX MV archives, v.1.0'
+ $at_quiet $ECHO_N " 60: sparse files in PAX MV archives, v.1.0 $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "60. spmvp10.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/spmvp10.at:24:
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H pax\"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGH 1M ABCDEFGHI || exit 77
+echo \"Pass 1: Split between data blocks\"
+echo \"Create archive\"
+tar --sparse --sparse-version=1.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo \"Pass 2: Split within a data block\"
+genfile --sparse --file sparsefile 0 ABCDEFG 1M ABCDEFGHI || exit 77
+echo \"Create archive\"
+tar --sparse --sparse-version=1.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo \"Test archive\"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo \"Compare archive\"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+)"
+echo spmvp10.at:24 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGH 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse --sparse-version=1.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFG 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse --sparse-version=1.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir pax
+(cd pax
+TEST_TAR_FORMAT=pax
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H pax"
+export TAR_OPTIONS
+rm -rf *
+
+exec <&-
+genfile --sparse --file sparsefile 0 ABCDEFGH 1M ABCDEFGHI || exit 77
+echo "Pass 1: Split between data blocks"
+echo "Create archive"
+tar --sparse --sparse-version=1.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+
+echo "Pass 2: Split within a data block"
+genfile --sparse --file sparsefile 0 ABCDEFG 1M ABCDEFGHI || exit 77
+echo "Create archive"
+tar --sparse --sparse-version=1.0 -c --record-size=512 -M -L6 -f arc.1 -f arc.2 -f arc.3 sparsefile
+echo "Test archive"
+tar -t -M -f arc.1 -f arc.2 -f arc.3
+echo "Compare archive"
+tar -d -M -f arc.1 -f arc.2 -f arc.3
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Pass 1: Split between data blocks
+Create archive
+Test archive
+sparsefile
+Compare archive
+Pass 2: Split within a data block
+Create archive
+Test archive
+sparsefile
+Compare archive
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/spmvp10.at:24: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 61 ) # 61. update.at:27: update unchanged directories
+ at_setup_line='update.at:27'
+ at_desc='update unchanged directories'
+ $at_quiet $ECHO_N " 61: update unchanged directories $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "61. update.at:27: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/update.at:30:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+)"
+echo update.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+directory/
+directory/file1
+directory/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/update.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/update.at:30:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+)"
+echo update.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+directory/
+directory/file1
+directory/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/update.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/update.at:30:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+)"
+echo update.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+directory/
+directory/file1
+directory/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/update.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/update.at:30:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+)"
+echo update.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+directory/
+directory/file1
+directory/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/update.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/update.at:30:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+)"
+echo update.at:30 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+directory/
+directory/file1
+directory/file2
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/update.at:30: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 62 ) # 62. volume.at:23: volume
+ at_setup_line='volume.at:23'
+ at_desc='volume'
+ $at_quiet $ECHO_N " 62: volume $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "62. volume.at:23: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/volume.at:26:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+tar -cf archive -V label -T /dev/null || exit 1
+
+tar xfV archive label || exit 1
+tar xfV archive 'la?el' || exit 1
+tar xfV archive 'l*l' || exit 1
+
+echo 1>&2 -----
+tar xfV archive lab
+test \$? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive bel
+test \$? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive babel
+test \$? = 2
+)"
+echo volume.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+tar -cf archive -V label -T /dev/null || exit 1
+
+tar xfV archive label || exit 1
+tar xfV archive 'la?el' || exit 1
+tar xfV archive 'l*l' || exit 1
+
+echo 1>&2 -----
+tar xfV archive lab
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive bel
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive babel
+test $? = 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+tar -cf archive -V label -T /dev/null || exit 1
+
+tar xfV archive label || exit 1
+tar xfV archive 'la?el' || exit 1
+tar xfV archive 'l*l' || exit 1
+
+echo 1>&2 -----
+tar xfV archive lab
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive bel
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive babel
+test $? = 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "-----
+tar: Volume \`label' does not match \`lab'
+tar: Error is not recoverable: exiting now
+-----
+tar: Volume \`label' does not match \`bel'
+tar: Error is not recoverable: exiting now
+-----
+tar: Volume \`label' does not match \`babel'
+tar: Error is not recoverable: exiting now
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/volume.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/volume.at:26:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+tar -cf archive -V label -T /dev/null || exit 1
+
+tar xfV archive label || exit 1
+tar xfV archive 'la?el' || exit 1
+tar xfV archive 'l*l' || exit 1
+
+echo 1>&2 -----
+tar xfV archive lab
+test \$? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive bel
+test \$? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive babel
+test \$? = 2
+)"
+echo volume.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+tar -cf archive -V label -T /dev/null || exit 1
+
+tar xfV archive label || exit 1
+tar xfV archive 'la?el' || exit 1
+tar xfV archive 'l*l' || exit 1
+
+echo 1>&2 -----
+tar xfV archive lab
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive bel
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive babel
+test $? = 2
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+tar -cf archive -V label -T /dev/null || exit 1
+
+tar xfV archive label || exit 1
+tar xfV archive 'la?el' || exit 1
+tar xfV archive 'l*l' || exit 1
+
+echo 1>&2 -----
+tar xfV archive lab
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive bel
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive babel
+test $? = 2
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "-----
+tar: Volume \`label' does not match \`lab'
+tar: Error is not recoverable: exiting now
+-----
+tar: Volume \`label' does not match \`bel'
+tar: Error is not recoverable: exiting now
+-----
+tar: Volume \`label' does not match \`babel'
+tar: Error is not recoverable: exiting now
+" | $at_diff - "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/volume.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 63 ) # 63. volsize.at:29: volume header size
+ at_setup_line='volsize.at:29'
+ at_desc='volume header size'
+ $at_quiet $ECHO_N " 63: volume header size $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "63. volsize.at:29: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/volsize.at:32:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf \$TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv \$TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf \$TEST_DATA_DIR/abc.tar
+find abc|sort
+)"
+echo volsize.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Short Listing
+abc/not-a-file.gif
+abc/CCC
+Verbose Listing
+V--------- 0/0 1536 2006-05-09 01:07 abc/not-a-file.gif--Volume Header--
+-rw-r--r-- tom/users 0 2006-04-22 22:52 abc/CCC
+Extracted directory
+abc
+abc/CCC
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/volsize.at:32: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/volsize.at:32:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf \$TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv \$TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf \$TEST_DATA_DIR/abc.tar
+find abc|sort
+)"
+echo volsize.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Short Listing
+abc/not-a-file.gif
+abc/CCC
+Verbose Listing
+V--------- 0/0 1536 2006-05-09 01:07 abc/not-a-file.gif--Volume Header--
+-rw-r--r-- tom/users 0 2006-04-22 22:52 abc/CCC
+Extracted directory
+abc
+abc/CCC
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/volsize.at:32: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/volsize.at:32:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf \$TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv \$TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf \$TEST_DATA_DIR/abc.tar
+find abc|sort
+)"
+echo volsize.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Short Listing
+abc/not-a-file.gif
+abc/CCC
+Verbose Listing
+V--------- 0/0 1536 2006-05-09 01:07 abc/not-a-file.gif--Volume Header--
+-rw-r--r-- tom/users 0 2006-04-22 22:52 abc/CCC
+Extracted directory
+abc
+abc/CCC
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/volsize.at:32: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/volsize.at:32:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf \$TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv \$TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf \$TEST_DATA_DIR/abc.tar
+find abc|sort
+)"
+echo volsize.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Short Listing
+abc/not-a-file.gif
+abc/CCC
+Verbose Listing
+V--------- 0/0 1536 2006-05-09 01:07 abc/not-a-file.gif--Volume Header--
+-rw-r--r-- tom/users 0 2006-04-22 22:52 abc/CCC
+Extracted directory
+abc
+abc/CCC
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/volsize.at:32: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/volsize.at:32:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf \$TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv \$TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf \$TEST_DATA_DIR/abc.tar
+find abc|sort
+)"
+echo volsize.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+
+test -z "$TEST_DATA_DIR" && exit 77
+tarball_prereq abc.tar 540f196ceddcad9e7bd2f2d7533d0474 $TEST_DATA_DIR $TEST_DATA_URL || exit 77
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "Short Listing
+abc/not-a-file.gif
+abc/CCC
+Verbose Listing
+V--------- 0/0 1536 2006-05-09 01:07 abc/not-a-file.gif--Volume Header--
+-rw-r--r-- tom/users 0 2006-04-22 22:52 abc/CCC
+Extracted directory
+abc
+abc/CCC
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/volsize.at:32: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 64 ) # 64. comprec.at:21: compressed format recognition
+ at_setup_line='comprec.at:21'
+ at_desc='compressed format recognition'
+ $at_quiet $ECHO_N " 64: compressed format recognition $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "64. comprec.at:21: testing ..."
+ $at_traceon
+
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/comprec.at:25:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo \"separator\"
+tar cfz archive file1
+echo \"separator\"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+)"
+echo comprec.at:25 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/comprec.at:25: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/comprec.at:25:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo \"separator\"
+tar cfz archive file1
+echo \"separator\"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+)"
+echo comprec.at:25 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/comprec.at:25: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/comprec.at:25:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo \"separator\"
+tar cfz archive file1
+echo \"separator\"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+)"
+echo comprec.at:25 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/comprec.at:25: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/comprec.at:25:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo \"separator\"
+tar cfz archive file1
+echo \"separator\"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+)"
+echo comprec.at:25 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/comprec.at:25: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/comprec.at:25:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo \"separator\"
+tar cfz archive file1
+echo \"separator\"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+)"
+echo comprec.at:25 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+
+cat /dev/null | gzip - > /dev/null 2>&1 || exit 77
+
+genfile --length 10240 --file file1
+echo "separator"
+tar cfz archive file1
+echo "separator"
+mv file1 orig
+tar xfv archive
+cmp orig file1
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "separator
+separator
+file1
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/comprec.at:25: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 65 ) # 65. truncate.at:29: truncate
+ at_setup_line='truncate.at:29'
+ at_desc='truncate'
+ $at_quiet $ECHO_N " 65: truncate $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "65. truncate.at:29: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/truncate.at:32:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: \$?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar)"
+echo truncate.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: File shrank by 5120 bytes; padding with zeros
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+Exit status: 1
+separator
+foo
+foo: Mod time differs
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/truncate.at:32: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/truncate.at:32:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: \$?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar)"
+echo truncate.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: File shrank by 5120 bytes; padding with zeros
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+Exit status: 1
+separator
+foo
+foo: Mod time differs
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/truncate.at:32: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/truncate.at:32:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: \$?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar)"
+echo truncate.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: File shrank by 5120 bytes; padding with zeros
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+Exit status: 1
+separator
+foo
+foo: Mod time differs
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/truncate.at:32: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/truncate.at:32:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: \$?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar)"
+echo truncate.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: File shrank by 5120 bytes; padding with zeros
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+Exit status: 1
+separator
+foo
+foo: Mod time differs
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/truncate.at:32: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/truncate.at:32:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: \$?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar)"
+echo truncate.at:32 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: File shrank by 5120 bytes; padding with zeros
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+Exit status: 1
+separator
+foo
+foo: Mod time differs
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/truncate.at:32: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 66 ) # 66. grow.at:24: grow
+ at_setup_line='grow.at:24'
+ at_desc='grow'
+ $at_quiet $ECHO_N " 66: grow $ECHO_C"
+ at_xfail=no
+ test -f $XFAILFILE && at_xfail=yes
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "66. grow.at:24: testing ..."
+ $at_traceon
+
+
+
+
+
+ $at_traceoff
+echo "$at_srcdir/grow.at:27:
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H v7\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \\
+ --append foo
+)"
+echo grow.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir v7
+(cd v7
+TEST_TAR_FORMAT=v7
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H v7"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: file changed as we read it
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/grow.at:27: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/grow.at:27:
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H oldgnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \\
+ --append foo
+)"
+echo grow.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir oldgnu
+(cd oldgnu
+TEST_TAR_FORMAT=oldgnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H oldgnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: file changed as we read it
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/grow.at:27: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/grow.at:27:
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H ustar\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \\
+ --append foo
+)"
+echo grow.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir ustar
+(cd ustar
+TEST_TAR_FORMAT=ustar
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H ustar"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: file changed as we read it
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/grow.at:27: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/grow.at:27:
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H posix\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \\
+ --append foo
+)"
+echo grow.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir posix
+(cd posix
+TEST_TAR_FORMAT=posix
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H posix"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: file changed as we read it
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/grow.at:27: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+$at_traceoff
+echo "$at_srcdir/grow.at:27:
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS=\"-H gnu\"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \\
+ --append foo
+)"
+echo grow.at:27 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+mkdir gnu
+(cd gnu
+TEST_TAR_FORMAT=gnu
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H gnu"
+export TAR_OPTIONS
+rm -rf *
+
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 1024 \
+ --append foo
+) ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo >>"$at_stderr"; echo "tar: foo: file changed as we read it
+" | $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "foo
+baz
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 1) ;;
+ *) echo "$at_srcdir/grow.at:27: exit code was $at_status, expected 1"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 67 ) # 67. gtarfail.at:21: gtarfail
+ at_setup_line='gtarfail.at:21'
+ at_desc='gtarfail'
+ $at_quiet $ECHO_N " 67: gtarfail $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "67. gtarfail.at:21: testing ..."
+ $at_traceon
+
+
+
+unset TAR_OPTIONS
+
+$at_traceoff
+echo "$at_srcdir/gtarfail.at:26:
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gtarfail.tar bf7612e401aaa679edbb07ae1183811b $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvf \$STAR_TESTSCRIPTS/gtarfail.tar
+"
+echo gtarfail.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gtarfail.tar bf7612e401aaa679edbb07ae1183811b $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvf $STAR_TESTSCRIPTS/gtarfail.tar
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gtarfail.tar bf7612e401aaa679edbb07ae1183811b $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvf $STAR_TESTSCRIPTS/gtarfail.tar
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "-rw-r--r-- jes/glone 518 2001-05-25 14:41 vedpowered.gif
+-rw-r--r-- jes/glone 6825 1997-04-29 00:19 cd.gif
+-rw-r--r-- jes/glone 33354 1999-06-22 12:17 DSCN0049c.JPG
+-rw-r--r-- jes/glone 86159 2001-06-05 18:16 Window1.jpg
+-rw-r--r-- jes/glone 1310 2001-05-25 13:05 vipower.gif
+-rw-rw-rw- jes/glone 148753 1998-09-15 13:08 billyboy.jpg
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/gtarfail.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 68 ) # 68. gtarfail2.at:21: gtarfail2
+ at_setup_line='gtarfail2.at:21'
+ at_desc='gtarfail2'
+ $at_quiet $ECHO_N " 68: gtarfail2 $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "68. gtarfail2.at:21: testing ..."
+ $at_traceon
+
+
+
+unset TAR_OPTIONS
+
+$at_traceoff
+echo "$at_srcdir/gtarfail2.at:26:
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gtarfail2.tar 6b607d1faec14b82f69525d9c5b66e53 $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+tar --utc -tvf \$STAR_TESTSCRIPTS/gtarfail2.tar
+"
+echo gtarfail2.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gtarfail2.tar 6b607d1faec14b82f69525d9c5b66e53 $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+tar --utc -tvf $STAR_TESTSCRIPTS/gtarfail2.tar
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gtarfail2.tar 6b607d1faec14b82f69525d9c5b66e53 $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+tar --utc -tvf $STAR_TESTSCRIPTS/gtarfail2.tar
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "-rwxr-xr-x jes/glone 214 2001-09-21 14:08 .clean
+lrwxrwxrwx jes/cats 0 1998-05-07 12:39 RULES -> makefiles/RULES
+drwxr-sr-x jes/glone 0 2001-12-10 00:00 build/
+-rw-r--r-- jes/glone 312019 2001-12-10 00:00 build/smake-1.2.tar.gz
+drwxr-sr-x jes/glone 0 2001-11-09 18:20 build/psmake/
+-rwxr-xr-x jes/glone 259 2000-01-09 16:36 build/psmake/MAKE
+-rwxr-xr-x jes/glone 4820 2001-02-25 22:45 build/psmake/MAKE.sh
+-rw-r--r-- jes/glone 647 2001-02-25 23:50 build/psmake/Makefile
+lrwxrwxrwx jes/glone 0 2001-08-29 10:53 build/psmake/archconf.c -> ../archconf.c
+lrwxrwxrwx jes/glone 0 2001-08-29 10:54 build/psmake/astoi.c -> ../../lib/astoi.c
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/gtarfail2.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 69 ) # 69. multi-fail.at:21: multi-fail
+ at_setup_line='multi-fail.at:21'
+ at_desc='multi-fail'
+ $at_quiet $ECHO_N " 69: multi-fail $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "69. multi-fail.at:21: testing ..."
+ $at_traceon
+
+
+
+unset TAR_OPTIONS
+
+$at_traceoff
+echo "$at_srcdir/multi-fail.at:26:
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gnu-multi-fail-volume1.gtar 7c28663dd98b0bd91ceb4be7af55254e $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gnu-multi-fail-volume2.gtar b5d41c4c3ec440687d4a44957b5079a8 $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvM -f \$STAR_TESTSCRIPTS/gnu-multi-fail-volume1.gtar \\
+ -f \$STAR_TESTSCRIPTS/gnu-multi-fail-volume2.gtar <&-
+"
+echo multi-fail.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gnu-multi-fail-volume1.gtar 7c28663dd98b0bd91ceb4be7af55254e $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gnu-multi-fail-volume2.gtar b5d41c4c3ec440687d4a44957b5079a8 $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvM -f $STAR_TESTSCRIPTS/gnu-multi-fail-volume1.gtar \
+ -f $STAR_TESTSCRIPTS/gnu-multi-fail-volume2.gtar <&-
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gnu-multi-fail-volume1.gtar 7c28663dd98b0bd91ceb4be7af55254e $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq gnu-multi-fail-volume2.gtar b5d41c4c3ec440687d4a44957b5079a8 $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvM -f $STAR_TESTSCRIPTS/gnu-multi-fail-volume1.gtar \
+ -f $STAR_TESTSCRIPTS/gnu-multi-fail-volume2.gtar <&-
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; echo "drwxrwsr-x joerg/bs 0 2003-10-11 14:32 OBJ/i386-sunos5-gcc/
+-rw-r--r-- joerg/bs 1 2003-10-11 14:32 OBJ/i386-sunos5-gcc/Dnull
+-rw-r--r-- joerg/bs 1743 2003-10-10 18:06 OBJ/i386-sunos5-gcc/star.d
+-rw-r--r-- joerg/bs 1460 2003-10-11 11:53 OBJ/i386-sunos5-gcc/header.d
+-rw-r--r-- joerg/bs 1540 2003-10-10 18:06 OBJ/i386-sunos5-gcc/cpiohdr.d
+-rw-r--r-- joerg/bs 2245 2003-10-10 18:06 OBJ/i386-sunos5-gcc/xheader.d
+-rw-r--r-- joerg/bs 1254 2003-10-10 18:06 OBJ/i386-sunos5-gcc/xattr.d
+-rw-r--r-- joerg/bs 1330 2003-10-10 18:06 OBJ/i386-sunos5-gcc/list.d
+-rw-r--r-- joerg/bs 1745 2003-10-10 18:06 OBJ/i386-sunos5-gcc/extract.d
+-rw-r--r-- joerg/bs 1518 2003-10-10 18:06 OBJ/i386-sunos5-gcc/create.d
+-rw-r--r-- joerg/bs 1235 2003-10-10 18:06 OBJ/i386-sunos5-gcc/append.d
+-rw-r--r-- joerg/bs 1368 2003-10-10 18:06 OBJ/i386-sunos5-gcc/diff.d
+-rw-r--r-- joerg/bs 1423 2003-10-10 18:06 OBJ/i386-sunos5-gcc/remove.d
+-rw-r--r-- joerg/bs 1493 2003-10-10 18:07 OBJ/i386-sunos5-gcc/star_unix.d
+-rw-r--r-- joerg/bs 1572 2003-10-10 18:07 OBJ/i386-sunos5-gcc/acl_unix.d
+-rw-r--r-- joerg/bs 1453 2003-10-10 18:07 OBJ/i386-sunos5-gcc/fflags.d
+-rw-r--r-- joerg/bs 2257 2003-10-11 14:32 OBJ/i386-sunos5-gcc/buffer.d
+-rw-r--r-- joerg/bs 969 2003-10-07 17:53 OBJ/i386-sunos5-gcc/dirtime.d
+-rw-r--r-- joerg/bs 1308 2003-10-10 18:07 OBJ/i386-sunos5-gcc/lhash.d
+-rw-r--r-- joerg/bs 1287 2003-10-10 18:07 OBJ/i386-sunos5-gcc/hole.d
+-rw-r--r-- joerg/bs 1105 2003-10-10 18:07 OBJ/i386-sunos5-gcc/longnames.d
+-rw-r--r-- joerg/bs 1230 2003-10-10 18:07 OBJ/i386-sunos5-gcc/names.d
+-rw-r--r-- joerg/bs 1091 2003-10-10 18:07 OBJ/i386-sunos5-gcc/movearch.d
+-rw-r--r-- joerg/bs 961 2003-10-07 17:53 OBJ/i386-sunos5-gcc/table.d
+-rw-r--r-- joerg/bs 1113 2003-10-10 18:07 OBJ/i386-sunos5-gcc/props.d
+-rw-r--r-- joerg/bs 2146 2003-10-10 18:07 OBJ/i386-sunos5-gcc/fetchdir.d
+-rw-r--r-- joerg/bs 1093 2003-10-10 18:07 OBJ/i386-sunos5-gcc/unicode.d
+-rw-r--r-- joerg/bs 1211 2003-10-10 18:07 OBJ/i386-sunos5-gcc/subst.d
+-rw-r--r-- joerg/bs 2076 2003-10-11 11:53 OBJ/i386-sunos5-gcc/volhdr.d
+-rw-r--r-- joerg/bs 1480 2003-10-10 18:07 OBJ/i386-sunos5-gcc/chdir.d
+-rw-r--r-- joerg/bs 42460 2003-10-10 18:07 OBJ/i386-sunos5-gcc/star.o
+-rw-r--r-- joerg/bs 22564 2003-10-11 11:53 OBJ/i386-sunos5-gcc/header.o
+-rw-r--r-- joerg/bs 7880 2003-10-10 18:07 OBJ/i386-sunos5-gcc/cpiohdr.o
+-rw-r--r-- joerg/bs 14624 2003-10-10 18:07 OBJ/i386-sunos5-gcc/xheader.o
+-rw-r--r-- joerg/bs 924 2003-10-10 18:07 OBJ/i386-sunos5-gcc/xattr.o
+-rw-r--r-- joerg/bs 6120 2003-10-10 18:07 OBJ/i386-sunos5-gcc/list.o
+-rw-r--r-- joerg/bs 12764 2003-10-10 18:07 OBJ/i386-sunos5-gcc/extract.o
+-rw-r--r-- joerg/bs 14668 2003-10-10 18:07 OBJ/i386-sunos5-gcc/create.o
+-rw-r--r-- joerg/bs 2576 2003-10-10 18:07 OBJ/i386-sunos5-gcc/append.o
+-rw-r--r-- joerg/bs 7636 2003-10-10 18:07 OBJ/i386-sunos5-gcc/diff.o
+-rw-r--r-- joerg/bs 3072 2003-10-10 18:07 OBJ/i386-sunos5-gcc/remove.o
+-rw-r--r-- joerg/bs 5612 2003-10-10 18:07 OBJ/i386-sunos5-gcc/star_unix.o
+-rw-r--r-- joerg/bs 6220 2003-10-10 18:07 OBJ/i386-sunos5-gcc/acl_unix.o
+-rw-r--r-- joerg/bs 1092 2003-10-10 18:07 OBJ/i386-sunos5-gcc/fflags.o
+-rw-r--r-- joerg/bs 20996 2003-10-11 14:32 OBJ/i386-sunos5-gcc/buffer.o
+-rw-r--r-- joerg/bs 2060 2003-10-07 17:53 OBJ/i386-sunos5-gcc/dirtime.o
+-rw-r--r-- joerg/bs 1664 2003-10-10 18:07 OBJ/i386-sunos5-gcc/lhash.o
+-rw-r--r-- joerg/bs 10564 2003-10-10 18:07 OBJ/i386-sunos5-gcc/hole.o
+-rw-r--r-- joerg/bs 3864 2003-10-10 18:07 OBJ/i386-sunos5-gcc/longnames.o
+-rw-r--r-- joerg/bs 2576 2003-10-10 18:07 OBJ/i386-sunos5-gcc/names.o
+-rw-r--r-- joerg/bs 952 2003-10-10 18:07 OBJ/i386-sunos5-gcc/movearch.o
+-rw-r--r-- joerg/bs 2756 2003-10-07 17:53 OBJ/i386-sunos5-gcc/table.o
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/multi-fail.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 70 ) # 70. ustar-big-2g.at:21: ustar-big-2g
+ at_setup_line='ustar-big-2g.at:21'
+ at_desc='ustar-big-2g'
+ $at_quiet $ECHO_N " 70: ustar-big-2g $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "70. ustar-big-2g.at:21: testing ..."
+ $at_traceon
+
+
+
+unset TAR_OPTIONS
+
+$at_traceoff
+echo "$at_srcdir/ustar-big-2g.at:26:
+
+cat /dev/null | bzip2 - > /dev/null 2>&1 || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq ustar-big-2g.tar.bz2 b63979733629c8fcdf40b60065422767 $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvjf \$STAR_TESTSCRIPTS/ustar-big-2g.tar.bz2
+"
+echo ustar-big-2g.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+
+cat /dev/null | bzip2 - > /dev/null 2>&1 || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq ustar-big-2g.tar.bz2 b63979733629c8fcdf40b60065422767 $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvjf $STAR_TESTSCRIPTS/ustar-big-2g.tar.bz2
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+
+cat /dev/null | bzip2 - > /dev/null 2>&1 || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq ustar-big-2g.tar.bz2 b63979733629c8fcdf40b60065422767 $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvjf $STAR_TESTSCRIPTS/ustar-big-2g.tar.bz2
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo stderr:; tee stderr <"$at_stderr"
+echo >>"$at_stdout"; echo "-rw------- jes/glone 2147483647 2002-06-15 14:53 big
+-rw-r--r-- jes/glone 0 2002-06-15 14:53 file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/ustar-big-2g.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+cat >stderr.re <<'_ATEOF'
+tar: Record size = .*
+_ATEOF
+
+awk '{print NR " " $0}' stderr > $$.1
+awk '{print NR " " $0}' stderr.re | join - $$.1 |
+while read NUM RE LINE
+do
+ echo "$LINE" | grep -- "$RE" >/dev/null || exit 1
+done
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 71 ) # 71. ustar-big-8g.at:21: ustar-big-8g
+ at_setup_line='ustar-big-8g.at:21'
+ at_desc='ustar-big-8g'
+ $at_quiet $ECHO_N " 71: ustar-big-8g $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "71. ustar-big-8g.at:21: testing ..."
+ $at_traceon
+
+
+
+unset TAR_OPTIONS
+
+$at_traceoff
+echo "$at_srcdir/ustar-big-8g.at:26:
+
+cat /dev/null | bzip2 - > /dev/null 2>&1 || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq ustar-big-8g.tar.bz2 60ff503fa4b8288bef7ada89e9c91b0f $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvjf \$STAR_TESTSCRIPTS/ustar-big-8g.tar.bz2
+"
+echo ustar-big-8g.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+
+cat /dev/null | bzip2 - > /dev/null 2>&1 || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq ustar-big-8g.tar.bz2 60ff503fa4b8288bef7ada89e9c91b0f $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvjf $STAR_TESTSCRIPTS/ustar-big-8g.tar.bz2
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+
+cat /dev/null | bzip2 - > /dev/null 2>&1 || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq ustar-big-8g.tar.bz2 60ff503fa4b8288bef7ada89e9c91b0f $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvjf $STAR_TESTSCRIPTS/ustar-big-8g.tar.bz2
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo stderr:; tee stderr <"$at_stderr"
+echo >>"$at_stdout"; echo "-rw------- jes/glone 8589934591 2002-06-15 15:08 8gb-1
+-rw-r--r-- jes/glone 0 2002-06-15 14:53 file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/ustar-big-8g.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+cat >stderr.re <<'_ATEOF'
+tar: Record size = .*
+_ATEOF
+
+awk '{print NR " " $0}' stderr > $$.1
+awk '{print NR " " $0}' stderr.re | join - $$.1 |
+while read NUM RE LINE
+do
+ echo "$LINE" | grep -- "$RE" >/dev/null || exit 1
+done
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+ 72 ) # 72. pax-big-10g.at:21: pax-big-10g
+ at_setup_line='pax-big-10g.at:21'
+ at_desc='pax-big-10g'
+ $at_quiet $ECHO_N " 72: pax-big-10g $ECHO_C"
+ at_xfail=no
+ echo "# -*- compilation -*-" >> "$at_group_log"
+ (
+ echo "72. pax-big-10g.at:21: testing ..."
+ $at_traceon
+
+
+
+unset TAR_OPTIONS
+
+$at_traceoff
+echo "$at_srcdir/pax-big-10g.at:26:
+
+cat /dev/null | bzip2 - > /dev/null 2>&1 || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq pax-big-10g.tar.bz2 ca15c23acc8d8bb1f27e60113a5f8bff $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvjf \$STAR_TESTSCRIPTS/pax-big-10g.tar.bz2
+"
+echo pax-big-10g.at:26 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+ echo 'Not enabling shell tracing (command contains an embedded newline)'
+fi
+
+if test -n "$at_trace_this"; then
+ ( $at_traceon;
+
+cat /dev/null | bzip2 - > /dev/null 2>&1 || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq pax-big-10g.tar.bz2 ca15c23acc8d8bb1f27e60113a5f8bff $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvjf $STAR_TESTSCRIPTS/pax-big-10g.tar.bz2
+ ) >"$at_stdout" 2>"$at_stder1"
+ at_status=$?
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+ ( :;
+
+cat /dev/null | bzip2 - > /dev/null 2>&1 || exit 77
+
+
+test -z "$STAR_TESTSCRIPTS" && exit 77
+tarball_prereq pax-big-10g.tar.bz2 ca15c23acc8d8bb1f27e60113a5f8bff $STAR_TESTSCRIPTS $STAR_DATA_URL || exit 77
+
+
+tar --utc -tvjf $STAR_TESTSCRIPTS/pax-big-10g.tar.bz2
+ ) >"$at_stdout" 2>"$at_stderr"
+ at_status=$?
+fi
+
+at_failed=false
+echo stderr:; tee stderr <"$at_stderr"
+echo >>"$at_stdout"; echo "-rw------- jes/glone 10737418240 2002-06-15 21:18 10g
+-rw-r--r-- jes/glone 0 2002-06-15 14:53 file
+" | $at_diff - "$at_stdout" || at_failed=:
+case $at_status in
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 0) ;;
+ *) echo "$at_srcdir/pax-big-10g.at:26: exit code was $at_status, expected 0"
+ at_failed=:;;
+esac
+if $at_failed; then
+
+
+ echo 1 > "$at_status_file"
+ exit 1
+fi
+
+$at_traceon
+
+
+
+cat >stderr.re <<'_ATEOF'
+tar: Record size = .*
+_ATEOF
+
+awk '{print NR " " $0}' stderr > $$.1
+awk '{print NR " " $0}' stderr.re | join - $$.1 |
+while read NUM RE LINE
+do
+ echo "$LINE" | grep -- "$RE" >/dev/null || exit 1
+done
+
+
+ $at_traceoff
+ $at_times_p && times >"$at_times_file"
+ ) 5>&1 2>&1 | eval $at_tee_pipe
+ at_status=`cat "$at_status_file"`
+ ;;
+
+
+ * )
+ echo "$as_me: no such test group: $at_group" >&2
+ continue
+ ;;
+ esac
+
+ # Be sure to come back to the suite directory, in particular
+ # since below we might `rm' the group directory we are in currently.
+ cd "$at_suite_dir"
+
+ case $at_group in
+ banner-*) ;;
+ *)
+ if test ! -f "$at_check_line_file"; then
+ sed "s/^ */$as_me: warning: /" <<_ATEOF
+ A failure happened in a test group before any test could be
+ run. This means that test suite is improperly designed. Please
+ report this failure to <bug-tar@gnu.org>.
+_ATEOF
+ echo "$at_setup_line" >"$at_check_line_file"
+ fi
+ at_group_count=`expr 1 + $at_group_count`
+ $at_verbose $ECHO_N "$at_group. $at_setup_line: $ECHO_C"
+ echo $ECHO_N "$at_group. $at_setup_line: $ECHO_C" >> "$at_group_log"
+ case $at_xfail:$at_status in
+ yes:0)
+ at_msg="UNEXPECTED PASS"
+ at_xpass_list="$at_xpass_list $at_group"
+ at_errexit=$at_errexit_p
+ ;;
+ no:0)
+ at_msg="ok"
+ at_pass_list="$at_pass_list $at_group"
+ at_errexit=false
+ ;;
+ *:77)
+ at_msg='skipped ('`cat "$at_check_line_file"`')'
+ at_skip_list="$at_skip_list $at_group"
+ at_errexit=false
+ ;;
+ yes:*)
+ at_msg='expected failure ('`cat "$at_check_line_file"`')'
+ at_xfail_list="$at_xfail_list $at_group"
+ at_errexit=false
+ ;;
+ no:*)
+ at_msg='FAILED ('`cat "$at_check_line_file"`')'
+ at_fail_list="$at_fail_list $at_group"
+ at_errexit=$at_errexit_p
+ ;;
+ esac
+ # Make sure there is a separator even with long titles.
+ echo " $at_msg"
+ at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
+ case $at_status in
+ 0|77)
+ # $at_times_file is only available if the group succeeded.
+ # We're not including the group log, so the success message
+ # is written in the global log separately. But we also
+ # write to the group log in case they're using -d.
+ if test -f "$at_times_file"; then
+ at_log_msg="$at_log_msg ("`sed 1d "$at_times_file"`')'
+ rm -f "$at_times_file"
+ fi
+ echo "$at_log_msg" >> "$at_group_log"
+ echo "$at_log_msg" >&5
+
+ # Cleanup the group directory, unless the user wants the files.
+ if $at_debug_p ; then
+ {
+ echo "#! /bin/sh"
+ echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$@"}'\''='\''"$@"'\'''
+ echo "cd '$at_dir'"
+ echo 'exec ${CONFIG_SHELL-'"$SHELL"'}' "$0" \
+ '-v -d' "$at_debug_args" "$at_group" '${1+"$@"}'
+ echo 'exit 1'
+ } >$at_group_dir/run
+ chmod +x $at_group_dir/run
+
+ elif test -d "$at_group_dir"; then
+ find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
+ rm -fr "$at_group_dir"
+ fi
+ ;;
+ *)
+ # Upon failure, include the log into the testsuite's global
+ # log. The failure message is written in the group log. It
+ # is later included in the global log.
+ echo "$at_log_msg" >> "$at_group_log"
+
+ # Upon failure, keep the group directory for autopsy, and
+ # create the debugging script.
+ {
+ echo "#! /bin/sh"
+ echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$@"}'\''='\''"$@"'\'''
+ echo "cd '$at_dir'"
+ echo 'exec ${CONFIG_SHELL-'"$SHELL"'}' "$0" \
+ '-v -d' "$at_debug_args" "$at_group" '${1+"$@"}'
+ echo 'exit 1'
+ } >$at_group_dir/run
+ chmod +x $at_group_dir/run
+
+ $at_errexit && break
+ ;;
+ esac
+ ;;
+ esac
+done
+
+# Back to the top directory.
+cd "$at_dir"
+
+# Compute the duration of the suite.
+at_stop_date=`date`
+at_stop_time=`date +%s 2>/dev/null`
+echo "$as_me: ending at: $at_stop_date" >&5
+case $at_start_time,$at_stop_time in
+ [0-9]*,[0-9]*)
+ at_duration_s=`expr $at_stop_time - $at_start_time`
+ at_duration_m=`expr $at_duration_s / 60`
+ at_duration_h=`expr $at_duration_m / 60`
+ at_duration_s=`expr $at_duration_s % 60`
+ at_duration_m=`expr $at_duration_m % 60`
+ at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
+ echo "$as_me: test suite duration: $at_duration" >&5
+ ;;
+esac
+
+# Wrap up the test suite with summary statistics.
+at_skip_count=`set dummy $at_skip_list; shift; echo $#`
+at_fail_count=`set dummy $at_fail_list; shift; echo $#`
+at_xpass_count=`set dummy $at_xpass_list; shift; echo $#`
+at_xfail_count=`set dummy $at_xfail_list; shift; echo $#`
+
+at_run_count=`expr $at_group_count - $at_skip_count`
+at_unexpected_count=`expr $at_xpass_count + $at_fail_count`
+at_total_fail_count=`expr $at_xfail_count + $at_fail_count`
+
+echo
+cat <<\_ASBOX
+## ------------- ##
+## Test results. ##
+## ------------- ##
+_ASBOX
+echo
+{
+ echo
+ cat <<\_ASBOX
+## ------------- ##
+## Test results. ##
+## ------------- ##
+_ASBOX
+ echo
+} >&5
+
+if test $at_run_count = 1; then
+ at_result="1 test"
+ at_were=was
+else
+ at_result="$at_run_count tests"
+ at_were=were
+fi
+if $at_errexit_p && test $at_unexpected_count != 0; then
+ if test $at_xpass_count = 1; then
+ at_result="$at_result $at_were run, one passed"
+ else
+ at_result="$at_result $at_were run, one failed"
+ fi
+ at_result="$at_result unexpectedly and inhibited subsequent tests."
+else
+ # Don't you just love exponential explosion of the number of cases?
+ case $at_xpass_count:$at_fail_count:$at_xfail_count in
+ # So far, so good.
+ 0:0:0) at_result="$at_result $at_were successful." ;;
+ 0:0:*) at_result="$at_result behaved as expected." ;;
+
+ # Some unexpected failures
+ 0:*:0) at_result="$at_result $at_were run,
+$at_fail_count failed unexpectedly." ;;
+
+ # Some failures, both expected and unexpected
+ 0:*:1) at_result="$at_result $at_were run,
+$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
+ 0:*:*) at_result="$at_result $at_were run,
+$at_total_fail_count failed ($at_xfail_count expected failures)." ;;
+
+ # No unexpected failures, but some xpasses
+ *:0:*) at_result="$at_result $at_were run,
+$at_xpass_count passed unexpectedly." ;;
+
+ # No expected failures, but failures and xpasses
+ *:1:0) at_result="$at_result $at_were run,
+$at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;;
+ *:*:0) at_result="$at_result $at_were run,
+$at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;;
+
+ # All of them.
+ *:*:1) at_result="$at_result $at_were run,
+$at_xpass_count passed unexpectedly,
+$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
+ *:*:*) at_result="$at_result $at_were run,
+$at_xpass_count passed unexpectedly,
+$at_total_fail_count failed ($at_xfail_count expected failures)." ;;
+ esac
+
+ if test $at_skip_count = 0 && test $at_run_count -gt 1; then
+ at_result="All $at_result"
+ fi
+fi
+
+# Now put skips in the mix.
+case $at_skip_count in
+ 0) ;;
+ 1) at_result="$at_result
+1 test was skipped." ;;
+ *) at_result="$at_result
+$at_skip_count tests were skipped." ;;
+esac
+
+if test $at_unexpected_count = 0; then
+ echo "$at_result"
+ echo "$at_result" >&5
+else
+ echo "ERROR: $at_result" >&2
+ echo "ERROR: $at_result" >&5
+ {
+ echo
+ cat <<\_ASBOX
+## ------------------------ ##
+## Summary of the failures. ##
+## ------------------------ ##
+_ASBOX
+
+ # Summary of failed and skipped tests.
+ if test $at_fail_count != 0; then
+ echo "Failed tests:"
+ $SHELL "$0" $at_fail_list --list
+ echo
+ fi
+ if test $at_skip_count != 0; then
+ echo "Skipped tests:"
+ $SHELL "$0" $at_skip_list --list
+ echo
+ fi
+ if test $at_xpass_count != 0; then
+ echo "Unexpected passes:"
+ $SHELL "$0" $at_xpass_list --list
+ echo
+ fi
+ if test $at_fail_count != 0; then
+ cat <<\_ASBOX
+## ---------------------- ##
+## Detailed failed tests. ##
+## ---------------------- ##
+_ASBOX
+ echo
+ for at_group in $at_fail_list
+ do
+ at_group_normalized=$at_group
+
+ while :; do
+ case $at_group_normalized in #(
+ $at_format*) break;;
+ esac
+ at_group_normalized=0$at_group_normalized
+ done
+
+ cat "$at_suite_dir/$at_group_normalized/$as_me.log"
+ echo
+ done
+ echo
+ fi
+ if test -n "$at_top_srcdir"; then
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## ${at_top_build_prefix}config.log ##
+_ASBOX
+ sed 's/^/| /' ${at_top_build_prefix}config.log
+ echo
+ fi
+ } >&5
+
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## $as_me.log was created. ##
+_ASBOX
+
+ echo
+ echo "Please send \`${at_testdir+${at_testdir}/}$as_me.log' and all information you think might help:"
+ echo
+ echo " To: <bug-tar@gnu.org>"
+ echo " Subject: [GNU tar 1.17] $as_me:$at_fail_list${at_fail_list:+ failed${at_xpass_list:+,}}$at_xpass_list${at_xpass_list:+ passed unexpectedly}"
+ echo
+ if test $at_debug_p = false; then
+ echo
+ echo 'You may investigate any problem if you feel able to do so, in which'
+ echo 'case the test suite provides a good starting point. Its output may'
+ echo "be found below \`${at_testdir+${at_testdir}/}$as_me.dir'."
+ echo
+ fi
+ exit 1
+fi
+
+exit 0
+
+
+
diff --git a/tests/testsuite.at b/tests/testsuite.at
new file mode 100644
index 0000000..86dfe9a
--- /dev/null
+++ b/tests/testsuite.at
@@ -0,0 +1,194 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# We need a recent Autotest.
+m4_version_prereq([2.52g])
+
+m4_define([AT_TAR_CHECK],[
+ AT_XFAIL_IF(test -f $[]XFAILFILE)
+ m4_foreach([FMT],
+ [m4_if([$7],[],[v7,oldgnu,ustar,posix,gnu],[$7])],
+ [AT_CHECK([
+mkdir FMT
+(cd FMT
+TEST_TAR_FORMAT=FMT
+export TEST_TAR_FORMAT
+TAR_OPTIONS="-H FMT"
+export TAR_OPTIONS
+rm -rf *
+$1)],$2,$3,$4,$5,$6)])
+])
+
+m4_define([RE_CHECK],[
+AT_DATA([$1.re],[$2])
+awk '{print NR " " $[]0}' $1 > $[]$.1
+awk '{print NR " " $[]0}' $1.re | join - $[]$.1 |
+while read NUM RE LINE
+do
+ echo "$LINE" | grep -- "$RE" >/dev/null || exit 1
+done
+])
+
+m4_define([AT_SKIP_TEST],[exit 77])
+
+dnl AT_TARBALL_PREREQ(tarball, md5sum) - Check if test tarball exists
+dnl in $TEST_DATA_DIR. If it does not, try to download it from
+dnl $TEST_DATA_URL. If download fails, or it the file's md5 sum does not
+dnl match second argument, skip the test.
+
+m4_define([AT_TARBALL_PREREQ],[
+test -z "$[]TEST_DATA_DIR" && AT_SKIP_TEST
+tarball_prereq $1 $2 $[]TEST_DATA_DIR $[]TEST_DATA_URL || AT_SKIP_TEST])
+
+dnl AT_TARBALL_PREREQ(tarball, md5sum) - Same for star testfiles
+m4_define([AT_STAR_PREREQ],[
+test -z "$STAR_TESTSCRIPTS" && AT_SKIP_TEST
+tarball_prereq $1 $2 $[]STAR_TESTSCRIPTS $[]STAR_DATA_URL || AT_SKIP_TEST
+])
+
+dnl AT_GZIP_PREREQ - Skip test unless gzip (or $1) is available
+m4_define([AT_GZIP_PREREQ],[
+cat /dev/null | m4_if([$1],[],gzip,[$1]) - > /dev/null 2>&1 || AT_SKIP_TEST
+])
+
+dnl AT_SORT_PREREQ - Skip test if sort utility outputs unwanted data on stderr
+m4_define([AT_SORT_PREREQ],[
+test -z "`sort < /dev/null 2>&1`" || AT_SKIP_TEST
+])
+
+dnl AT_UNPRIVILEGED_PREREQ - Skip test if running at root privileges
+m4_define([AT_UNPRIVILEGED_PREREQ],[
+echo "test" > $[]$
+chmod 0 $[]$
+cat $[]$ > /dev/null 2>&1
+result=$?
+rm -f $[]$
+test $result -eq 0 && AT_SKIP_TEST
+])
+
+m4_define([AT_TAR_MKHIER],[
+install-sh -d $1 >/dev/null
+m4_if([$2],,,genfile --file [$1]/[$2])])
+
+m4_include([sparsemvp.at])
+
+AT_INIT
+
+AT_TESTED([tar])
+
+m4_include([version.at])
+
+m4_include([pipe.at])
+
+m4_include([options.at])
+m4_include([options02.at])
+
+m4_include([T-empty.at])
+m4_include([T-null.at])
+
+m4_include([indexfile.at])
+m4_include([verbose.at])
+
+m4_include([append.at])
+m4_include([append01.at])
+m4_include([append02.at])
+
+m4_include([exclude.at])
+
+m4_include([delete01.at])
+m4_include([delete02.at])
+m4_include([delete03.at])
+m4_include([delete04.at])
+m4_include([delete05.at])
+
+m4_include([extrac01.at])
+m4_include([extrac02.at])
+m4_include([extrac03.at])
+m4_include([extrac04.at])
+m4_include([extrac05.at])
+m4_include([extrac06.at])
+m4_include([extrac07.at])
+
+m4_include([gzip.at])
+
+m4_include([incremental.at])
+m4_include([incr01.at])
+m4_include([incr02.at])
+m4_include([listed01.at])
+m4_include([listed02.at])
+m4_include([incr03.at])
+m4_include([incr04.at])
+m4_include([rename01.at])
+m4_include([rename02.at])
+m4_include([rename03.at])
+m4_include([chtype.at])
+
+m4_include([ignfail.at])
+
+m4_include([link01.at])
+
+m4_include([longv7.at])
+m4_include([long01.at])
+m4_include([lustar01.at])
+m4_include([lustar02.at])
+m4_include([lustar03.at])
+
+m4_include([multiv01.at])
+m4_include([multiv02.at])
+m4_include([multiv03.at])
+m4_include([multiv04.at])
+m4_include([multiv05.at])
+
+m4_include([old.at])
+
+m4_include([recurse.at])
+
+m4_include([same-order01.at])
+m4_include([same-order02.at])
+
+m4_include([shortrec.at])
+
+m4_include([sparse01.at])
+m4_include([sparse02.at])
+m4_include([sparse03.at])
+m4_include([sparsemv.at])
+m4_include([spmvp00.at])
+m4_include([spmvp01.at])
+m4_include([spmvp10.at])
+
+m4_include([update.at])
+
+m4_include([volume.at])
+m4_include([volsize.at])
+
+m4_include([comprec.at])
+
+m4_include([truncate.at])
+m4_include([grow.at])
+
+m4_include([star/gtarfail.at])
+m4_include([star/gtarfail2.at])
+
+m4_include([star/multi-fail.at])
+
+m4_include([star/ustar-big-2g.at])
+m4_include([star/ustar-big-8g.at])
+
+m4_include([star/pax-big-10g.at])
diff --git a/tests/truncate.at b/tests/truncate.at
new file mode 100644
index 0000000..3d2e670
--- /dev/null
+++ b/tests/truncate.at
@@ -0,0 +1,53 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Tar 1.15.1 incorrectly padded archive members that were truncated during
+# archiving.
+# References: <1115437005.8530.644529@goedel.fjf.gnu.de>
+# http://lists.gnu.org/archive/html/bug-tar/2005-05/msg00008.html
+#
+# The test case is based on the script by Frank Heckenbach <frank@g-n-u.de>
+# Additionally, the test verifies if tar exits with code 1 (file differs).
+
+AT_SETUP([truncate])
+AT_KEYWORDS([truncate filechange])
+
+AT_TAR_CHECK([
+genfile --file foo --length 50000k
+genfile --file baz
+genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
+echo Exit status: $?
+echo separator
+sleep 1
+genfile --file foo --seek 49995k --length 5k --pattern=zeros
+tar dvf bar],
+[1],
+[foo
+baz
+Exit status: 1
+separator
+foo
+foo: Mod time differs
+baz
+],
+[tar: foo: File shrank by 5120 bytes; padding with zeros
+])
+
+AT_CLEANUP
diff --git a/tests/update.at b/tests/update.at
new file mode 100644
index 0000000..30fc2dc
--- /dev/null
+++ b/tests/update.at
@@ -0,0 +1,50 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Check that tar --update does not add non-changed directories to the
+# archive.
+# References: <42AB0D28.6030706@mein-horde.de>
+# by Martin Lohmeier <martin@mein-horde.de>
+# on Sat, 11 Jun 2005 18:11:20 +0200
+
+AT_SETUP([update unchanged directories])
+AT_KEYWORDS([update])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+mkdir directory
+genfile --length 10240 --pattern zeros --file directory/file1
+genfile --length 10240 --pattern default --file directory/file2
+
+tar cf archive directory || exit 1
+echo separator
+tar uf archive directory || exit 1
+echo separator
+tar tf archive | sort || exit 1
+],
+[0],
+[separator
+separator
+directory/
+directory/file1
+directory/file2
+])
+
+AT_CLEANUP
diff --git a/tests/verbose.at b/tests/verbose.at
new file mode 100644
index 0000000..abd5a81
--- /dev/null
+++ b/tests/verbose.at
@@ -0,0 +1,44 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Version 1.15.92 sent verbose output to the archive when invoked
+# as tar cvf - foo.txt > foo.tar
+# Reported by Mike Frysinger <vapier@gentoo.org>
+# References: <200610131946.20530.vapier@gentoo.org>
+
+AT_SETUP([tar cvf -])
+AT_KEYWORDS([stdout verbose])
+
+AT_TAR_CHECK([
+genfile --file file --length 10240
+echo Creating the archive
+tar cvf - file > archive
+echo Testing the archive
+tar tf archive
+],
+[0],
+[Creating the archive
+Testing the archive
+file
+],
+[file
+])
+
+AT_CLEANUP
diff --git a/tests/version.at b/tests/version.at
new file mode 100644
index 0000000..6c1485e
--- /dev/null
+++ b/tests/version.at
@@ -0,0 +1,35 @@
+# Checking tar version -*- Autotest -*-
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_SETUP([tar version])
+
+AT_CHECK([tar --version | sed 1q],
+ [0],
+ [AT_PACKAGE_TARNAME (AT_PACKAGE_NAME) AT_PACKAGE_VERSION
+],
+[],
+[cat >$[]XFAILFILE <<'_EOT'
+
+==============================================================
+WARNING: Not using the proper version, *all* checks dubious...
+==============================================================
+_EOT
+],
+[rm -f $[]XFAILFILE])
+
+AT_CLEANUP
diff --git a/tests/volsize.at b/tests/volsize.at
new file mode 100644
index 0000000..ddda506
--- /dev/null
+++ b/tests/volsize.at
@@ -0,0 +1,60 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Description: The size field of a volume header was ignored when listing,
+# but taken into account when extracting. Thus it was possible to hide
+# some files within the archive, placing them after a volume header and
+# manually modifying its size field. Test tarball kindly provided by Tomas.
+# Reported by: Thomas <metaf4@users.askja.de>
+# References: <4462E13A.3080008@users.askja.de>,
+# <44639C4C.5050401@users.askja.de>
+
+AT_SETUP([volume header size])
+AT_KEYWORDS([volume volsize])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+AT_TARBALL_PREREQ([abc.tar],[540f196ceddcad9e7bd2f2d7533d0474])
+
+echo Short Listing
+tar tf $TEST_DATA_DIR/abc.tar
+echo Verbose Listing
+tar tfv $TEST_DATA_DIR/abc.tar
+echo Extracted directory
+tar xf $TEST_DATA_DIR/abc.tar
+find abc|sort
+],
+[0],
+[Short Listing
+abc/not-a-file.gif
+abc/CCC
+Verbose Listing
+V--------- 0/0 1536 2006-05-09 01:07 abc/not-a-file.gif--Volume Header--
+-rw-r--r-- tom/users 0 2006-04-22 22:52 abc/CCC
+Extracted directory
+abc
+abc/CCC
+])
+
+AT_CLEANUP
+
+# End of volsize.at
+
+
diff --git a/tests/volume.at b/tests/volume.at
new file mode 100644
index 0000000..7607062
--- /dev/null
+++ b/tests/volume.at
@@ -0,0 +1,58 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Volume labels are checked on read by fnmatch.
+
+AT_SETUP([volume])
+AT_KEYWORDS([volume volcheck])
+
+AT_TAR_CHECK([
+tar -cf archive -V label -T /dev/null || exit 1
+
+tar xfV archive label || exit 1
+tar xfV archive 'la?el' || exit 1
+tar xfV archive 'l*l' || exit 1
+
+echo 1>&2 -----
+tar xfV archive lab
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive bel
+test $? = 2 || exit 1
+echo 1>&2 -----
+tar xfV archive babel
+test $? = 2
+],
+[0],
+[],
+[-----
+tar: Volume `label' does not match `lab'
+tar: Error is not recoverable: exiting now
+-----
+tar: Volume `label' does not match `bel'
+tar: Error is not recoverable: exiting now
+-----
+tar: Volume `label' does not match `babel'
+tar: Error is not recoverable: exiting now
+],
+[],[],[gnu, oldgnu])
+
+AT_CLEANUP
+